diff --git a/.eslintignore.errorfiles b/.eslintignore.errorfiles
index f501f373cdf..42818244b35 100644
--- a/.eslintignore.errorfiles
+++ b/.eslintignore.errorfiles
@@ -6,39 +6,57 @@ src/autocomplete/EmojiProvider.js
src/autocomplete/UserProvider.js
src/CallHandler.js
src/component-index.js
-src/components/structures/ContextualMenu.js
+src/components/structures/BottomLeftMenu.js
+src/components/structures/CompatibilityPage.js
src/components/structures/CreateRoom.js
+src/components/structures/HomePage.js
+src/components/structures/LeftPanel.js
src/components/structures/LoggedInView.js
src/components/structures/login/ForgotPassword.js
src/components/structures/login/Login.js
src/components/structures/login/Registration.js
+src/components/structures/LoginBox.js
src/components/structures/MessagePanel.js
src/components/structures/NotificationPanel.js
+src/components/structures/RoomDirectory.js
src/components/structures/RoomStatusBar.js
+src/components/structures/RoomSubList.js
src/components/structures/RoomView.js
src/components/structures/ScrollPanel.js
+src/components/structures/SearchBox.js
src/components/structures/TimelinePanel.js
src/components/structures/UploadBar.js
+src/components/structures/ViewSource.js
src/components/views/avatars/BaseAvatar.js
+src/components/views/avatars/GroupAvatar.js
src/components/views/avatars/MemberAvatar.js
src/components/views/create_room/RoomAlias.js
+src/components/views/dialogs/BugReportDialog.js
+src/components/views/dialogs/ChangelogDialog.js
src/components/views/dialogs/ChatCreateOrReuseDialog.js
src/components/views/dialogs/DeactivateAccountDialog.js
+src/components/views/dialogs/SetPasswordDialog.js
src/components/views/dialogs/UnknownDeviceDialog.js
+src/components/views/directory/NetworkDropdown.js
src/components/views/elements/AddressSelector.js
src/components/views/elements/DeviceVerifyButtons.js
src/components/views/elements/DirectorySearchBox.js
src/components/views/elements/EditableText.js
+src/components/views/elements/ImageView.js
+src/components/views/elements/InlineSpinner.js
src/components/views/elements/MemberEventListSummary.js
+src/components/views/elements/Spinner.js
src/components/views/elements/TintableSvg.js
src/components/views/elements/UserSelector.js
+src/components/views/globals/MatrixToolbar.js
+src/components/views/globals/NewVersionBar.js
+src/components/views/globals/UpdateCheckBar.js
src/components/views/login/CountryDropdown.js
src/components/views/login/InteractiveAuthEntryComponents.js
src/components/views/login/PasswordLogin.js
src/components/views/login/RegistrationForm.js
src/components/views/login/ServerConfig.js
src/components/views/messages/MFileBody.js
-src/components/views/messages/MImageBody.js
src/components/views/messages/RoomAvatarEvent.js
src/components/views/messages/TextualBody.js
src/components/views/room_settings/AliasSettings.js
@@ -55,12 +73,14 @@ src/components/views/rooms/MemberList.js
src/components/views/rooms/MemberTile.js
src/components/views/rooms/MessageComposer.js
src/components/views/rooms/MessageComposerInput.js
-src/components/views/rooms/ReadReceiptMarker.js
+src/components/views/rooms/RoomDropTarget.js
src/components/views/rooms/RoomList.js
src/components/views/rooms/RoomPreviewBar.js
src/components/views/rooms/RoomSettings.js
src/components/views/rooms/RoomTile.js
+src/components/views/rooms/RoomTooltip.js
src/components/views/rooms/SearchableEntityList.js
+src/components/views/rooms/SearchBar.js
src/components/views/rooms/SearchResultTile.js
src/components/views/rooms/TopUnreadMessagesBar.js
src/components/views/rooms/UserTile.js
@@ -69,6 +89,8 @@ src/components/views/settings/ChangeAvatar.js
src/components/views/settings/ChangeDisplayName.js
src/components/views/settings/ChangePassword.js
src/components/views/settings/DevicesPanel.js
+src/components/views/settings/IntegrationsManager.js
+src/components/views/settings/Notifications.js
src/ContentMessages.js
src/HtmlUtils.js
src/ImageUtils.js
@@ -78,9 +100,16 @@ src/Login.js
src/Markdown.js
src/MatrixClientPeg.js
src/Modal.js
+src/notifications/ContentRules.js
+src/notifications/NotificationUtils.js
+src/notifications/PushRuleVectorState.js
+src/notifications/StandardActions.js
+src/notifications/VectorPushRulesDefinitions.js
src/Notifier.js
src/PlatformPeg.js
src/Presence.js
+src/rageshake/rageshake.js
+src/rageshake/submit-rageshake.js
src/ratelimitedfunc.js
src/RichText.js
src/Roles.js
@@ -89,10 +118,12 @@ src/ScalarAuthClient.js
src/UiEffects.js
src/Unread.js
src/utils/DecryptFile.js
+src/utils/DirectoryUtils.js
src/utils/DMRoomMap.js
src/utils/FormattingUtils.js
src/utils/MultiInviter.js
src/utils/Receipt.js
+src/VectorConferenceHandler.js
src/Velociraptor.js
src/VelocityBounce.js
src/WhoIsTyping.js
@@ -102,8 +133,9 @@ test/components/structures/MessagePanel-test.js
test/components/structures/ScrollPanel-test.js
test/components/structures/TimelinePanel-test.js
test/components/views/dialogs/InteractiveAuthDialog-test.js
-test/components/views/elements/MemberEventListSummary-test.js
test/components/views/login/RegistrationForm-test.js
test/components/views/rooms/MessageComposerInput-test.js
test/mock-clock.js
+test/notifications/ContentRules-test.js
+test/notifications/PushRuleVectorState-test.js
test/stores/RoomViewStore-test.js
diff --git a/header b/header
index beee1ebe891..33b7fb9e80f 100644
--- a/header
+++ b/header
@@ -1,6 +1,7 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
Copyright 2017 Vector Creations 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.
diff --git a/package.json b/package.json
index 9ca8a293cd5..77338b4874b 100644
--- a/package.json
+++ b/package.json
@@ -67,19 +67,22 @@
"flux": "2.1.1",
"focus-trap-react": "^3.0.5",
"fuse.js": "^2.2.0",
+ "gemini-scrollbar": "matrix-org/gemini-scrollbar#b302279",
+ "gfm.css": "^1.1.1",
"glob": "^5.0.14",
- "highlight.js": "^8.9.1",
+ "highlight.js": "^9.0.0",
"isomorphic-fetch": "^2.2.1",
"linkifyjs": "^2.1.3",
"lodash": "^4.13.1",
"matrix-js-sdk": "0.10.1",
"optimist": "^0.6.1",
+ "pako": "^1.0.5",
"prop-types": "^15.5.8",
"querystring": "^0.2.0",
- "react": "^15.4.0",
+ "react": "^15.6.0",
"react-addons-css-transition-group": "15.3.2",
- "react-beautiful-dnd": "^4.0.0",
- "react-dom": "^15.4.0",
+ "react-beautiful-dnd": "^4.0.1",
+ "react-dom": "^15.6.0",
"react-gemini-scrollbar": "matrix-org/react-gemini-scrollbar#5e97aef",
"sanitize-html": "^1.14.1",
"text-encoding-utf-8": "^1.0.1",
diff --git a/res/css/_common.scss b/res/css/_common.scss
new file mode 100644
index 00000000000..e81c228430f
--- /dev/null
+++ b/res/css/_common.scss
@@ -0,0 +1,361 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2017 Vector Creations Ltd
+Copyright 2017 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+html {
+ /* hack to stop overscroll bounce on OSX and iOS.
+ N.B. Breaks things when we have legitimate horizontal overscroll */
+ height: 100%;
+ overflow: hidden;
+}
+
+body {
+ font-family: $font-family;
+ font-size: 15px;
+ background-color: $primary-bg-color;
+ color: $primary-fg-color;
+ border: 0px;
+ margin: 0px;
+ /* This should render the fonts the same accross browsers */
+ -webkit-font-smoothing: subpixel-antialiased;
+}
+
+div.error, div.warning {
+ color: $warning-color;
+}
+
+h2 {
+ color: $primary-fg-color;
+ font-weight: 400;
+ font-size: 18px;
+ margin-top: 16px;
+ margin-bottom: 16px;
+}
+
+a:hover,
+a:link,
+a:visited {
+ color: $accent-color;
+}
+
+input[type=text], input[type=password], textarea {
+ background-color: transparent;
+ color: $primary-fg-color;
+}
+
+input[type=text].error, input[type=password].error {
+ border: 1px solid $warning-color;
+}
+
+input[type=text]:focus, input[type=password]:focus, textarea:focus {
+ border: 1px solid $accent-color;
+ outline: none;
+ box-shadow: none;
+}
+
+/* Required by Firefox */
+textarea {
+ font-family: $font-family;
+}
+
+/* Prevent ugly dotted highlight around selected elements in Firefox */
+::-moz-focus-inner {
+ border: 0;
+}
+
+/* applied to side-panels and messagepanel when in RoomSettings */
+.mx_fadable {
+ opacity: 1;
+ transition: opacity 0.2s ease-in-out;
+}
+
+.mx_fadable.mx_fadable_faded {
+ opacity: 0.3;
+ pointer-events: none;
+}
+
+/* XXX: critical hack to GeminiScrollbar to allow them to work in FF 42 and Chrome 48.
+ Stop the scrollbar view from pushing out the container's overall sizing, which causes
+ flexbox to adapt to the new size and cause the view to keep growing.
+ */
+.gm-scrollbar-container .gm-scroll-view {
+ position: absolute;
+}
+
+/* Expand thumbs on hoverover */
+.gm-scrollbar {
+ border-radius: 5px ! important;
+}
+.gm-scrollbar.-vertical {
+ width: 6px;
+ transition: width 120ms ease-out ! important;
+}
+.gm-scrollbar.-vertical:hover,
+.gm-scrollbar.-vertical:active {
+ width: 8px;
+ transition: width 120ms ease-out ! important;
+}
+.gm-scrollbar.-horizontal {
+ height: 6px;
+ transition: height 120ms ease-out ! important;
+}
+.gm-scrollbar.-horizontal:hover,
+.gm-scrollbar.-horizontal:active {
+ height: 8px;
+ transition: height 120ms ease-out ! important;
+}
+
+// These are magic constants which are excluded from tinting, to let themes
+// (which only have CSS, unlike skins) tell the app what their non-tinted
+// colourscheme is by inspecting the stylesheet DOM.
+//
+// They are not used for layout!!
+#mx_theme_accentColor {
+ color: $accent-color;
+}
+
+#mx_theme_secondaryAccentColor {
+ color: $secondary-accent-color;
+}
+
+#mx_theme_tertiaryAccentColor {
+ color: $roomsublist-label-bg-color;
+}
+
+.mx_Dialog_wrapper {
+ position: fixed;
+ z-index: 4000;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+/* Spinner Dialog overide */
+.mx_Dialog_wrapper.mx_Dialog_spinner .mx_Dialog {
+ width: auto;
+ border-radius: 8px;
+ padding: 0px;
+ box-shadow: none;
+}
+
+/* View Source Dialog overide */
+.mx_Dialog_wrapper.mx_Dialog_viewsource .mx_Dialog {
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+.mx_Dialog {
+ background-color: $primary-bg-color;
+ color: $light-fg-color;
+ z-index: 4010;
+ font-weight: 300;
+ font-size: 15px;
+ position: relative;
+ padding-left: 58px;
+ padding-bottom: 36px;
+ width: 60%;
+ max-width: 704px;
+ box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.2);
+ max-height: 80%;
+ overflow-y: auto;
+}
+
+.mx_Dialog_background {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: $dialog-background-bg-color;
+ opacity: 0.8;
+}
+
+.mx_Dialog_lightbox .mx_Dialog_background {
+ opacity: 0.85;
+ background-color: $lightbox-background-bg-color;
+}
+
+.mx_Dialog_lightbox .mx_Dialog {
+ border-radius: 0px;
+ background-color: transparent;
+ width: 100%;
+ height: 100%;
+ max-width: 100%;
+ max-height: 100%;
+ pointer-events: none;
+}
+
+.mx_Dialog_cancelButton {
+ position: absolute;
+ right: 11px;
+ top: 13px;
+ cursor: pointer;
+}
+
+.mx_Dialog_cancelButton object {
+ pointer-events: none;
+}
+
+.mx_Dialog_content {
+ margin: 24px 58px 68px 0;
+ font-size: 14px;
+ color: $primary-fg-color;
+ word-wrap: break-word;
+}
+
+.mx_Dialog button, .mx_Dialog input[type="submit"] {
+ @mixin mx_DialogButton;
+ margin-left: 0px;
+ margin-right: 8px;
+
+ // flip colours for the secondary ones
+ font-weight: 600;
+ border: 1px solid $accent-color ! important;
+ color: $accent-color;
+ background-color: $accent-fg-color;
+}
+
+.mx_Dialog button:hover, .mx_Dialog input[type="submit"]:hover {
+ @mixin mx_DialogButton_hover;
+}
+
+.mx_Dialog button:focus, .mx_Dialog input[type="submit"]:focus {
+ filter: brightness($focus-brightness);
+}
+
+.mx_Dialog button.mx_Dialog_primary, .mx_Dialog input[type="submit"].mx_Dialog_primary {
+ color: $accent-fg-color;
+ background-color: $accent-color;
+}
+
+.mx_Dialog button.danger, .mx_Dialog input[type="submit"].danger {
+ background-color: $warning-color;
+ border: solid 1px $warning-color;
+}
+
+.mx_Dialog button:disabled, .mx_Dialog input[type="submit"]:disabled {
+ background-color: $light-fg-color;
+ border: solid 1px $light-fg-color;
+ opacity: 0.7;
+}
+
+.mx_Dialog_title {
+ min-height: 16px;
+ padding-top: 40px;
+ font-weight: bold;
+ font-size: 22px;
+ line-height: 1.4;
+ color: $primary-fg-color;
+}
+
+.mx_Dialog_title.danger {
+ color: $warning-color;
+}
+
+.mx_TextInputDialog_label {
+ text-align: left;
+ padding-bottom: 12px;
+}
+
+.mx_TextInputDialog_input {
+ font-size: 15px;
+ border-radius: 3px;
+ border: 1px solid $input-border-color;
+ padding: 9px;
+ color: $primary-fg-color;
+ background-color: $primary-bg-color;
+}
+
+.mx_emojione {
+ height: 1em;
+ vertical-align: middle;
+}
+
+::-moz-selection {
+ background-color: $accent-color;
+ color: $selection-fg-color;
+}
+
+::selection {
+ background-color: $accent-color;
+ color: $selection-fg-color;
+}
+
+.mx_textButton {
+ @mixin mx_DialogButton_small;
+}
+
+.mx_textButton:hover {
+ @mixin mx_DialogButton_hover;
+}
+
+.mx_button_row {
+ margin-top: 69px;
+}
+
+.mx_Beta {
+ color: red;
+ margin-right: 10px;
+ position: relative;
+ top: -3px;
+ background-color: white;
+ padding: 0 4px;
+ border-radius: 3px;
+ border: 1px solid darkred;
+ cursor: help;
+ transition-duration: 200ms;
+ font-size: smaller;
+ filter: opacity(0.5);
+}
+
+.mx_Beta:hover {
+ color: white;
+ border: 1px solid gray;
+ background-color: darkred;
+}
+
+.mx_TintableSvgButton {
+ position: relative;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-content: center;
+}
+
+.mx_TintableSvgButton object {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100%;
+ max-width: 100%;
+ max-height: 100%;
+}
+
+.mx_TintableSvgButton span {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ opacity: 0;
+ cursor: pointer;
+}
diff --git a/res/css/_components.scss b/res/css/_components.scss
new file mode 100644
index 00000000000..97700103247
--- /dev/null
+++ b/res/css/_components.scss
@@ -0,0 +1,109 @@
+// autogenerated by rethemendex.sh
+@import "./_common.scss";
+@import "./_fonts.scss";
+@import "./structures/_CompatibilityPage.scss";
+@import "./structures/_ContextualMenu.scss";
+@import "./structures/_CreateRoom.scss";
+@import "./structures/_FilePanel.scss";
+@import "./structures/_GroupView.scss";
+@import "./structures/_HomePage.scss";
+@import "./structures/_LeftPanel.scss";
+@import "./structures/_LoginBox.scss";
+@import "./structures/_MatrixChat.scss";
+@import "./structures/_MyGroups.scss";
+@import "./structures/_NotificationPanel.scss";
+@import "./structures/_RightPanel.scss";
+@import "./structures/_RoomDirectory.scss";
+@import "./structures/_RoomStatusBar.scss";
+@import "./structures/_RoomSubList.scss";
+@import "./structures/_RoomView.scss";
+@import "./structures/_SearchBox.scss";
+@import "./structures/_TagPanel.scss";
+@import "./structures/_UploadBar.scss";
+@import "./structures/_UserSettings.scss";
+@import "./structures/_ViewSource.scss";
+@import "./structures/login/_Login.scss";
+@import "./views/avatars/_BaseAvatar.scss";
+@import "./views/context_menus/_MessageContextMenu.scss";
+@import "./views/context_menus/_RoomTileContextMenu.scss";
+@import "./views/context_menus/_TagTileContextMenu.scss";
+@import "./views/dialogs/_BugReportDialog.scss";
+@import "./views/dialogs/_ChangelogDialog.scss";
+@import "./views/dialogs/_ChatCreateOrReuseChatDialog.scss";
+@import "./views/dialogs/_ChatInviteDialog.scss";
+@import "./views/dialogs/_ConfirmUserActionDialog.scss";
+@import "./views/dialogs/_CreateGroupDialog.scss";
+@import "./views/dialogs/_CreateRoomDialog.scss";
+@import "./views/dialogs/_DevtoolsDialog.scss";
+@import "./views/dialogs/_EncryptedEventDialog.scss";
+@import "./views/dialogs/_GroupAddressPicker.scss";
+@import "./views/dialogs/_QuestionDialog.scss";
+@import "./views/dialogs/_SetEmailDialog.scss";
+@import "./views/dialogs/_SetMxIdDialog.scss";
+@import "./views/dialogs/_SetPasswordDialog.scss";
+@import "./views/dialogs/_UnknownDeviceDialog.scss";
+@import "./views/directory/_NetworkDropdown.scss";
+@import "./views/elements/_AccessibleButton.scss";
+@import "./views/elements/_AddressSelector.scss";
+@import "./views/elements/_AddressTile.scss";
+@import "./views/elements/_DirectorySearchBox.scss";
+@import "./views/elements/_Dropdown.scss";
+@import "./views/elements/_EditableItemList.scss";
+@import "./views/elements/_ImageView.scss";
+@import "./views/elements/_InlineSpinner.scss";
+@import "./views/elements/_MemberEventListSummary.scss";
+@import "./views/elements/_ProgressBar.scss";
+@import "./views/elements/_Quote.scss";
+@import "./views/elements/_RichText.scss";
+@import "./views/elements/_RoleButton.scss";
+@import "./views/elements/_Spinner.scss";
+@import "./views/elements/_SyntaxHighlight.scss";
+@import "./views/elements/_ToolTipButton.scss";
+@import "./views/globals/_MatrixToolbar.scss";
+@import "./views/groups/_GroupPublicityToggle.scss";
+@import "./views/groups/_GroupRoomList.scss";
+@import "./views/groups/_GroupUserSettings.scss";
+@import "./views/login/_InteractiveAuthEntryComponents.scss";
+@import "./views/login/_ServerConfig.scss";
+@import "./views/messages/_DateSeparator.scss";
+@import "./views/messages/_MEmoteBody.scss";
+@import "./views/messages/_MFileBody.scss";
+@import "./views/messages/_MImageBody.scss";
+@import "./views/messages/_MNoticeBody.scss";
+@import "./views/messages/_MStickerBody.scss";
+@import "./views/messages/_MTextBody.scss";
+@import "./views/messages/_MessageTimestamp.scss";
+@import "./views/messages/_RoomAvatarEvent.scss";
+@import "./views/messages/_SenderProfile.scss";
+@import "./views/messages/_TextualEvent.scss";
+@import "./views/messages/_UnknownBody.scss";
+@import "./views/rooms/_AppsDrawer.scss";
+@import "./views/rooms/_Autocomplete.scss";
+@import "./views/rooms/_EntityTile.scss";
+@import "./views/rooms/_EventTile.scss";
+@import "./views/rooms/_LinkPreviewWidget.scss";
+@import "./views/rooms/_MemberDeviceInfo.scss";
+@import "./views/rooms/_MemberInfo.scss";
+@import "./views/rooms/_MemberList.scss";
+@import "./views/rooms/_MessageComposer.scss";
+@import "./views/rooms/_PinnedEventTile.scss";
+@import "./views/rooms/_PinnedEventsPanel.scss";
+@import "./views/rooms/_PresenceLabel.scss";
+@import "./views/rooms/_QuotePreview.scss";
+@import "./views/rooms/_RoomDropTarget.scss";
+@import "./views/rooms/_RoomHeader.scss";
+@import "./views/rooms/_RoomList.scss";
+@import "./views/rooms/_RoomPreviewBar.scss";
+@import "./views/rooms/_RoomSettings.scss";
+@import "./views/rooms/_RoomTile.scss";
+@import "./views/rooms/_RoomTooltip.scss";
+@import "./views/rooms/_SearchBar.scss";
+@import "./views/rooms/_SearchableEntityList.scss";
+@import "./views/rooms/_Stickers.scss";
+@import "./views/rooms/_TopUnreadMessagesBar.scss";
+@import "./views/settings/_DevicesPanel.scss";
+@import "./views/settings/_IntegrationsManager.scss";
+@import "./views/settings/_Notifications.scss";
+@import "./views/voip/_CallView.scss";
+@import "./views/voip/_IncomingCallbox.scss";
+@import "./views/voip/_VideoView.scss";
diff --git a/res/css/_fonts.scss b/res/css/_fonts.scss
new file mode 100644
index 00000000000..52ac95b5694
--- /dev/null
+++ b/res/css/_fonts.scss
@@ -0,0 +1,67 @@
+/*
+ * Open Sans
+ * Includes extended Latin, Greek, Cyrillic and Vietnamese character sets
+ */
+
+/* the 'src' links are relative to the bundle.css, which is in a subdirectory.
+ */
+@font-face {
+ font-family: 'Open Sans';
+ src: url('../../fonts/Open_Sans/OpenSans-Regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ src: url('../../fonts/Open_Sans/OpenSans-Italic.ttf') format('truetype');
+ font-weight: 400;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ src: url('../../fonts/Open_Sans/OpenSans-Semibold.ttf') format('truetype');
+ font-weight: 600;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ src: url('../../fonts/Open_Sans/OpenSans-SemiboldItalic.ttf') format('truetype');
+ font-weight: 600;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ src: url('../../fonts/Open_Sans/OpenSans-Bold.ttf') format('truetype');
+ font-weight: 700;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ src: url('../../fonts/Open_Sans/OpenSans-BoldItalic.ttf') format('truetype');
+ font-weight: 700;
+ font-style: italic;
+}
+
+/*
+ * Fira Mono
+ * Used for monospace copy, i.e. code
+ */
+
+@font-face {
+ font-family: 'Fira Mono';
+ src: url('../../fonts/Fira_Mono/FiraMono-Regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Fira Mono';
+ src: url('../../fonts/Fira_Mono/FiraMono-Bold.ttf') format('truetype');
+ font-weight: 700;
+ font-style: normal;
+}
diff --git a/res/css/rethemendex.sh b/res/css/rethemendex.sh
new file mode 100755
index 00000000000..13be73f9a97
--- /dev/null
+++ b/res/css/rethemendex.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+cd `dirname $0`
+
+{
+ echo "// autogenerated by rethemendex.sh"
+
+ # we used to have exclude /themes from the find at this point.
+ # as themes are no longer a spurious subdirectory of css/, we don't
+ # need it any more.
+ find . -iname _\*.scss | fgrep -v _components.scss | LC_ALL=C sort |
+ while read i; do
+ echo "@import \"$i\";"
+ done
+} > _components.scss
diff --git a/res/css/structures/_CompatibilityPage.scss b/res/css/structures/_CompatibilityPage.scss
new file mode 100644
index 00000000000..f3f032c9753
--- /dev/null
+++ b/res/css/structures/_CompatibilityPage.scss
@@ -0,0 +1,19 @@
+.mx_CompatibilityPage {
+ width: 100%;
+ height: 100%;
+ background-color: #e55;
+}
+
+.mx_CompatibilityPage_box {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ margin: auto;
+ width: 500px;
+ height: 300px;
+ border: 1px solid;
+ padding: 10px;
+ background-color: #fcc;
+}
\ No newline at end of file
diff --git a/res/css/structures/_ContextualMenu.scss b/res/css/structures/_ContextualMenu.scss
new file mode 100644
index 00000000000..a0191b92cf5
--- /dev/null
+++ b/res/css/structures/_ContextualMenu.scss
@@ -0,0 +1,160 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_ContextualMenu_wrapper {
+ position: fixed;
+ z-index: 2000;
+}
+
+.mx_ContextualMenu_background {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 1.0;
+ z-index: 2000;
+}
+
+.mx_ContextualMenu {
+ border: solid 1px $menu-border-color;
+ border-radius: 4px;
+ background-color: $menu-bg-color;
+ color: $primary-fg-color;
+ position: absolute;
+ padding: 6px;
+ font-size: 14px;
+ z-index: 2001;
+}
+
+.mx_ContextualMenu.mx_ContextualMenu_right {
+ right: 8px;
+}
+
+.mx_ContextualMenu_chevron_right {
+ position: absolute;
+ right: -8px;
+ top: 0px;
+ width: 0;
+ height: 0;
+ border-top: 8px solid transparent;
+ border-left: 8px solid $menu-border-color;
+ border-bottom: 8px solid transparent;
+}
+
+.mx_ContextualMenu_chevron_right:after {
+ content:'';
+ width: 0;
+ height: 0;
+ border-top: 7px solid transparent;
+ border-left: 7px solid $menu-bg-color;
+ border-bottom: 7px solid transparent;
+ position:absolute;
+ top: -7px;
+ right: 1px;
+}
+
+.mx_ContextualMenu.mx_ContextualMenu_left {
+ left: 8px;
+}
+
+.mx_ContextualMenu_chevron_left {
+ position: absolute;
+ left: -8px;
+ top: 0px;
+ width: 0;
+ height: 0;
+ border-top: 8px solid transparent;
+ border-right: 8px solid $menu-border-color;
+ border-bottom: 8px solid transparent;
+}
+
+.mx_ContextualMenu_chevron_left:after{
+ content:'';
+ width: 0;
+ height: 0;
+ border-top: 7px solid transparent;
+ border-right: 7px solid $menu-bg-color;
+ border-bottom: 7px solid transparent;
+ position:absolute;
+ top: -7px;
+ left: 1px;
+}
+
+.mx_ContextualMenu.mx_ContextualMenu_top {
+ top: 8px;
+}
+
+.mx_ContextualMenu_chevron_top {
+ position: absolute;
+ left: 0px;
+ top: -8px;
+ width: 0;
+ height: 0;
+ border-left: 8px solid transparent;
+ border-bottom: 8px solid $menu-border-color;
+ border-right: 8px solid transparent;
+}
+
+.mx_ContextualMenu_chevron_top:after{
+ content:'';
+ width: 0;
+ height: 0;
+ border-left: 7px solid transparent;
+ border-bottom: 7px solid $menu-bg-color;
+ border-right: 7px solid transparent;
+ position:absolute;
+ left: -7px;
+ top: 1px;
+}
+
+.mx_ContextualMenu.mx_ContextualMenu_bottom {
+ bottom: 8px;
+}
+
+.mx_ContextualMenu_chevron_bottom {
+ position: absolute;
+ left: 0px;
+ bottom: -8px;
+ width: 0;
+ height: 0;
+ border-left: 8px solid transparent;
+ border-top: 8px solid $menu-border-color;
+ border-right: 8px solid transparent;
+}
+
+.mx_ContextualMenu_chevron_bottom:after{
+ content:'';
+ width: 0;
+ height: 0;
+ border-left: 7px solid transparent;
+ border-top: 7px solid $menu-bg-color;
+ border-right: 7px solid transparent;
+ position:absolute;
+ left: -7px;
+ bottom: 1px;
+}
+
+.mx_ContextualMenu_field {
+ padding: 3px 6px 3px 6px;
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+.mx_ContextualMenu_spinner {
+ display: block;
+ margin: 0 auto;
+}
diff --git a/res/css/structures/_CreateRoom.scss b/res/css/structures/_CreateRoom.scss
new file mode 100644
index 00000000000..2be193525e9
--- /dev/null
+++ b/res/css/structures/_CreateRoom.scss
@@ -0,0 +1,37 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_CreateRoom {
+ width: 960px;
+ margin-left: auto;
+ margin-right: auto;
+ color: $primary-fg-color;
+}
+
+.mx_CreateRoom input,
+.mx_CreateRoom textarea {
+ border-radius: 3px;
+ border: 1px solid $strong-input-border-color;
+ font-weight: 300;
+ font-size: 13px;
+ padding: 9px;
+ margin-top: 6px;
+}
+
+.mx_CreateRoom_description {
+ width: 330px;
+}
+
diff --git a/res/css/structures/_FilePanel.scss b/res/css/structures/_FilePanel.scss
new file mode 100644
index 00000000000..58e090645fe
--- /dev/null
+++ b/res/css/structures/_FilePanel.scss
@@ -0,0 +1,114 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_FilePanel {
+ order: 2;
+
+ flex: 1 1 0;
+
+ width: 100%;
+
+ overflow-y: auto;
+}
+
+.mx_FilePanel .mx_RoomView_messageListWrapper {
+ margin-right: 20px;
+}
+
+.mx_FilePanel .mx_RoomView_MessageList h2 {
+ display: none;
+}
+
+/* FIXME: rather than having EventTile's default CSS be for MessagePanel,
+ we should make EventTile a base CSS class and customise it specifically
+ for usage in {Message,File,Notification}Panel. */
+
+.mx_FilePanel .mx_EventTile_avatar {
+ display: none;
+}
+
+/* Overrides for the attachment body tiles */
+
+.mx_FilePanel .mx_EventTile {
+ word-break: break-word;
+}
+
+.mx_FilePanel .mx_EventTile .mx_MImageBody {
+ margin-right: 0px;
+}
+
+.mx_FilePanel .mx_EventTile .mx_MImageBody_download {
+ display: flex;
+ font-size: 14px;
+ color: $event-timestamp-color;
+}
+
+.mx_FilePanel .mx_EventTile .mx_MImageBody_downloadLink {
+ flex: 1 1 auto;
+ color: $light-fg-color;
+}
+
+.mx_FilePanel .mx_EventTile .mx_MImageBody_size {
+ flex: 1 0 0;
+ font-size: 11px;
+ text-align: right;
+ white-space: nowrap;
+}
+
+/* Overides for the sender details line */
+
+.mx_FilePanel .mx_EventTile_senderDetails {
+ display: flex;
+ margin-top: -2px;
+}
+
+.mx_FilePanel .mx_EventTile_senderDetailsLink {
+ text-decoration: none;
+}
+
+.mx_FilePanel .mx_EventTile .mx_SenderProfile {
+ flex: 1 1 auto;
+ line-height: initial;
+ padding: 0px;
+ font-size: 11px;
+ opacity: 1.0;
+ color: $event-timestamp-color;
+}
+
+.mx_FilePanel .mx_EventTile .mx_MessageTimestamp {
+ flex: 1 0 0;
+ text-align: right;
+ visibility: visible;
+ position: initial;
+ font-size: 11px;
+ opacity: 1.0;
+ color: $event-timestamp-color;
+}
+
+/* Overrides for the wrappers around the body tile */
+
+.mx_FilePanel .mx_EventTile_line {
+ margin-right: 0px;
+ padding-left: 0px;
+}
+
+.mx_FilePanel .mx_EventTile:hover .mx_EventTile_line {
+ background-color: $primary-bg-color;
+}
+
+.mx_FilePanel .mx_EventTile_selected .mx_EventTile_line {
+ padding-left: 0px;
+}
diff --git a/res/css/structures/_GroupView.scss b/res/css/structures/_GroupView.scss
new file mode 100644
index 00000000000..02e5a948e98
--- /dev/null
+++ b/res/css/structures/_GroupView.scss
@@ -0,0 +1,349 @@
+/*
+Copyright 2017 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.
+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_GroupView {
+ max-width: 960px;
+ width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+}
+
+.mx_GroupView_error {
+ margin: auto;
+}
+
+.mx_GroupView_header {
+ max-width: 960px;
+ min-height: 70px;
+ align-items: center;
+ display: flex;
+ padding-bottom: 10px;
+}
+
+.mx_GroupView_header_view {
+ border-bottom: 1px solid $primary-hairline-color;
+ padding-bottom: 0px;
+}
+
+.mx_GroupView_header_avatar, .mx_GroupView_header_info {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.mx_GroupHeader_button {
+ margin-left: 12px;
+ cursor: pointer;
+}
+
+.mx_GroupHeader_button object {
+ // prevents clicks from being swallowed by svg in 'object' tag
+ pointer-events: none;
+}
+
+.mx_GroupView_editable {
+ border-bottom: 1px solid $strong-input-border-color ! important;
+ min-width: 150px;
+ cursor: text;
+}
+
+.mx_GroupView_editable:focus {
+ border-bottom: 1px solid $accent-color ! important;
+ outline: none;
+ box-shadow: none;
+}
+
+.mx_GroupView_header_isUserMember .mx_GroupView_header_name:hover div:not(.mx_GroupView_editable) {
+ color: $accent-color;
+ cursor: pointer;
+}
+
+.mx_GroupView_avatarPicker {
+ position: relative;
+}
+
+.mx_GroupView_avatarPicker_edit {
+ position: absolute;
+ top: 50px;
+ left: 15px;
+}
+
+.mx_GroupView_avatarPicker .mx_Spinner {
+ width: 48px;
+ height: 48px ! important;
+}
+
+.mx_GroupView_header_leftCol {
+ flex: 1;
+
+ overflow: hidden;
+}
+
+.mx_GroupView_header_rightCol {
+ display: flex;
+ align-items: center;
+}
+
+.mx_GroupView_textButton {
+ display: inline-block;
+}
+
+.mx_GroupView_header_groupid {
+ font-weight: normal;
+ font-size: initial;
+ padding-left: 10px;
+}
+
+.mx_GroupView_header_name {
+ vertical-align: middle;
+ width: 100%;
+ height: 31px;
+ overflow: hidden;
+ color: $primary-fg-color;
+ font-weight: bold;
+ font-size: 22px;
+ padding-left: 19px;
+ padding-right: 16px;
+ /* why isn't text-overflow working? */
+ text-overflow: ellipsis;
+ border-bottom: 1px solid transparent;
+}
+
+.mx_GroupView_header_shortDesc {
+ vertical-align: bottom;
+ float: left;
+ max-height: 42px;
+ color: $settings-grey-fg-color;
+ font-weight: 300;
+ font-size: 13px;
+ padding-left: 19px;
+ margin-right: 16px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ border-bottom: 1px solid transparent;
+}
+
+.mx_GroupView_avatarPicker_label {
+ cursor: pointer;
+}
+
+.mx_GroupView_cancelButton {
+ padding-left: 8px;
+}
+
+.mx_GroupView_cancelButton img {
+ position: relative;
+ top: 5px;
+}
+
+.mx_GroupView input[type='radio'] {
+ margin: 10px 10px 0px 10px;
+}
+
+.mx_GroupView_label_text {
+ display: inline-block;
+ max-width: 80%;
+ vertical-align: 0.1em;
+ line-height: 2em;
+}
+
+.mx_GroupView_body {
+ flex-grow: 1;
+}
+
+.mx_GroupView_rooms {
+ flex-grow: 1;
+ display: flex;
+ flex-direction: column;
+ min-height: 200px;
+ user-select: none;
+}
+
+.mx_GroupView h3 {
+ text-transform: uppercase;
+ color: $h3-color;
+ font-weight: 600;
+ font-size: 13px;
+ margin-bottom: 10px;
+}
+
+.mx_GroupView_rooms_header .mx_AccessibleButton {
+ padding-left: 14px;
+ margin-bottom: 14px;
+ height: 24px;
+}
+
+.mx_GroupView_group {
+ border-top: 1px solid $primary-hairline-color;
+}
+
+.mx_GroupView_group_disabled {
+ opacity: 0.3;
+ pointer-events: none;
+}
+
+.mx_GroupView_rooms_header_addRow_button {
+ display: inline-block;
+}
+
+.mx_GroupView_rooms_header_addRow_button object {
+ pointer-events: none;
+}
+
+.mx_GroupView_rooms_header_addRow_label {
+ display: inline-block;
+ vertical-align: top;
+ line-height: 24px;
+ padding-left: 28px;
+ color: $accent-color;
+}
+
+.mx_GroupView_rooms .mx_RoomDetailList {
+ flex-grow: 1;
+ border-top: 1px solid $primary-hairline-color;
+ padding-top: 10px;
+ word-break: break-word;
+}
+
+.mx_GroupView .mx_RoomView_messageListWrapper {
+ justify-content: flex-start;
+}
+
+.mx_GroupView_membershipSection {
+ color: $greyed-fg-color;
+ margin-top: 10px;
+}
+
+.mx_GroupView_membershipSubSection {
+ justify-content: space-between;
+ display: flex;
+}
+
+.mx_GroupView_membershipSubSection .mx_Spinner {
+ justify-content: flex-end;
+}
+
+.mx_GroupView_membershipSection_description {
+ /* To match textButton */
+ line-height: 34px;
+}
+
+.mx_GroupView_membershipSection_description .mx_BaseAvatar {
+ margin-right: 10px;
+}
+
+.mx_GroupView_membershipSection .mx_GroupView_textButton {
+ margin-right: 0px;
+ margin-top: 0px;
+ margin-left: 8px;
+}
+
+.mx_GroupView_memberSettings_toggle label {
+ cursor: pointer;
+ user-select: none;
+}
+
+.mx_GroupView_memberSettings input {
+ margin-right: 6px;
+}
+
+.mx_GroupView_featuredThings {
+ margin-top: 20px;
+}
+
+.mx_GroupView_featuredThings_header {
+ font-weight: bold;
+ font-size: 120%;
+ margin-bottom: 20px;
+}
+
+.mx_GroupView_featuredThings_category {
+ font-weight: bold;
+ font-size: 110%;
+ margin-top: 10px;
+}
+
+.mx_GroupView_featuredThings_container {
+ display: flex;
+}
+
+.mx_GroupView_featuredThings_addButton,
+.mx_GroupView_featuredThing {
+ display: table-cell;
+ text-align: center;
+
+ width: 100px;
+ margin: 0px 20px;
+}
+
+.mx_GroupView_featuredThing {
+ position: relative;
+}
+
+.mx_GroupView_featuredThing .mx_GroupView_featuredThing_deleteButton {
+ position: absolute;
+ top: -7px;
+ right: 11px;
+ opacity: 0.4;
+}
+
+.mx_GroupView_featuredThing .mx_BaseAvatar {
+ /* To prevent misalignment with mx_TintableSvg (in addButton) */
+ vertical-align: initial;
+}
+
+.mx_GroupView_featuredThings_addButton object {
+ pointer-events: none;
+}
+
+.mx_GroupView_featuredThing_name {
+ word-wrap: break-word;
+}
+
+.mx_GroupView_uploadInput {
+ display: none;
+}
+
+.mx_GroupView_body .gm-scroll-view > *{
+ margin: 11px 50px 0px 68px;
+}
+
+.mx_GroupView_groupDesc textarea {
+ width: 100%;
+ max-width: 100%;
+ height: 150px;
+}
+
+.mx_GroupView_groupDesc_placeholder,
+.mx_GroupView_changeDelayWarning {
+ background-color: $info-plinth-bg-color;
+ color: $info-plinth-fg-color;
+ border-radius: 10px;
+ text-align: center;
+
+ margin: 20px 0px;
+}
+
+.mx_GroupView_groupDesc_placeholder {
+ padding: 100px 20px;
+ cursor: pointer;
+}
+
+.mx_GroupView_changeDelayWarning {
+ padding: 40px 20px;
+}
diff --git a/res/css/structures/_HomePage.scss b/res/css/structures/_HomePage.scss
new file mode 100644
index 00000000000..cdac1bcc8ab
--- /dev/null
+++ b/res/css/structures/_HomePage.scss
@@ -0,0 +1,35 @@
+/*
+Copyright 2016 OpenMarket Ltd
+Copyright 2017 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.
+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_HomePage {
+ max-width: 960px;
+ width: 100%;
+ height: 100%;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.mx_HomePage iframe {
+ display: block;
+ width: 100%;
+ height: 100%;
+ border: 0px;
+}
+
+.mx_HomePage_body {
+// margin-left: 63px;
+}
diff --git a/res/css/structures/_LeftPanel.scss b/res/css/structures/_LeftPanel.scss
new file mode 100644
index 00000000000..96ed5878ac4
--- /dev/null
+++ b/res/css/structures/_LeftPanel.scss
@@ -0,0 +1,129 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_LeftPanel {
+ position: relative;
+
+ display: flex;
+ flex-direction: column;
+}
+
+.mx_LeftPanel_container {
+ display: flex;
+ /* LeftPanel 235px */
+ flex: 0 0 235px;
+}
+
+.mx_LeftPanel_container.mx_LeftPanel_container_hasTagPanel {
+ /* TagPanel 60px + LeftPanel 235px */
+ flex: 0 0 295px;
+}
+
+.mx_LeftPanel_container_collapsed {
+ /* Collapsed LeftPanel 60px */
+ flex: 0 0 60px;
+}
+
+.mx_LeftPanel_container_collapsed.mx_LeftPanel_container_hasTagPanel {
+ /* TagPanel 60px + Collapsed LeftPanel 60px */
+ flex: 0 0 120px;
+}
+
+.mx_LeftPanel_hideButton {
+ position: absolute;
+ top: 10px;
+ right: 0px;
+ padding: 8px;
+ cursor: pointer;
+}
+
+.mx_LeftPanel_callView {
+
+}
+
+.mx_LeftPanel .mx_RoomList_scrollbar {
+ order: 1;
+
+ flex: 1 1 0;
+
+ overflow-y: auto;
+ z-index: 6;
+}
+
+.mx_LeftPanel.collapsed .mx_BottomLeftMenu {
+ flex: 0 0 160px;
+ margin-bottom: 9px;
+}
+
+.mx_LeftPanel .mx_BottomLeftMenu {
+ order: 3;
+
+ border-top: 1px solid $panel-divider-color;
+ margin-left: 16px; /* gutter */
+ margin-right: 16px; /* gutter */
+ flex: 0 0 60px;
+ z-index: 1;
+}
+
+.mx_LeftPanel .mx_BottomLeftMenu_options {
+ margin-top: 18px;
+}
+
+.mx_BottomLeftMenu_options object {
+ pointer-events: none;
+}
+
+.collapsed .mx_RoleButton {
+ margin-right: 0px ! important;
+ padding-top: 3px ! important;
+ padding-bottom: 3px ! important;
+}
+
+.mx_BottomLeftMenu_options > div {
+ display: inline-block;
+}
+
+.mx_BottomLeftMenu_options .mx_RoleButton {
+ margin-left: 0px;
+ margin-right: 10px;
+ height: 30px;
+}
+
+.mx_BottomLeftMenu_options .mx_BottomLeftMenu_settings {
+ float: right;
+}
+
+.mx_BottomLeftMenu_options .mx_BottomLeftMenu_settings .mx_RoleButton {
+ margin-right: 0px;
+}
+
+.mx_LeftPanel.collapsed .mx_BottomLeftMenu_settings {
+ float: none;
+}
+
+.mx_MatrixChat_useCompactLayout {
+ .mx_LeftPanel .mx_BottomLeftMenu {
+ flex: 0 0 50px;
+ }
+
+ .mx_LeftPanel.collapsed .mx_BottomLeftMenu {
+ flex: 0 0 160px;
+ }
+
+ .mx_LeftPanel .mx_BottomLeftMenu_options {
+ margin-top: 12px;
+ }
+}
diff --git a/res/css/structures/_LoginBox.scss b/res/css/structures/_LoginBox.scss
new file mode 100644
index 00000000000..7f6199c4516
--- /dev/null
+++ b/res/css/structures/_LoginBox.scss
@@ -0,0 +1,47 @@
+/*
+Copyright 2017 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_LoginBox {
+ min-height: 24px;
+ height: unset !important;
+ padding-top: 13px !important;
+ padding-bottom: 14px !important;
+}
+
+.mx_LoginBox_loginButton_wrapper {
+ text-align: center;
+ width: 100%;
+}
+
+.mx_LoginBox_loginButton,
+.mx_LoginBox_registerButton {
+ margin-top: 3px;
+ height: 40px;
+ border: 0px;
+ border-radius: 40px;
+ margin-left: 4px;
+ margin-right: 4px;
+ min-width: 80px;
+
+ background-color: $accent-color;
+ color: $primary-bg-color;
+
+ cursor: pointer;
+
+ font-size: 15px;
+ padding: 0 11px;
+ word-break: break-word;
+}
diff --git a/res/css/structures/_MatrixChat.scss b/res/css/structures/_MatrixChat.scss
new file mode 100644
index 00000000000..156b1709fef
--- /dev/null
+++ b/res/css/structures/_MatrixChat.scss
@@ -0,0 +1,104 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MatrixChat_splash {
+ position: relative;
+ height: 100%;
+}
+
+.mx_MatrixChat_splashButtons {
+ text-align: center;
+ width: 100%;
+ position: absolute;
+ bottom: 30px;
+}
+
+.mx_MatrixChat_wrapper {
+ display: flex;
+
+ flex-direction: column;
+
+ width: 100%;
+ height: 100%;
+}
+
+.mx_MatrixToolbar {
+ order: 1;
+
+ height: 40px;
+}
+
+.mx_MatrixChat_toolbarShowing {
+ height: auto;
+}
+
+.mx_MatrixChat {
+ width: 100%;
+ height: 100%;
+
+ display: flex;
+
+ order: 2;
+
+ flex: 1;
+}
+
+.mx_MatrixChat .mx_LeftPanel {
+ order: 1;
+
+ background-color: $secondary-accent-color;
+
+ flex: 0 0 235px;
+}
+
+.mx_MatrixChat .mx_LeftPanel.collapsed {
+ flex: 0 0 60px;
+}
+
+.mx_MatrixChat .mx_MatrixChat_middlePanel {
+ order: 2;
+
+ padding-left: 20px;
+ padding-right: 22px;
+ background-color: $primary-bg-color;
+
+ flex: 1;
+
+ /* Experimental fix for https://github.com/vector-im/vector-web/issues/947
+ and https://github.com/vector-im/vector-web/issues/946.
+ Empirically this stops the MessagePanel's width exploding outwards when
+ gemini is in 'prevented' mode
+ */
+ overflow-x: auto;
+
+ display: flex;
+
+ /* To fix https://github.com/vector-im/riot-web/issues/3298 where Safari
+ needed height 100% all the way down to the HomePage. Height does not
+ have to be auto, empirically.
+ */
+ height: 100%;
+}
+
+.mx_MatrixChat .mx_RightPanel {
+ order: 3;
+
+ flex: 0 0 235px;
+}
+
+.mx_MatrixChat .mx_RightPanel.collapsed {
+ flex: 0 0 122px;
+}
diff --git a/res/css/structures/_MyGroups.scss b/res/css/structures/_MyGroups.scss
new file mode 100644
index 00000000000..6d140721c8f
--- /dev/null
+++ b/res/css/structures/_MyGroups.scss
@@ -0,0 +1,151 @@
+/*
+Copyright 2017 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.
+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_MyGroups {
+ max-width: 960px;
+ margin-left: auto;
+ margin-right: auto;
+
+ display: flex;
+ flex-direction: column;
+}
+
+.mx_MyGroups .mx_RoomHeader_simpleHeader {
+ margin-left: 0px;
+}
+
+.mx_MyGroups_header {
+ /* Keep mid-point of create button aligned with icon in page header */
+ margin-left: 2px;
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.mx_MyGroups_headerCard {
+ flex: 1 0 50%;
+ margin-bottom: 30px;
+ min-width: 400px;
+ display: flex;
+ align-items: center;
+}
+
+.mx_MyGroups_headerCard .mx_MyGroups_headerCard_button {
+ margin-right: 13px;
+ height: 50px;
+}
+
+.mx_MyGroups_headerCard_button object {
+ /* Otherwise the SVG object absorbs clicks and the button doesn't work */
+ pointer-events: none;
+}
+
+.mx_MyGroups_headerCard_header {
+ font-weight: bold;
+ margin-bottom: 10px;
+}
+
+.mx_MyGroups_headerCard_content {
+ padding-right: 15px;
+}
+
+/* Until the button is wired up */
+.mx_MyGroups_joinBox {
+ visibility: hidden;
+
+ /* When joinBox wraps onto its own row, it should take up zero height so
+ that there isn't an awkward gap between MyGroups_createBox and
+ MyGroups_content.
+ */
+ height: 0px;
+ margin: 0px;
+}
+
+.mx_MyGroups_content {
+ margin-left: 2px;
+
+ flex: 1 0 0;
+
+ display: flex;
+ flex-direction: column;
+}
+
+.mx_MyGroups_placeholder {
+ background-color: $info-plinth-bg-color;
+ color: $info-plinth-fg-color;
+ line-height: 400px;
+ border-radius: 10px;
+ text-align: center;
+}
+
+.mx_MyGroups_joinedGroups {
+ border-top: 1px solid $primary-hairline-color;
+ overflow-x: hidden;
+
+ display: flex;
+ flex-direction: row;
+ flex-flow: wrap;
+ align-content: flex-start;
+}
+
+.mx_MyGroups_joinedGroups .mx_GroupTile {
+ min-width: 300px;
+ max-width: 33%;
+ flex: 1 0 300px;
+ height: 75px;
+ margin: 10px 0px;
+ display: flex;
+ align-items: flex-start;
+ cursor: pointer;
+}
+
+.mx_GroupTile_avatar {
+ cursor: grab, -webkit-grab;
+}
+
+.mx_GroupTile_profile {
+ margin-left: 10px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+.mx_GroupTile_profile .mx_GroupTile_name,
+.mx_GroupTile_profile .mx_GroupTile_groupId,
+.mx_GroupTile_profile .mx_GroupTile_desc {
+ padding-right: 10px;
+}
+
+.mx_GroupTile_profile .mx_GroupTile_name {
+ margin: 0px;
+ font-size: 15px;
+}
+
+.mx_GroupTile_profile .mx_GroupTile_groupId {
+ font-size: 13px;
+}
+
+.mx_GroupTile_profile .mx_GroupTile_desc {
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ font-size: 13px;
+ max-height: 36px;
+ overflow: hidden;
+}
+
+.mx_GroupTile_profile .mx_GroupTile_groupId {
+ opacity: 0.7;
+}
diff --git a/res/css/structures/_NotificationPanel.scss b/res/css/structures/_NotificationPanel.scss
new file mode 100644
index 00000000000..a899808d57f
--- /dev/null
+++ b/res/css/structures/_NotificationPanel.scss
@@ -0,0 +1,100 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_NotificationPanel {
+ order: 2;
+
+ flex: 1 1 0;
+
+ width: 100%;
+
+ overflow-y: auto;
+}
+
+.mx_NotificationPanel .mx_RoomView_messageListWrapper {
+ margin-right: 20px;
+}
+
+.mx_NotificationPanel .mx_RoomView_MessageList h2 {
+ margin-left: 0px;
+}
+
+/* FIXME: rather than having EventTile's default CSS be for MessagePanel,
+ we should make EventTile a base CSS class and customise it specifically
+ for usage in {Message,File,Notification}Panel. */
+
+.mx_NotificationPanel .mx_EventTile {
+ word-break: break-word;
+}
+
+.mx_NotificationPanel .mx_EventTile_roomName {
+ font-weight: bold;
+ font-size: 14px;
+}
+
+.mx_NotificationPanel .mx_EventTile_roomName a {
+ color: $primary-fg-color;
+}
+
+.mx_NotificationPanel .mx_EventTile_avatar {
+ top: 8px;
+ left: 0px;
+}
+
+.mx_NotificationPanel .mx_EventTile .mx_SenderProfile,
+.mx_NotificationPanel .mx_EventTile .mx_MessageTimestamp {
+ color: $primary-fg-color;
+ font-size: 12px;
+ display: inline;
+ padding-left: 0px;
+}
+
+.mx_NotificationPanel .mx_EventTile_senderDetails {
+ padding-left: 32px;
+ padding-top: 8px;
+ position: relative;
+}
+
+.mx_NotificationPanel .mx_EventTile_roomName a,
+.mx_NotificationPanel .mx_EventTile_senderDetails a {
+ text-decoration: none ! important;
+}
+
+.mx_NotificationPanel .mx_EventTile .mx_MessageTimestamp {
+ visibility: visible;
+ position: initial;
+ display: inline;
+}
+
+.mx_NotificationPanel .mx_EventTile_line {
+ margin-right: 0px;
+ padding-left: 32px;
+ padding-top: 0px;
+ padding-bottom: 0px;
+ padding-right: 0px;
+}
+
+.mx_NotificationPanel .mx_EventTile:hover .mx_EventTile_line {
+ background-color: $primary-bg-color;
+}
+
+.mx_NotificationPanel .mx_EventTile_selected .mx_EventTile_line {
+ padding-left: 0px;
+}
+
+.mx_NotificationPanel .mx_EventTile_content {
+ margin-right: 0px;
+}
\ No newline at end of file
diff --git a/res/css/structures/_RightPanel.scss b/res/css/structures/_RightPanel.scss
new file mode 100644
index 00000000000..b4dff612ed0
--- /dev/null
+++ b/res/css/structures/_RightPanel.scss
@@ -0,0 +1,133 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_RightPanel {
+ position: relative;
+
+ display: flex;
+ flex-direction: column;
+}
+
+.mx_RightPanel_header {
+ order: 1;
+
+ border-bottom: 1px solid $primary-hairline-color;
+ margin-right: 20px;
+
+ flex: 0 0 70px;
+}
+
+/** Fixme - factor this out with the main header **/
+
+.mx_RightPanel_headerButtonGroup {
+ margin-top: 6px;
+ display: flex;
+ width: 100%;
+ background-color: $primary-bg-color;
+ margin-left: 0px;
+}
+
+.mx_RightPanel_headerButton {
+ cursor: pointer;
+ flex: 0 0 auto;
+ vertical-align: top;
+ padding-left: 4px;
+ padding-right: 5px;
+ text-align: center;
+ position: relative;
+}
+
+.mx_RightPanel_headerButton object {
+ pointer-events: none;
+ padding-bottom: 3px;
+}
+
+.mx_RightPanel_headerButton_highlight {
+ width: 25px;
+ height: 5px;
+ border-radius: 5px;
+ background-color: $accent-color;
+ opacity: 0.2;
+}
+
+.mx_RightPanel_headerButton_badge {
+ font-size: 11px;
+ color: $accent-color;
+ font-weight: bold;
+ padding-bottom: 2px;
+}
+
+.mx_RightPanel_collapsebutton {
+ flex: 1;
+ text-align: right;
+ margin-top: 20px;
+}
+
+.mx_RightPanel .mx_MemberList,
+.mx_RightPanel .mx_MemberInfo,
+.mx_RightPanel .mx_GroupRoomList,
+.mx_RightPanel_blank {
+ order: 2;
+ flex: 1 1 0;
+}
+
+.mx_RightPanel .mx_RoomView_messagePanelSpinner {
+ order: 2;
+ margin: auto;
+}
+
+.mx_RightPanel_footer {
+ order: 3;
+
+ border-top: 1px solid $primary-hairline-color;
+ margin-right: 20px;
+
+ flex: 0 0 60px;
+}
+
+.mx_RightPanel_footer .mx_RightPanel_invite {
+ font-size: 14px;
+ color: $primary-fg-color;
+ padding-top: 13px;
+ padding-left: 5px;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+}
+
+.collapsed .mx_RightPanel_footer .mx_RightPanel_invite {
+ display: none;
+}
+
+.mx_RightPanel_invite .mx_RightPanel_icon object {
+ pointer-events: none;
+}
+
+.mx_RightPanel_invite .mx_RightPanel_message {
+ padding-left: 10px;
+ line-height: 18px;
+}
+
+.mx_MatrixChat_useCompactLayout {
+ .mx_RightPanel_footer {
+ flex: 0 0 50px;
+ }
+
+ .mx_RightPanel_footer .mx_RightPanel_invite {
+ line-height: 25px;
+ padding-top: 8px;
+ }
+}
diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss
new file mode 100644
index 00000000000..9cd3e7284ca
--- /dev/null
+++ b/res/css/structures/_RoomDirectory.scss
@@ -0,0 +1,131 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_RoomDirectory {
+ max-width: 960px;
+ width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+ margin-bottom: 12px;
+ color: $primary-fg-color;
+ word-break: break-word;
+
+ display: flex;
+
+ flex-direction: column;
+}
+
+.mx_RoomDirectory .mx_RoomHeader_simpleHeader {
+ margin-left: 0px;
+}
+
+.mx_RoomDirectory_list {
+ flex: 1;
+
+ display: flex;
+
+ flex-direction: column;
+}
+
+.mx_RoomDirectory_list .mx_RoomView_messageListWrapper {
+ justify-content: flex-start;
+}
+
+.mx_RoomDirectory_listheader {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+ margin-top: 12px;
+ margin-bottom: 12px;
+ border-spacing: 5px;
+}
+
+.mx_RoomDirectory_searchbox {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.mx_RoomDirectory_listheader .mx_NetworkDropdown {
+ display: table-cell;
+ width: 200px;
+}
+
+.mx_RoomDirectory_tableWrapper {
+ overflow-y: auto;
+ flex: 1 1 0;
+}
+
+.mx_RoomDirectory_table {
+ font-size: 14px;
+ color: $primary-fg-color;
+ width: 100%;
+ text-align: left;
+ table-layout: fixed;
+}
+
+.mx_RoomDirectory_roomAvatar {
+ width: 24px;
+ padding-left: 12px;
+ padding-right: 24px;
+ vertical-align: top;
+}
+
+.mx_RoomDirectory_roomDescription {
+ padding-bottom: 16px;
+}
+
+.mx_RoomDirectory_name {
+ display: inline-block;
+ font-weight: 600;
+}
+
+.mx_RoomDirectory_perms {
+ display: inline-block;
+}
+
+.mx_RoomDirectory_perm {
+ display: inline;
+ padding-left: 5px;
+ padding-right: 5px;
+ margin-right: 5px;
+ height: 15px;
+ border-radius: 11px;
+ background-color: $plinth-bg-color;
+ text-transform: uppercase;
+ font-weight: 600;
+ font-size: 11px;
+ color: $accent-color;
+}
+
+.mx_RoomDirectory_topic {
+ cursor: initial;
+}
+
+.mx_RoomDirectory_alias {
+ font-size: 12px;
+ color: $settings-grey-fg-color;
+}
+
+.mx_RoomDirectory_roomMemberCount {
+ text-align: right;
+ width: 100px;
+ padding-right: 10px;
+}
+
+.mx_RoomDirectory_table tr {
+ padding-bottom: 10px;
+ cursor: pointer;
+}
diff --git a/res/css/structures/_RoomStatusBar.scss b/res/css/structures/_RoomStatusBar.scss
new file mode 100644
index 00000000000..ca7431eac22
--- /dev/null
+++ b/res/css/structures/_RoomStatusBar.scss
@@ -0,0 +1,181 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_RoomStatusBar {
+ margin-left: 65px;
+ min-height: 50px;
+}
+
+/* position the indicator in the same place horizontally as .mx_EventTile_avatar. */
+.mx_RoomStatusBar_indicator {
+ padding-left: 17px;
+ padding-right: 12px;
+ margin-left: -73px;
+ margin-top: 15px;
+ float: left;
+ width: 24px;
+ text-align: center;
+}
+
+.mx_RoomStatusBar_callBar {
+ height: 50px;
+ line-height: 50px;
+}
+
+.mx_RoomStatusBar_placeholderIndicator span {
+ color: $primary-fg-color;
+ opacity: 0.5;
+ position: relative;
+ top: -4px;
+/*
+ animation-duration: 1s;
+ animation-name: bounce;
+ animation-direction: alternate;
+ animation-iteration-count: infinite;
+*/
+}
+
+.mx_RoomStatusBar_placeholderIndicator span:nth-child(1) {
+ animation-delay: 0.3s;
+}
+.mx_RoomStatusBar_placeholderIndicator span:nth-child(2) {
+ animation-delay: 0.6s;
+}
+.mx_RoomStatusBar_placeholderIndicator span:nth-child(3) {
+ animation-delay: 0.9s;
+}
+
+@keyframes bounce {
+ from {
+ opacity: 0.5;
+ top: 0;
+ }
+
+ to {
+ opacity: 0.2;
+ top: -3px;
+ }
+}
+
+.mx_RoomStatusBar_typingIndicatorAvatars {
+ width: 52px;
+ margin-top: -1px;
+ text-align: left;
+}
+
+.mx_RoomStatusBar_typingIndicatorAvatars .mx_BaseAvatar_image {
+ margin-right: -12px;
+ border: 1px solid $primary-bg-color;
+}
+
+.mx_RoomStatusBar_typingIndicatorAvatars .mx_BaseAvatar_initial {
+ padding-left: 1px;
+ padding-top: 1px;
+}
+
+.mx_RoomStatusBar_typingIndicatorRemaining {
+ display: inline-block;
+ color: #acacac;
+ background-color: #ddd;
+ border: 1px solid $primary-bg-color;
+ border-radius: 40px;
+ width: 24px;
+ height: 24px;
+ line-height: 24px;
+ font-size: 0.8em;
+ vertical-align: top;
+ text-align: center;
+ position: absolute;
+}
+
+.mx_RoomStatusBar_scrollDownIndicator {
+ cursor: pointer;
+ padding-left: 1px;
+}
+
+.mx_RoomStatusBar_unreadMessagesBar {
+ padding-top: 10px;
+ color: $warning-color;
+ cursor: pointer;
+}
+
+.mx_RoomStatusBar_connectionLostBar {
+ margin-top: 19px;
+ min-height: 58px;
+}
+
+.mx_RoomStatusBar_connectionLostBar img {
+ padding-left: 10px;
+ padding-right: 22px;
+ vertical-align: middle;
+ float: left;
+}
+
+.mx_RoomStatusBar_connectionLostBar_title {
+ color: $warning-color;
+}
+
+.mx_RoomStatusBar_connectionLostBar_desc {
+ color: $primary-fg-color;
+ font-size: 13px;
+ opacity: 0.5;
+}
+
+.mx_RoomStatusBar_resend_link {
+ color: $primary-fg-color ! important;
+ text-decoration: underline ! important;
+ cursor: pointer;
+}
+
+.mx_RoomStatusBar_typingBar {
+ height: 50px;
+ line-height: 50px;
+
+ color: $primary-fg-color;
+ opacity: 0.5;
+ overflow-y: hidden;
+ display: block;
+}
+
+.mx_RoomStatusBar_isAlone {
+ height: 50px;
+ line-height: 50px;
+
+ color: $primary-fg-color;
+ opacity: 0.5;
+ overflow-y: hidden;
+ display: block;
+}
+
+.mx_MatrixChat_useCompactLayout {
+ .mx_RoomStatusBar {
+ min-height: 40px;
+ }
+
+ .mx_RoomStatusBar_indicator {
+ margin-top: 10px;
+ }
+
+ .mx_RoomStatusBar_callBar {
+ height: 40px;
+ line-height: 40px;
+ }
+
+ .mx_RoomStatusBar_typingBar {
+ height: 40px;
+ line-height: 40px;
+ }
+}
diff --git a/res/css/structures/_RoomSubList.scss b/res/css/structures/_RoomSubList.scss
new file mode 100644
index 00000000000..a2863460ad7
--- /dev/null
+++ b/res/css/structures/_RoomSubList.scss
@@ -0,0 +1,244 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_RoomSubList {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+
+ background-color: $roomsublist-background;
+}
+
+.mx_RoomSubList_labelContainer {
+ height: 31px; /* mx_RoomSubList_label height including border */
+ width: 235px; /* LHS Panel width */
+ position: relative;
+}
+
+.mx_RoomSubList_label {
+ position: relative;
+ text-transform: uppercase;
+ color: $roomsublist-label-fg-color;
+ font-weight: 600;
+ font-size: 12px;
+ width: 203px; /* padding + width = LHS Panel width */
+ height: 19px; /* height + padding = 31px = mx_RoomSubList_label height */
+ padding-left: 16px; /* gutter */
+ padding-right: 16px; /* gutter */
+ padding-top: 6px;
+ padding-bottom: 6px;
+ cursor: pointer;
+ background-color: $secondary-accent-color;
+}
+
+.mx_RoomSubList_label.mx_RoomSubList_fixed {
+ position: fixed;
+ top: 0;
+ z-index: 5;
+ /* pointer-events: none; */
+}
+
+.collapsed .mx_RoomSubList_label {
+ height: 17px;
+ width: 28px; /* collapsed LHS Panel width */
+}
+
+.collapsed .mx_RoomSubList_labelContainer {
+ width: 28px; /* collapsed LHS Panel width */
+}
+
+.mx_RoomSubList_roomCount {
+ display: inline-block;
+ font-size: 12px;
+ font-weight: normal;
+ color: $accent-color;
+ padding-left: 5px;
+ text-transform: none;
+}
+
+.collapsed .mx_RoomSubList_roomCount {
+ display: none;
+}
+
+.mx_RoomSubList_badge {
+ display: inline-block;
+ min-width: 15px;
+ height: 15px;
+ position: absolute;
+ right: 8px; /*gutter */
+ top: 7px;
+ border-radius: 8px;
+ color: $accent-fg-color;
+ font-weight: 600;
+ font-size: 10px;
+ text-align: center;
+ padding-top: 1px;
+ padding-left: 4px;
+ padding-right: 4px;
+ background-color: $accent-color;
+}
+
+/*
+.collapsed .mx_RoomSubList_badge {
+ display: none;
+}
+*/
+
+.mx_RoomSubList_badgeHighlight {
+ background-color: $warning-color;
+}
+
+/* This is the bottom of the speech bubble */
+.mx_RoomSubList_badgeHighlight:after {
+ content: "";
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ margin-left: 5px;
+ border-top: 5px solid $warning-color;
+ border-right: 7px solid transparent;
+}
+
+/* Hide the bottom of speech bubble */
+.collapsed .mx_RoomSubList_badgeHighlight:after {
+ display: none;
+}
+
+.mx_RoomSubList_chevron {
+ pointer-events: none;
+ position: absolute;
+ right: 41px;
+ top: 11px;
+}
+
+.mx_RoomSubList_chevronDown {
+ width: 0;
+ height: 0;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+ border-top: 6px solid $roomsublist-chevron-color;
+}
+
+.mx_RoomSubList_chevronUp {
+ width: 0;
+ height: 0;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+ border-bottom: 6px solid $roomsublist-chevron-color;
+}
+
+.mx_RoomSubList_chevronRight {
+ width: 0;
+ height: 0;
+ border-top: 5px solid transparent;
+ border-left: 6px solid $roomsublist-chevron-color;
+ border-bottom: 5px solid transparent;
+}
+
+/* The overflow section */
+.mx_RoomSubList_ellipsis {
+ display: block;
+ line-height: 11px;
+ height: 18px;
+ position: relative;
+ cursor: pointer;
+ font-size: 13px;
+
+ background-color: $secondary-accent-color;
+}
+
+.collapsed .mx_RoomSubList_ellipsis {
+ height: 20px;
+}
+
+.mx_RoomSubList_line {
+ display: inline-block;
+ width: 159px;
+ border-top: dotted 2px $accent-color;
+ vertical-align: middle;
+}
+
+.collapsed .mx_RoomSubList_line {
+ display: none;
+}
+
+.mx_RoomSubList_more {
+ display: inline-block;
+ text-transform: uppercase;
+ font-size: 10px;
+ font-weight: 600;
+ text-align: left;
+ color: $accent-color;
+ padding-left: 7px;
+ padding-right: 7px;
+ padding-left: 7px;
+ vertical-align: middle;
+}
+
+.collapsed .mx_RoomSubList_more {
+ display: none;
+}
+
+.mx_RoomSubList_moreBadge {
+ display: inline-block;
+ min-width: 15px;
+ height: 13px;
+ position: absolute;
+ right: 8px; /*gutter */
+ top: -2px;
+ border-radius: 8px;
+ border: solid 1px $accent-color;
+ color: $accent-fg-color;
+ font-weight: 600;
+ font-size: 10px;
+ text-align: center;
+ padding-top: 1px;
+ padding-left: 3px;
+ padding-right: 3px;
+ background-color: $primary-bg-color;
+ vertical-align: middle;
+}
+
+.mx_RoomSubList_moreBadge.mx_RoomSubList_moreBadgeNotify {
+ background-color: $accent-color;
+ border: 0;
+ padding-top: 3px;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.mx_RoomSubList_moreBadge.mx_RoomSubList_moreBadgeHighlight {
+ background-color: $warning-color;
+ border: 0;
+ padding-top: 3px;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.collapsed .mx_RoomSubList_moreBadge {
+ position: static;
+ margin-left: 16px;
+ margin-top: 2px;
+}
+
+.mx_RoomSubList_ellipsis .mx_RoomSubList_chevronDown {
+ position: relative;
+ top: 4px;
+ left: 2px;
+}
+
+
diff --git a/res/css/structures/_RoomView.scss b/res/css/structures/_RoomView.scss
new file mode 100644
index 00000000000..b8e1190375f
--- /dev/null
+++ b/res/css/structures/_RoomView.scss
@@ -0,0 +1,272 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_RoomView {
+ word-wrap: break-word;
+ position: relative;
+
+ display: flex;
+ width: 100%;
+
+ flex-direction: column;
+}
+
+.mx_RoomView .mx_RoomHeader {
+ order: 1;
+
+ flex: 0 0 70px;
+}
+
+.mx_RoomView_fileDropTarget {
+ min-width: 0px;
+ max-width: 960px;
+ width: 100%;
+ font-size: 18px;
+ text-align: center;
+
+ pointer-events: none;
+
+ padding-left: 12px;
+ padding-right: 12px;
+ margin-left: -12px;
+
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+
+ background-color: $droptarget-bg-color;
+ border: 2px #e1dddd solid;
+ border-bottom: none;
+ position: absolute;
+ top: 70px;
+ bottom: 0px;
+ z-index: 3000;
+}
+
+.mx_RoomView_fileDropTargetLabel {
+ top: 50%;
+ width: 100%;
+ margin-top: -50px;
+ position: absolute;
+}
+
+.mx_RoomView_auxPanel {
+ order: 2;
+
+ min-width: 0px;
+ max-width: 960px;
+ width: 100%;
+ margin: 0px auto;
+
+ overflow: auto;
+ border-bottom: 1px solid $primary-hairline-color;
+
+ flex: 0 0 auto;
+}
+
+.mx_RoomView_auxPanel_apps {
+ max-width: 1920px ! important;
+}
+
+
+.mx_RoomView_body {
+ order: 3;
+ flex: 1 1 0;
+ flex-direction: column;
+ display: flex;
+}
+
+.mx_RoomView_body .mx_RoomView_topUnreadMessagesBar {
+ order: 1;
+}
+
+.mx_RoomView_body .mx_RoomView_messagePanel {
+ order: 2;
+}
+
+.mx_RoomView_body .mx_RoomView_messagePanelSpinner {
+ order: 2;
+ margin: auto;
+}
+
+.mx_RoomView_body .mx_RoomView_statusArea {
+ order: 3;
+}
+
+.mx_RoomView_body .mx_MessageComposer {
+ order: 4;
+}
+
+.mx_RoomView_messagePanel {
+ width: 100%;
+ overflow-y: auto;
+}
+
+.mx_RoomView_messageListWrapper {
+ max-width: 960px;
+ margin: auto;
+
+ min-height: 100%;
+
+ display: flex;
+
+ flex-direction: column;
+
+ justify-content: flex-end;
+}
+
+.mx_RoomView_searchResultsPanel .mx_RoomView_messageListWrapper {
+ justify-content: flex-start;
+}
+
+.mx_RoomView_empty {
+ flex: 1 1 auto;
+ font-size: 13px;
+ padding-left: 3em;
+ padding-right: 3em;
+ margin-right: 20px;
+ margin-top: 33%;
+ text-align: center;
+}
+
+.mx_RoomView_MessageList {
+ width: 100%;
+ list-style-type: none;
+ padding: 0px;
+}
+
+.mx_RoomView_MessageList li {
+ clear: both;
+}
+
+li.mx_RoomView_myReadMarker_container {
+ height: 0px;
+ margin: 0px;
+ padding: 0px;
+ border: 0px;
+}
+
+hr.mx_RoomView_myReadMarker {
+ border-top: solid 1px $accent-color;
+ border-bottom: solid 1px $accent-color;
+ margin-top: 0px;
+ position: relative;
+ top: -1px;
+ z-index: 1;
+}
+
+.mx_RoomView_statusArea {
+ width: 100%;
+ flex: 0 0 auto;
+
+ max-height: 0px;
+ background-color: $primary-bg-color;
+ z-index: 1000;
+ overflow: hidden;
+
+ -webkit-transition: all .2s ease-out;
+ -moz-transition: all .2s ease-out;
+ -ms-transition: all .2s ease-out;
+ -o-transition: all .2s ease-out;
+}
+
+.mx_RoomView_statusArea_expanded {
+ max-height: 100px;
+}
+
+.mx_RoomView_statusAreaBox {
+ max-width: 960px;
+ margin: auto;
+ min-height: 50px;
+}
+
+.mx_RoomView_statusAreaBox_line {
+ margin-left: 65px;
+ border-top: 1px solid $primary-hairline-color;
+ height: 1px;
+}
+
+.mx_RoomView_callStatusBar .mx_UploadBar_uploadProgressInner {
+ background-color: $primary-bg-color;
+}
+
+.mx_RoomView_callStatusBar .mx_UploadBar_uploadFilename {
+ color: $accent-fg-color;
+ opacity: 1.0;
+}
+
+.mx_RoomView_inCall .mx_RoomView_statusAreaBox_line {
+ margin-top: 2px;
+ border: none;
+ height: 0px;
+}
+
+.mx_RoomView_inCall .mx_MessageComposer_wrapper {
+ border-top: 2px hidden;
+ padding-top: 1px;
+}
+
+.mx_RoomView_inCall .mx_RoomView_statusAreaBox {
+ background-color: $accent-color;
+ color: $accent-fg-color;
+ position: relative;
+}
+
+.mx_RoomView_voipChevron {
+ position: absolute;
+ bottom: -11px;
+ right: 11px;
+}
+
+.mx_RoomView_voipButton {
+ float: right;
+ margin-right: 13px;
+ margin-top: 10px;
+ cursor: pointer;
+}
+
+.mx_RoomView_voipButton object {
+ pointer-events: none;
+}
+
+.mx_RoomView .mx_MessageComposer {
+ width: 100%;
+ flex: 0 0 auto;
+ margin-right: 2px;
+}
+
+.mx_RoomView_ongoingConfCallNotification {
+ width: 100%;
+ text-align: center;
+ background-color: $warning-color;
+ color: $accent-fg-color;
+ font-weight: bold;
+ padding: 6px 0;
+ cursor: pointer;
+}
+
+.mx_RoomView_ongoingConfCallNotification a {
+ color: $accent-fg-color ! important;
+}
+
+.mx_MatrixChat_useCompactLayout {
+ .mx_RoomView_MessageList {
+ margin-bottom: 4px;
+ }
+
+ .mx_RoomView_statusAreaBox {
+ min-height: 42px;
+ }
+}
diff --git a/res/css/structures/_SearchBox.scss b/res/css/structures/_SearchBox.scss
new file mode 100644
index 00000000000..6f08fd47b2d
--- /dev/null
+++ b/res/css/structures/_SearchBox.scss
@@ -0,0 +1,68 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_SearchBox {
+ height: 24px;
+ margin-left: 16px;
+ margin-right: 16px;
+ padding-top: 24px;
+ padding-bottom: 22px;
+
+ border-bottom: 1px solid $panel-divider-color;
+
+ display: flex;
+}
+
+.mx_SearchBox_searchButton {
+ margin-right: 10px;
+ margin-top: 5px;
+ pointer-events: none;
+}
+
+.mx_SearchBox_closeButton {
+ cursor: pointer;
+ margin-top: -5px;
+}
+
+.mx_SearchBox_search {
+ flex: 1 1 auto;
+ width: 0px;
+ font-family: $font-family;
+ font-size: 12px;
+ margin-top: -2px;
+ height: 24px;
+ border: 0px ! important;
+ /* border-bottom: 1px solid rgba(0, 0, 0, 0.1) ! important; */
+ border: 0px;
+}
+
+.mx_SearchBox_minimise,
+.mx_SearchBox_maximise {
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+.mx_SearchBox_minimise {
+ margin-left: 10px;
+}
+
+.mx_SearchBox_maximise {
+ margin-left: 9px;
+}
+
+.mx_SearchBox object {
+ pointer-events: none;
+}
diff --git a/res/css/structures/_TagPanel.scss b/res/css/structures/_TagPanel.scss
new file mode 100644
index 00000000000..ab1d4feac30
--- /dev/null
+++ b/res/css/structures/_TagPanel.scss
@@ -0,0 +1,126 @@
+/*
+Copyright 2017 New Vector Ltd.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_TagPanel {
+ flex: 0 0 60px;
+ background-color: $tertiary-accent-color;
+ cursor: pointer;
+
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.mx_TagPanel .mx_TagPanel_clearButton {
+ /* Constant height within flex mx_TagPanel */
+ height: 70px;
+ width: 60px;
+
+ flex: none;
+
+ display: flex;
+ justify-content: center;
+ align-items: flex-start;
+}
+
+.mx_TagPanel .mx_TagPanel_clearButton object {
+ /* Same as .mx_SearchBox padding-top */
+ margin-top: 24px;
+ pointer-events: none;
+}
+
+.mx_TagPanel .mx_TagPanel_divider {
+ height: 0px;
+ width: 42px;
+ border-bottom: 1px solid $panel-divider-color;
+}
+
+.mx_TagPanel .mx_TagPanel_scroller {
+ flex-grow: 1;
+}
+
+.mx_TagPanel .mx_TagPanel_tagTileContainer {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ height: 100%;
+}
+
+.mx_TagPanel .mx_TagTile {
+ padding: 6px 3px;
+ opacity: 0.5;
+ position: relative;
+}
+.mx_TagPanel .mx_TagTile:focus,
+.mx_TagPanel .mx_TagTile:hover,
+.mx_TagPanel .mx_TagTile.mx_TagTile_selected {
+ opacity: 1;
+}
+
+.mx_TagPanel .mx_TagTile.mx_TagTile_selected {
+ /* To offset border of mx_TagTile_avatar */
+ padding: 3px 0px;
+}
+
+.mx_TagPanel .mx_TagTile.mx_TagTile_selected .mx_TagTile_avatar .mx_BaseAvatar {
+ border: 3px solid $accent-color;
+ background-color: $accent-color;
+ border-radius: 60px;
+
+ /* In case this is a "initial" avatar */
+ display: block;
+ height: 35px;
+ width: 35px;
+}
+
+.mx_TagPanel .mx_TagTile.mx_AccessibleButton:focus {
+ filter: none;
+}
+
+.mx_TagTile_tooltip {
+ position: relative;
+ top: -30px;
+ left: 5px;
+}
+
+.mx_TagTile_context_button {
+ min-width: 15px;
+ height: 15px;
+ position: absolute;
+ right: -5px;
+ top: 1px;
+ border-radius: 8px;
+ background-color: $neutral-badge-color;
+ color: #ffffff;
+ font-weight: 600;
+ font-size: 10px;
+ text-align: center;
+ padding-top: 1px;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.mx_TagPanel_groupsButton {
+ margin-bottom: 17px;
+ margin-top: 18px;
+ height: 25px;
+}
+
+.mx_TagPanel_groupsButton object {
+ pointer-events: none;
+}
diff --git a/res/css/structures/_UploadBar.scss b/res/css/structures/_UploadBar.scss
new file mode 100644
index 00000000000..d76c81668cf
--- /dev/null
+++ b/res/css/structures/_UploadBar.scss
@@ -0,0 +1,61 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_UploadBar {
+ position: relative;
+}
+
+.mx_UploadBar_uploadProgressOuter {
+ height: 5px;
+ margin-left: 63px;
+ margin-top: -1px;
+ padding-bottom: 5px;
+}
+
+.mx_UploadBar_uploadProgressInner {
+ background-color: $accent-color;
+ height: 5px;
+}
+
+.mx_UploadBar_uploadFilename {
+ margin-top: 5px;
+ margin-left: 65px;
+ opacity: 0.5;
+ color: $primary-fg-color;
+}
+
+.mx_UploadBar_uploadIcon {
+ float: left;
+ margin-top: 5px;
+ margin-left: 14px;
+}
+
+.mx_UploadBar_uploadCancel {
+ float: right;
+ margin-top: 5px;
+ margin-right: 10px;
+ position: relative;
+ opacity: 0.6;
+ cursor: pointer;
+ z-index: 1;
+}
+
+.mx_UploadBar_uploadBytes {
+ float: right;
+ margin-top: 5px;
+ margin-right: 30px;
+ color: $accent-color;
+}
diff --git a/res/css/structures/_UserSettings.scss b/res/css/structures/_UserSettings.scss
new file mode 100644
index 00000000000..4830814e4fb
--- /dev/null
+++ b/res/css/structures/_UserSettings.scss
@@ -0,0 +1,253 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2017 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.
+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_UserSettings {
+ max-width: 960px;
+ width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+
+ display: flex;
+ flex-direction: column;
+}
+
+.mx_UserSettings .mx_RoomHeader {
+ order: 1;
+
+ flex: 0 0 70px;
+}
+
+.mx_UserSettings_body {
+ order: 2;
+
+ flex: 1 1 0;
+
+ margin-top: -20px;
+ overflow-y: auto;
+}
+
+.mx_UserSettings h3 {
+ clear: both;
+ margin-left: 63px;
+ text-transform: uppercase;
+ color: $h3-color;
+ font-weight: 600;
+ font-size: 13px;
+ margin-top: 26px;
+ margin-bottom: 10px;
+}
+
+.mx_UserSettings_section h3 {
+ margin-left: 0px;
+}
+
+.mx_UserSettings_spinner {
+ display: inline-block;
+ vertical-align: middle;
+ margin-right: 12px;
+ width: 32px;
+ height: 32px;
+}
+
+.mx_UserSettings_button {
+ @mixin mx_DialogButton;
+ display: inline;
+ margin: auto;
+}
+
+.mx_UserSettings_button:hover {
+ @mixin mx_DialogButton_hover;
+}
+
+.mx_UserSettings_button.danger {
+ background-color: $warning-color;
+}
+
+.mx_UserSettings_section {
+ margin-left: 63px;
+ margin-top: 28px;
+ margin-bottom: 28px;
+}
+
+.mx_UserSettings_cryptoSection ul {
+ display: table;
+}
+.mx_UserSettings_cryptoSection li {
+ display: table-row;
+}
+.mx_UserSettings_cryptoSection label,
+.mx_UserSettings_cryptoSection span {
+ display: table-cell;
+ padding-right: 1em;
+}
+
+.mx_UserSettings_passwordWarning {
+ /* To move the "Sign out" button out of the way */
+ clear: both;
+ color: $warning-color;
+ margin-bottom: 5px;
+}
+
+.mx_UserSettings_importExportButtons {
+ padding-top: 10px;
+ padding-left: 40px;
+}
+
+.mx_UserSettings_importExportButtons .mx_UserSettings_button {
+ margin-right: 1em;
+}
+
+.mx_UserSettings_toggle input {
+ width: 16px;
+ margin-right: 8px;
+ margin-bottom: 8px;
+}
+
+.mx_UserSettings_toggle label {
+ padding-bottom: 21px;
+}
+
+.mx_UserSettings_accountTable
+.mx_UserSettings_notifTable
+{
+ display: table;
+}
+
+.mx_UserSettings_notifTable .mx_Spinner {
+ position: absolute;
+}
+
+.mx_UserSettings_language {
+ width: 200px;
+}
+
+.mx_UserSettings_webRtcDevices_dropdown {
+ width: 50%;
+}
+
+.mx_UserSettings_profileTable
+{
+ display: table;
+ float: left;
+}
+
+.mx_UserSettings_profileTableRow
+{
+ display: table-row;
+}
+
+.mx_UserSettings_profileLabelCell
+{
+ padding-bottom: 21px;
+ display: table-cell;
+ font-weight: bold;
+ padding-right: 24px;
+}
+
+.mx_UserSettings_profileInputCell {
+ display: table-cell;
+ padding-bottom: 21px;
+ width: 240px;
+}
+
+.mx_UserSettings_profileInputCell input,
+.mx_UserSettings_profileInputCell .mx_EditableText
+{
+ display: inline-block;
+ border: 0px;
+ border-bottom: 1px solid $input-underline-color;
+ padding: 0px;
+ width: 240px;
+ color: $input-fg-color;
+ font-family: 'Open Sans', Helvetica, Arial, Sans-Serif;
+ font-size: 16px;
+}
+
+.mx_UserSettings_threepidButton {
+ display: table-cell;
+ padding-left: 0.5em;
+ position: relative;
+ cursor: pointer;
+}
+
+.mx_UserSettings_phoneSection {
+ display:table;
+}
+
+.mx_UserSettings_phoneCountry {
+ width: 70px;
+ display: table-cell;
+}
+
+input.mx_UserSettings_phoneNumberField {
+ margin-left: 3px;
+ width: 172px;
+ border: 1px solid transparent;
+}
+
+.mx_UserSettings_changePasswordButton {
+ float: right;
+ margin-right: 32px;
+ margin-left: 32px;
+}
+
+.mx_UserSettings_logout {
+ float: right;
+ margin-right: 32px;
+ margin-left: 32px;
+}
+
+.mx_UserSettings_avatarPicker {
+ margin-left: 32px;
+ margin-right: 32px;
+ float: right;
+ cursor: pointer;
+}
+
+.mx_UserSettings_avatarPicker_img .mx_BaseAvatar_image {
+ object-fit: cover;
+}
+
+.mx_UserSettings_avatarPicker_edit {
+ text-align: center;
+ margin-top: 10px;
+}
+
+.mx_UserSettings_avatarPicker_edit img {
+ cursor: pointer;
+}
+
+.mx_UserSettings_avatarPicker_edit > input {
+ display: none;
+}
+
+.mx_UserSettings_avatarPicker_imgContainer {
+ display: inline-block;
+}
+
+.mx_UserSettings_avatarPicker_remove {
+ display: inline-block;
+ float: right;
+ margin-right: -15px;
+}
+
+.mx_UserSettings_advanced_spoiler,
+.mx_UserSettings_link {
+ cursor: pointer;
+ color: $accent-color;
+ word-break: break-all;
+}
diff --git a/res/css/structures/_ViewSource.scss b/res/css/structures/_ViewSource.scss
new file mode 100644
index 00000000000..a4c7dcf58a2
--- /dev/null
+++ b/res/css/structures/_ViewSource.scss
@@ -0,0 +1,23 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_ViewSource pre {
+ text-align: left;
+ font-size: 12px;
+ padding: 0.5em 1em 0.5em 1em;
+ word-wrap: break-word;
+ white-space: pre-wrap;
+}
diff --git a/res/css/structures/login/_Login.scss b/res/css/structures/login/_Login.scss
new file mode 100644
index 00000000000..84b8306a74a
--- /dev/null
+++ b/res/css/structures/login/_Login.scss
@@ -0,0 +1,284 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_Login {
+ width: 100%;
+ height: 100%;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ overflow: auto;
+}
+
+.mx_Login h2 {
+ font-weight: 300;
+ margin-top: 32px;
+ margin-bottom: 20px;
+}
+
+.mx_Login_box {
+ width: 300px;
+ min-height: 450px;
+ padding-top: 50px;
+ padding-bottom: 50px;
+ margin: auto;
+}
+
+.mx_Login_logo {
+ text-align: center;
+ height: 150px;
+ margin-bottom: 45px;
+}
+
+.mx_Login_logo img {
+ max-height: 100%
+}
+
+.mx_Login_support {
+ text-align: center;
+ font-size: 13px;
+ margin-top: 0px;
+ opacity: 0.7;
+}
+
+.mx_Login_field {
+ width: 280px;
+ border-radius: 3px;
+ border: 1px solid $strong-input-border-color;
+ font-weight: 300;
+ font-size: 13px;
+ padding: 9px;
+ margin-bottom: 14px;
+}
+
+.mx_Login_field_disabled {
+ opacity: 0.3;
+}
+
+.mx_Login_fieldLabel {
+ margin-top: -10px;
+ margin-left: 8px;
+ margin-bottom: 14px;
+ font-size: 13px;
+ opacity: 0.8;
+}
+
+.mx_Login_submit {
+ @mixin mx_DialogButton;
+ width: 100%;
+ margin-top: 35px;
+ margin-bottom: 24px;
+}
+
+.mx_Login_submit:hover {
+ @mixin mx_DialogButton_hover;
+}
+
+.mx_Login_submit:disabled {
+ opacity: 0.3;
+}
+
+.mx_Login_label {
+ font-size: 13px;
+ opacity: 0.8;
+}
+
+.mx_Login_checkbox,
+.mx_Login_radio {
+ margin-right: 10px;
+}
+
+.mx_Login_create {
+ display: block;
+ text-align: center;
+ width: 100%;
+ font-size: 13px;
+ opacity: 0.8;
+}
+
+.mx_Login_create:link {
+ color: $primary-fg-color;
+}
+
+.mx_Login_links {
+ display: block;
+ text-align: center;
+ margin-top: 15px;
+ width: 100%;
+ font-size: 13px;
+ opacity: 0.8;
+}
+
+.mx_Login_links a:link {
+ color: $primary-fg-color;
+}
+
+.mx_Login_prompt {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ font-size: 13px;
+}
+
+.mx_Login_forgot {
+ font-size: 15px;
+}
+
+.mx_Login_forgot:link {
+ color: $primary-fg-color;
+}
+
+.mx_Login_loader {
+ display: inline;
+ position: relative;
+ top: 2px;
+ left: 8px;
+}
+
+.mx_Login_loader .mx_Spinner {
+ display: inline;
+}
+
+.mx_Login_loader .mx_Spinner img {
+ width: 16px;
+ height: 16px;
+}
+
+.mx_Login_error {
+ color: $warning-color;
+ font-weight: bold;
+ text-align: center;
+/*
+ height: 24px;
+*/
+ margin-top: 12px;
+ margin-bottom: 12px;
+}
+
+.mx_Login_type_container {
+ display: flex;
+ margin-bottom: 14px;
+}
+
+.mx_Login_type_label {
+ flex-grow: 1;
+ line-height: 35px;
+}
+
+.mx_Login_type_dropdown {
+ display: inline-block;
+ min-width: 170px;
+ align-self: flex-end;
+ flex: 1 1 auto;
+}
+
+.mx_Login_field_group {
+ display: flex;
+}
+
+.mx_Login_field_prefix {
+ height: 34px;
+ padding: 0px 5px;
+ line-height: 33px;
+
+ background-color: #eee;
+ border: 1px solid #c7c7c7;
+ border-right: 0px;
+ border-radius: 3px 0px 0px 3px;
+
+ text-align: center;
+}
+
+.mx_Login_field_suffix {
+ height: 34px;
+ padding: 0px 5px;
+ line-height: 33px;
+
+ background-color: #eee;
+ border: 1px solid #c7c7c7;
+ border-left: 0px;
+ border-radius: 0px 3px 3px 0px;
+
+ text-align: center;
+ flex-grow: 1;
+}
+
+.mx_Login_username {
+ height: 16px;
+ flex-shrink: 1;
+ min-width: 0px;
+}
+
+.mx_Login_phoneNumberField {
+ height: 16px;
+}
+
+.mx_Login_field_has_prefix {
+ border-top-left-radius: 0px;
+ border-bottom-left-radius: 0px;
+}
+
+.mx_Login_field_has_suffix {
+ border-top-right-radius: 0px;
+ border-bottom-right-radius: 0px;
+}
+
+.mx_Login_phoneSection {
+ display:flex;
+}
+
+.mx_Login_phoneCountry {
+ margin-bottom: 14px;
+ width: 150px;
+
+ /* To override mx_Login_field_prefix */
+ text-align: left;
+ padding: 0px;
+ background-color: $primary-bg-color;
+}
+
+.mx_Login_field_prefix .mx_Dropdown_input {
+ /* To use prefix border instead of dropdown border */
+ border: 0;
+}
+
+.mx_Login_phoneCountry .mx_Dropdown_option {
+ /*
+ To match height of mx_Login_field
+ 33px + 2px border from mx_Dropdown_option = 35px
+ */
+ height: 33px;
+ line-height: 33px;
+}
+
+.mx_Login_phoneCountry .mx_Dropdown_option img {
+ margin: 3px;
+ vertical-align: top;
+}
+
+.mx_Login_language {
+ margin-left: auto;
+ margin-right: auto;
+ min-width: 60%;
+}
+
+.mx_Login_language_div {
+ display: flex;
+ margin-top: 12px;
+ margin-bottom: 12px;
+}
+
diff --git a/res/css/views/avatars/_BaseAvatar.scss b/res/css/views/avatars/_BaseAvatar.scss
new file mode 100644
index 00000000000..ee2d9c190fb
--- /dev/null
+++ b/res/css/views/avatars/_BaseAvatar.scss
@@ -0,0 +1,35 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_BaseAvatar {
+ position: relative;
+}
+
+.mx_BaseAvatar_initial {
+ position: absolute;
+ left: 0px;
+ color: $avatar-initial-color;
+ text-align: center;
+ speak: none;
+ pointer-events: none;
+ font-weight: normal;
+}
+
+.mx_BaseAvatar_image {
+ border-radius: 40px;
+ vertical-align: top;
+ background-color: $avatar-bg-color;
+}
diff --git a/res/css/views/context_menus/_MessageContextMenu.scss b/res/css/views/context_menus/_MessageContextMenu.scss
new file mode 100644
index 00000000000..85e8080c880
--- /dev/null
+++ b/res/css/views/context_menus/_MessageContextMenu.scss
@@ -0,0 +1,25 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MessageContextMenu_field {
+ padding: 3px 6px 3px 6px;
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+.mx_MessageContextMenu_field.mx_MessageContextMenu_fieldSet {
+ font-weight: bold;
+}
diff --git a/res/css/views/context_menus/_RoomTileContextMenu.scss b/res/css/views/context_menus/_RoomTileContextMenu.scss
new file mode 100644
index 00000000000..598f8ac249d
--- /dev/null
+++ b/res/css/views/context_menus/_RoomTileContextMenu.scss
@@ -0,0 +1,114 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_RoomTileContextMenu_tag_field, .mx_RoomTileContextMenu_leave {
+ padding-top: 8px;
+ padding-right: 20px;
+ padding-bottom: 8px;
+ cursor: pointer;
+ white-space: nowrap;
+ display: flex;
+ align-items: center;
+ line-height: 16px;
+}
+
+.mx_RoomTileContextMenu_tag_field.mx_RoomTileContextMenu_tag_fieldSet {
+ font-weight: bold;
+}
+
+.mx_RoomTileContextMenu_tag_field.mx_RoomTileContextMenu_tag_fieldSet .mx_RoomTileContextMenu_tag_icon {
+ display: none;
+}
+
+.mx_RoomTileContextMenu_tag_field.mx_RoomTileContextMenu_tag_fieldSet .mx_RoomTileContextMenu_tag_icon_set {
+ display: inline-block;
+}
+
+.mx_RoomTileContextMenu_tag_field.mx_RoomTileContextMenu_tag_fieldDisabled {
+ color: rgba(0, 0, 0, 0.2);
+}
+
+.mx_RoomTileContextMenu_tag_icon {
+ padding-right: 8px;
+ padding-left: 4px;
+ display: inline-block
+}
+
+.mx_RoomTileContextMenu_tag_icon_set {
+ padding-right: 8px;
+ padding-left: 4px;
+ display: none;
+}
+
+.mx_RoomTileContextMenu_separator {
+ margin-top: 0;
+ margin-bottom: 0;
+ border-bottom-style: none;
+ border-left-style: none;
+ border-right-style: none;
+ border-top-style: solid;
+ border-top-width: 1px;
+ border-color: $menu-border-color;
+}
+
+.mx_RoomTileContextMenu_leave {
+ color: $warning-color;
+}
+
+.mx_RoomTileContextMenu_tag_fieldSet .mx_RoomTileContextMenu_tag_icon {
+ /* Something to indicate that the icon is the set tag */
+}
+
+.mx_RoomTileContextMenu_notif_picker {
+ position: absolute;
+ top: 16px;
+ left: 5px;
+}
+
+.mx_RoomTileContextMenu_notif_field {
+ padding-top: 4px;
+ padding-right: 6px;
+ padding-bottom: 10px;
+ padding-left: 8px; /* 20px */
+ cursor: pointer;
+ white-space: nowrap;
+ display: flex;
+ align-items: center;
+}
+
+.mx_RoomTileContextMenu_notif_field.mx_RoomTileContextMenu_notif_fieldSet {
+ font-weight: bold;
+}
+
+.mx_RoomTileContextMenu_notif_field.mx_RoomTileContextMenu_notif_fieldDisabled {
+ color: rgba(0, 0, 0, 0.2);
+}
+
+.mx_RoomTileContextMenu_notif_icon {
+ padding-right: 4px;
+ padding-left: 4px;
+}
+
+.mx_RoomTileContextMenu_notif_activeIcon {
+ display: inline-block;
+ opacity: 0;
+ position: relative;
+ left: -5px;
+}
+
+.mx_RoomTileContextMenu_notif_fieldSet .mx_RoomTileContextMenu_notif_activeIcon {
+ opacity: 1;
+}
diff --git a/res/css/views/context_menus/_TagTileContextMenu.scss b/res/css/views/context_menus/_TagTileContextMenu.scss
new file mode 100644
index 00000000000..759b92bd684
--- /dev/null
+++ b/res/css/views/context_menus/_TagTileContextMenu.scss
@@ -0,0 +1,44 @@
+/*
+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_TagTileContextMenu_item {
+ padding-top: 8px;
+ padding-right: 20px;
+ padding-bottom: 8px;
+ cursor: pointer;
+ white-space: nowrap;
+ display: flex;
+ align-items: center;
+ line-height: 16px;
+}
+
+
+.mx_TagTileContextMenu_item_icon {
+ padding-right: 8px;
+ padding-left: 4px;
+ display: inline-block
+}
+
+.mx_TagTileContextMenu_separator {
+ margin-top: 0;
+ margin-bottom: 0;
+ border-bottom-style: none;
+ border-left-style: none;
+ border-right-style: none;
+ border-top-style: solid;
+ border-top-width: 1px;
+ border-color: $menu-border-color;
+}
diff --git a/res/css/views/dialogs/_BugReportDialog.scss b/res/css/views/dialogs/_BugReportDialog.scss
new file mode 100644
index 00000000000..e00d446edaa
--- /dev/null
+++ b/res/css/views/dialogs/_BugReportDialog.scss
@@ -0,0 +1,52 @@
+/*
+Copyright 2017 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_BugReportDialog_field_container {
+ display: flex;
+}
+
+.mx_BugReportDialog_field_label {
+ flex-basis: 150px;
+
+ text-align: right;
+
+ padding-top: 9px;
+ padding-right: 4px;
+
+ line-height: 18px;
+}
+
+.mx_BugReportDialog_field_input {
+ flex-grow: 1;
+
+ /* taken from mx_ChatInviteDialog_inputContainer */
+ border-radius: 3px;
+ border: solid 1px $input-border-color;
+
+ font-size: 14px;
+
+ padding-left: 4px;
+ padding-right: 4px;
+ padding-top: 7px;
+ padding-bottom: 7px;
+
+ margin-bottom: 4px;
+}
+
+.mx_BugReportDialog_field_input[type="text" i] {
+ padding-top: 9px;
+ padding-bottom: 9px;
+}
diff --git a/res/css/views/dialogs/_ChangelogDialog.scss b/res/css/views/dialogs/_ChangelogDialog.scss
new file mode 100644
index 00000000000..460a5f94b13
--- /dev/null
+++ b/res/css/views/dialogs/_ChangelogDialog.scss
@@ -0,0 +1,24 @@
+/*
+Copyright 2016 Aviral Dasgupta
+
+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_ChangelogDialog_content {
+ max-height: 300px;
+ overflow: auto;
+}
+
+.mx_ChangelogDialog_li {
+ padding: 0.2em;
+}
diff --git a/res/css/views/dialogs/_ChatCreateOrReuseChatDialog.scss b/res/css/views/dialogs/_ChatCreateOrReuseChatDialog.scss
new file mode 100644
index 00000000000..0f358a588e4
--- /dev/null
+++ b/res/css/views/dialogs/_ChatCreateOrReuseChatDialog.scss
@@ -0,0 +1,41 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_ChatCreateOrReuseDialog .mx_ChatCreateOrReuseDialog_tiles {
+ margin-top: 24px;
+}
+
+.mx_ChatCreateOrReuseDialog .mx_Dialog_content {
+ margin-bottom: 24px;
+
+ /*
+ To stop spinner that mx_ChatCreateOrReuseDialog_profile replaces from causing a
+ height change
+ */
+ min-height: 100px;
+}
+
+.mx_ChatCreateOrReuseDialog .mx_RoomTile_badge {
+ display: none;
+}
+
+.mx_ChatCreateOrReuseDialog_profile {
+ display: flex;
+}
+
+.mx_ChatCreateOrReuseDialog_profile_name {
+ padding: 14px;
+}
diff --git a/res/css/views/dialogs/_ChatInviteDialog.scss b/res/css/views/dialogs/_ChatInviteDialog.scss
new file mode 100644
index 00000000000..6fc211743d1
--- /dev/null
+++ b/res/css/views/dialogs/_ChatInviteDialog.scss
@@ -0,0 +1,77 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_ChatInviteDialog {
+ /* XXX: padding-left is on mx_Dialog but padding-right has subsequently
+ * been added on other dialogs. Surely all our dialogs should have consistent
+ * right hand padding?
+ */
+ padding-right: 58px;
+}
+
+/* Using a textarea for this element, to circumvent autofill */
+.mx_ChatInviteDialog_input,
+.mx_ChatInviteDialog_input:focus
+{
+ height: 26px;
+ font-size: 14px;
+ font-family: $font-family;
+ padding-left: 12px;
+ padding-right: 12px;
+ margin: 0 !important;
+ border: 0 !important;
+ outline: 0 !important;
+ width: 1000%; /* Pretend that this is an "input type=text" */
+ resize: none;
+ overflow: hidden;
+ vertical-align: middle;
+ box-sizing: border-box;
+ word-wrap: nowrap;
+}
+
+.mx_ChatInviteDialog .mx_Dialog_content {
+ min-height: 50px
+}
+
+.mx_ChatInviteDialog_inputContainer {
+ border-radius: 3px;
+ border: solid 1px $input-border-color;
+ line-height: 36px;
+ padding-left: 4px;
+ padding-right: 4px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ max-height: 150px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.mx_ChatInviteDialog_error {
+ margin-top: 10px;
+ color: $warning-color;
+}
+
+.mx_ChatInviteDialog_cancel {
+ position: absolute;
+ right: 11px;
+ top: 13px;
+ cursor: pointer;
+}
+
+.mx_ChatInviteDialog_cancel object {
+ pointer-events: none;
+}
+
diff --git a/res/css/views/dialogs/_ConfirmUserActionDialog.scss b/res/css/views/dialogs/_ConfirmUserActionDialog.scss
new file mode 100644
index 00000000000..b859d6bf4d4
--- /dev/null
+++ b/res/css/views/dialogs/_ConfirmUserActionDialog.scss
@@ -0,0 +1,53 @@
+/*
+Copyright 2017 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.
+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_ConfirmUserActionDialog .mx_Dialog_content {
+ min-height: 48px;
+ margin-bottom: 24px;
+}
+
+.mx_ConfirmUserActionDialog_avatar {
+ float: left;
+ margin-right: 20px;
+ margin-top: -2px;
+}
+
+.mx_ConfirmUserActionDialog_name {
+ font-size: 18px;
+}
+
+.mx_ConfirmUserActionDialog_userId {
+ font-size: 13px;
+}
+
+.mx_ConfirmUserActionDialog_reasonField {
+ font-family: $font-family;
+ font-size: 14px;
+ color: $primary-fg-color;
+ background-color: $primary-bg-color;
+
+ border-radius: 3px;
+ border: solid 1px $input-border-color;
+ line-height: 36px;
+ padding-left: 16px;
+ padding-right: 16px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+
+ margin-bottom: 24px;
+
+ width: 90%;
+}
diff --git a/res/css/views/dialogs/_CreateGroupDialog.scss b/res/css/views/dialogs/_CreateGroupDialog.scss
new file mode 100644
index 00000000000..500e12ee496
--- /dev/null
+++ b/res/css/views/dialogs/_CreateGroupDialog.scss
@@ -0,0 +1,62 @@
+/*
+Copyright 2017 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.
+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_CreateGroupDialog_inputRow {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.mx_CreateGroupDialog_label {
+ text-align: left;
+ padding-bottom: 12px;
+}
+
+.mx_CreateGroupDialog_input {
+ font-size: 15px;
+ border-radius: 3px;
+ border: 1px solid $input-border-color;
+ padding: 9px;
+ color: $primary-fg-color;
+ background-color: $primary-bg-color;
+}
+
+.mx_CreateGroupDialog_input_hasPrefixAndSuffix {
+ border-radius: 0px;
+}
+
+.mx_CreateGroupDialog_input_group {
+ display: flex;
+}
+
+.mx_CreateGroupDialog_prefix,
+.mx_CreateGroupDialog_suffix {
+ height: 35px;
+ padding: 0px 5px;
+ line-height: 37px;
+ background-color: $input-border-color;
+ border: 1px solid $input-border-color;
+ text-align: center;
+}
+
+.mx_CreateGroupDialog_prefix {
+ border-right: 0px;
+ border-radius: 3px 0px 0px 3px;
+}
+
+.mx_CreateGroupDialog_suffix {
+ border-left: 0px;
+ border-radius: 0px 3px 3px 0px;
+}
diff --git a/res/css/views/dialogs/_CreateRoomDialog.scss b/res/css/views/dialogs/_CreateRoomDialog.scss
new file mode 100644
index 00000000000..888f147d216
--- /dev/null
+++ b/res/css/views/dialogs/_CreateRoomDialog.scss
@@ -0,0 +1,33 @@
+/*
+Copyright 2017 Michael Telatynski <7t3chguy@gmail.com>
+
+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_CreateRoomDialog_details_summary {
+ outline: none;
+}
+
+.mx_CreateRoomDialog_label {
+ text-align: left;
+ padding-bottom: 12px;
+}
+
+.mx_CreateRoomDialog_input {
+ font-size: 15px;
+ border-radius: 3px;
+ border: 1px solid $input-border-color;
+ padding: 9px;
+ color: $primary-fg-color;
+ background-color: $primary-bg-color;
+}
diff --git a/res/css/views/dialogs/_DevtoolsDialog.scss b/res/css/views/dialogs/_DevtoolsDialog.scss
new file mode 100644
index 00000000000..8918373ecf1
--- /dev/null
+++ b/res/css/views/dialogs/_DevtoolsDialog.scss
@@ -0,0 +1,166 @@
+/*
+Copyright 2017 Michael Telatynski <7t3chguy@gmail.com>
+
+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_DevTools_RoomStateExplorer_button, .mx_DevTools_RoomStateExplorer_query {
+ margin-bottom: 10px;
+}
+
+.mx_DevTools_label_left {
+ float: left;
+}
+
+.mx_DevTools_label_right {
+ float: right;
+}
+
+.mx_DevTools_label_bottom {
+ clear: both;
+ border-bottom: 1px solid #e5e5e5;
+}
+
+.mx_DevTools_inputRow
+{
+ display: table-row;
+}
+
+.mx_DevTools_inputLabelCell
+{
+ padding-bottom: 21px;
+ display: table-cell;
+ font-weight: bold;
+ padding-right: 24px;
+}
+
+.mx_DevTools_inputCell {
+ display: table-cell;
+ padding-bottom: 21px;
+ width: 240px;
+}
+
+.mx_DevTools_inputCell input
+{
+ display: inline-block;
+ border: 0;
+ border-bottom: 1px solid $input-underline-color;
+ padding: 0;
+ width: 240px;
+ color: $input-fg-color;
+ font-family: 'Open Sans', Helvetica, Arial, Sans-Serif;
+ font-size: 16px;
+}
+
+.mx_DevTools_tgl {
+ display: none;
+
+ // add default box-sizing for this scope
+ &,
+ &:after,
+ &:before,
+ & *,
+ & *:after,
+ & *:before,
+ & + .mx_DevTools_tgl-btn {
+ box-sizing: border-box;
+ &::selection {
+ background: none;
+ }
+ }
+
+ + .mx_DevTools_tgl-btn {
+ outline: 0;
+ display: block;
+ width: 7em;
+ height: 2em;
+ position: relative;
+ cursor: pointer;
+ user-select: none;
+ &:after,
+ &:before {
+ position: relative;
+ display: block;
+ content: "";
+ width: 50%;
+ height: 100%;
+ }
+
+ &:after {
+ left: 0;
+ }
+
+ &:before {
+ display: none;
+ }
+ }
+
+ &:checked + .mx_DevTools_tgl-btn:after {
+ left: 50%;
+ }
+}
+
+.mx_DevTools_tgl-flip {
+ + .mx_DevTools_tgl-btn {
+ padding: 2px;
+ transition: all .2s ease;
+ font-family: sans-serif;
+ perspective: 100px;
+ &:after,
+ &:before {
+ display: inline-block;
+ transition: all .4s ease;
+ width: 100%;
+ text-align: center;
+ position: absolute;
+ line-height: 2em;
+ font-weight: bold;
+ color: #fff;
+ top: 0;
+ left: 0;
+ backface-visibility: hidden;
+ border-radius: 4px;
+ }
+
+ &:after {
+ content: attr(data-tg-on);
+ background: #02C66F;
+ transform: rotateY(-180deg);
+ }
+
+ &:before {
+ background: #FF3A19;
+ content: attr(data-tg-off);
+ }
+
+ &:active:before {
+ transform: rotateY(-20deg);
+ }
+ }
+
+ &:checked + .mx_DevTools_tgl-btn {
+ &:before {
+ transform: rotateY(180deg);
+ }
+
+ &:after {
+ transform: rotateY(0);
+ left: 0;
+ background: #7FC6A6;
+ }
+
+ &:active:after {
+ transform: rotateY(20deg);
+ }
+ }
+}
diff --git a/res/css/views/dialogs/_EncryptedEventDialog.scss b/res/css/views/dialogs/_EncryptedEventDialog.scss
new file mode 100644
index 00000000000..b4dd353370a
--- /dev/null
+++ b/res/css/views/dialogs/_EncryptedEventDialog.scss
@@ -0,0 +1,27 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_EncryptedEventDialog .mx_MemberDeviceInfo {
+ float: right;
+ padding: 0px;
+ margin-right: 42px;
+}
+
+.mx_EncryptedEventDialog .mx_MemberDeviceInfo_textButton {
+ @mixin mx_DialogButton;
+ background-color: $primary-bg-color;
+ color: $accent-color;
+}
\ No newline at end of file
diff --git a/res/css/views/dialogs/_GroupAddressPicker.scss b/res/css/views/dialogs/_GroupAddressPicker.scss
new file mode 100644
index 00000000000..d6c961c0ec3
--- /dev/null
+++ b/res/css/views/dialogs/_GroupAddressPicker.scss
@@ -0,0 +1,25 @@
+/*
+Copyright 2017 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_GroupAddressPicker_checkboxContainer{
+ margin-top: 10px;
+ display: flex;
+}
+
+.mx_GroupAddressPicker_checkboxContainer input[type="checkbox"] {
+ /* Stop flex from shrinking the checkbox */
+ width: 20px;
+}
diff --git a/res/css/views/dialogs/_QuestionDialog.scss b/res/css/views/dialogs/_QuestionDialog.scss
new file mode 100644
index 00000000000..3d47f175925
--- /dev/null
+++ b/res/css/views/dialogs/_QuestionDialog.scss
@@ -0,0 +1,18 @@
+/*
+Copyright 2017 New Vector Ltd.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.mx_QuestionDialog {
+ padding-right: 58px;
+}
diff --git a/res/css/views/dialogs/_SetEmailDialog.scss b/res/css/views/dialogs/_SetEmailDialog.scss
new file mode 100644
index 00000000000..588f10c9cbb
--- /dev/null
+++ b/res/css/views/dialogs/_SetEmailDialog.scss
@@ -0,0 +1,36 @@
+/*
+Copyright 2017 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.
+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_SetEmailDialog_email_input {
+ border-radius: 3px;
+ border: 1px solid $input-border-color;
+ padding: 9px;
+ color: $input-fg-color;
+ background-color: $primary-bg-color;
+ font-size: 15px;
+ width: 100%;
+ max-width: 280px;
+ margin-bottom: 10px;
+}
+
+.mx_SetEmailDialog_email_input:focus {
+ outline: none;
+ box-shadow: none;
+ border: 1px solid $accent-color;
+}
+
+.mx_SetEmailDialog_email_input_placeholder {
+}
diff --git a/res/css/views/dialogs/_SetMxIdDialog.scss b/res/css/views/dialogs/_SetMxIdDialog.scss
new file mode 100644
index 00000000000..f7d8a3d0011
--- /dev/null
+++ b/res/css/views/dialogs/_SetMxIdDialog.scss
@@ -0,0 +1,50 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2017 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.
+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_SetMxIdDialog .mx_Dialog_title {
+ padding-right: 40px;
+}
+
+.mx_SetMxIdDialog_input_group {
+ display: flex;
+}
+
+.mx_SetMxIdDialog_input {
+ border-radius: 3px;
+ border: 1px solid $input-border-color;
+ padding: 9px;
+ color: $primary-fg-color;
+ background-color: $primary-bg-color;
+ font-size: 15px;
+ width: 100%;
+ max-width: 280px;
+}
+
+.mx_SetMxIdDialog_input.error,
+.mx_SetMxIdDialog_input.error:focus {
+ border: 1px solid $warning-color;
+}
+
+.mx_SetMxIdDialog_input_group .mx_Spinner {
+ height: 37px;
+ padding-left: 10px;
+ justify-content: flex-start;
+}
+
+.mx_SetMxIdDialog .success {
+ color: $accent-color;
+}
diff --git a/res/css/views/dialogs/_SetPasswordDialog.scss b/res/css/views/dialogs/_SetPasswordDialog.scss
new file mode 100644
index 00000000000..28a8b7c9d7f
--- /dev/null
+++ b/res/css/views/dialogs/_SetPasswordDialog.scss
@@ -0,0 +1,35 @@
+/*
+Copyright 2017 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.
+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_SetPasswordDialog_change_password input {
+ border-radius: 3px;
+ border: 1px solid $input-border-color;
+ padding: 9px;
+ color: $primary-fg-color;
+ background-color: $primary-bg-color;
+ font-size: 15px;
+ width: 100%;
+ max-width: 280px;
+ margin-bottom: 10px;
+}
+
+.mx_SetPasswordDialog_change_password_button {
+ margin-top: 68px;
+}
+
+.mx_SetPasswordDialog .mx_Dialog_content {
+ margin-bottom: 0px;
+}
diff --git a/res/css/views/dialogs/_UnknownDeviceDialog.scss b/res/css/views/dialogs/_UnknownDeviceDialog.scss
new file mode 100644
index 00000000000..3457e50b928
--- /dev/null
+++ b/res/css/views/dialogs/_UnknownDeviceDialog.scss
@@ -0,0 +1,54 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// CSS voodoo to support a gemini-scrollbar for the contents of the dialog
+.mx_Dialog_unknownDevice .mx_Dialog {
+ // ideally we'd shrink the height to fit when needed, but in practice this
+ // is a pain in the ass. plus might as well make the dialog big given how
+ // important it is.
+ height: 100%;
+
+ // position the gemini scrollbar nicely
+ padding-right: 58px;
+}
+
+.mx_UnknownDeviceDialog {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.mx_UnknownDeviceDialog .mx_Dialog_content {
+ margin-bottom: 24px;
+}
+
+.mx_UnknownDeviceDialog .mx_MemberDeviceInfo {
+ float: right;
+ clear: both;
+ padding: 0px;
+ padding-top: 8px;
+}
+
+.mx_UnknownDeviceDialog .mx_MemberDeviceInfo_textButton {
+ @mixin mx_DialogButton_small;
+ background-color: $primary-bg-color;
+ color: $accent-color;
+}
+
+.mx_UnknownDeviceDialog .mx_UnknownDeviceDialog_deviceList li {
+ height: 40px;
+ border-bottom: 1px solid $primary-hairline-color;
+}
\ No newline at end of file
diff --git a/res/css/views/directory/_NetworkDropdown.scss b/res/css/views/directory/_NetworkDropdown.scss
new file mode 100644
index 00000000000..98503795971
--- /dev/null
+++ b/res/css/views/directory/_NetworkDropdown.scss
@@ -0,0 +1,84 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_NetworkDropdown {
+ position: relative;
+}
+
+.mx_NetworkDropdown_input {
+ position: relative;
+ border-radius: 3px;
+ border: 1px solid $strong-input-border-color;
+ font-weight: 300;
+ font-size: 13px;
+ user-select: none;
+}
+
+.mx_NetworkDropdown_arrow {
+ border-color: $primary-fg-color transparent transparent;
+ border-style: solid;
+ border-width: 5px 5px 0;
+ display: block;
+ height: 0;
+ position: absolute;
+ right: 10px;
+ top: 14px;
+ width: 0
+}
+
+.mx_NetworkDropdown_networkoption {
+ height: 35px;
+ line-height: 35px;
+ padding-left: 8px;
+ padding-right: 8px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.mx_NetworkDropdown_networkoption img {
+ margin: 5px;
+ width: 25px;
+ vertical-align: middle;
+}
+
+input.mx_NetworkDropdown_networkoption, input.mx_NetworkDropdown_networkoption:focus {
+ border: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+.mx_NetworkDropdown_menu {
+ position: absolute;
+ left: -1px;
+ right: -1px;
+ top: 100%;
+ z-index: 2;
+ margin: 0;
+ padding: 0px;
+ border-radius: 3px;
+ border: 1px solid $accent-color;
+ background-color: $primary-bg-color;
+}
+
+.mx_NetworkDropdown_menu .mx_NetworkDropdown_networkoption:hover {
+ background-color: $focus-bg-color;
+}
+
+.mx_NetworkDropdown_menu_network {
+ font-weight: bold;
+}
+
diff --git a/res/css/views/elements/_AccessibleButton.scss b/res/css/views/elements/_AccessibleButton.scss
new file mode 100644
index 00000000000..edf455049b1
--- /dev/null
+++ b/res/css/views/elements/_AccessibleButton.scss
@@ -0,0 +1,24 @@
+/*
+Copyright 2017 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.
+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_AccessibleButton:focus {
+ outline: 0;
+ filter: brightness($focus-brightness);
+}
+
+.mx_AccessibleButton {
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/res/css/views/elements/_AddressSelector.scss b/res/css/views/elements/_AddressSelector.scss
new file mode 100644
index 00000000000..9871a7e881b
--- /dev/null
+++ b/res/css/views/elements/_AddressSelector.scss
@@ -0,0 +1,45 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_AddressSelector {
+ position: absolute;
+ background-color: $primary-bg-color;
+ width: 485px;
+ max-height: 116px;
+ overflow-y: auto;
+ border-radius: 3px;
+ background-color: $primary-bg-color;
+ border: solid 1px $accent-color;
+ cursor: pointer;
+}
+
+.mx_AddressSelector.mx_AddressSelector_empty {
+ display: none;
+}
+
+.mx_AddressSelector_addressListElement .mx_AddressTile {
+ background-color: $primary-bg-color;
+ border: solid 1px $primary-bg-color;
+}
+
+.mx_AddressSelector_addressListElement.mx_AddressSelector_selected {
+ background-color: $selected-color;
+}
+
+.mx_AddressSelector_addressListElement.mx_AddressSelector_selected .mx_AddressTile {
+ background-color: $selected-color;
+ border: solid 1px $selected-color;
+}
diff --git a/res/css/views/elements/_AddressTile.scss b/res/css/views/elements/_AddressTile.scss
new file mode 100644
index 00000000000..0ecfb17c830
--- /dev/null
+++ b/res/css/views/elements/_AddressTile.scss
@@ -0,0 +1,138 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_AddressTile {
+ display: inline-block;
+ border-radius: 3px;
+ background-color: rgba(74, 73, 74, 0.1);
+ border: solid 1px $input-border-color;
+ line-height: 26px;
+ color: $primary-fg-color;
+ font-size: 14px;
+ font-weight: normal;
+ margin-right: 4px;
+}
+
+.mx_AddressTile.mx_AddressTile_error {
+ background-color: rgba(255, 0, 100, 0.1);
+ color: $warning-color;
+ border-color: $warning-color;
+}
+
+.mx_AddressTile_network {
+ display: inline-block;
+ position: relative;
+ padding-left: 2px;
+ padding-right: 4px;
+ vertical-align: middle;
+}
+
+.mx_AddressTile_avatar {
+ display: inline-block;
+ position: relative;
+ padding-left: 2px;
+ padding-right: 7px;
+ vertical-align: middle;
+}
+
+.mx_AddressTile_mx {
+ display: inline-block;
+ margin: 0;
+ border: 0;
+ padding: 0;
+}
+
+.mx_AddressTile_name {
+ display: inline-block;
+ padding-right: 4px;
+ font-weight: 600;
+ overflow: hidden;
+ height: 26px;
+ vertical-align: middle;
+}
+
+.mx_AddressTile_name.mx_AddressTile_justified {
+ width: 180px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ vertical-align: middle;
+}
+
+.mx_AddressTile_id {
+ display: inline-block;
+ padding-right: 11px;
+}
+
+.mx_AddressTile_id.mx_AddressTile_justified {
+ width: 200px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ vertical-align: middle;
+}
+
+.mx_AddressTile_unknownMx {
+ display: inline-block;
+ font-weight: 600;
+ padding-right: 11px;
+}
+
+.mx_AddressTile_unknownMxl.mx_AddressTile_justified {
+ width: 380px; /* name + id width */
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ vertical-align: middle;
+}
+
+.mx_AddressTile_email {
+ display: inline-block;
+ font-weight: 600;
+ padding-right: 11px;
+}
+
+.mx_AddressTile_email.mx_AddressTile_justified {
+ width: 200px; /* same as id width */
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ vertical-align: middle;
+}
+
+.mx_AddressTile_unknown {
+ display: inline-block;
+ padding-right: 11px;
+}
+
+.mx_AddressTile_unknown.mx_AddressTile_justified {
+ width: 380px; /* name + id width */
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ vertical-align: middle;
+}
+
+.mx_AddressTile_dismiss {
+ display: inline-block;
+ padding-right: 11px;
+ padding-left: 1px;
+ cursor: pointer;
+}
+
+.mx_AddressTile_dismiss object {
+ pointer-events: none;
+}
diff --git a/res/css/views/elements/_DirectorySearchBox.scss b/res/css/views/elements/_DirectorySearchBox.scss
new file mode 100644
index 00000000000..94a92b23ce4
--- /dev/null
+++ b/res/css/views/elements/_DirectorySearchBox.scss
@@ -0,0 +1,70 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_DirectorySearchBox {
+ position: relative;
+ border-radius: 3px;
+ border: 1px solid $strong-input-border-color;
+}
+
+.mx_DirectorySearchBox_container {
+ display: flex;
+ padding-left: 9px;
+ padding-right: 9px;
+}
+
+.mx_DirectorySearchBox_input {
+ flex-grow: 1;
+ border: 0;
+ padding: 0;
+ font-weight: 300;
+ font-size: 13px;
+}
+input[type=text].mx_DirectorySearchBox_input:focus {
+ border: 0;
+}
+
+.mx_DirectorySearchBox_joinButton {
+ display: table-cell;
+ padding: 3px;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: $plinth-bg-color;
+ border-radius: 3px;
+ background-image: url('../../img/icon-return.svg');
+ background-position: 8px 70%;
+ background-repeat: no-repeat;
+ text-indent: 18px;
+ font-weight: 600;
+ font-size: 12px;
+ user-select: none;
+ cursor: pointer;
+}
+
+.mx_DirectorySearchBox_clear_wrapper {
+ display: table-cell;
+}
+
+.mx_DirectorySearchBox_clear {
+ display: inline-block;
+ vertical-align: middle;
+ background: url('../../img/icon_context_delete.svg');
+ background-position: 0 50%;
+ background-repeat: no-repeat;
+ width: 15px;
+ height: 15px;
+ cursor: pointer;
+}
diff --git a/res/css/views/elements/_Dropdown.scss b/res/css/views/elements/_Dropdown.scss
new file mode 100644
index 00000000000..69dd1703ee8
--- /dev/null
+++ b/res/css/views/elements/_Dropdown.scss
@@ -0,0 +1,131 @@
+/*
+Copyright 2017 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_Dropdown {
+ position: relative;
+}
+
+.mx_Dropdown_disabled {
+ opacity: 0.3;
+}
+
+.mx_Dropdown_input {
+ position: relative;
+ border-radius: 3px;
+ border: 1px solid $strong-input-border-color;
+ font-weight: 300;
+ font-size: 13px;
+ user-select: none;
+}
+
+.mx_Dropdown_input:focus {
+ border-color: $accent-color;
+}
+
+/* Disable dropdown highlight on focus */
+.mx_Dropdown_input.mx_AccessibleButton:focus {
+ filter: none;
+}
+
+.mx_Dropdown_arrow {
+ border-color: $primary-fg-color transparent transparent;
+ border-style: solid;
+ border-width: 5px 5px 0;
+ display: block;
+ height: 0;
+ position: absolute;
+ right: 10px;
+ top: 14px;
+ width: 0
+}
+
+.mx_Dropdown.left_aligned .mx_Dropdown_arrow {
+ left: 10px;
+}
+
+.mx_Dropdown_input > .mx_Dropdown_option {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.mx_Dropdown.left_aligned .mx_Dropdown_input > .mx_Dropdown_option {
+ padding-left: 25px;
+}
+
+.mx_Dropdown_option {
+ height: 35px;
+ line-height: 35px;
+ padding-left: 8px;
+ padding-right: 8px;
+}
+
+.mx_Dropdown_option div {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.mx_Dropdown_option img {
+ margin: 5px;
+ width: 27px;
+ vertical-align: middle;
+}
+
+input.mx_Dropdown_option, input.mx_Dropdown_option:focus {
+ border: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ // XXX: hack to prevent text box being too big and pushing
+ // its parent out / overlapping the dropdown arrow. Only really
+ // works in the Country dropdown.
+ width: 60%;
+}
+
+.mx_Dropdown_menu {
+ position: absolute;
+ left: -1px;
+ right: -1px;
+ top: 100%;
+ z-index: 2;
+ margin: 0;
+ padding: 0px;
+ border-radius: 3px;
+ border: 1px solid $accent-color;
+ background-color: $primary-bg-color;
+ max-height: 200px;
+ overflow-y: auto;
+}
+
+.mx_Dropdown_menu .mx_Dropdown_option {
+ height: auto;
+ min-height: 35px;
+}
+
+.mx_Dropdown_menu .mx_Dropdown_option_highlight {
+ background-color: $focus-bg-color;
+}
+
+.mx_Dropdown_menu {
+ font-weight: bold;
+}
+
+.mx_Dropdown_searchPrompt {
+ font-weight: normal;
+ margin-left: 5px;
+ margin-bottom: 5px;
+}
+
diff --git a/res/css/views/elements/_EditableItemList.scss b/res/css/views/elements/_EditableItemList.scss
new file mode 100644
index 00000000000..9fbb39aa174
--- /dev/null
+++ b/res/css/views/elements/_EditableItemList.scss
@@ -0,0 +1,62 @@
+/*
+Copyright 2017 New Vector Ltd.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_EditableItemList {
+ margin-top: 12px;
+ margin-bottom: 0px;
+}
+
+.mx_EditableItem {
+ display: flex;
+ margin-left: 56px;
+}
+
+.mx_EditableItem .mx_EditableItem_editable {
+ border: 0px;
+ border-bottom: 1px solid $strong-input-border-color;
+ padding: 0px;
+ min-width: 240px;
+ max-width: 400px;
+ margin-bottom: 16px;
+}
+
+.mx_EditableItem .mx_EditableItem_editable:focus {
+ border-bottom: 1px solid $accent-color;
+ outline: none;
+ box-shadow: none;
+}
+
+.mx_EditableItem .mx_EditableItem_editablePlaceholder {
+ color: $settings-grey-fg-color;
+}
+
+.mx_EditableItem .mx_EditableItem_addButton,
+.mx_EditableItem .mx_EditableItem_removeButton {
+ padding-left: 0.5em;
+ position: relative;
+ cursor: pointer;
+
+ visibility: hidden;
+}
+
+.mx_EditableItem:hover .mx_EditableItem_addButton,
+.mx_EditableItem:hover .mx_EditableItem_removeButton {
+ visibility: visible;
+}
+
+.mx_EditableItemList_label {
+ margin-bottom: 8px;
+}
diff --git a/res/css/views/elements/_ImageView.scss b/res/css/views/elements/_ImageView.scss
new file mode 100644
index 00000000000..8ed0698a723
--- /dev/null
+++ b/res/css/views/elements/_ImageView.scss
@@ -0,0 +1,134 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/* This has got to be the most fragile piece of CSS ever written.
+ But empirically it works on Chrome/FF/Safari
+ */
+
+.mx_ImageView {
+ display: flex;
+ width: 100%;
+ height: 100%;
+ align-items: center;
+}
+
+.mx_ImageView_lhs {
+ order: 1;
+ flex: 1 1 10%;
+ min-width: 60px;
+ // background-color: #080;
+ // height: 20px;
+}
+
+.mx_ImageView_content {
+ order: 2;
+ /* min-width hack needed for FF */
+ min-width: 0px;
+ height: 90%;
+ flex: 15 15 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.mx_ImageView_content img {
+ max-width: 100%;
+ /* XXX: max-height interacts badly with flex on Chrome and doesn't relayout properly until you refresh */
+ max-height: 100%;
+ /* object-fit hack needed for Chrome due to Chrome not re-laying-out until you refresh */
+ object-fit: contain;
+ /* background-image: url('../../img/trans.png'); */
+ pointer-events: all;
+}
+
+.mx_ImageView_labelWrapper {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ height: 100%;
+ overflow: auto;
+ pointer-events: all;
+}
+
+.mx_ImageView_label {
+ text-align: left;
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+ padding-left: 30px;
+ padding-right: 30px;
+ min-height: 100%;
+ max-width: 240px;
+ color: $lightbox-fg-color;
+}
+
+.mx_ImageView_cancel {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ padding: 35px;
+ cursor: pointer;
+}
+
+.mx_ImageView_name {
+ font-size: 18px;
+ margin-bottom: 6px;
+ word-wrap: break-word;
+}
+
+.mx_ImageView_metadata {
+ font-size: 15px;
+ opacity: 0.5;
+}
+
+.mx_ImageView_download {
+ display: table;
+ margin-top: 24px;
+ margin-bottom: 6px;
+ border-radius: 5px;
+ background-color: $lightbox-bg-color;
+ font-size: 14px;
+ padding: 9px;
+ border: 1px solid $lightbox-border-color;
+}
+
+.mx_ImageView_size {
+ font-size: 11px;
+}
+
+.mx_ImageView_link {
+ color: $lightbox-fg-color ! important;
+ text-decoration: none ! important;
+}
+
+.mx_ImageView_button {
+ font-size: 15px;
+ opacity: 0.5;
+ margin-top: 18px;
+ cursor: pointer;
+}
+
+.mx_ImageView_shim {
+ height: 30px;
+}
+
+.mx_ImageView_rhs {
+ order: 3;
+ flex: 1 1 10%;
+ min-width: 300px;
+ // background-color: #800;
+ // height: 20px;
+}
diff --git a/res/css/views/elements/_InlineSpinner.scss b/res/css/views/elements/_InlineSpinner.scss
new file mode 100644
index 00000000000..612b6209c61
--- /dev/null
+++ b/res/css/views/elements/_InlineSpinner.scss
@@ -0,0 +1,24 @@
+/*
+Copyright 2017 New Vector Ltd.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_InlineSpinner {
+ display: inline;
+}
+
+.mx_InlineSpinner img {
+ margin: 0px 6px;
+ vertical-align: -3px;
+}
diff --git a/res/css/views/elements/_MemberEventListSummary.scss b/res/css/views/elements/_MemberEventListSummary.scss
new file mode 100644
index 00000000000..02ecb5d84ad
--- /dev/null
+++ b/res/css/views/elements/_MemberEventListSummary.scss
@@ -0,0 +1,71 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MemberEventListSummary {
+ position: relative;
+}
+
+.mx_TextualEvent.mx_MemberEventListSummary_summary {
+ font-size: 14px;
+ display: inline-flex;
+}
+
+.mx_MemberEventListSummary_avatars {
+ display: inline-block;
+ margin-right: 8px;
+ padding-top: 8px;
+ line-height: 12px;
+}
+
+.mx_MemberEventListSummary_avatars .mx_BaseAvatar {
+ margin-right: -4px;
+ cursor: pointer;
+}
+
+.mx_MemberEventListSummary_toggle {
+ color: $accent-color;
+ cursor: pointer;
+ float: right;
+ margin-right: 10px;
+ margin-top: 8px;
+}
+
+.mx_MemberEventListSummary_line {
+ border-bottom: 1px solid $primary-hairline-color;
+ margin-left: 63px;
+ line-height: 30px;
+}
+
+.mx_MatrixChat_useCompactLayout {
+ .mx_MemberEventListSummary {
+ font-size: 13px;
+ .mx_EventTile_line {
+ line-height: 20px;
+ }
+ }
+
+ .mx_MemberEventListSummary_line {
+ line-height: 22px;
+ }
+
+ .mx_MemberEventListSummary_toggle {
+ margin-top: 3px;
+ }
+
+ .mx_TextualEvent.mx_MemberEventListSummary_summary {
+ font-size: 13px;
+ }
+}
diff --git a/res/css/views/elements/_ProgressBar.scss b/res/css/views/elements/_ProgressBar.scss
new file mode 100644
index 00000000000..a3fee232d0b
--- /dev/null
+++ b/res/css/views/elements/_ProgressBar.scss
@@ -0,0 +1,25 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_ProgressBar {
+ height: 5px;
+ border: 1px solid $progressbar-color;
+}
+
+.mx_ProgressBar_fill {
+ height: 100%;
+ background-color: $progressbar-color;
+}
diff --git a/res/css/views/elements/_Quote.scss b/res/css/views/elements/_Quote.scss
new file mode 100644
index 00000000000..0af555b5aad
--- /dev/null
+++ b/res/css/views/elements/_Quote.scss
@@ -0,0 +1,26 @@
+/*
+Copyright 2017 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.
+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_Quote .mx_DateSeparator {
+ font-size: 1em !important;
+ margin-bottom: 0;
+ padding-bottom: 1px;
+ bottom: -5px;
+}
+
+.mx_Quote_show {
+ cursor: pointer;
+}
diff --git a/res/css/views/elements/_RichText.scss b/res/css/views/elements/_RichText.scss
new file mode 100644
index 00000000000..474a123455d
--- /dev/null
+++ b/res/css/views/elements/_RichText.scss
@@ -0,0 +1,75 @@
+// XXX: bleurgh, what is this? These classes totally break the component
+// naming scheme; it's completely unclear where or how they're being used
+// --Matthew
+
+.mx_UserPill,
+.mx_RoomPill,
+.mx_AtRoomPill {
+ border-radius: 16px;
+ display: inline-block;
+ height: 20px;
+ line-height: 20px;
+ padding-left: 5px;
+}
+
+.mx_EventTile_body .mx_UserPill,
+.mx_EventTile_body .mx_RoomPill {
+ cursor: pointer;
+}
+
+/* More specific to override `.markdown-body a` color */
+.mx_EventTile_content .markdown-body a.mx_UserPill,
+.mx_UserPill {
+ color: $primary-fg-color;
+ background-color: $other-user-pill-bg-color;
+ padding-right: 5px;
+}
+
+.mx_EventTile_highlight .mx_EventTile_content .markdown-body a.mx_UserPill_me,
+.mx_EventTile_content .mx_AtRoomPill,
+.mx_MessageComposer_input .mx_AtRoomPill {
+ color: $accent-fg-color;
+ background-color: $mention-user-pill-bg-color;
+ padding-right: 5px;
+}
+
+/* More specific to override `.markdown-body a` color */
+.mx_EventTile_content .markdown-body a.mx_RoomPill,
+.mx_RoomPill {
+ color: $accent-fg-color;
+ background-color: $rte-room-pill-color;
+ padding-right: 5px;
+}
+
+.mx_UserPill .mx_BaseAvatar,
+.mx_RoomPill .mx_BaseAvatar,
+.mx_AtRoomPill .mx_BaseAvatar {
+ position: relative;
+ left: -3px;
+ top: 2px;
+}
+
+.mx_Markdown_BOLD {
+ font-weight: bold;
+}
+
+.mx_Markdown_ITALIC {
+ font-style: italic;
+}
+
+.mx_Markdown_CODE {
+ padding: .2em 0;
+ margin: 0;
+ font-size: 85%;
+ background-color: $rte-code-bg-color;
+ border-radius: 3px;
+}
+
+.mx_Markdown_HR {
+ display: block;
+ background: $rte-bg-color;
+}
+
+.mx_Markdown_STRIKETHROUGH {
+ text-decoration: line-through;
+}
diff --git a/res/css/views/elements/_RoleButton.scss b/res/css/views/elements/_RoleButton.scss
new file mode 100644
index 00000000000..094e0b9b1b7
--- /dev/null
+++ b/res/css/views/elements/_RoleButton.scss
@@ -0,0 +1,33 @@
+/*
+Copyright 2107 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.
+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_RoleButton {
+ margin-left: 4px;
+ margin-right: 4px;
+ cursor: pointer;
+ display: inline-block;
+}
+
+.mx_RoleButton object {
+ pointer-events: none;
+}
+
+.mx_RoleButton_tooltip {
+ display: inline-block;
+ position: relative;
+ top: -25px;
+ left: 6px;
+}
diff --git a/res/css/views/elements/_Spinner.scss b/res/css/views/elements/_Spinner.scss
new file mode 100644
index 00000000000..aea57379187
--- /dev/null
+++ b/res/css/views/elements/_Spinner.scss
@@ -0,0 +1,28 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_Spinner {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ flex: 1;
+}
+
+.mx_MatrixChat_middlePanel .mx_Spinner {
+ height: auto;
+}
\ No newline at end of file
diff --git a/res/css/views/elements/_SyntaxHighlight.scss b/res/css/views/elements/_SyntaxHighlight.scss
new file mode 100644
index 00000000000..e97401a1607
--- /dev/null
+++ b/res/css/views/elements/_SyntaxHighlight.scss
@@ -0,0 +1,21 @@
+/*
+Copyright 2017 Michael Telatynski <7t3chguy@gmail.com>
+
+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_SyntaxHighlight {
+ /* inhibit hljs styling */
+ background: none !important;
+ color: $light-fg-color !important;
+}
diff --git a/res/css/views/elements/_ToolTipButton.scss b/res/css/views/elements/_ToolTipButton.scss
new file mode 100644
index 00000000000..c496e675158
--- /dev/null
+++ b/res/css/views/elements/_ToolTipButton.scss
@@ -0,0 +1,51 @@
+/*
+Copyright 2017 New Vector Ltd.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_ToolTipButton {
+ display: inline-block;
+ width: 11px;
+ height: 11px;
+ margin-left: 5px;
+
+ border: 2px solid $neutral-badge-color;
+ border-radius: 20px;
+ color: $neutral-badge-color;
+
+ transition: opacity 0.2s ease-in;
+ opacity: 0.6;
+
+ line-height: 11px;
+ text-align: center;
+
+ cursor: pointer;
+}
+
+.mx_ToolTipButton:hover {
+ opacity: 1.0;
+}
+
+.mx_ToolTipButton_container {
+ position: relative;
+ top: -18px;
+ left: 4px;
+}
+
+.mx_ToolTipButton_helpText {
+ width: 400px;
+ text-align: start;
+ line-height: 17px !important;
+}
+
diff --git a/res/css/views/globals/_MatrixToolbar.scss b/res/css/views/globals/_MatrixToolbar.scss
new file mode 100644
index 00000000000..be69b15f375
--- /dev/null
+++ b/res/css/views/globals/_MatrixToolbar.scss
@@ -0,0 +1,62 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MatrixToolbar {
+ background-color: $accent-color;
+ color: $accent-fg-color;
+
+ display: flex;
+ align-items: center;
+}
+
+.mx_MatrixToolbar_warning {
+ margin-left: 16px;
+ margin-right: 8px;
+ margin-top: -2px;
+}
+
+.mx_MatrixToolbar_content {
+ flex: 1;
+}
+
+.mx_MatrixToolbar_link
+{
+ color: $accent-fg-color ! important;
+ text-decoration: underline ! important;
+ cursor: pointer;
+}
+
+.mx_MatrixToolbar_clickable {
+ cursor: pointer;
+}
+
+.mx_MatrixToolbar_close {
+ cursor: pointer;
+}
+
+.mx_MatrixToolbar_close img {
+ display: block;
+ float: right;
+ margin-right: 10px;
+}
+
+.mx_MatrixToolbar_action {
+ margin-right: 16px;
+}
+
+.mx_MatrixToolbar_changelog {
+ white-space: pre;
+}
\ No newline at end of file
diff --git a/res/css/views/groups/_GroupPublicityToggle.scss b/res/css/views/groups/_GroupPublicityToggle.scss
new file mode 100644
index 00000000000..3ea4aa07d6b
--- /dev/null
+++ b/res/css/views/groups/_GroupPublicityToggle.scss
@@ -0,0 +1,42 @@
+/*
+Copyright 2017 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_GroupPublicity_toggle {
+ display: flex;
+ align-items: center;
+ margin: 8px;
+}
+
+.mx_GroupPublicity_toggle > label {
+ display: flex;
+ align-items: flex-start;
+}
+
+.mx_GroupPublicity_toggle > label,
+.mx_GroupPublicity_toggle .mx_GroupTile {
+ width: 50%;
+}
+
+.mx_GroupPublicity_toggle input {
+ margin-right: 8px;
+ vertical-align: -4px;
+}
+
+.mx_GroupPublicity_toggle .mx_GroupTile {
+ display: flex;
+ align-items: flex-start;
+ cursor: pointer;
+}
diff --git a/res/css/views/groups/_GroupRoomList.scss b/res/css/views/groups/_GroupRoomList.scss
new file mode 100644
index 00000000000..fb41ebaa9e2
--- /dev/null
+++ b/res/css/views/groups/_GroupRoomList.scss
@@ -0,0 +1,21 @@
+/*
+Copyright 2017 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_GroupRoomTile {
+ position: relative;
+ color: $primary-fg-color;
+ cursor: pointer;
+}
diff --git a/res/css/views/groups/_GroupUserSettings.scss b/res/css/views/groups/_GroupUserSettings.scss
new file mode 100644
index 00000000000..0c909b7cf75
--- /dev/null
+++ b/res/css/views/groups/_GroupUserSettings.scss
@@ -0,0 +1,23 @@
+/*
+Copyright 2017 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_GroupUserSettings_groupPublicity_scrollbox {
+ height: 200px;
+ border: 1px solid $primary-hairline-color;
+ border-radius: 3px;
+ margin-right: 32px;
+ overflow: hidden;
+}
diff --git a/res/css/views/login/_InteractiveAuthEntryComponents.scss b/res/css/views/login/_InteractiveAuthEntryComponents.scss
new file mode 100644
index 00000000000..183b5cd251e
--- /dev/null
+++ b/res/css/views/login/_InteractiveAuthEntryComponents.scss
@@ -0,0 +1,42 @@
+/*
+Copyright 2017 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.
+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_InteractiveAuthEntryComponents_msisdnWrapper {
+ text-align: center;
+}
+
+.mx_InteractiveAuthEntryComponents_msisdnEntry {
+ font-size: 200%;
+ font-weight: bold;
+ border: 1px solid $strong-input-border-color;
+ border-radius: 3px;
+ width: 6em;
+}
+
+.mx_InteractiveAuthEntryComponents_msisdnEntry:focus {
+ border: 1px solid $accent-color;
+}
+
+.mx_InteractiveAuthEntryComponents_msisdnSubmit {
+ margin-top: 4px;
+ margin-bottom: 5px;
+}
+
+// XXX: This should be a common button class
+.mx_InteractiveAuthEntryComponents_msisdnSubmit:disabled {
+ background-color: $light-fg-color;
+ cursor: default;
+}
diff --git a/res/css/views/login/_ServerConfig.scss b/res/css/views/login/_ServerConfig.scss
new file mode 100644
index 00000000000..894ce198278
--- /dev/null
+++ b/res/css/views/login/_ServerConfig.scss
@@ -0,0 +1,36 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_ServerConfig {
+ margin-top: 7px;
+}
+
+.mx_ServerConfig .mx_Login_field {
+ margin-top: 4px;
+ margin-bottom: 5px;
+}
+
+.mx_ServerConfig_help:link {
+ opacity: 0.8;
+ font-size: 13px;
+ font-weight: 300;
+ color: $primary-fg-color;
+}
+
+.mx_ServerConfig_selector {
+ text-align: center;
+ width: 302px; // for fr i18n
+}
\ No newline at end of file
diff --git a/res/css/views/messages/_DateSeparator.scss b/res/css/views/messages/_DateSeparator.scss
new file mode 100644
index 00000000000..f676d24bef2
--- /dev/null
+++ b/res/css/views/messages/_DateSeparator.scss
@@ -0,0 +1,25 @@
+/*
+Copyright 2017 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.
+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_DateSeparator {
+ clear: both;
+ margin-top: 32px;
+ margin-bottom: 8px;
+ margin-left: 63px;
+ padding-bottom: 6px;
+ border-bottom: 1px solid $primary-hairline-color;
+}
+
diff --git a/res/css/views/messages/_MEmoteBody.scss b/res/css/views/messages/_MEmoteBody.scss
new file mode 100644
index 00000000000..cf722e5ae86
--- /dev/null
+++ b/res/css/views/messages/_MEmoteBody.scss
@@ -0,0 +1,23 @@
+/*
+Copyright 2017 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.
+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_MEmoteBody {
+ white-space: pre-wrap;
+}
+
+.mx_MEmoteBody_sender {
+ cursor: pointer;
+}
diff --git a/res/css/views/messages/_MFileBody.scss b/res/css/views/messages/_MFileBody.scss
new file mode 100644
index 00000000000..6cbce687455
--- /dev/null
+++ b/res/css/views/messages/_MFileBody.scss
@@ -0,0 +1,47 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MFileBody_download {
+ color: $accent-color;
+}
+
+.mx_MFileBody_download a {
+ color: $accent-color;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.mx_MFileBody_download object {
+ margin-left: -16px;
+ padding-right: 4px;
+ margin-top: -4px;
+ vertical-align: middle;
+ pointer-events: none;
+}
+
+/* Remove the border and padding for iframes for download links. */
+.mx_MFileBody_download iframe {
+ margin: 0px;
+ padding: 0px;
+ border: none;
+ width: 100%;
+ /* Set the height of the iframe to be 1 line of text.
+ * Iframes don't automatically size themselves to fit their content.
+ * So either we have to fix the height of the iframe using CSS or
+ * use javascript's cross-origin postMessage API to communicate how
+ * big the content of the iframe is. */
+ height: 1.5em;
+}
diff --git a/res/css/views/messages/_MImageBody.scss b/res/css/views/messages/_MImageBody.scss
new file mode 100644
index 00000000000..bf483feda33
--- /dev/null
+++ b/res/css/views/messages/_MImageBody.scss
@@ -0,0 +1,20 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MImageBody {
+ display: block;
+ margin-right: 34px;
+}
diff --git a/res/css/views/messages/_MNoticeBody.scss b/res/css/views/messages/_MNoticeBody.scss
new file mode 100644
index 00000000000..a88c20863d9
--- /dev/null
+++ b/res/css/views/messages/_MNoticeBody.scss
@@ -0,0 +1,20 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MNoticeBody {
+ white-space: pre-wrap;
+ opacity: 0.6;
+}
diff --git a/res/css/views/messages/_MStickerBody.scss b/res/css/views/messages/_MStickerBody.scss
new file mode 100644
index 00000000000..3e6bbe5aa45
--- /dev/null
+++ b/res/css/views/messages/_MStickerBody.scss
@@ -0,0 +1,46 @@
+/*
+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_MStickerBody {
+ display: block;
+ margin-right: 34px;
+ min-height: 110px;
+ padding: 20px 0;
+}
+
+.mx_MStickerBody_image_container {
+ display: inline-block;
+ position: relative;
+}
+
+.mx_MStickerBody_image {
+ max-width: 100%;
+ opacity: 0;
+}
+
+.mx_MStickerBody_image_visible {
+ opacity: 1;
+}
+
+.mx_MStickerBody_placeholder {
+ position: absolute;
+ opacity: 1;
+}
+
+.mx_MStickerBody_placeholder_invisible {
+ transition: 500ms;
+ opacity: 0;
+}
diff --git a/res/css/views/messages/_MTextBody.scss b/res/css/views/messages/_MTextBody.scss
new file mode 100644
index 00000000000..fcf397fd2d2
--- /dev/null
+++ b/res/css/views/messages/_MTextBody.scss
@@ -0,0 +1,24 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MTextBody {
+ white-space: pre-wrap;
+}
+
+.mx_MTextBody pre{
+ overflow-y: auto;
+ max-height: 30vh;
+}
diff --git a/res/css/views/messages/_MessageTimestamp.scss b/res/css/views/messages/_MessageTimestamp.scss
new file mode 100644
index 00000000000..e21189c59ed
--- /dev/null
+++ b/res/css/views/messages/_MessageTimestamp.scss
@@ -0,0 +1,18 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MessageTimestamp {
+}
diff --git a/res/css/views/messages/_RoomAvatarEvent.scss b/res/css/views/messages/_RoomAvatarEvent.scss
new file mode 100644
index 00000000000..9adce42eefb
--- /dev/null
+++ b/res/css/views/messages/_RoomAvatarEvent.scss
@@ -0,0 +1,26 @@
+/*
+Copyright 2017 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.
+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_RoomAvatarEvent {
+ opacity: 0.5;
+ overflow-y: hidden;
+}
+
+.mx_RoomAvatarEvent_avatar {
+ display: inline;
+ position: relative;
+ top: 5px;
+}
\ No newline at end of file
diff --git a/res/css/views/messages/_SenderProfile.scss b/res/css/views/messages/_SenderProfile.scss
new file mode 100644
index 00000000000..060709b82eb
--- /dev/null
+++ b/res/css/views/messages/_SenderProfile.scss
@@ -0,0 +1,15 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
diff --git a/res/css/views/messages/_TextualEvent.scss b/res/css/views/messages/_TextualEvent.scss
new file mode 100644
index 00000000000..be7565b3c54
--- /dev/null
+++ b/res/css/views/messages/_TextualEvent.scss
@@ -0,0 +1,20 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_TextualEvent {
+ opacity: 0.5;
+ overflow-y: hidden;
+}
diff --git a/res/css/views/messages/_UnknownBody.scss b/res/css/views/messages/_UnknownBody.scss
new file mode 100644
index 00000000000..9036e12bf01
--- /dev/null
+++ b/res/css/views/messages/_UnknownBody.scss
@@ -0,0 +1,16 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_UnknownBody {
+ white-space: pre-wrap;
+}
diff --git a/res/css/views/rooms/_AppsDrawer.scss b/res/css/views/rooms/_AppsDrawer.scss
new file mode 100644
index 00000000000..0cf3e7b9cb4
--- /dev/null
+++ b/res/css/views/rooms/_AppsDrawer.scss
@@ -0,0 +1,271 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_AppsDrawer {
+ margin: 5px;
+}
+
+.mx_AppsDrawer_hidden {
+ display: none;
+}
+
+.mx_AppsContainer {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+}
+
+.mx_AddWidget_button {
+ order: 2;
+ cursor: pointer;
+ padding-right: 12px;
+ padding: 0;
+ margin: 5px auto 5px auto;
+ color: $accent-color;
+ font-size: 12px;
+}
+
+.mx_AddWidget_button_full_width {
+ max-width: 960px;
+}
+
+.mx_SetAppURLDialog_input {
+ border-radius: 3px;
+ border: 1px solid $input-border-color;
+ padding: 9px;
+ color: $primary-hairline-color;
+ background-color: $primary-bg-color;
+ font-size: 15px;
+}
+
+.mx_AppTile {
+ max-width: 960px;
+ width: 50%;
+ margin-right: 5px;
+ border: 1px solid $primary-hairline-color;
+ border-radius: 2px;
+ background-color: $dialog-background-bg-color;
+}
+
+.mx_AppTile:last-child {
+ margin-right: 1px;
+}
+
+.mx_AppTileFullWidth {
+ max-width: 960px;
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ border: 1px solid $primary-hairline-color;
+ border-radius: 2px;
+}
+
+.mx_AppTileMenuBar {
+ margin: 0;
+ padding: 2px 10px;
+ border-bottom: 1px solid $primary-hairline-color;
+ font-size: 10px;
+ background-color: $widget-menu-bar-bg-color;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ cursor: pointer;
+}
+
+.mx_AppTileMenuBarTitle {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ pointer-events: none;
+}
+
+.mx_AppTileMenuBarWidgets {
+ float: right;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+}
+
+.mx_AppTileMenuBarWidget {
+ cursor: pointer;
+ width: 10px;
+ height: 10px;
+ padding: 1px;
+ transition-duration: 500ms;
+ border: 1px solid transparent;
+}
+
+.mx_AppTileMenuBarWidgetDelete {
+ filter: none;
+}
+
+.mx_AppTileMenuBarWidget:hover {
+ border: 1px solid $primary-fg-color;
+ border-radius: 2px;
+}
+
+.mx_AppTileBody{
+ height: 280px;
+ width: 100%;
+ overflow: hidden;
+}
+
+.mx_AppTileBody iframe {
+ width: 100%;
+ height: 280px;
+ overflow: hidden;
+ border: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+}
+
+.mx_AppTileMenuBarWidgetPadding {
+ margin-right: 5px;
+}
+
+.mx_AppIconTile {
+ background-color: $lightbox-bg-color;
+ border: 1px solid rgba(0, 0, 0, 0);
+ width: 200px;
+ box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
+ transition: 0.3s;
+ border-radius: 3px;
+ margin: 5px;
+ display: inline-block;
+}
+
+.mx_AppIconTile.mx_AppIconTile_active {
+ color: $accent-color;
+ border-color: $accent-color;
+}
+
+.mx_AppIconTile:hover {
+ border: 1px solid $accent-color;
+ box-shadow: 0 0 10px 5px rgba(200,200,200,0.5);
+}
+
+.mx_AppIconTile_content {
+ padding: 2px 16px;
+ height: 60px;
+ overflow: hidden;
+}
+
+.mx_AppIconTile_content h4 {
+ margin-top: 5px;
+ margin-bottom: 2px;
+}
+
+.mx_AppIconTile_content p {
+ margin-top: 0;
+ margin-bottom: 5px;
+ font-size: smaller;
+}
+
+.mx_AppIconTile_image {
+ padding: 10px;
+ width: 75%;
+ max-width:100px;
+ max-height:100px;
+ width: auto;
+ height: auto;
+}
+
+.mx_AppIconTile_imageContainer {
+ text-align: center;
+ width: 100%;
+ background-color: white;
+ border-radius: 3px 3px 0 0;
+ height: 155px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+form.mx_Custom_Widget_Form div {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.mx_AppPermissionWarning {
+ text-align: center;
+ background-color: $primary-bg-color;
+ display: flex;
+ height: 100%;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+.mx_AppPermissionWarningImage {
+ margin: 10px 0;
+}
+
+.mx_AppPermissionWarningImage img {
+ width: 100px;
+}
+
+.mx_AppPermissionWarningText {
+ max-width: 400px;
+ margin: 10px auto 10px auto;
+ color: $primary-fg-color;
+}
+
+.mx_AppPermissionWarningTextLabel {
+ font-weight: bold;
+ display: block;
+}
+
+.mx_AppPermissionWarningTextURL {
+ color: $accent-color;
+}
+
+.mx_AppPermissionButton {
+ padding: 5px;
+ border-radius: 5px;
+ color: $warning-color;
+ background-color: $primary-bg-color;
+}
+
+.mx_AppPermissionButton:hover {
+ background-color: $primary-fg-color;
+ cursor: pointer;
+}
+
+.mx_AppLoading {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ font-weight: bold;
+ position: relative;
+ height: 280px;
+}
+
+.mx_AppLoading .mx_Spinner {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+}
+
+.mx_AppLoading iframe {
+ display: none;
+}
diff --git a/res/css/views/rooms/_Autocomplete.scss b/res/css/views/rooms/_Autocomplete.scss
new file mode 100644
index 00000000000..732ada088b4
--- /dev/null
+++ b/res/css/views/rooms/_Autocomplete.scss
@@ -0,0 +1,93 @@
+.mx_Autocomplete {
+ position: absolute;
+ bottom: 0;
+ z-index: 1001;
+ width: 100%;
+ border: 1px solid $primary-hairline-color;
+ background: $primary-bg-color;
+ border-bottom: none;
+ border-radius: 4px 4px 0 0;
+ max-height: 50vh;
+ overflow: auto
+}
+
+.mx_Autocomplete_ProviderSection {
+ border-bottom: 1px solid $primary-hairline-color;
+}
+
+.mx_Autocomplete_Completion_container_pill {
+ margin: 12px;
+ display: flex;
+}
+
+/* a "block" completion takes up a whole line */
+.mx_Autocomplete_Completion_block {
+ height: 34px;
+ display: flex;
+ padding: 0 12px;
+ user-select: none;
+ cursor: pointer;
+ align-items: center;
+ color: $primary-fg-color;
+}
+
+.mx_Autocomplete_Completion_block * {
+ margin: 0 3px;
+}
+
+.mx_Autocomplete_Completion_pill {
+ border-radius: 17px;
+ height: 34px;
+ padding: 0px 5px;
+ display: flex;
+ user-select: none;
+ cursor: pointer;
+ align-items: center;
+ color: $primary-fg-color;
+}
+
+.mx_Autocomplete_Completion_pill > * {
+ margin: 0 3px;
+}
+
+.mx_Autocomplete_Completion_container_truncate {
+ .mx_Autocomplete_Completion_title,
+ .mx_Autocomplete_Completion_subtitle,
+ .mx_Autocomplete_Completion_description {
+ /* Ellipsis for long names/subtitles/descriptions*/
+ max-width: 150px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+}
+
+/* container for pill-style completions */
+.mx_Autocomplete_Completion_container_pill {
+ margin: 12px;
+ display: flex;
+ flex-flow: wrap;
+}
+
+.mx_Autocomplete_Completion.selected {
+ background: $menu-bg-color;
+ outline: none;
+}
+
+.mx_Autocomplete_provider_name {
+ margin: 12px;
+ color: $primary-fg-color;
+ font-weight: 400;
+ opacity: 0.4;
+}
+
+/* styling for common completion elements */
+.mx_Autocomplete_Completion_subtitle {
+ font-style: italic;
+ flex: 1;
+}
+
+.mx_Autocomplete_Completion_description {
+ color: gray;
+}
+
diff --git a/res/css/views/rooms/_EntityTile.scss b/res/css/views/rooms/_EntityTile.scss
new file mode 100644
index 00000000000..031894afdec
--- /dev/null
+++ b/res/css/views/rooms/_EntityTile.scss
@@ -0,0 +1,114 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_EntityTile {
+ display: table-row;
+ position: relative;
+ color: $primary-fg-color;
+ cursor: pointer;
+}
+
+.mx_EntityTile_invite {
+ display: table-cell;
+ vertical-align: middle;
+ margin-left: 10px;
+ width: 26px;
+}
+
+.mx_EntityTile_avatar,
+.mx_GroupRoomTile_avatar {
+ display: table-cell;
+ padding-left: 3px;
+ padding-right: 12px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ vertical-align: middle;
+ width: 36px;
+ height: 36px;
+ position: relative;
+}
+
+.mx_EntityTile_power {
+ position: absolute;
+ width: 16px;
+ height: 17px;
+ top: 0px;
+ right: 6px;
+}
+
+.mx_EntityTile_name,
+.mx_GroupRoomTile_name {
+ display: table-cell;
+ vertical-align: middle;
+ overflow: hidden;
+ font-size: 14px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ max-width: 155px;
+}
+
+.mx_EntityTile_details {
+ display: table-cell;
+ padding-right: 14px;
+ vertical-align: middle;
+}
+
+.mx_EntityTile_name_hover {
+ font-size: 13px;
+}
+
+.mx_EntityTile_chevron {
+ margin-top: 8px;
+ margin-right: -4px;
+ margin-left: 6px;
+ float: right;
+}
+
+.mx_EntityTile_ellipsis .mx_EntityTile_name {
+ font-style: italic;
+ color: $primary-fg-color;
+}
+
+.mx_EntityTile_invitePlaceholder .mx_EntityTile_name {
+ font-style: italic;
+ color: $primary-fg-color;
+}
+
+.mx_EntityTile_unavailable .mx_EntityTile_avatar,
+.mx_EntityTile_unavailable .mx_EntityTile_name,
+.mx_EntityTile_unavailable .mx_EntityTile_name_hover,
+.mx_EntityTile_offline_beenactive .mx_EntityTile_avatar,
+.mx_EntityTile_offline_beenactive .mx_EntityTile_name,
+.mx_EntityTile_offline_beenactive .mx_EntityTile_name_hover
+{
+ opacity: 0.66;
+}
+
+.mx_EntityTile_offline_neveractive .mx_EntityTile_avatar,
+.mx_EntityTile_offline_neveractive .mx_EntityTile_name,
+.mx_EntityTile_offline_neveractive .mx_EntityTile_name_hover
+{
+ opacity: 0.25;
+}
+
+.mx_EntityTile_unknown .mx_EntityTile_avatar,
+.mx_EntityTile_unknown .mx_EntityTile_name,
+.mx_EntityTile_unknown .mx_EntityTile_name_hover
+{
+ opacity: 0.25;
+}
+
+
diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss
new file mode 100644
index 00000000000..4bb81a2e534
--- /dev/null
+++ b/res/css/views/rooms/_EventTile.scss
@@ -0,0 +1,530 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_EventTile {
+ max-width: 100%;
+ clear: both;
+ padding-top: 18px;
+ font-size: 14px;
+ position: relative;
+}
+
+.mx_EventTile.mx_EventTile_info {
+ padding-top: 0px;
+}
+
+.mx_EventTile_avatar {
+ position: absolute;
+ top: 14px;
+ left: 8px;
+ cursor: pointer;
+ z-index: 2;
+}
+
+.mx_EventTile.mx_EventTile_info .mx_EventTile_avatar {
+ top: 8px;
+ left: 65px;
+}
+
+.mx_EventTile_continuation {
+ padding-top: 0px ! important;
+}
+
+.mx_EventTile .mx_SenderProfile {
+ color: $primary-fg-color;
+ font-size: 14px;
+ display: block; /* anti-zalgo, with overflow hidden */
+ overflow-y: hidden;
+ cursor: pointer;
+ padding-left: 65px; /* left gutter */
+ padding-bottom: 0px;
+ padding-top: 0px;
+ margin: 0px;
+ line-height: 22px;
+}
+
+.mx_EventTile .mx_SenderProfile .mx_SenderProfile_name,
+.mx_EventTile .mx_SenderProfile .mx_SenderProfile_aux {
+ opacity: 0.5;
+}
+
+.mx_EventTile .mx_SenderProfile .mx_Flair {
+ opacity: 0.7;
+ margin-left: 5px;
+}
+
+.mx_EventTile .mx_SenderProfile .mx_Flair img {
+ vertical-align: -2px;
+ margin-right: 2px;
+ border-radius: 8px;
+}
+
+.mx_EventTile .mx_MessageTimestamp {
+ display: block;
+ visibility: hidden;
+ white-space: nowrap;
+ color: $event-timestamp-color;
+ font-size: 10px;
+ left: 0px;
+ width: 46px; /* 8 + 30 (avatar) + 8 */
+ text-align: center;
+ position: absolute;
+}
+
+.mx_EventTile_line {
+ position: relative;
+ /* ideally should be 100px, but 95px gives us a max thumbnail size of 800x600, which is nice */
+ margin-right: 110px;
+ padding-left: 65px; /* left gutter */
+ padding-top: 4px;
+ padding-bottom: 2px;
+ border-radius: 4px;
+ min-height: 24px;
+ line-height: 22px;
+}
+
+.mx_EventTile_quote {
+ margin-right: 10px;
+}
+
+.mx_EventTile_info .mx_EventTile_line {
+ padding-left: 83px;
+}
+
+/* HACK to override line-height which is already marked important elsewhere */
+.mx_EventTile_bigEmoji.mx_EventTile_bigEmoji {
+ font-size: 48px ! important;
+ line-height: 48px ! important;
+}
+
+/* this is used for the tile for the event which is selected via the URL.
+ * TODO: ultimately we probably want some transition on here.
+ */
+.mx_EventTile_selected > .mx_EventTile_line {
+ border-left: $accent-color 5px solid;
+ padding-left: 60px;
+ background-color: $event-selected-color;
+}
+
+.mx_EventTile:hover .mx_EventTile_line:not(.mx_EventTile_quote),
+.mx_EventTile.menu .mx_EventTile_line
+{
+ background-color: $event-selected-color;
+}
+
+.mx_EventTile_searchHighlight {
+ background-color: $accent-color;
+ color: $accent-fg-color;
+ border-radius: 5px;
+ padding-left: 2px;
+ padding-right: 2px;
+ cursor: pointer;
+}
+
+.mx_EventTile_searchHighlight a {
+ background-color: $accent-color;
+ color: $accent-fg-color;
+}
+
+.mx_EventTile_encrypting {
+ color: $event-encrypting-color ! important;
+}
+
+.mx_EventTile_sending {
+ color: $event-sending-color;
+}
+
+.mx_EventTile_sending .mx_UserPill,
+.mx_EventTile_sending .mx_RoomPill,
+.mx_EventTile_sending .mx_emojione {
+ opacity: 0.5;
+}
+
+.mx_EventTile_notSent {
+ color: $event-notsent-color;
+}
+
+.mx_EventTile_redacted .mx_EventTile_line .mx_UnknownBody {
+ display: block;
+ width: 100%;
+ height: 22px;
+ width: 250px;
+ border-radius: 11px;
+ background: repeating-linear-gradient(
+ -45deg,
+ $event-redacted-fg-color,
+ $event-redacted-fg-color 3px,
+ transparent 3px,
+ transparent 6px
+ );
+ box-shadow: 0px 0px 3px $event-redacted-border-color inset;
+}
+
+.mx_EventTile_highlight,
+.mx_EventTile_highlight .markdown-body
+ {
+ color: $warning-color;
+}
+
+.mx_EventTile_contextual {
+ opacity: 0.4;
+}
+
+.mx_EventTile_msgOption {
+ float: right;
+ text-align: right;
+ z-index: 1;
+ position: relative;
+ width: 90px;
+
+ /* Hack to stop the height of this pushing the messages apart.
+ Replaces margin-top: -6px. This interacts better with a read
+ marker being in between. Content overflows. */
+ height: 1px;
+
+ margin-right: 10px;
+}
+
+.mx_EventTile_msgOption a {
+ text-decoration: none;
+}
+
+.mx_EventTile_last .mx_MessageTimestamp,
+.mx_EventTile:hover .mx_MessageTimestamp,
+.mx_EventTile.menu .mx_MessageTimestamp
+{
+ visibility: visible;
+}
+
+.mx_MessagePanel_alwaysShowTimestamps .mx_MessageTimestamp {
+ visibility: visible;
+}
+
+.mx_EventTile_selected > div > a > .mx_MessageTimestamp {
+ left: 3px;
+ width: auto;
+}
+
+.mx_EventTile_editButton {
+ position: absolute;
+ display: inline-block;
+ visibility: hidden;
+ cursor: pointer;
+ top: 6px;
+ right: 6px;
+ width: 19px;
+ height: 19px;
+ background-image: url($edit-button-url);
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.mx_EventTile:hover .mx_EventTile_editButton,
+.mx_EventTile.menu .mx_EventTile_editButton
+{
+ visibility: visible;
+}
+
+.mx_EventTile.menu .mx_MessageTimestamp {
+ visibility: visible;
+}
+
+.mx_EventTile_readAvatars {
+ position: relative;
+ display: inline-block;
+ width: 14px;
+ height: 14px;
+ top: 29px;
+}
+
+.mx_EventTile_continuation .mx_EventTile_readAvatars,
+.mx_EventTile_info .mx_EventTile_readAvatars,
+.mx_EventTile_emote .mx_EventTile_readAvatars {
+ top: 7px;
+}
+
+.mx_EventTile_readAvatars .mx_BaseAvatar {
+ position: absolute;
+ display: inline-block;
+}
+
+.mx_EventTile_readAvatarRemainder {
+ color: $event-timestamp-color;
+ font-size: 11px;
+ position: absolute;
+}
+
+/* all the overflow-y: hidden; are to trap Zalgos -
+ but they introduce an implicit overflow-x: auto.
+ so make that explicitly hidden too to avoid random
+ horizontal scrollbars occasionally appearing, like in
+ https://github.com/vector-im/vector-web/issues/1154
+ */
+.mx_EventTile_content {
+ display: block;
+ overflow-y: hidden;
+ overflow-x: hidden;
+ margin-right: 34px;
+}
+
+/* De-zalgoing */
+.mx_EventTile_body {
+ overflow-y: hidden;
+}
+
+/* End to end encryption stuff */
+
+.mx_EventTile_e2eIcon {
+ display: block;
+ position: absolute;
+ top: 9px;
+ left: 46px;
+ z-index: 2;
+ cursor: pointer;
+}
+
+.mx_EventTile_keyRequestInfo {
+ font-size: 12px;
+}
+
+.mx_EventTile_keyRequestInfo_text {
+ opacity: 0.5;
+}
+
+.mx_EventTile_keyRequestInfo_text a {
+ color: $primary-fg-color;
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+.mx_EventTile_keyRequestInfo_tooltip_contents p {
+ text-align: auto;
+ margin-left: 3px;
+ margin-right: 3px;
+}
+
+.mx_EventTile_keyRequestInfo_tooltip_contents p:first-child {
+ margin-top: 0px;
+}
+
+.mx_EventTile_keyRequestInfo_tooltip_contents p:last-child {
+ margin-bottom: 0px;
+}
+
+.mx_EventTile_12hr .mx_EventTile_e2eIcon {
+ padding-left: 5px;
+}
+
+.mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line,
+.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line {
+ padding-left: 60px;
+}
+
+.mx_EventTile_selected.mx_EventTile_info .mx_EventTile_line,
+.mx_EventTile:hover.mx_EventTile_verified.mx_EventTile_info .mx_EventTile_line,
+.mx_EventTile:hover.mx_EventTile_unverified.mx_EventTile_info .mx_EventTile_line {
+ padding-left: 78px;
+}
+
+.mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line {
+ border-left: $e2e-verified-color 5px solid;
+}
+.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line {
+ border-left: $e2e-unverified-color 5px solid;
+}
+
+.mx_EventTile:hover.mx_EventTile_verified .mx_MessageTimestamp,
+.mx_EventTile:hover.mx_EventTile_unverified .mx_MessageTimestamp {
+ left: 3px;
+ width: auto;
+}
+
+/*
+.mx_EventTile_verified .mx_EventTile_e2eIcon {
+ display: none;
+}
+*/
+
+.mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_e2eIcon,
+.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_e2eIcon {
+ display: block;
+ left: 41px;
+}
+
+/* Various markdown overrides */
+
+.mx_EventTile_content .markdown-body {
+ font-family: inherit ! important;
+ white-space: normal ! important;
+ line-height: inherit ! important;
+ color: inherit; // inherit the colour from the dark or light theme by default (but not for code blocks)
+ font-size: 14px;
+}
+
+/* have to use overlay rather than auto otherwise Linux and Windows
+ Chrome gets very confused about vertical spacing:
+ https://github.com/vector-im/vector-web/issues/754
+*/
+.mx_EventTile_content .markdown-body pre {
+ overflow-x: overlay;
+ overflow-y: visible;
+}
+
+.mx_EventTile_content .markdown-body code {
+ // deliberate constants as we're behind an invert filter
+ background-color: #f8f8f8;
+ color: #333;
+}
+
+.mx_EventTile_copyButton {
+ position: absolute;
+ display: inline-block;
+ visibility: hidden;
+ cursor: pointer;
+ top: 6px;
+ right: 6px;
+ width: 19px;
+ height: 19px;
+ background-image: url($copy-button-url);
+}
+
+.mx_EventTile_body pre {
+ position: relative;
+ border: 1px solid transparent;
+}
+
+.mx_EventTile:hover .mx_EventTile_body pre
+{
+ border: 1px solid #e5e5e5; // deliberate constant as we're behind an invert filter
+}
+
+.mx_EventTile_body pre:hover .mx_EventTile_copyButton
+{
+ visibility: visible;
+}
+
+.mx_EventTile_content .markdown-body h1,
+.mx_EventTile_content .markdown-body h2,
+.mx_EventTile_content .markdown-body h3,
+.mx_EventTile_content .markdown-body h4,
+.mx_EventTile_content .markdown-body h5,
+.mx_EventTile_content .markdown-body h6
+{
+ font-family: inherit ! important;
+ color: inherit;
+}
+
+
+/* Make h1 and h2 the same size as h3. */
+.mx_EventTile_content .markdown-body h1,
+.mx_EventTile_content .markdown-body h2
+{
+ font-size: 1.5em;
+}
+
+.mx_EventTile_content .markdown-body a {
+ color: $accent-color;
+}
+
+.mx_EventTile_content .markdown-body .hljs {
+ display: inline ! important;
+}
+
+/* end of overrides */
+
+.mx_MatrixChat_useCompactLayout {
+ .mx_EventTile {
+ padding-top: 4px;
+ }
+
+ .mx_EventTile.mx_EventTile_info {
+ // same as the padding for non-compact .mx_EventTile.mx_EventTile_info
+ padding-top: 0px;
+ font-size: 13px;
+ .mx_EventTile_line {
+ line-height: 20px;
+ }
+ .mx_EventTile_avatar {
+ top: 4px;
+ }
+ }
+
+ .mx_EventTile .mx_SenderProfile {
+ font-size: 13px;
+ }
+
+ .mx_EventTile.mx_EventTile_emote {
+ // add a bit more space for emotes so that avatars don't collide
+ padding-top: 8px;
+ .mx_EventTile_avatar {
+ top: 2px;
+ }
+ .mx_EventTile_line {
+ padding-top: 0px;
+ padding-bottom: 1px;
+ }
+ }
+
+ .mx_EventTile.mx_EventTile_emote.mx_EventTile_continuation {
+ padding-top: 0;
+ .mx_EventTile_line {
+ padding-top: 0px;
+ padding-bottom: 0px;
+ }
+ }
+
+ .mx_EventTile_line {
+ padding-top: 0px;
+ padding-bottom: 0px;
+ }
+
+ .mx_EventTile_avatar {
+ top: 2px;
+ }
+
+ .mx_EventTile_e2eIcon {
+ top: 7px;
+ }
+
+ .mx_EventTile_editButton {
+ top: 3px;
+ }
+
+ .mx_EventTile_readAvatars {
+ top: 27px;
+ }
+
+ .mx_EventTile_continuation .mx_EventTile_readAvatars,
+ .mx_EventTile_emote .mx_EventTile_readAvatars {
+ top: 5px;
+ }
+
+ .mx_EventTile_info .mx_EventTile_readAvatars {
+ top: 4px;
+ }
+
+ .mx_RoomView_MessageList h2 {
+ margin-top: 6px;
+ }
+
+ .mx_EventTile_content .markdown-body {
+ p, ul, ol, dl, blockquote, pre, table {
+ margin-bottom: 4px; // 1/4 of the non-compact margin-bottom
+ }
+ }
+}
diff --git a/res/css/views/rooms/_LinkPreviewWidget.scss b/res/css/views/rooms/_LinkPreviewWidget.scss
new file mode 100644
index 00000000000..4495b142e63
--- /dev/null
+++ b/res/css/views/rooms/_LinkPreviewWidget.scss
@@ -0,0 +1,69 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_LinkPreviewWidget {
+ margin-top: 15px;
+ margin-right: 15px;
+ margin-bottom: 15px;
+ display: flex;
+ border-left: 4px solid $preview-widget-bar-color;
+ color: $preview-widget-fg-color;
+}
+
+.mx_LinkPreviewWidget_image {
+ flex: 0 0 100px;
+ margin-left: 15px;
+ text-align: center;
+ cursor: pointer;
+}
+
+.mx_LinkPreviewWidget_caption {
+ margin-left: 15px;
+ flex: 1 1 auto;
+}
+
+.mx_LinkPreviewWidget_title {
+ display: inline;
+ font-weight: bold;
+ white-space: normal;
+}
+
+.mx_LinkPreviewWidget_siteName {
+ display: inline;
+}
+
+.mx_LinkPreviewWidget_description {
+ margin-top: 8px;
+ white-space: normal;
+ word-wrap: break-word;
+}
+
+.mx_LinkPreviewWidget_cancel {
+ visibility: hidden;
+ cursor: pointer;
+ flex: 0 0 40px;
+}
+
+.mx_LinkPreviewWidget:hover .mx_LinkPreviewWidget_cancel {
+ visibility: visible;
+}
+
+.mx_MatrixChat_useCompactLayout {
+ .mx_LinkPreviewWidget {
+ margin-top: 6px;
+ margin-bottom: 6px;
+ }
+}
diff --git a/res/css/views/rooms/_MemberDeviceInfo.scss b/res/css/views/rooms/_MemberDeviceInfo.scss
new file mode 100644
index 00000000000..5888820e0dd
--- /dev/null
+++ b/res/css/views/rooms/_MemberDeviceInfo.scss
@@ -0,0 +1,74 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MemberDeviceInfo {
+ padding: 10px 0px;
+}
+
+.mx_MemberDeviceInfo.mx_DeviceVerifyButtons {
+ padding: 6px 0;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+}
+
+.mx_MemberDeviceInfo_textButton {
+ @mixin mx_DialogButton_small;
+ margin: 2px;
+ flex: 1;
+}
+
+.mx_MemberDeviceInfo_textButton:hover {
+ @mixin mx_DialogButton_hover;
+}
+
+.mx_MemberDeviceInfo_deviceId {
+ font-size: 13px;
+}
+
+.mx_MemberDeviceInfo_deviceInfo {
+ margin-bottom: 10px;
+ padding-bottom: 10px;
+ border-bottom: 1px solid rgba(0,0,0,0.1);
+}
+
+/* "Unblacklist" is too long for a regular button: make it wider and
+ reduce the padding. */
+.mx_EncryptedEventDialog .mx_MemberDeviceInfo_blacklist,
+.mx_EncryptedEventDialog .mx_MemberDeviceInfo_unblacklist {
+ width: 8em;
+ padding-left: 1em;
+ padding-right: 1em;
+}
+
+.mx_MemberDeviceInfo div.mx_MemberDeviceInfo_verified,
+.mx_MemberDeviceInfo div.mx_MemberDeviceInfo_unverified,
+.mx_MemberDeviceInfo div.mx_MemberDeviceInfo_blacklisted {
+ float: right;
+ padding-left: 1em;
+}
+
+.mx_MemberDeviceInfo div.mx_MemberDeviceInfo_verified {
+ color: $e2e-verified-color;
+}
+
+.mx_MemberDeviceInfo div.mx_MemberDeviceInfo_unverified {
+ color: $e2e-unverified-color;
+}
+
+.mx_MemberDeviceInfo div.mx_MemberDeviceInfo_blacklisted {
+ color: $e2e-warning-color;
+}
diff --git a/res/css/views/rooms/_MemberInfo.scss b/res/css/views/rooms/_MemberInfo.scss
new file mode 100644
index 00000000000..5d47275efe4
--- /dev/null
+++ b/res/css/views/rooms/_MemberInfo.scss
@@ -0,0 +1,112 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MemberInfo {
+ margin-top: 20px;
+ padding-right: 20px;
+ height: 100%;
+ overflow-y: auto;
+}
+
+.mx_MemberInfo h2 {
+ margin-top: 6px;
+}
+
+.mx_MemberInfo .mx_RoomTile_nameContainer {
+ width: 154px;
+}
+
+.mx_MemberInfo .mx_RoomTile_badge {
+ display: none;
+}
+
+.mx_MemberInfo .mx_RoomTile_name {
+ width: 160px;
+}
+
+.mx_MemberInfo_cancel {
+ float: right;
+ margin-right: 10px;
+ cursor: pointer;
+}
+
+.mx_MemberInfo_avatar {
+ clear: both;
+}
+
+.mx_MemberInfo_avatar .mx_BaseAvatar {
+}
+
+.mx_MemberInfo_avatar .mx_BaseAvatar.mx_BaseAvatar_image {
+ cursor: zoom-in;
+}
+
+.mx_MemberInfo_profile {
+ margin-bottom: 16px;
+}
+
+.mx_MemberInfo h3 {
+ text-transform: uppercase;
+ color: $h3-color;
+ font-weight: 600;
+ font-size: 13px;
+ margin-top: 16px;
+ margin-bottom: 14px;
+}
+
+.mx_MemberInfo_profileField {
+ font-size: 13px;
+ position: relative;
+ background-color: $primary-bg-color;
+}
+
+.mx_MemberInfo_buttons {
+ margin-bottom: 16px;
+}
+
+.mx_MemberInfo_field {
+ cursor: pointer;
+ font-size: 13px;
+ color: $accent-color;
+ margin-left: 8px;
+ line-height: 23px;
+}
+
+.mx_MemberInfo_createRoom {
+ cursor: pointer;
+}
+
+.mx_MemberInfo_createRoom_label {
+ width: initial ! important;
+ cursor: pointer;
+}
+
+.mx_MemberInfo label {
+ font-size: 13px;
+}
+
+.mx_MemberInfo label .mx_MemberInfo_label_text {
+ display: inline-block;
+ max-width: 180px;
+ vertical-align: text-top;
+}
+
+.mx_MemberInfo input[type="radio"] {
+ vertical-align: -2px;
+ margin-right: 5px;
+ margin-left: 8px;
+}
+
diff --git a/res/css/views/rooms/_MemberList.scss b/res/css/views/rooms/_MemberList.scss
new file mode 100644
index 00000000000..83fc70aefba
--- /dev/null
+++ b/res/css/views/rooms/_MemberList.scss
@@ -0,0 +1,116 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MemberList,
+.mx_GroupMemberList,
+.mx_GroupRoomList {
+ height: 100%;
+
+ margin-top: 12px;
+ margin-right: 20px;
+
+ flex: 1;
+
+ display: flex;
+
+ flex-direction: column;
+}
+
+.mx_MemberList .mx_Spinner {
+ flex: 0 0 auto;
+}
+
+.mx_MemberList_chevron {
+ position: absolute;
+ right: 35px;
+ margin-top: -15px;
+}
+
+.mx_MemberList_border {
+ overflow-y: auto;
+
+ order: 1;
+ flex: 1 1 0px;
+}
+
+.mx_MemberList_query,
+.mx_GroupMemberList_query,
+.mx_GroupRoomList_query {
+ font-family: $font-family;
+ border-radius: 3px;
+ border: 1px solid $input-border-color;
+ padding: 9px;
+ color: $primary-fg-color;
+ background-color: $primary-bg-color;
+ margin-left: 3px;
+ font-size: 14px;
+ margin-bottom: 8px;
+ width: 189px;
+}
+
+.mx_MemberList_query::-moz-placeholder,
+.mx_GroupMemberList_query::-moz-placeholder,
+.mx_GroupRoomList_query::-moz-placeholder {
+ color: $primary-fg-color;
+ opacity: 0.5;
+ font-size: 14px;
+}
+
+.mx_MemberList_query::-webkit-input-placeholder,
+.mx_GroupMemberList_query::-webkit-input-placeholder,
+.mx_GroupRoomList_query::-webkit-input-placeholder {
+ color: $primary-fg-color;
+ opacity: 0.5;
+ font-size: 14px;
+}
+
+.mx_MemberList_joined {
+ order: 2;
+ flex: 1 0 0;
+
+ overflow-y: auto;
+}
+
+/*
+.mx_MemberList_invited {
+ order: 3;
+ flex: 0 0 100px;
+ overflow-y: auto;
+}
+*/
+
+.mx_GroupMemberList_invited h2,
+.mx_MemberList_invited h2 {
+ text-transform: uppercase;
+ color: $h3-color;
+ font-weight: 600;
+ font-size: 13px;
+ padding-left: 3px;
+ padding-right: 12px;
+ margin-top: 8px;
+ margin-bottom: 4px;
+}
+
+/* we have to have display: table in order for the horizontal wrapping to work */
+.mx_MemberList_wrapper {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.mx_MemberList_outerWrapper {
+ height: 0px;
+}
diff --git a/res/css/views/rooms/_MessageComposer.scss b/res/css/views/rooms/_MessageComposer.scss
new file mode 100644
index 00000000000..2e8f07b7ef6
--- /dev/null
+++ b/res/css/views/rooms/_MessageComposer.scss
@@ -0,0 +1,246 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MessageComposer_wrapper {
+ max-width: 960px;
+ vertical-align: middle;
+ margin: auto;
+ border-top: 1px solid $primary-hairline-color;
+ position: relative;
+}
+
+.mx_MessageComposer_autocomplete_wrapper {
+ position: relative;
+ height: 0;
+}
+
+.mx_MessageComposer_row {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ width: 100%;
+}
+
+.mx_MessageComposer_row div:last-child{
+ padding-right: 0;
+}
+
+.mx_MessageComposer .mx_MessageComposer_avatar {
+ padding-left: 10px;
+ padding-right: 28px;
+}
+
+.mx_MessageComposer .mx_MessageComposer_avatar .mx_BaseAvatar {
+ display: block;
+}
+
+.mx_MessageComposer_composecontrols {
+ width: 100%;
+}
+
+.mx_MessageComposer_e2eIcon {
+ position: absolute;
+ left: 44px;
+}
+
+.mx_MessageComposer_noperm_error {
+ width: 100%;
+ height: 60px;
+ font-style: italic;
+ color: $greyed-fg-color;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.mx_MessageComposer_input_wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+}
+
+.mx_MessageComposer_input {
+ flex: 1;
+ vertical-align: middle;
+ display: flex;
+ flex-direction: column;
+ min-height: 60px;
+ justify-content: center;
+ align-items: flex-start;
+ font-size: 14px;
+ margin-right: 6px;
+}
+
+@keyframes visualbell
+{
+ from { background-color: #faa }
+ to { background-color: $primary-bg-color }
+}
+
+.mx_MessageComposer_input_error {
+ animation: 0.2s visualbell;
+}
+
+.mx_MessageComposer_input_empty .public-DraftEditorPlaceholder-root {
+ display: none;
+}
+
+.mx_MessageComposer_input .DraftEditor-root {
+ width: 100%;
+ flex: 1;
+ word-break: break-word;
+ max-height: 120px;
+ min-height: 21px;
+ overflow: auto;
+}
+
+.mx_MessageComposer_input .DraftEditor-root .DraftEditor-editorContainer {
+ /* Ensure mx_UserPill and mx_RoomPill (see _RichText) are not obscured from the top */
+ padding-top: 2px;
+}
+
+.mx_MessageComposer .public-DraftStyleDefault-block {
+ overflow-x: hidden;
+}
+
+.mx_MessageComposer_input blockquote {
+ color: $blockquote-fg-color;
+ margin: 0 0 16px;
+ padding: 0 15px;
+ border-left: 4px solid $blockquote-bar-color;
+}
+
+.mx_MessageComposer_input pre.public-DraftStyleDefault-pre pre {
+ background-color: $rte-code-bg-color;
+ border-radius: 3px;
+ padding: 10px;
+}
+
+.mx_MessageComposer_input textarea {
+ display: block;
+ width: 100%;
+ padding: 0px;
+ margin-top: 6px;
+ margin-bottom: 6px;
+ border: 0px;
+ resize: none;
+ outline: none;
+ box-shadow: none;
+ color: $primary-fg-color;
+ background-color: $primary-bg-color;
+ font-size: 14px;
+ max-height: 120px;
+ overflow: auto;
+ /* needed for FF */
+ font-family: $font-family;
+}
+
+/* hack for FF as vertical alignment of custom placeholder text is broken */
+.mx_MessageComposer_input textarea::-moz-placeholder {
+ line-height: 100%;
+ color: $accent-color;
+ opacity: 1.0;
+}
+.mx_MessageComposer_input textarea::-webkit-input-placeholder {
+ color: $accent-color;
+}
+
+.mx_MessageComposer_upload,
+.mx_MessageComposer_hangup,
+.mx_MessageComposer_voicecall,
+.mx_MessageComposer_videocall,
+.mx_MessageComposer_apps,
+.mx_MessageComposer_stickers {
+ /*display: table-cell;*/
+ /*vertical-align: middle;*/
+ /*padding-left: 10px;*/
+ padding-right: 5px;
+ cursor: pointer;
+ padding-top: 4px;
+}
+
+.mx_MessageComposer_upload object,
+.mx_MessageComposer_hangup object,
+.mx_MessageComposer_voicecall object,
+.mx_MessageComposer_videocall object,
+.mx_MessageComposer_apps object,
+.mx_MessageComposer_stickers object {
+ pointer-events: none;
+}
+
+.mx_MessageComposer_formatting {
+ cursor: pointer;
+ margin: 0 11px;
+ width: 24px;
+ height: 18px;
+}
+
+.mx_MessageComposer_formatbar_wrapper {
+ width: 100%;
+ background-color: $menu-bg-color;
+ box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.08);
+}
+
+.mx_MessageComposer_formatbar {
+ margin: auto;
+ max-width: 960px;
+ display: flex;
+
+ height: 30px;
+
+ box-sizing: border-box;
+ padding-left: 62px;
+
+ flex-direction: row;
+ align-items: center;
+ font-size: 10px;
+ color: $greyed-fg-color;
+}
+
+.mx_MessageComposer_formatbar * {
+ margin-right: 4px;
+}
+
+.mx_MessageComposer_format_button,
+.mx_MessageComposer_formatbar_cancel,
+.mx_MessageComposer_formatbar_markdown {
+ cursor: pointer;
+}
+
+.mx_MessageComposer_formatbar_cancel {
+ margin-right: 22px;
+}
+
+.mx_MessageComposer_formatbar_markdown {
+ margin-right: 64px;
+}
+
+.mx_MessageComposer_input_markdownIndicator {
+ cursor: pointer;
+ height: 10px;
+ padding: 4px 4px 4px 0;
+ opacity: 0.8;
+}
+
+.mx_MatrixChat_useCompactLayout {
+ .mx_MessageComposer_input {
+ min-height: 50px;
+ }
+
+ .mx_MessageComposer_noperm_error {
+ height: 50px;
+ }
+}
diff --git a/res/css/views/rooms/_PinnedEventTile.scss b/res/css/views/rooms/_PinnedEventTile.scss
new file mode 100644
index 00000000000..ca790ef8f03
--- /dev/null
+++ b/res/css/views/rooms/_PinnedEventTile.scss
@@ -0,0 +1,67 @@
+/*
+Copyright 2017 Travis Ralston
+
+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_PinnedEventTile {
+ min-height: 40px;
+ margin-bottom: 5px;
+ width: 100%;
+ border-radius: 5px; // for the hover
+}
+
+.mx_PinnedEventTile:hover {
+ background-color: $event-selected-color;
+}
+
+.mx_PinnedEventTile .mx_PinnedEventTile_sender {
+ color: #868686;
+ font-size: 0.8em;
+ vertical-align: top;
+ display: block;
+ padding-bottom: 3px;
+}
+
+.mx_PinnedEventTile .mx_EventTile_content {
+ margin-left: 50px;
+ position: relative;
+ top: 0;
+ left: 0;
+}
+
+.mx_PinnedEventTile .mx_BaseAvatar {
+ float: left;
+ margin-right: 10px;
+}
+
+.mx_PinnedEventTile:hover .mx_PinnedEventTile_actions {
+ display: block;
+}
+
+.mx_PinnedEventTile_actions {
+ float: right;
+ margin-right: 10px;
+ display: none;
+}
+
+.mx_PinnedEventTile_unpinButton {
+ display: inline-block;
+ cursor: pointer;
+ margin-left: 10px;
+}
+
+.mx_PinnedEventTile_gotoButton {
+ display: inline-block;
+ font-size: 0.8em;
+}
diff --git a/res/css/views/rooms/_PinnedEventsPanel.scss b/res/css/views/rooms/_PinnedEventsPanel.scss
new file mode 100644
index 00000000000..663d5bdf6e7
--- /dev/null
+++ b/res/css/views/rooms/_PinnedEventsPanel.scss
@@ -0,0 +1,37 @@
+/*
+Copyright 2017 Travis Ralston
+
+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_PinnedEventsPanel {
+ border-top: 1px solid $primary-hairline-color;
+}
+
+.mx_PinnedEventsPanel_body {
+ max-height: 300px;
+ overflow-y: auto;
+ padding-bottom: 15px;
+}
+
+.mx_PinnedEventsPanel_header {
+ margin: 0;
+ padding-top: 8px;
+ padding-bottom: 15px;
+}
+
+.mx_PinnedEventsPanel_cancel {
+ margin: 12px;
+ float: right;
+ display: inline-block;
+}
diff --git a/res/css/views/rooms/_PresenceLabel.scss b/res/css/views/rooms/_PresenceLabel.scss
new file mode 100644
index 00000000000..682c849ceef
--- /dev/null
+++ b/res/css/views/rooms/_PresenceLabel.scss
@@ -0,0 +1,20 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_PresenceLabel {
+ font-size: 11px;
+ opacity: 0.5;
+}
\ No newline at end of file
diff --git a/res/css/views/rooms/_QuotePreview.scss b/res/css/views/rooms/_QuotePreview.scss
new file mode 100644
index 00000000000..86fd79d4730
--- /dev/null
+++ b/res/css/views/rooms/_QuotePreview.scss
@@ -0,0 +1,36 @@
+.mx_QuotePreview {
+ position: absolute;
+ bottom: 0;
+ z-index: 1000;
+ width: 100%;
+ border: 1px solid $primary-hairline-color;
+ background: $primary-bg-color;
+ border-bottom: none;
+ border-radius: 4px 4px 0 0;
+ max-height: 50vh;
+ overflow: auto
+}
+
+.mx_QuotePreview_section {
+ border-bottom: 1px solid $primary-hairline-color;
+}
+
+.mx_QuotePreview_header {
+ margin: 12px;
+ color: $primary-fg-color;
+ font-weight: 400;
+ opacity: 0.4;
+}
+
+.mx_QuotePreview_title {
+ float: left;
+}
+
+.mx_QuotePreview_cancel {
+ float: right;
+ cursor: pointer;
+}
+
+.mx_QuotePreview_clear {
+ clear: both;
+}
diff --git a/res/css/views/rooms/_RoomDropTarget.scss b/res/css/views/rooms/_RoomDropTarget.scss
new file mode 100644
index 00000000000..1076a0563a3
--- /dev/null
+++ b/res/css/views/rooms/_RoomDropTarget.scss
@@ -0,0 +1,55 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_RoomDropTarget_container {
+ background-color: $secondary-accent-color;
+ padding-left: 18px;
+ padding-right: 18px;
+ padding-top: 8px;
+ padding-bottom: 7px;
+}
+
+.collapsed .mx_RoomDropTarget_container {
+ padding-right: 10px;
+ padding-left: 10px;
+}
+
+.mx_RoomDropTarget {
+ font-size: 13px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ border: 1px dashed $accent-color;
+ color: $primary-fg-color;
+ background-color: $droptarget-bg-color;
+ border-radius: 4px;
+}
+
+
+.mx_RoomDropTarget_label {
+ position: relative;
+ margin-top: 3px;
+ line-height: 21px;
+ z-index: 1;
+ text-align: center;
+}
+
+.collapsed .mx_RoomDropTarget_avatar {
+ float: none;
+}
+
+.collapsed .mx_RoomDropTarget_label {
+ display: none;
+}
diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss
new file mode 100644
index 00000000000..9c1349adbc0
--- /dev/null
+++ b/res/css/views/rooms/_RoomHeader.scss
@@ -0,0 +1,245 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/* add 20px to the height of the header when editing */
+.mx_RoomHeader_editing {
+ flex: 0 0 93px ! important;
+}
+
+.mx_RoomHeader_wrapper {
+ max-width: 960px;
+ margin: auto;
+ height: 70px;
+ align-items: center;
+ display: flex;
+}
+
+.mx_RoomHeader_leftRow {
+ margin-left: -2px;
+ order: 1;
+ flex: 1;
+ overflow: hidden;
+}
+
+.mx_RoomHeader_spinner {
+ height: 36px;
+ order: 2;
+ padding-left: 12px;
+ padding-right: 12px;
+}
+
+.mx_RoomHeader_textButton {
+ @mixin mx_DialogButton;
+ margin-right: 8px;
+ margin-top: -5px;
+ order: 2;
+}
+
+.mx_RoomHeader_textButton:hover {
+ @mixin mx_DialogButton_hover;
+}
+
+.mx_RoomHeader_textButton_danger {
+ background-color: $warning-color;
+}
+
+.mx_RoomHeader_cancelButton {
+ order: 2;
+ cursor: pointer;
+ padding-left: 12px;
+ padding-right: 12px;
+}
+
+.mx_RoomHeader_rightRow {
+ margin-top: 4px;
+ background-color: $primary-bg-color;
+ display: flex;
+ align-items: center;
+ order: 3;
+}
+
+.mx_RoomHeader_info {
+ display: table-cell;
+ width: 100%;
+ vertical-align: middle;
+}
+
+.mx_RoomHeader_simpleHeader {
+ line-height: 70px;
+ color: $primary-fg-color;
+ font-size: 22px;
+ font-weight: bold;
+ overflow: hidden;
+ margin-left: 63px;
+ text-overflow: ellipsis;
+ width: 100%;
+}
+
+.mx_RoomHeader_simpleHeader .mx_RoomHeader_cancelButton {
+ float: right;
+}
+
+.mx_RoomHeader_simpleHeader .mx_RoomHeader_icon {
+ margin-left: 14px;
+ margin-right: 24px;
+ vertical-align: -4px;
+}
+
+.mx_RoomHeader_name {
+ vertical-align: middle;
+ width: 100%;
+ height: 31px;
+ overflow: hidden;
+ color: $primary-fg-color;
+ font-weight: bold;
+ font-size: 22px;
+ padding-left: 19px;
+ padding-right: 16px;
+ /* why isn't text-overflow working? */
+ text-overflow: ellipsis;
+ border-bottom: 1px solid transparent;
+}
+
+.mx_RoomHeader_nametext {
+ display: inline-block;
+}
+
+.mx_RoomHeader_settingsHint {
+ color: $settings-grey-fg-color ! important;
+}
+
+.mx_RoomHeader_searchStatus {
+ display: inline-block;
+ font-weight: normal;
+ opacity: 0.6;
+}
+
+.mx_RoomHeader_settingsButton object {
+ pointer-events: none;
+}
+
+.mx_RoomHeader_name,
+.mx_RoomHeader_avatar,
+.mx_RoomHeader_avatarPicker,
+.mx_RoomHeader_avatarPicker_edit,
+.mx_RoomHeader_avatarPicker_remove {
+ cursor: pointer;
+}
+
+.mx_RoomHeader_avatarPicker_remove {
+ position: absolute;
+ top: -11px;
+ right: -9px;
+}
+
+.mx_RoomHeader_name:hover div:not(.mx_RoomHeader_editable) {
+ color: $accent-color;
+}
+
+.mx_RoomHeader_placeholder {
+ color: $settings-grey-fg-color ! important;
+}
+
+.mx_RoomHeader_editable {
+ border-bottom: 1px solid $strong-input-border-color ! important;
+ min-width: 150px;
+ cursor: text;
+}
+
+.mx_RoomHeader_editable:focus {
+ border-bottom: 1px solid $accent-color ! important;
+ outline: none;
+ box-shadow: none;
+}
+
+.mx_RoomHeader_topic {
+ vertical-align: bottom;
+ float: left;
+ max-height: 38px;
+ color: $settings-grey-fg-color;
+ font-weight: 300;
+ font-size: 13px;
+ margin-left: 19px;
+ margin-right: 16px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ border-bottom: 1px solid transparent;
+ column-width: 960px;
+}
+
+.mx_RoomHeader_avatar {
+ display: table-cell;
+ width: 48px;
+ height: 50px;
+ vertical-align: middle;
+}
+
+.mx_RoomHeader_avatar .mx_BaseAvatar_image {
+ object-fit: cover;
+}
+
+.mx_RoomHeader_avatarPicker {
+ margin-top: 23px;
+ position: relative;
+}
+
+.mx_RoomHeader_avatarPicker_edit {
+ margin-left: 16px;
+ margin-top: 4px;
+}
+
+.mx_RoomHeader_avatarPicker_edit > label {
+ cursor: pointer;
+}
+
+.mx_RoomHeader_avatarPicker_edit > input {
+ display: none;
+}
+
+.mx_RoomHeader_button {
+ margin-left: 12px;
+ cursor: pointer;
+}
+
+.mx_RoomHeader_button object {
+ pointer-events: none;
+}
+
+.mx_RoomHeader_voipButton {
+ display: table-cell;
+}
+
+.mx_RoomHeader_voipButtons {
+ margin-top: 18px;
+}
+
+.mx_RoomHeader_pinnedButton {
+ position: relative;
+}
+
+.mx_RoomHeader_pinsIndicator {
+ position: absolute;
+ right: 0;
+ bottom: 4px;
+ width: 8px;
+ height: 8px;
+ border-radius: 8px;
+ background-color: $pinned-color;
+}
+
+.mx_RoomHeader_pinsIndicatorUnread {
+ background-color: $pinned-unread-color;
+}
diff --git a/res/css/views/rooms/_RoomList.scss b/res/css/views/rooms/_RoomList.scss
new file mode 100644
index 00000000000..581016d5bab
--- /dev/null
+++ b/res/css/views/rooms/_RoomList.scss
@@ -0,0 +1,67 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2107 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.
+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_RoomList {
+ padding-bottom: 12px;
+ min-height: 400px;
+}
+
+.mx_RoomList_expandButton {
+ margin-left: 8px;
+ cursor: pointer;
+ padding-left: 12px;
+ padding-right: 12px;
+}
+
+/* Evil hacky override until Chrome fixes drop and drag table cells
+ and we can correctly fix horizontal wrapping in the sidebar again */
+.mx_RoomList_scrollbar .gm-scroll-view {
+ overflow-x: hidden ! important;
+ overflow-y: scroll ! important;
+}
+
+/* Make sure the scrollbar is above the sticky headers from RoomList */
+.mx_RoomList_scrollbar .gm-scrollbar.-vertical {
+ z-index: 6;
+}
+
+.mx_RoomList_emptySubListTip_container {
+ background-color: $secondary-accent-color;
+ padding-left: 18px;
+ padding-right: 18px;
+ padding-top: 8px;
+ padding-bottom: 7px;
+}
+
+.mx_RoomList_emptySubListTip {
+ font-size: 13px;
+ padding: 5px;
+ border: 1px dashed $accent-color;
+ color: $primary-fg-color;
+ background-color: $droptarget-bg-color;
+ border-radius: 4px;
+ line-height: 16px;
+}
+
+.mx_RoomList_emptySubListTip .mx_RoleButton {
+ vertical-align: -2px;
+}
+
+.mx_RoomList_headerButtons {
+ position: absolute;
+ right: 60px;
+}
diff --git a/res/css/views/rooms/_RoomPreviewBar.scss b/res/css/views/rooms/_RoomPreviewBar.scss
new file mode 100644
index 00000000000..331eb582ea0
--- /dev/null
+++ b/res/css/views/rooms/_RoomPreviewBar.scss
@@ -0,0 +1,58 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_RoomPreviewBar {
+ 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;
+}
+
+.mx_RoomPreviewBar_wrapper {
+}
+
+.mx_RoomPreviewBar_invite_text {
+ color: $primary-fg-color;
+}
+
+.mx_RoomPreviewBar_join_text {
+ color: $warning-color;
+}
+
+.mx_RoomPreviewBar_preview_text {
+ margin-top: 25px;
+ color: $settings-grey-fg-color;
+}
+
+.mx_RoomPreviewBar_join_text a {
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+.mx_RoomPreviewBar_warning {
+ display: flex;
+ align-items: center;
+ padding: 8px;
+}
+
+.mx_RoomPreviewBar_warningIcon {
+ padding: 12px;
+}
diff --git a/res/css/views/rooms/_RoomSettings.scss b/res/css/views/rooms/_RoomSettings.scss
new file mode 100644
index 00000000000..4013af4c7c2
--- /dev/null
+++ b/res/css/views/rooms/_RoomSettings.scss
@@ -0,0 +1,247 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2017 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.
+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_RoomSettings {
+ margin-left: 65px;
+ margin-bottom: 20px;
+}
+
+.mx_RoomSettings_leaveButton,
+.mx_RoomSettings_unbanButton {
+ @mixin mx_DialogButton;
+ position: relative;
+ margin-right: 8px;
+}
+
+.mx_RoomSettings_leaveButton:hover,
+.mx_RoomSettings_unbanButton:hover {
+ @mixin mx_DialogButton_hover;
+}
+
+.mx_RoomSettings_integrationsButton_error {
+ position: relative;
+ cursor: not-allowed;
+}
+.mx_RoomSettings_integrationsButton_error img {
+ position: absolute;
+ right: -5px;
+ top: -5px;
+}
+.mx_RoomSettings_leaveButton,
+.mx_RoomSettings_integrationsButton_error {
+ float: right;
+}
+.mx_RoomSettings_integrationsButton_error .mx_RoomSettings_integrationsButton_errorPopup {
+ display: none;
+}
+.mx_RoomSettings_integrationsButton_error:hover .mx_RoomSettings_integrationsButton_errorPopup {
+ display: inline;
+}
+.mx_RoomSettings_integrationsButton_errorPopup {
+ position: absolute;
+ top: 110%;
+ left: -125%;
+ width: 348%;
+ padding: 2%;
+ font-size: 10pt;
+ line-height: 1.5em;
+ border-radius: 5px;
+ background-color: $accent-color;
+ color: $accent-fg-color;
+ text-align: center;
+}
+.mx_RoomSettings_unbanButton {
+ display: inline;
+}
+
+.mx_RoomSettings_e2eIcon {
+ padding-left: 4px;
+ padding-right: 7px;
+}
+
+.mx_RoomSettings_leaveButton {
+ margin-right: 32px;
+}
+
+.mx_RoomSettings_powerLevels {
+ display: table;
+}
+
+.mx_RoomSettings_powerLevel {
+ display: table-row;
+}
+
+.mx_RoomSettings_powerLevelKey,
+.mx_RoomSettings_powerLevel .mx_PowerSelector {
+ display: table-cell;
+ padding-bottom: 5px;
+}
+
+.mx_RoomSettings_powerLevelKey {
+ text-align: right;
+ padding-right: 0.3em;
+}
+
+.mx_RoomSettings h3 {
+ text-transform: uppercase;
+ color: $h3-color;
+ font-weight: 600;
+ font-size: 13px;
+ margin-top: 36px;
+ margin-bottom: 10px;
+}
+
+.mx_RoomSettings .mx_RoomSettings_toggles label {
+ margin-bottom: 8px;
+ display: block;
+}
+
+.mx_RoomSettings .mx_RoomSettings_toggles input[type="checkbox"],
+.mx_RoomSettings .mx_RoomSettings_toggles input[type="radio"] {
+ margin-right: 7px;
+}
+
+.mx_RoomSettings .mx_RoomSettings_tags input[type="checkbox"] {
+ margin-left: 1em;
+ margin-right: 7px;
+}
+
+.mx_RoomSettings .mx_RoomSettings_tags {
+ margin-bottom: 8px;
+}
+
+.mx_RoomSettings .mx_RoomSettings_roomColor {
+ display: inline-block;
+ position: relative;
+ width: 37px;
+ height: 37px;
+ border: 1px solid #979797;
+ margin-right: 13px;
+ cursor: pointer;
+}
+
+.mx_RoomSettings .mx_RoomSettings_roomColor_selected {
+ position: absolute;
+ left: 10px;
+ top: 4px;
+ cursor: default ! important;
+}
+
+.mx_RoomSettings .mx_RoomSettings_roomColorPrimary {
+ height: 10px;
+ position: absolute;
+ bottom: 0px;
+ width: 100%;
+}
+
+.mx_RoomSettings .mx_RoomSettings_aliasLabel {
+ margin-bottom: 8px;
+}
+
+.mx_RoomSettings .mx_RoomSettings_aliasesTable {
+ margin-top: 12px;
+ margin-bottom: 0px;
+ margin-left: 56px;
+ display: table;
+}
+
+.mx_RoomSettings .mx_RoomSettings_aliasesTableRow {
+ display: table-row;
+ margin-bottom: 16px;
+}
+
+.mx_RoomSettings .mx_RoomSettings_alias {
+ max-width: 400px;
+ margin-bottom: 16px;
+ /*
+ commented out so margin applies
+ display: table-cell; */
+}
+
+.mx_RoomSettings .mx_RoomSettings_addAlias,
+.mx_RoomSettings .mx_RoomSettings_deleteAlias {
+ display: table-cell;
+ padding-left: 0.5em;
+ position: relative;
+ cursor: pointer;
+}
+
+.mx_RoomSettings .mx_RoomSettings_addAlias img,
+.mx_RoomSettings .mx_RoomSettings_deleteAlias img {
+ visibility: hidden;
+}
+
+.mx_RoomSettings .mx_RoomSettings_aliasesTableRow:hover .mx_RoomSettings_addAlias img,
+.mx_RoomSettings .mx_RoomSettings_aliasesTableRow:hover .mx_RoomSettings_deleteAlias img {
+ visibility: visible;
+}
+
+.mx_RoomSettings_warning {
+ color: $warning-color;
+ font-weight: bold;
+ margin-top: 8px;
+ margin-bottom: 8px;
+}
+
+.mx_RoomSettings_editable {
+ border: 0px;
+ border-bottom: 1px solid $strong-input-border-color;
+ padding: 0px;
+ min-width: 240px;
+}
+
+.mx_RoomSettings_editable:focus {
+ border-bottom: 1px solid $accent-color;
+ outline: none;
+ box-shadow: none;
+}
+
+.mx_RoomSettings_deleteAlias,
+.mx_RoomSettings_addAlias {
+ display: table-cell;
+ visibility: visible;
+}
+
+.mx_RoomSettings_deleteAlias:hover,
+.mx_RoomSettings_addAlias:hover {
+ visibility: visible;
+}
+
+.mx_RoomSettings_aliasPlaceholder {
+ color: $settings-grey-fg-color;
+}
+
+.mx_RoomSettings_buttons {
+ text-align: right;
+ margin-bottom: 16px;
+}
+
+.mx_RoomSettings_button {
+ display: inline;
+ border: 0px;
+ height: 36px;
+ border-radius: 36px;
+ font-weight: 400;
+ font-size: 15px;
+ color: $accent-fg-color;
+ background-color: $accent-color;
+ width: auto;
+ margin: auto;
+ padding: 6px;
+ padding-left: 1em;
+ padding-right: 1em;
+}
diff --git a/res/css/views/rooms/_RoomTile.scss b/res/css/views/rooms/_RoomTile.scss
new file mode 100644
index 00000000000..ccd3afe26c6
--- /dev/null
+++ b/res/css/views/rooms/_RoomTile.scss
@@ -0,0 +1,190 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_RoomTile {
+ position: relative;
+ cursor: pointer;
+ font-size: 13px;
+ display: block;
+ height: 34px;
+
+ background-color: $secondary-accent-color;
+}
+
+.mx_RoomTile_tooltip {
+ display: inline-block;
+ position: relative;
+ top: -54px;
+ left: -12px;
+}
+
+
+.mx_RoomTile_nameContainer {
+ display: inline-block;
+ width: 180px;
+ height: 24px;
+}
+
+.mx_RoomTile_avatar_container {
+ position: relative;
+}
+
+.mx_RoomTile_avatar {
+ display: inline-block;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-left: 16px;
+ padding-right: 6px;
+ width: 24px;
+ height: 24px;
+ vertical-align: middle;
+}
+
+.mx_RoomTile_dm {
+ display: block;
+ position: absolute;
+ bottom: 0;
+ right: -5px;
+ z-index: 2;
+}
+
+.mx_RoomTile_name {
+ display: inline-block;
+ position: relative;
+ width: 165px;
+ vertical-align: middle;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 2px;
+ padding-bottom: 3px;
+ color: $roomtile-name-color;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.mx_RoomTile_invite {
+/* color: rgba(69, 69, 69, 0.5); */
+}
+
+.collapsed .mx_RoomTile_nameContainer {
+ width: 60px; /* colapsed panel width */
+}
+
+.collapsed .mx_RoomTile_name {
+ display: none;
+}
+
+.collapsed .mx_RoomTile_badge {
+ top: 0px;
+ min-width: 12px;
+ border-radius: 16px;
+ padding: 0px 4px 0px 4px;
+ z-index: 3;
+}
+
+/* Hide the bottom of speech bubble */
+.collapsed .mx_RoomTile_highlight .mx_RoomTile_badge:after {
+ display: none;
+}
+
+/* This is the bottom of the speech bubble */
+.mx_RoomTile_highlight .mx_RoomTile_badge:after {
+ content: "";
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ margin-left: 5px;
+ border-top: 5px solid $warning-color;
+ border-right: 7px solid transparent;
+}
+
+.mx_RoomTile_badge {
+ display: inline-block;
+ min-width: 15px;
+ height: 15px;
+ position: absolute;
+ right: 8px; /*gutter */
+ top: 9px;
+ border-radius: 8px;
+ color: $accent-fg-color;
+ font-weight: 600;
+ font-size: 10px;
+ text-align: center;
+ padding-top: 1px;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeButton,
+.mx_RoomTile.mx_RoomTile_menuDisplayed .mx_RoomTile_badge {
+ letter-spacing: 0.1em;
+ opacity: 1;
+}
+
+.mx_RoomTile.mx_RoomTile_noBadges .mx_RoomTile_badge.mx_RoomTile_badgeButton,
+.mx_RoomTile.mx_RoomTile_menuDisplayed.mx_RoomTile_noBadges .mx_RoomTile_badge {
+ background-color: $neutral-badge-color;
+}
+
+.mx_RoomTile_unreadNotify .mx_RoomTile_badge {
+ background-color: $accent-color;
+}
+
+.mx_RoomTile_highlight .mx_RoomTile_badge {
+ background-color: $warning-color;
+}
+
+.mx_RoomTile_unread, .mx_RoomTile_highlight {
+ font-weight: 800;
+}
+
+.mx_RoomTile_selected {
+ background-color: $roomtile-selected-bg-color;
+}
+
+.mx_DNDRoomTile {
+ transform: none;
+ transition: transform 0.2s;
+}
+
+.mx_DNDRoomTile_dragging {
+ transform: scale(1.05, 1.05);
+}
+
+.mx_RoomTile:focus {
+ filter: none ! important;
+ background-color: $roomtile-focused-bg-color;
+}
+
+.mx_RoomTile .mx_RoomTile_name.mx_RoomTile_badgeShown {
+ width: 140px;
+}
+
+.mx_RoomTile_arrow {
+ position: absolute;
+ right: 0px;
+}
+
+.mx_RoomTile.mx_RoomTile_transparent {
+ background-color: transparent;
+}
+
+.mx_RoomTile.mx_RoomTile_transparent:focus {
+ background-color: $roomtile-transparent-focused-color;
+}
+
diff --git a/res/css/views/rooms/_RoomTooltip.scss b/res/css/views/rooms/_RoomTooltip.scss
new file mode 100644
index 00000000000..9988425b8f4
--- /dev/null
+++ b/res/css/views/rooms/_RoomTooltip.scss
@@ -0,0 +1,54 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_RoomTooltip_chevron {
+ position: absolute;
+ left: -8px;
+ top: 4px;
+ width: 0;
+ height: 0;
+ border-top: 8px solid transparent;
+ border-right: 8px solid $menu-border-color;
+ border-bottom: 8px solid transparent;
+}
+
+.mx_RoomTooltip_chevron:after {
+ content:'';
+ width: 0;
+ height: 0;
+ border-top: 7px solid transparent;
+ border-right: 7px solid $primary-bg-color;
+ border-bottom: 7px solid transparent;
+ position:absolute;
+ top: -7px;
+ left: 1px;
+}
+
+.mx_RoomTooltip {
+ display: none;
+ position: fixed;
+ border: 1px solid $menu-border-color;
+ border-radius: 5px;
+ background-color: $primary-bg-color;
+ z-index: 2000;
+ padding: 5px;
+ pointer-events: none;
+ line-height: 14px;
+ font-size: 13px;
+ color: $primary-fg-color;
+ max-width: 600px;
+ margin-right: 50px;
+}
diff --git a/res/css/views/rooms/_SearchBar.scss b/res/css/views/rooms/_SearchBar.scss
new file mode 100644
index 00000000000..079ea16c686
--- /dev/null
+++ b/res/css/views/rooms/_SearchBar.scss
@@ -0,0 +1,83 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_SearchBar {
+ padding-top: 5px;
+ padding-bottom: 5px;
+ display: flex;
+ align-items: center;
+}
+
+.mx_SearchBar_input {
+ display: inline block;
+ border-radius: 3px 0px 0px 3px;
+ border: 1px solid $input-border-color;
+ font-size: 15px;
+ padding: 9px;
+ padding-left: 11px;
+ width: auto;
+ flex: 1 1 0;
+}
+
+.mx_SearchBar_searchButton {
+ cursor: pointer;
+ margin-right: 10px;
+ width: 37px;
+ height: 37px;
+ border-radius: 0px 3px 3px 0px;
+ background-color: $accent-color;
+}
+
+@keyframes pulsate {
+ 0% { opacity: 1.0; }
+ 50% { opacity: 0.1; }
+ 100% { opacity: 1.0; }
+}
+
+.mx_SearchBar_searching img {
+ animation: pulsate 0.5s ease-out;
+ animation-iteration-count: infinite;
+}
+
+.mx_SearchBar_button {
+ display: inline;
+ border: 0px;
+ border-radius: 36px;
+ font-weight: 400;
+ font-size: 15px;
+ color: $accent-fg-color;
+ background-color: $accent-color;
+ width: auto;
+ margin: auto;
+ margin-left: 7px;
+ padding-top: 6px;
+ padding-bottom: 4px;
+ padding-left: 24px;
+ padding-right: 24px;
+ cursor: pointer;
+}
+
+.mx_SearchBar_unselected {
+ background-color: $primary-bg-color;
+ color: $accent-color;
+ border: $accent-color 1px solid;
+}
+
+.mx_SearchBar_cancel {
+ padding-left: 14px;
+ padding-right: 14px;
+ cursor: pointer;
+}
diff --git a/res/css/views/rooms/_SearchableEntityList.scss b/res/css/views/rooms/_SearchableEntityList.scss
new file mode 100644
index 00000000000..37a663123d1
--- /dev/null
+++ b/res/css/views/rooms/_SearchableEntityList.scss
@@ -0,0 +1,77 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_SearchableEntityList {
+ display: flex;
+
+ flex-direction: column;
+}
+
+.mx_SearchableEntityList_query {
+ font-family: $font-family;
+ border-radius: 3px;
+ border: 1px solid $input-border-color;
+ padding: 9px;
+ color: $primary-fg-color;
+ background-color: $primary-bg-color;
+ margin-left: 3px;
+ font-size: 15px;
+ margin-bottom: 8px;
+ width: 189px;
+}
+
+.mx_SearchableEntityList_query::-moz-placeholder {
+ color: $primary-fg-color;
+ opacity: 0.5;
+ font-size: 12px;
+}
+
+.mx_SearchableEntityList_query::-webkit-input-placeholder {
+ color: $primary-fg-color;
+ opacity: 0.5;
+ font-size: 12px;
+}
+
+.mx_SearchableEntityList_listWrapper {
+ flex: 1;
+
+ overflow-y: auto;
+}
+
+.mx_SearchableEntityList_list {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.mx_SearchableEntityList_list .mx_EntityTile_chevron {
+ display: none;
+}
+
+.mx_SearchableEntityList_hrWrapper {
+ width: 100%;
+ flex: 0 0 auto;
+}
+
+.mx_SearchableEntityList hr {
+ height: 1px;
+ border: 0px;
+ color: $primary-fg-color;
+ background-color: $primary-fg-color;
+ margin-right: 15px;
+ margin-top: 11px;
+ margin-bottom: 11px;
+}
diff --git a/res/css/views/rooms/_Stickers.scss b/res/css/views/rooms/_Stickers.scss
new file mode 100644
index 00000000000..669ca135452
--- /dev/null
+++ b/res/css/views/rooms/_Stickers.scss
@@ -0,0 +1,35 @@
+.mx_Stickers_content {
+ overflow: hidden;
+}
+
+.mx_Stickers_content_container {
+ overflow: hidden;
+ height: 300px;
+}
+
+.mx_Stickers_content .mx_AppTileFullWidth {
+ border: none;
+}
+
+.mx_Stickers_contentPlaceholder {
+ display: flex;
+ flex-grow: 1;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+}
+
+.mx_Stickers_contentPlaceholder p {
+ max-width: 200px;
+}
+
+.mx_Stickers_addLink {
+ display: inline;
+ cursor: pointer;
+ text-decoration: underline;
+}
+
+.mx_Stickers_hideStickers {
+ z-index: 2001;
+}
diff --git a/res/css/views/rooms/_TopUnreadMessagesBar.scss b/res/css/views/rooms/_TopUnreadMessagesBar.scss
new file mode 100644
index 00000000000..1ee56d9532f
--- /dev/null
+++ b/res/css/views/rooms/_TopUnreadMessagesBar.scss
@@ -0,0 +1,53 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_TopUnreadMessagesBar {
+ margin: auto; /* centre horizontally */
+ max-width: 960px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ border-bottom: 1px solid $primary-hairline-color;
+}
+
+.mx_TopUnreadMessagesBar_scrollUp {
+ display: inline;
+ cursor: pointer;
+ text-decoration: underline;
+}
+
+.mx_TopUnreadMessagesBar_scrollUp img {
+ padding-left: 10px;
+ padding-right: 31px;
+ vertical-align: middle;
+}
+
+.mx_TopUnreadMessagesBar_scrollUp span {
+ opacity: 0.5;
+}
+
+.mx_TopUnreadMessagesBar_close {
+ float: right;
+ padding-right: 14px;
+ padding-top: 3px;
+ cursor: pointer;
+}
+
+.mx_MatrixChat_useCompactLayout {
+ .mx_TopUnreadMessagesBar {
+ padding-top: 4px;
+ padding-bottom: 4px;
+ }
+}
diff --git a/res/css/views/settings/_DevicesPanel.scss b/res/css/views/settings/_DevicesPanel.scss
new file mode 100644
index 00000000000..e4856531d9b
--- /dev/null
+++ b/res/css/views/settings/_DevicesPanel.scss
@@ -0,0 +1,51 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_DevicesPanel {
+ display: table;
+ table-layout: fixed;
+ width: 880px;
+ border-spacing: 2px;
+}
+
+.mx_DevicesPanel_header {
+ display: table-header-group;
+ font-weight: bold;
+}
+
+.mx_DevicesPanel_header > div {
+ display: table-cell;
+}
+
+.mx_DevicesPanel_header .mx_DevicesPanel_deviceLastSeen {
+ width: 30%;
+}
+
+.mx_DevicesPanel_header .mx_DevicesPanel_deviceButtons {
+ width: 20%;
+}
+
+.mx_DevicesPanel_device {
+ display: table-row;
+}
+
+.mx_DevicesPanel_device > div {
+ display: table-cell;
+}
+
+.mx_DevicesPanel_myDevice {
+ font-weight: bold;
+}
\ No newline at end of file
diff --git a/res/css/views/settings/_IntegrationsManager.scss b/res/css/views/settings/_IntegrationsManager.scss
new file mode 100644
index 00000000000..93ee0e20fe0
--- /dev/null
+++ b/res/css/views/settings/_IntegrationsManager.scss
@@ -0,0 +1,31 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_IntegrationsManager .mx_Dialog {
+ width: 60%;
+ height: 70%;
+ overflow: hidden;
+ padding: 0px;
+ max-width: initial;
+ max-height: initial;
+}
+
+.mx_IntegrationsManager iframe {
+ background-color: #fff;
+ border: 0px;
+ width: 100%;
+ height: 100%;
+}
diff --git a/res/css/views/settings/_Notifications.scss b/res/css/views/settings/_Notifications.scss
new file mode 100644
index 00000000000..4c88e449529
--- /dev/null
+++ b/res/css/views/settings/_Notifications.scss
@@ -0,0 +1,70 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_UserNotifSettings_tableRow
+{
+ display: table-row;
+}
+
+.mx_UserNotifSettings_inputCell {
+ display: table-cell;
+ padding-bottom: 8px;
+ padding-right: 8px;
+ width: 16px;
+}
+
+.mx_UserNotifSettings_labelCell
+{
+ padding-bottom: 8px;
+ width: 400px;
+ display: table-cell;
+}
+
+.mx_UserNotifSettings_pushRulesTableWrapper {
+ padding-bottom: 8px;
+}
+
+.mx_UserNotifSettings_pushRulesTable {
+ width: 100%;
+ table-layout: fixed;
+}
+
+.mx_UserNotifSettings_pushRulesTable thead {
+ font-weight: bold;
+ font-size: 15px;
+}
+
+.mx_UserNotifSettings_pushRulesTable tbody th {
+ font-weight: 400;
+ font-size: 15px;
+}
+
+.mx_UserNotifSettings_pushRulesTable tbody th:first-child {
+ text-align: left;
+}
+
+.mx_UserNotifSettings_keywords {
+ cursor: pointer;
+ color: $accent-color;
+}
+
+.mx_UserSettings_devicesTable td {
+ padding-left: 20px;
+ padding-right: 20px;
+}
+.mx_UserSettings_devicesTable_nodevices {
+ font-style: italic;
+}
diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss
new file mode 100644
index 00000000000..deb89a837cd
--- /dev/null
+++ b/res/css/views/voip/_CallView.scss
@@ -0,0 +1,25 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_CallView_voice {
+ background-color: $accent-color;
+ color: $accent-fg-color;
+ cursor: pointer;
+ text-align: center;
+ padding: 6px;
+ font-weight: bold;
+ font-size: 13px;
+}
\ No newline at end of file
diff --git a/res/css/views/voip/_IncomingCallbox.scss b/res/css/views/voip/_IncomingCallbox.scss
new file mode 100644
index 00000000000..64eac25d013
--- /dev/null
+++ b/res/css/views/voip/_IncomingCallbox.scss
@@ -0,0 +1,69 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_IncomingCallBox {
+ text-align: center;
+ border: 1px solid #a4a4a4;
+ border-radius: 8px;
+ background-color: $primary-bg-color;
+ position: fixed;
+ z-index: 1000;
+ padding: 6px;
+ margin-top: -3px;
+ margin-left: -20px;
+ width: 200px;
+}
+
+.mx_IncomingCallBox_chevron {
+ padding: 12px;
+ position: absolute;
+ left: -21px;
+ top: 0px;
+}
+
+.mx_IncomingCallBox_title {
+ padding: 6px;
+ font-weight: bold;
+}
+
+.mx_IncomingCallBox_buttons {
+ display: flex;
+}
+
+.mx_IncomingCallBox_buttons_cell {
+ vertical-align: middle;
+ padding: 6px;
+ flex: 1;
+}
+
+.mx_IncomingCallBox_buttons_decline,
+.mx_IncomingCallBox_buttons_accept {
+ vertical-align: middle;
+ width: 80px;
+ height: 36px;
+ line-height: 36px;
+ border-radius: 36px;
+ color: $accent-fg-color;
+ margin: auto;
+}
+
+.mx_IncomingCallBox_buttons_decline {
+ background-color: $voip-decline-color;
+}
+
+.mx_IncomingCallBox_buttons_accept {
+ background-color: $voip-accept-color;
+}
diff --git a/res/css/views/voip/_VideoView.scss b/res/css/views/voip/_VideoView.scss
new file mode 100644
index 00000000000..feb60f47634
--- /dev/null
+++ b/res/css/views/voip/_VideoView.scss
@@ -0,0 +1,49 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_VideoView {
+ width: 100%;
+ position: relative;
+ z-index: 30;
+}
+
+.mx_VideoView video {
+ width: 100%;
+}
+
+.mx_VideoView_remoteVideoFeed {
+ width: 100%;
+ background-color: #000;
+ z-index: 50;
+}
+
+.mx_VideoView_localVideoFeed {
+ width: 25%;
+ height: 25%;
+ position: absolute;
+ left: 10px;
+ bottom: 10px;
+ z-index: 100;
+}
+
+.mx_VideoView_localVideoFeed video {
+ width: auto;
+ height: 100%;
+}
+
+.mx_VideoView_localVideoFeed.mx_VideoView_localVideoFeed_flipped video {
+ transform: scale(-1, 1);
+}
diff --git a/res/fonts/Fira_Mono/FiraMono-Bold.ttf b/res/fonts/Fira_Mono/FiraMono-Bold.ttf
new file mode 100755
index 00000000000..4b8b1cfbcb1
Binary files /dev/null and b/res/fonts/Fira_Mono/FiraMono-Bold.ttf differ
diff --git a/res/fonts/Fira_Mono/FiraMono-Regular.ttf b/res/fonts/Fira_Mono/FiraMono-Regular.ttf
new file mode 100755
index 00000000000..5238c09eda8
Binary files /dev/null and b/res/fonts/Fira_Mono/FiraMono-Regular.ttf differ
diff --git a/res/fonts/Fira_Mono/OFL.txt b/res/fonts/Fira_Mono/OFL.txt
new file mode 100755
index 00000000000..ba853c049e4
--- /dev/null
+++ b/res/fonts/Fira_Mono/OFL.txt
@@ -0,0 +1,92 @@
+Copyright (c) 2012-2013, The Mozilla Corporation and Telefonica S.A.
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/res/fonts/Open_Sans/LICENSE.txt b/res/fonts/Open_Sans/LICENSE.txt
new file mode 100755
index 00000000000..75b52484ea4
--- /dev/null
+++ b/res/fonts/Open_Sans/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
diff --git a/res/fonts/Open_Sans/OpenSans-Bold.ttf b/res/fonts/Open_Sans/OpenSans-Bold.ttf
new file mode 100755
index 00000000000..fd79d43bea0
Binary files /dev/null and b/res/fonts/Open_Sans/OpenSans-Bold.ttf differ
diff --git a/res/fonts/Open_Sans/OpenSans-BoldItalic.ttf b/res/fonts/Open_Sans/OpenSans-BoldItalic.ttf
new file mode 100755
index 00000000000..9bc800958a4
Binary files /dev/null and b/res/fonts/Open_Sans/OpenSans-BoldItalic.ttf differ
diff --git a/res/fonts/Open_Sans/OpenSans-Italic.ttf b/res/fonts/Open_Sans/OpenSans-Italic.ttf
new file mode 100755
index 00000000000..c90da48ff3b
Binary files /dev/null and b/res/fonts/Open_Sans/OpenSans-Italic.ttf differ
diff --git a/res/fonts/Open_Sans/OpenSans-Regular.ttf b/res/fonts/Open_Sans/OpenSans-Regular.ttf
new file mode 100755
index 00000000000..db433349b70
Binary files /dev/null and b/res/fonts/Open_Sans/OpenSans-Regular.ttf differ
diff --git a/res/fonts/Open_Sans/OpenSans-Semibold.ttf b/res/fonts/Open_Sans/OpenSans-Semibold.ttf
new file mode 100755
index 00000000000..1a7679e3949
Binary files /dev/null and b/res/fonts/Open_Sans/OpenSans-Semibold.ttf differ
diff --git a/res/fonts/Open_Sans/OpenSans-SemiboldItalic.ttf b/res/fonts/Open_Sans/OpenSans-SemiboldItalic.ttf
new file mode 100755
index 00000000000..59b6d16b065
Binary files /dev/null and b/res/fonts/Open_Sans/OpenSans-SemiboldItalic.ttf differ
diff --git a/res/img/50e2c2.png b/res/img/50e2c2.png
new file mode 100644
index 00000000000..ee0f8558957
Binary files /dev/null and b/res/img/50e2c2.png differ
diff --git a/res/img/76cfa6.png b/res/img/76cfa6.png
new file mode 100644
index 00000000000..de1ea60d54c
Binary files /dev/null and b/res/img/76cfa6.png differ
diff --git a/res/img/80cef4.png b/res/img/80cef4.png
new file mode 100644
index 00000000000..637d03f63cd
Binary files /dev/null and b/res/img/80cef4.png differ
diff --git a/res/img/admin.svg b/res/img/admin.svg
new file mode 100644
index 00000000000..7ea7459304d
--- /dev/null
+++ b/res/img/admin.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/res/img/attach.png b/res/img/attach.png
new file mode 100644
index 00000000000..1bcb70045d4
Binary files /dev/null and b/res/img/attach.png differ
diff --git a/res/img/avatar-error.svg b/res/img/avatar-error.svg
new file mode 100644
index 00000000000..c5e168944c1
--- /dev/null
+++ b/res/img/avatar-error.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/button-md-false.png b/res/img/button-md-false.png
new file mode 100644
index 00000000000..6debbccc937
Binary files /dev/null and b/res/img/button-md-false.png differ
diff --git a/res/img/button-md-false.svg b/res/img/button-md-false.svg
new file mode 100644
index 00000000000..6414933d961
--- /dev/null
+++ b/res/img/button-md-false.svg
@@ -0,0 +1,29 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-md-false@2x.png b/res/img/button-md-false@2x.png
new file mode 100644
index 00000000000..497f5385d14
Binary files /dev/null and b/res/img/button-md-false@2x.png differ
diff --git a/res/img/button-md-false@3x.png b/res/img/button-md-false@3x.png
new file mode 100644
index 00000000000..1184e6b351e
Binary files /dev/null and b/res/img/button-md-false@3x.png differ
diff --git a/res/img/button-md-true.png b/res/img/button-md-true.png
new file mode 100644
index 00000000000..2e39c55e1eb
Binary files /dev/null and b/res/img/button-md-true.png differ
diff --git a/res/img/button-md-true.svg b/res/img/button-md-true.svg
new file mode 100644
index 00000000000..2acc4f675c3
--- /dev/null
+++ b/res/img/button-md-true.svg
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-md-true@2x.png b/res/img/button-md-true@2x.png
new file mode 100644
index 00000000000..ad9067f385b
Binary files /dev/null and b/res/img/button-md-true@2x.png differ
diff --git a/res/img/button-md-true@3x.png b/res/img/button-md-true@3x.png
new file mode 100644
index 00000000000..d615867dc46
Binary files /dev/null and b/res/img/button-md-true@3x.png differ
diff --git a/res/img/button-text-bold-o-n.svg b/res/img/button-text-bold-o-n.svg
new file mode 100644
index 00000000000..161e740e907
--- /dev/null
+++ b/res/img/button-text-bold-o-n.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-bold.svg b/res/img/button-text-bold.svg
new file mode 100644
index 00000000000..0fd0baa07ef
--- /dev/null
+++ b/res/img/button-text-bold.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-bullet-o-n.svg b/res/img/button-text-bullet-o-n.svg
new file mode 100644
index 00000000000..d4a40e889cf
--- /dev/null
+++ b/res/img/button-text-bullet-o-n.svg
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-bullet.svg b/res/img/button-text-bullet.svg
new file mode 100644
index 00000000000..ae3e640d8ee
--- /dev/null
+++ b/res/img/button-text-bullet.svg
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-code-o-n.svg b/res/img/button-text-code-o-n.svg
new file mode 100644
index 00000000000..8d1439c97b5
--- /dev/null
+++ b/res/img/button-text-code-o-n.svg
@@ -0,0 +1,25 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-code.svg b/res/img/button-text-code.svg
new file mode 100644
index 00000000000..24026cb7090
--- /dev/null
+++ b/res/img/button-text-code.svg
@@ -0,0 +1,25 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-formatting.svg b/res/img/button-text-formatting.svg
new file mode 100644
index 00000000000..d697010d402
--- /dev/null
+++ b/res/img/button-text-formatting.svg
@@ -0,0 +1,21 @@
+
+
+
diff --git a/res/img/button-text-italic-o-n.svg b/res/img/button-text-italic-o-n.svg
new file mode 100644
index 00000000000..15fe5885962
--- /dev/null
+++ b/res/img/button-text-italic-o-n.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-italic.svg b/res/img/button-text-italic.svg
new file mode 100644
index 00000000000..b5722e827bc
--- /dev/null
+++ b/res/img/button-text-italic.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-numbullet-o-n.svg b/res/img/button-text-numbullet-o-n.svg
new file mode 100644
index 00000000000..869a2c2cc2c
--- /dev/null
+++ b/res/img/button-text-numbullet-o-n.svg
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-numbullet.svg b/res/img/button-text-numbullet.svg
new file mode 100644
index 00000000000..8e5b8b87b6f
--- /dev/null
+++ b/res/img/button-text-numbullet.svg
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-quote-o-n.svg b/res/img/button-text-quote-o-n.svg
new file mode 100644
index 00000000000..f8a86125c94
--- /dev/null
+++ b/res/img/button-text-quote-o-n.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-quote.svg b/res/img/button-text-quote.svg
new file mode 100644
index 00000000000..d70c261f5da
--- /dev/null
+++ b/res/img/button-text-quote.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-strike-o-n.svg b/res/img/button-text-strike-o-n.svg
new file mode 100644
index 00000000000..2914fcabe60
--- /dev/null
+++ b/res/img/button-text-strike-o-n.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-strike.svg b/res/img/button-text-strike.svg
new file mode 100644
index 00000000000..5f262dc3504
--- /dev/null
+++ b/res/img/button-text-strike.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-underline-o-n.svg b/res/img/button-text-underline-o-n.svg
new file mode 100644
index 00000000000..870be3ce6af
--- /dev/null
+++ b/res/img/button-text-underline-o-n.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/res/img/button-text-underline.svg b/res/img/button-text-underline.svg
new file mode 100644
index 00000000000..26f448539cc
--- /dev/null
+++ b/res/img/button-text-underline.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/res/img/call.png b/res/img/call.png
new file mode 100644
index 00000000000..a7805e0596b
Binary files /dev/null and b/res/img/call.png differ
diff --git a/res/img/call.svg b/res/img/call.svg
new file mode 100644
index 00000000000..f528f9a24ed
--- /dev/null
+++ b/res/img/call.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/camera.svg b/res/img/camera.svg
new file mode 100644
index 00000000000..6519496f789
--- /dev/null
+++ b/res/img/camera.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/res/img/camera_green.svg b/res/img/camera_green.svg
new file mode 100644
index 00000000000..5aae5502cd0
--- /dev/null
+++ b/res/img/camera_green.svg
@@ -0,0 +1,15 @@
+
+
+
+
diff --git a/res/img/cancel-black.png b/res/img/cancel-black.png
new file mode 100644
index 00000000000..87dcfd41a88
Binary files /dev/null and b/res/img/cancel-black.png differ
diff --git a/res/img/cancel-black2.png b/res/img/cancel-black2.png
new file mode 100644
index 00000000000..a928c61b096
Binary files /dev/null and b/res/img/cancel-black2.png differ
diff --git a/res/img/cancel-red.svg b/res/img/cancel-red.svg
new file mode 100644
index 00000000000..a72a970b62e
--- /dev/null
+++ b/res/img/cancel-red.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/res/img/cancel-small.svg b/res/img/cancel-small.svg
new file mode 100644
index 00000000000..e4c8cafc10d
--- /dev/null
+++ b/res/img/cancel-small.svg
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/res/img/cancel-white.svg b/res/img/cancel-white.svg
new file mode 100644
index 00000000000..65e14c2fbc0
--- /dev/null
+++ b/res/img/cancel-white.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/res/img/cancel.png b/res/img/cancel.png
new file mode 100644
index 00000000000..2bda8ff5bf0
Binary files /dev/null and b/res/img/cancel.png differ
diff --git a/res/img/cancel.svg b/res/img/cancel.svg
new file mode 100644
index 00000000000..e32060025ea
--- /dev/null
+++ b/res/img/cancel.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/res/img/cancel_green.svg b/res/img/cancel_green.svg
new file mode 100644
index 00000000000..2e3d759be2d
--- /dev/null
+++ b/res/img/cancel_green.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/res/img/chevron-left.png b/res/img/chevron-left.png
new file mode 100644
index 00000000000..efb0065de97
Binary files /dev/null and b/res/img/chevron-left.png differ
diff --git a/res/img/chevron-right.png b/res/img/chevron-right.png
new file mode 100644
index 00000000000..18a4684e472
Binary files /dev/null and b/res/img/chevron-right.png differ
diff --git a/res/img/chevron.png b/res/img/chevron.png
new file mode 100644
index 00000000000..81236f91bc2
Binary files /dev/null and b/res/img/chevron.png differ
diff --git a/res/img/close-white.png b/res/img/close-white.png
new file mode 100644
index 00000000000..d8752ed9fe1
Binary files /dev/null and b/res/img/close-white.png differ
diff --git a/res/img/create-big.png b/res/img/create-big.png
new file mode 100644
index 00000000000..b7307a11c79
Binary files /dev/null and b/res/img/create-big.png differ
diff --git a/res/img/create-big.svg b/res/img/create-big.svg
new file mode 100644
index 00000000000..2450542b63c
--- /dev/null
+++ b/res/img/create-big.svg
@@ -0,0 +1,26 @@
+
+
\ No newline at end of file
diff --git a/res/img/create.png b/res/img/create.png
new file mode 100644
index 00000000000..2d6107ac506
Binary files /dev/null and b/res/img/create.png differ
diff --git a/res/img/delete.png b/res/img/delete.png
new file mode 100644
index 00000000000..8ff20a116d4
Binary files /dev/null and b/res/img/delete.png differ
diff --git a/res/img/directory-big.png b/res/img/directory-big.png
new file mode 100644
index 00000000000..03cab69c4a5
Binary files /dev/null and b/res/img/directory-big.png differ
diff --git a/res/img/directory-big.svg b/res/img/directory-big.svg
new file mode 100644
index 00000000000..5631a2ae3ef
--- /dev/null
+++ b/res/img/directory-big.svg
@@ -0,0 +1,22 @@
+
+
\ No newline at end of file
diff --git a/res/img/download.png b/res/img/download.png
new file mode 100644
index 00000000000..1999ebf7ab6
Binary files /dev/null and b/res/img/download.png differ
diff --git a/res/img/download.svg b/res/img/download.svg
new file mode 100644
index 00000000000..d0ea090d8ae
--- /dev/null
+++ b/res/img/download.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/res/img/e2e-blocked.svg b/res/img/e2e-blocked.svg
new file mode 100644
index 00000000000..0ab2c6efbe2
--- /dev/null
+++ b/res/img/e2e-blocked.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/res/img/e2e-unencrypted.svg b/res/img/e2e-unencrypted.svg
new file mode 100644
index 00000000000..14672236384
--- /dev/null
+++ b/res/img/e2e-unencrypted.svg
@@ -0,0 +1,23 @@
+
+
\ No newline at end of file
diff --git a/res/img/e2e-verified.svg b/res/img/e2e-verified.svg
new file mode 100644
index 00000000000..b65f50b2b68
--- /dev/null
+++ b/res/img/e2e-verified.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/res/img/e2e-warning.svg b/res/img/e2e-warning.svg
new file mode 100644
index 00000000000..8a55f199ba6
--- /dev/null
+++ b/res/img/e2e-warning.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/res/img/edit.png b/res/img/edit.png
new file mode 100644
index 00000000000..6f373d3f3dc
Binary files /dev/null and b/res/img/edit.png differ
diff --git a/res/img/edit.svg b/res/img/edit.svg
new file mode 100644
index 00000000000..9ba00607740
--- /dev/null
+++ b/res/img/edit.svg
@@ -0,0 +1,11 @@
+
+
+
diff --git a/res/img/edit_green.svg b/res/img/edit_green.svg
new file mode 100644
index 00000000000..f7f4c7adcb8
--- /dev/null
+++ b/res/img/edit_green.svg
@@ -0,0 +1,11 @@
+
+
+
diff --git a/res/img/ellipsis.svg b/res/img/ellipsis.svg
new file mode 100644
index 00000000000..d60c844089b
--- /dev/null
+++ b/res/img/ellipsis.svg
@@ -0,0 +1,25 @@
+
+
\ No newline at end of file
diff --git a/res/img/eol.svg b/res/img/eol.svg
new file mode 100644
index 00000000000..02d1946cf4a
--- /dev/null
+++ b/res/img/eol.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/res/img/f4c371.png b/res/img/f4c371.png
new file mode 100644
index 00000000000..ad3b8f16161
Binary files /dev/null and b/res/img/f4c371.png differ
diff --git a/res/img/file.png b/res/img/file.png
new file mode 100644
index 00000000000..5904ea8284c
Binary files /dev/null and b/res/img/file.png differ
diff --git a/res/img/filegrid.png b/res/img/filegrid.png
new file mode 100644
index 00000000000..c2c2799f375
Binary files /dev/null and b/res/img/filegrid.png differ
diff --git a/res/img/fileicon.png b/res/img/fileicon.png
new file mode 100644
index 00000000000..af018efa6df
Binary files /dev/null and b/res/img/fileicon.png differ
diff --git a/res/img/filelist.png b/res/img/filelist.png
new file mode 100644
index 00000000000..3cf6cb494eb
Binary files /dev/null and b/res/img/filelist.png differ
diff --git a/res/img/files.png b/res/img/files.png
new file mode 100644
index 00000000000..83932267f8b
Binary files /dev/null and b/res/img/files.png differ
diff --git a/res/img/files.svg b/res/img/files.svg
new file mode 100644
index 00000000000..20aba851ea4
--- /dev/null
+++ b/res/img/files.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/res/img/flags/AD.png b/res/img/flags/AD.png
new file mode 100644
index 00000000000..d5d59645fe6
Binary files /dev/null and b/res/img/flags/AD.png differ
diff --git a/res/img/flags/AE.png b/res/img/flags/AE.png
new file mode 100644
index 00000000000..05c7418aa4d
Binary files /dev/null and b/res/img/flags/AE.png differ
diff --git a/res/img/flags/AF.png b/res/img/flags/AF.png
new file mode 100644
index 00000000000..bc7cef09166
Binary files /dev/null and b/res/img/flags/AF.png differ
diff --git a/res/img/flags/AG.png b/res/img/flags/AG.png
new file mode 100644
index 00000000000..d48facad47f
Binary files /dev/null and b/res/img/flags/AG.png differ
diff --git a/res/img/flags/AI.png b/res/img/flags/AI.png
new file mode 100644
index 00000000000..8fd27cd39e2
Binary files /dev/null and b/res/img/flags/AI.png differ
diff --git a/res/img/flags/AL.png b/res/img/flags/AL.png
new file mode 100644
index 00000000000..883835ffb33
Binary files /dev/null and b/res/img/flags/AL.png differ
diff --git a/res/img/flags/AM.png b/res/img/flags/AM.png
new file mode 100644
index 00000000000..b1bb36b987a
Binary files /dev/null and b/res/img/flags/AM.png differ
diff --git a/res/img/flags/AO.png b/res/img/flags/AO.png
new file mode 100644
index 00000000000..ae68b12c44d
Binary files /dev/null and b/res/img/flags/AO.png differ
diff --git a/res/img/flags/AQ.png b/res/img/flags/AQ.png
new file mode 100644
index 00000000000..146e9c0a044
Binary files /dev/null and b/res/img/flags/AQ.png differ
diff --git a/res/img/flags/AR.png b/res/img/flags/AR.png
new file mode 100644
index 00000000000..8142adfc836
Binary files /dev/null and b/res/img/flags/AR.png differ
diff --git a/res/img/flags/AS.png b/res/img/flags/AS.png
new file mode 100644
index 00000000000..cc5bf30daf4
Binary files /dev/null and b/res/img/flags/AS.png differ
diff --git a/res/img/flags/AT.png b/res/img/flags/AT.png
new file mode 100644
index 00000000000..e32414bd6ac
Binary files /dev/null and b/res/img/flags/AT.png differ
diff --git a/res/img/flags/AU.png b/res/img/flags/AU.png
new file mode 100644
index 00000000000..8d1e143791f
Binary files /dev/null and b/res/img/flags/AU.png differ
diff --git a/res/img/flags/AW.png b/res/img/flags/AW.png
new file mode 100644
index 00000000000..6ec178847e2
Binary files /dev/null and b/res/img/flags/AW.png differ
diff --git a/res/img/flags/AX.png b/res/img/flags/AX.png
new file mode 100644
index 00000000000..ba269c0453b
Binary files /dev/null and b/res/img/flags/AX.png differ
diff --git a/res/img/flags/AZ.png b/res/img/flags/AZ.png
new file mode 100644
index 00000000000..2bf3c746e7a
Binary files /dev/null and b/res/img/flags/AZ.png differ
diff --git a/res/img/flags/BA.png b/res/img/flags/BA.png
new file mode 100644
index 00000000000..3e3ec3fc767
Binary files /dev/null and b/res/img/flags/BA.png differ
diff --git a/res/img/flags/BB.png b/res/img/flags/BB.png
new file mode 100644
index 00000000000..694050ca469
Binary files /dev/null and b/res/img/flags/BB.png differ
diff --git a/res/img/flags/BD.png b/res/img/flags/BD.png
new file mode 100644
index 00000000000..6de2cde85bc
Binary files /dev/null and b/res/img/flags/BD.png differ
diff --git a/res/img/flags/BE.png b/res/img/flags/BE.png
new file mode 100644
index 00000000000..742ba9231fe
Binary files /dev/null and b/res/img/flags/BE.png differ
diff --git a/res/img/flags/BF.png b/res/img/flags/BF.png
new file mode 100644
index 00000000000..17f9f67d266
Binary files /dev/null and b/res/img/flags/BF.png differ
diff --git a/res/img/flags/BG.png b/res/img/flags/BG.png
new file mode 100644
index 00000000000..b01d3ff57b3
Binary files /dev/null and b/res/img/flags/BG.png differ
diff --git a/res/img/flags/BH.png b/res/img/flags/BH.png
new file mode 100644
index 00000000000..d0f82e82855
Binary files /dev/null and b/res/img/flags/BH.png differ
diff --git a/res/img/flags/BI.png b/res/img/flags/BI.png
new file mode 100644
index 00000000000..21865ac7202
Binary files /dev/null and b/res/img/flags/BI.png differ
diff --git a/res/img/flags/BJ.png b/res/img/flags/BJ.png
new file mode 100644
index 00000000000..a7c60914342
Binary files /dev/null and b/res/img/flags/BJ.png differ
diff --git a/res/img/flags/BL.png b/res/img/flags/BL.png
new file mode 100644
index 00000000000..6d50a0f544a
Binary files /dev/null and b/res/img/flags/BL.png differ
diff --git a/res/img/flags/BM.png b/res/img/flags/BM.png
new file mode 100644
index 00000000000..310a25ea238
Binary files /dev/null and b/res/img/flags/BM.png differ
diff --git a/res/img/flags/BN.png b/res/img/flags/BN.png
new file mode 100644
index 00000000000..bc4da8d9a61
Binary files /dev/null and b/res/img/flags/BN.png differ
diff --git a/res/img/flags/BO.png b/res/img/flags/BO.png
new file mode 100644
index 00000000000..144b8d32db9
Binary files /dev/null and b/res/img/flags/BO.png differ
diff --git a/res/img/flags/BQ.png b/res/img/flags/BQ.png
new file mode 100644
index 00000000000..0897943760f
Binary files /dev/null and b/res/img/flags/BQ.png differ
diff --git a/res/img/flags/BR.png b/res/img/flags/BR.png
new file mode 100644
index 00000000000..02784925925
Binary files /dev/null and b/res/img/flags/BR.png differ
diff --git a/res/img/flags/BS.png b/res/img/flags/BS.png
new file mode 100644
index 00000000000..2b05a8fc7c4
Binary files /dev/null and b/res/img/flags/BS.png differ
diff --git a/res/img/flags/BT.png b/res/img/flags/BT.png
new file mode 100644
index 00000000000..1f031df071c
Binary files /dev/null and b/res/img/flags/BT.png differ
diff --git a/res/img/flags/BV.png b/res/img/flags/BV.png
new file mode 100644
index 00000000000..aafb0f17761
Binary files /dev/null and b/res/img/flags/BV.png differ
diff --git a/res/img/flags/BW.png b/res/img/flags/BW.png
new file mode 100644
index 00000000000..30840167189
Binary files /dev/null and b/res/img/flags/BW.png differ
diff --git a/res/img/flags/BY.png b/res/img/flags/BY.png
new file mode 100644
index 00000000000..ce9de9c9c7c
Binary files /dev/null and b/res/img/flags/BY.png differ
diff --git a/res/img/flags/BZ.png b/res/img/flags/BZ.png
new file mode 100644
index 00000000000..33620c3f314
Binary files /dev/null and b/res/img/flags/BZ.png differ
diff --git a/res/img/flags/CA.png b/res/img/flags/CA.png
new file mode 100644
index 00000000000..4bbf8b11699
Binary files /dev/null and b/res/img/flags/CA.png differ
diff --git a/res/img/flags/CC.png b/res/img/flags/CC.png
new file mode 100644
index 00000000000..fd40fc8a783
Binary files /dev/null and b/res/img/flags/CC.png differ
diff --git a/res/img/flags/CD.png b/res/img/flags/CD.png
new file mode 100644
index 00000000000..230aacd454f
Binary files /dev/null and b/res/img/flags/CD.png differ
diff --git a/res/img/flags/CF.png b/res/img/flags/CF.png
new file mode 100644
index 00000000000..c58ed4f7b2d
Binary files /dev/null and b/res/img/flags/CF.png differ
diff --git a/res/img/flags/CG.png b/res/img/flags/CG.png
new file mode 100644
index 00000000000..6c2441e3e03
Binary files /dev/null and b/res/img/flags/CG.png differ
diff --git a/res/img/flags/CH.png b/res/img/flags/CH.png
new file mode 100644
index 00000000000..9fd87167df8
Binary files /dev/null and b/res/img/flags/CH.png differ
diff --git a/res/img/flags/CI.png b/res/img/flags/CI.png
new file mode 100644
index 00000000000..9741b9b11f0
Binary files /dev/null and b/res/img/flags/CI.png differ
diff --git a/res/img/flags/CK.png b/res/img/flags/CK.png
new file mode 100644
index 00000000000..6cca35967c1
Binary files /dev/null and b/res/img/flags/CK.png differ
diff --git a/res/img/flags/CL.png b/res/img/flags/CL.png
new file mode 100644
index 00000000000..13b993d15de
Binary files /dev/null and b/res/img/flags/CL.png differ
diff --git a/res/img/flags/CM.png b/res/img/flags/CM.png
new file mode 100644
index 00000000000..bca5730fb54
Binary files /dev/null and b/res/img/flags/CM.png differ
diff --git a/res/img/flags/CN.png b/res/img/flags/CN.png
new file mode 100644
index 00000000000..e086855c731
Binary files /dev/null and b/res/img/flags/CN.png differ
diff --git a/res/img/flags/CO.png b/res/img/flags/CO.png
new file mode 100644
index 00000000000..65c0aba4474
Binary files /dev/null and b/res/img/flags/CO.png differ
diff --git a/res/img/flags/CR.png b/res/img/flags/CR.png
new file mode 100644
index 00000000000..b351c67a530
Binary files /dev/null and b/res/img/flags/CR.png differ
diff --git a/res/img/flags/CU.png b/res/img/flags/CU.png
new file mode 100644
index 00000000000..e7a25c60b38
Binary files /dev/null and b/res/img/flags/CU.png differ
diff --git a/res/img/flags/CV.png b/res/img/flags/CV.png
new file mode 100644
index 00000000000..f249bbaa460
Binary files /dev/null and b/res/img/flags/CV.png differ
diff --git a/res/img/flags/CW.png b/res/img/flags/CW.png
new file mode 100644
index 00000000000..e02cacd3dd9
Binary files /dev/null and b/res/img/flags/CW.png differ
diff --git a/res/img/flags/CX.png b/res/img/flags/CX.png
new file mode 100644
index 00000000000..3ea21422f0f
Binary files /dev/null and b/res/img/flags/CX.png differ
diff --git a/res/img/flags/CY.png b/res/img/flags/CY.png
new file mode 100644
index 00000000000..3182f48bd25
Binary files /dev/null and b/res/img/flags/CY.png differ
diff --git a/res/img/flags/CZ.png b/res/img/flags/CZ.png
new file mode 100644
index 00000000000..54623346383
Binary files /dev/null and b/res/img/flags/CZ.png differ
diff --git a/res/img/flags/DE.png b/res/img/flags/DE.png
new file mode 100644
index 00000000000..93e269166b5
Binary files /dev/null and b/res/img/flags/DE.png differ
diff --git a/res/img/flags/DJ.png b/res/img/flags/DJ.png
new file mode 100644
index 00000000000..243bb7390d2
Binary files /dev/null and b/res/img/flags/DJ.png differ
diff --git a/res/img/flags/DK.png b/res/img/flags/DK.png
new file mode 100644
index 00000000000..fc74cc396cc
Binary files /dev/null and b/res/img/flags/DK.png differ
diff --git a/res/img/flags/DM.png b/res/img/flags/DM.png
new file mode 100644
index 00000000000..c3a0e9d102a
Binary files /dev/null and b/res/img/flags/DM.png differ
diff --git a/res/img/flags/DO.png b/res/img/flags/DO.png
new file mode 100644
index 00000000000..5c4a004fefe
Binary files /dev/null and b/res/img/flags/DO.png differ
diff --git a/res/img/flags/DZ.png b/res/img/flags/DZ.png
new file mode 100644
index 00000000000..1589d0cc40c
Binary files /dev/null and b/res/img/flags/DZ.png differ
diff --git a/res/img/flags/EC.png b/res/img/flags/EC.png
new file mode 100644
index 00000000000..4c53dead1c5
Binary files /dev/null and b/res/img/flags/EC.png differ
diff --git a/res/img/flags/EE.png b/res/img/flags/EE.png
new file mode 100644
index 00000000000..3668de79198
Binary files /dev/null and b/res/img/flags/EE.png differ
diff --git a/res/img/flags/EG.png b/res/img/flags/EG.png
new file mode 100644
index 00000000000..66ec709df74
Binary files /dev/null and b/res/img/flags/EG.png differ
diff --git a/res/img/flags/EH.png b/res/img/flags/EH.png
new file mode 100644
index 00000000000..148be93c083
Binary files /dev/null and b/res/img/flags/EH.png differ
diff --git a/res/img/flags/ER.png b/res/img/flags/ER.png
new file mode 100644
index 00000000000..7cb8441514c
Binary files /dev/null and b/res/img/flags/ER.png differ
diff --git a/res/img/flags/ES.png b/res/img/flags/ES.png
new file mode 100644
index 00000000000..aae73b6fcb4
Binary files /dev/null and b/res/img/flags/ES.png differ
diff --git a/res/img/flags/ET.png b/res/img/flags/ET.png
new file mode 100644
index 00000000000..7b420f02f4d
Binary files /dev/null and b/res/img/flags/ET.png differ
diff --git a/res/img/flags/FI.png b/res/img/flags/FI.png
new file mode 100644
index 00000000000..42f64bf3601
Binary files /dev/null and b/res/img/flags/FI.png differ
diff --git a/res/img/flags/FJ.png b/res/img/flags/FJ.png
new file mode 100644
index 00000000000..cecc683c9cc
Binary files /dev/null and b/res/img/flags/FJ.png differ
diff --git a/res/img/flags/FK.png b/res/img/flags/FK.png
new file mode 100644
index 00000000000..6074fea09c8
Binary files /dev/null and b/res/img/flags/FK.png differ
diff --git a/res/img/flags/FM.png b/res/img/flags/FM.png
new file mode 100644
index 00000000000..45fdb664260
Binary files /dev/null and b/res/img/flags/FM.png differ
diff --git a/res/img/flags/FO.png b/res/img/flags/FO.png
new file mode 100644
index 00000000000..d8fd75c6389
Binary files /dev/null and b/res/img/flags/FO.png differ
diff --git a/res/img/flags/FR.png b/res/img/flags/FR.png
new file mode 100644
index 00000000000..6d50a0f544a
Binary files /dev/null and b/res/img/flags/FR.png differ
diff --git a/res/img/flags/GA.png b/res/img/flags/GA.png
new file mode 100644
index 00000000000..3808a61f1de
Binary files /dev/null and b/res/img/flags/GA.png differ
diff --git a/res/img/flags/GB.png b/res/img/flags/GB.png
new file mode 100644
index 00000000000..589be70063c
Binary files /dev/null and b/res/img/flags/GB.png differ
diff --git a/res/img/flags/GD.png b/res/img/flags/GD.png
new file mode 100644
index 00000000000..babe1e4cc65
Binary files /dev/null and b/res/img/flags/GD.png differ
diff --git a/res/img/flags/GE.png b/res/img/flags/GE.png
new file mode 100644
index 00000000000..d34cddeca9b
Binary files /dev/null and b/res/img/flags/GE.png differ
diff --git a/res/img/flags/GF.png b/res/img/flags/GF.png
new file mode 100644
index 00000000000..98828a59061
Binary files /dev/null and b/res/img/flags/GF.png differ
diff --git a/res/img/flags/GG.png b/res/img/flags/GG.png
new file mode 100644
index 00000000000..aec8969b28a
Binary files /dev/null and b/res/img/flags/GG.png differ
diff --git a/res/img/flags/GH.png b/res/img/flags/GH.png
new file mode 100644
index 00000000000..70b1a623de2
Binary files /dev/null and b/res/img/flags/GH.png differ
diff --git a/res/img/flags/GI.png b/res/img/flags/GI.png
new file mode 100644
index 00000000000..9aa58327e35
Binary files /dev/null and b/res/img/flags/GI.png differ
diff --git a/res/img/flags/GL.png b/res/img/flags/GL.png
new file mode 100644
index 00000000000..cf1645c2b5d
Binary files /dev/null and b/res/img/flags/GL.png differ
diff --git a/res/img/flags/GM.png b/res/img/flags/GM.png
new file mode 100644
index 00000000000..ec374fb3c33
Binary files /dev/null and b/res/img/flags/GM.png differ
diff --git a/res/img/flags/GN.png b/res/img/flags/GN.png
new file mode 100644
index 00000000000..46874b4d985
Binary files /dev/null and b/res/img/flags/GN.png differ
diff --git a/res/img/flags/GP.png b/res/img/flags/GP.png
new file mode 100644
index 00000000000..81b7abdf0e9
Binary files /dev/null and b/res/img/flags/GP.png differ
diff --git a/res/img/flags/GQ.png b/res/img/flags/GQ.png
new file mode 100644
index 00000000000..7fd1015e8be
Binary files /dev/null and b/res/img/flags/GQ.png differ
diff --git a/res/img/flags/GR.png b/res/img/flags/GR.png
new file mode 100644
index 00000000000..101de51eab1
Binary files /dev/null and b/res/img/flags/GR.png differ
diff --git a/res/img/flags/GS.png b/res/img/flags/GS.png
new file mode 100644
index 00000000000..772c2cbe6d3
Binary files /dev/null and b/res/img/flags/GS.png differ
diff --git a/res/img/flags/GT.png b/res/img/flags/GT.png
new file mode 100644
index 00000000000..d5bd8c1e46a
Binary files /dev/null and b/res/img/flags/GT.png differ
diff --git a/res/img/flags/GU.png b/res/img/flags/GU.png
new file mode 100644
index 00000000000..8923085d5a0
Binary files /dev/null and b/res/img/flags/GU.png differ
diff --git a/res/img/flags/GW.png b/res/img/flags/GW.png
new file mode 100644
index 00000000000..20c268ce069
Binary files /dev/null and b/res/img/flags/GW.png differ
diff --git a/res/img/flags/GY.png b/res/img/flags/GY.png
new file mode 100644
index 00000000000..86f56635ef1
Binary files /dev/null and b/res/img/flags/GY.png differ
diff --git a/res/img/flags/HK.png b/res/img/flags/HK.png
new file mode 100644
index 00000000000..907dc596240
Binary files /dev/null and b/res/img/flags/HK.png differ
diff --git a/res/img/flags/HM.png b/res/img/flags/HM.png
new file mode 100644
index 00000000000..8d1e143791f
Binary files /dev/null and b/res/img/flags/HM.png differ
diff --git a/res/img/flags/HN.png b/res/img/flags/HN.png
new file mode 100644
index 00000000000..4cf8c3112c5
Binary files /dev/null and b/res/img/flags/HN.png differ
diff --git a/res/img/flags/HR.png b/res/img/flags/HR.png
new file mode 100644
index 00000000000..413ceb15868
Binary files /dev/null and b/res/img/flags/HR.png differ
diff --git a/res/img/flags/HT.png b/res/img/flags/HT.png
new file mode 100644
index 00000000000..097abeb4344
Binary files /dev/null and b/res/img/flags/HT.png differ
diff --git a/res/img/flags/HU.png b/res/img/flags/HU.png
new file mode 100644
index 00000000000..23499bf63cc
Binary files /dev/null and b/res/img/flags/HU.png differ
diff --git a/res/img/flags/ID.png b/res/img/flags/ID.png
new file mode 100644
index 00000000000..80200657c63
Binary files /dev/null and b/res/img/flags/ID.png differ
diff --git a/res/img/flags/IE.png b/res/img/flags/IE.png
new file mode 100644
index 00000000000..63f22201180
Binary files /dev/null and b/res/img/flags/IE.png differ
diff --git a/res/img/flags/IL.png b/res/img/flags/IL.png
new file mode 100644
index 00000000000..0268826321f
Binary files /dev/null and b/res/img/flags/IL.png differ
diff --git a/res/img/flags/IM.png b/res/img/flags/IM.png
new file mode 100644
index 00000000000..c777acc490b
Binary files /dev/null and b/res/img/flags/IM.png differ
diff --git a/res/img/flags/IN.png b/res/img/flags/IN.png
new file mode 100644
index 00000000000..85fa9bfe729
Binary files /dev/null and b/res/img/flags/IN.png differ
diff --git a/res/img/flags/IO.png b/res/img/flags/IO.png
new file mode 100644
index 00000000000..1675d8e7dbe
Binary files /dev/null and b/res/img/flags/IO.png differ
diff --git a/res/img/flags/IQ.png b/res/img/flags/IQ.png
new file mode 100644
index 00000000000..f2c21f7260a
Binary files /dev/null and b/res/img/flags/IQ.png differ
diff --git a/res/img/flags/IR.png b/res/img/flags/IR.png
new file mode 100644
index 00000000000..0b8e67506c2
Binary files /dev/null and b/res/img/flags/IR.png differ
diff --git a/res/img/flags/IS.png b/res/img/flags/IS.png
new file mode 100644
index 00000000000..5ee3e63c5c2
Binary files /dev/null and b/res/img/flags/IS.png differ
diff --git a/res/img/flags/IT.png b/res/img/flags/IT.png
new file mode 100644
index 00000000000..53b967be99f
Binary files /dev/null and b/res/img/flags/IT.png differ
diff --git a/res/img/flags/JE.png b/res/img/flags/JE.png
new file mode 100644
index 00000000000..a1437aba781
Binary files /dev/null and b/res/img/flags/JE.png differ
diff --git a/res/img/flags/JM.png b/res/img/flags/JM.png
new file mode 100644
index 00000000000..0d462fa3aea
Binary files /dev/null and b/res/img/flags/JM.png differ
diff --git a/res/img/flags/JO.png b/res/img/flags/JO.png
new file mode 100644
index 00000000000..8934db7ecaf
Binary files /dev/null and b/res/img/flags/JO.png differ
diff --git a/res/img/flags/JP.png b/res/img/flags/JP.png
new file mode 100644
index 00000000000..6f92d523656
Binary files /dev/null and b/res/img/flags/JP.png differ
diff --git a/res/img/flags/KE.png b/res/img/flags/KE.png
new file mode 100644
index 00000000000..866b3f15dca
Binary files /dev/null and b/res/img/flags/KE.png differ
diff --git a/res/img/flags/KG.png b/res/img/flags/KG.png
new file mode 100644
index 00000000000..56b433c7566
Binary files /dev/null and b/res/img/flags/KG.png differ
diff --git a/res/img/flags/KH.png b/res/img/flags/KH.png
new file mode 100644
index 00000000000..e1ddd5f84c1
Binary files /dev/null and b/res/img/flags/KH.png differ
diff --git a/res/img/flags/KI.png b/res/img/flags/KI.png
new file mode 100644
index 00000000000..8b7c54bc0fd
Binary files /dev/null and b/res/img/flags/KI.png differ
diff --git a/res/img/flags/KM.png b/res/img/flags/KM.png
new file mode 100644
index 00000000000..227a3b33967
Binary files /dev/null and b/res/img/flags/KM.png differ
diff --git a/res/img/flags/KN.png b/res/img/flags/KN.png
new file mode 100644
index 00000000000..bc6189bed12
Binary files /dev/null and b/res/img/flags/KN.png differ
diff --git a/res/img/flags/KP.png b/res/img/flags/KP.png
new file mode 100644
index 00000000000..c92248b9101
Binary files /dev/null and b/res/img/flags/KP.png differ
diff --git a/res/img/flags/KR.png b/res/img/flags/KR.png
new file mode 100644
index 00000000000..ab1cb94943f
Binary files /dev/null and b/res/img/flags/KR.png differ
diff --git a/res/img/flags/KW.png b/res/img/flags/KW.png
new file mode 100644
index 00000000000..0b41c7a5327
Binary files /dev/null and b/res/img/flags/KW.png differ
diff --git a/res/img/flags/KY.png b/res/img/flags/KY.png
new file mode 100644
index 00000000000..7af5290d317
Binary files /dev/null and b/res/img/flags/KY.png differ
diff --git a/res/img/flags/KZ.png b/res/img/flags/KZ.png
new file mode 100644
index 00000000000..e10a1255a08
Binary files /dev/null and b/res/img/flags/KZ.png differ
diff --git a/res/img/flags/LA.png b/res/img/flags/LA.png
new file mode 100644
index 00000000000..6ad67d42558
Binary files /dev/null and b/res/img/flags/LA.png differ
diff --git a/res/img/flags/LB.png b/res/img/flags/LB.png
new file mode 100644
index 00000000000..865df57a42f
Binary files /dev/null and b/res/img/flags/LB.png differ
diff --git a/res/img/flags/LC.png b/res/img/flags/LC.png
new file mode 100644
index 00000000000..e83a2d08bc6
Binary files /dev/null and b/res/img/flags/LC.png differ
diff --git a/res/img/flags/LI.png b/res/img/flags/LI.png
new file mode 100644
index 00000000000..57034d367c4
Binary files /dev/null and b/res/img/flags/LI.png differ
diff --git a/res/img/flags/LK.png b/res/img/flags/LK.png
new file mode 100644
index 00000000000..6e7ad58254e
Binary files /dev/null and b/res/img/flags/LK.png differ
diff --git a/res/img/flags/LR.png b/res/img/flags/LR.png
new file mode 100644
index 00000000000..46c3b84a925
Binary files /dev/null and b/res/img/flags/LR.png differ
diff --git a/res/img/flags/LS.png b/res/img/flags/LS.png
new file mode 100644
index 00000000000..79b505d4904
Binary files /dev/null and b/res/img/flags/LS.png differ
diff --git a/res/img/flags/LT.png b/res/img/flags/LT.png
new file mode 100644
index 00000000000..7740cdc0a09
Binary files /dev/null and b/res/img/flags/LT.png differ
diff --git a/res/img/flags/LU.png b/res/img/flags/LU.png
new file mode 100644
index 00000000000..8f383e674e8
Binary files /dev/null and b/res/img/flags/LU.png differ
diff --git a/res/img/flags/LV.png b/res/img/flags/LV.png
new file mode 100644
index 00000000000..a0f36d89c49
Binary files /dev/null and b/res/img/flags/LV.png differ
diff --git a/res/img/flags/LY.png b/res/img/flags/LY.png
new file mode 100644
index 00000000000..2884c4c0a9c
Binary files /dev/null and b/res/img/flags/LY.png differ
diff --git a/res/img/flags/MA.png b/res/img/flags/MA.png
new file mode 100644
index 00000000000..1f76cfc9bd4
Binary files /dev/null and b/res/img/flags/MA.png differ
diff --git a/res/img/flags/MC.png b/res/img/flags/MC.png
new file mode 100644
index 00000000000..06fc2ad1663
Binary files /dev/null and b/res/img/flags/MC.png differ
diff --git a/res/img/flags/MD.png b/res/img/flags/MD.png
new file mode 100644
index 00000000000..8e54c2b815f
Binary files /dev/null and b/res/img/flags/MD.png differ
diff --git a/res/img/flags/ME.png b/res/img/flags/ME.png
new file mode 100644
index 00000000000..97424d4ec26
Binary files /dev/null and b/res/img/flags/ME.png differ
diff --git a/res/img/flags/MF.png b/res/img/flags/MF.png
new file mode 100644
index 00000000000..6d50a0f544a
Binary files /dev/null and b/res/img/flags/MF.png differ
diff --git a/res/img/flags/MG.png b/res/img/flags/MG.png
new file mode 100644
index 00000000000..28bfccc9e89
Binary files /dev/null and b/res/img/flags/MG.png differ
diff --git a/res/img/flags/MH.png b/res/img/flags/MH.png
new file mode 100644
index 00000000000..e482a659245
Binary files /dev/null and b/res/img/flags/MH.png differ
diff --git a/res/img/flags/MK.png b/res/img/flags/MK.png
new file mode 100644
index 00000000000..84e2e65e766
Binary files /dev/null and b/res/img/flags/MK.png differ
diff --git a/res/img/flags/ML.png b/res/img/flags/ML.png
new file mode 100644
index 00000000000..38fec347964
Binary files /dev/null and b/res/img/flags/ML.png differ
diff --git a/res/img/flags/MM.png b/res/img/flags/MM.png
new file mode 100644
index 00000000000..70a03c6b14d
Binary files /dev/null and b/res/img/flags/MM.png differ
diff --git a/res/img/flags/MN.png b/res/img/flags/MN.png
new file mode 100644
index 00000000000..1e1bbe60894
Binary files /dev/null and b/res/img/flags/MN.png differ
diff --git a/res/img/flags/MO.png b/res/img/flags/MO.png
new file mode 100644
index 00000000000..3833d683e7c
Binary files /dev/null and b/res/img/flags/MO.png differ
diff --git a/res/img/flags/MP.png b/res/img/flags/MP.png
new file mode 100644
index 00000000000..63119096b0c
Binary files /dev/null and b/res/img/flags/MP.png differ
diff --git a/res/img/flags/MQ.png b/res/img/flags/MQ.png
new file mode 100644
index 00000000000..9cab441aec6
Binary files /dev/null and b/res/img/flags/MQ.png differ
diff --git a/res/img/flags/MR.png b/res/img/flags/MR.png
new file mode 100644
index 00000000000..c144de17f7b
Binary files /dev/null and b/res/img/flags/MR.png differ
diff --git a/res/img/flags/MS.png b/res/img/flags/MS.png
new file mode 100644
index 00000000000..12217070421
Binary files /dev/null and b/res/img/flags/MS.png differ
diff --git a/res/img/flags/MT.png b/res/img/flags/MT.png
new file mode 100644
index 00000000000..7963aa618a4
Binary files /dev/null and b/res/img/flags/MT.png differ
diff --git a/res/img/flags/MU.png b/res/img/flags/MU.png
new file mode 100644
index 00000000000..d5d4d4008df
Binary files /dev/null and b/res/img/flags/MU.png differ
diff --git a/res/img/flags/MV.png b/res/img/flags/MV.png
new file mode 100644
index 00000000000..0f2ecb43896
Binary files /dev/null and b/res/img/flags/MV.png differ
diff --git a/res/img/flags/MW.png b/res/img/flags/MW.png
new file mode 100644
index 00000000000..d0a5d24f559
Binary files /dev/null and b/res/img/flags/MW.png differ
diff --git a/res/img/flags/MX.png b/res/img/flags/MX.png
new file mode 100644
index 00000000000..096cb1111fa
Binary files /dev/null and b/res/img/flags/MX.png differ
diff --git a/res/img/flags/MY.png b/res/img/flags/MY.png
new file mode 100644
index 00000000000..17f18ac5192
Binary files /dev/null and b/res/img/flags/MY.png differ
diff --git a/res/img/flags/MZ.png b/res/img/flags/MZ.png
new file mode 100644
index 00000000000..66be6563c63
Binary files /dev/null and b/res/img/flags/MZ.png differ
diff --git a/res/img/flags/NA.png b/res/img/flags/NA.png
new file mode 100644
index 00000000000..7ecfd317c71
Binary files /dev/null and b/res/img/flags/NA.png differ
diff --git a/res/img/flags/NC.png b/res/img/flags/NC.png
new file mode 100644
index 00000000000..11126ade770
Binary files /dev/null and b/res/img/flags/NC.png differ
diff --git a/res/img/flags/NE.png b/res/img/flags/NE.png
new file mode 100644
index 00000000000..d584fa8429e
Binary files /dev/null and b/res/img/flags/NE.png differ
diff --git a/res/img/flags/NF.png b/res/img/flags/NF.png
new file mode 100644
index 00000000000..c0540425917
Binary files /dev/null and b/res/img/flags/NF.png differ
diff --git a/res/img/flags/NG.png b/res/img/flags/NG.png
new file mode 100644
index 00000000000..73aee15b3f3
Binary files /dev/null and b/res/img/flags/NG.png differ
diff --git a/res/img/flags/NI.png b/res/img/flags/NI.png
new file mode 100644
index 00000000000..fd044933e48
Binary files /dev/null and b/res/img/flags/NI.png differ
diff --git a/res/img/flags/NL.png b/res/img/flags/NL.png
new file mode 100644
index 00000000000..0897943760f
Binary files /dev/null and b/res/img/flags/NL.png differ
diff --git a/res/img/flags/NO.png b/res/img/flags/NO.png
new file mode 100644
index 00000000000..aafb0f17761
Binary files /dev/null and b/res/img/flags/NO.png differ
diff --git a/res/img/flags/NP.png b/res/img/flags/NP.png
new file mode 100644
index 00000000000..744458e17e9
Binary files /dev/null and b/res/img/flags/NP.png differ
diff --git a/res/img/flags/NR.png b/res/img/flags/NR.png
new file mode 100644
index 00000000000..58c2afb228a
Binary files /dev/null and b/res/img/flags/NR.png differ
diff --git a/res/img/flags/NU.png b/res/img/flags/NU.png
new file mode 100644
index 00000000000..007c99eca5f
Binary files /dev/null and b/res/img/flags/NU.png differ
diff --git a/res/img/flags/NZ.png b/res/img/flags/NZ.png
new file mode 100644
index 00000000000..839368dd7bc
Binary files /dev/null and b/res/img/flags/NZ.png differ
diff --git a/res/img/flags/OM.png b/res/img/flags/OM.png
new file mode 100644
index 00000000000..63a893367fa
Binary files /dev/null and b/res/img/flags/OM.png differ
diff --git a/res/img/flags/PA.png b/res/img/flags/PA.png
new file mode 100644
index 00000000000..3515d95d371
Binary files /dev/null and b/res/img/flags/PA.png differ
diff --git a/res/img/flags/PE.png b/res/img/flags/PE.png
new file mode 100644
index 00000000000..58f70b8d180
Binary files /dev/null and b/res/img/flags/PE.png differ
diff --git a/res/img/flags/PF.png b/res/img/flags/PF.png
new file mode 100644
index 00000000000..2f33f2574f0
Binary files /dev/null and b/res/img/flags/PF.png differ
diff --git a/res/img/flags/PG.png b/res/img/flags/PG.png
new file mode 100644
index 00000000000..c796f587c63
Binary files /dev/null and b/res/img/flags/PG.png differ
diff --git a/res/img/flags/PH.png b/res/img/flags/PH.png
new file mode 100644
index 00000000000..0d98de03861
Binary files /dev/null and b/res/img/flags/PH.png differ
diff --git a/res/img/flags/PK.png b/res/img/flags/PK.png
new file mode 100644
index 00000000000..87f4e2f4924
Binary files /dev/null and b/res/img/flags/PK.png differ
diff --git a/res/img/flags/PL.png b/res/img/flags/PL.png
new file mode 100644
index 00000000000..273869dfc68
Binary files /dev/null and b/res/img/flags/PL.png differ
diff --git a/res/img/flags/PM.png b/res/img/flags/PM.png
new file mode 100644
index 00000000000..b74c396d924
Binary files /dev/null and b/res/img/flags/PM.png differ
diff --git a/res/img/flags/PN.png b/res/img/flags/PN.png
new file mode 100644
index 00000000000..e34c62d598f
Binary files /dev/null and b/res/img/flags/PN.png differ
diff --git a/res/img/flags/PR.png b/res/img/flags/PR.png
new file mode 100644
index 00000000000..8efdb91252f
Binary files /dev/null and b/res/img/flags/PR.png differ
diff --git a/res/img/flags/PS.png b/res/img/flags/PS.png
new file mode 100644
index 00000000000..7a0cceec00d
Binary files /dev/null and b/res/img/flags/PS.png differ
diff --git a/res/img/flags/PT.png b/res/img/flags/PT.png
new file mode 100644
index 00000000000..49e290827c8
Binary files /dev/null and b/res/img/flags/PT.png differ
diff --git a/res/img/flags/PW.png b/res/img/flags/PW.png
new file mode 100644
index 00000000000..6cb2e1e70d2
Binary files /dev/null and b/res/img/flags/PW.png differ
diff --git a/res/img/flags/PY.png b/res/img/flags/PY.png
new file mode 100644
index 00000000000..a61c42c423f
Binary files /dev/null and b/res/img/flags/PY.png differ
diff --git a/res/img/flags/QA.png b/res/img/flags/QA.png
new file mode 100644
index 00000000000..bb091cc88c2
Binary files /dev/null and b/res/img/flags/QA.png differ
diff --git a/res/img/flags/RE.png b/res/img/flags/RE.png
new file mode 100644
index 00000000000..6d50a0f544a
Binary files /dev/null and b/res/img/flags/RE.png differ
diff --git a/res/img/flags/RO.png b/res/img/flags/RO.png
new file mode 100644
index 00000000000..4495d29eb02
Binary files /dev/null and b/res/img/flags/RO.png differ
diff --git a/res/img/flags/RS.png b/res/img/flags/RS.png
new file mode 100644
index 00000000000..ebb0f28a7bd
Binary files /dev/null and b/res/img/flags/RS.png differ
diff --git a/res/img/flags/RU.png b/res/img/flags/RU.png
new file mode 100644
index 00000000000..64532ffa58a
Binary files /dev/null and b/res/img/flags/RU.png differ
diff --git a/res/img/flags/RW.png b/res/img/flags/RW.png
new file mode 100644
index 00000000000..64b3cfff04b
Binary files /dev/null and b/res/img/flags/RW.png differ
diff --git a/res/img/flags/SA.png b/res/img/flags/SA.png
new file mode 100644
index 00000000000..250de6f6f53
Binary files /dev/null and b/res/img/flags/SA.png differ
diff --git a/res/img/flags/SB.png b/res/img/flags/SB.png
new file mode 100644
index 00000000000..5833c130eb6
Binary files /dev/null and b/res/img/flags/SB.png differ
diff --git a/res/img/flags/SC.png b/res/img/flags/SC.png
new file mode 100644
index 00000000000..ce5248f434c
Binary files /dev/null and b/res/img/flags/SC.png differ
diff --git a/res/img/flags/SD.png b/res/img/flags/SD.png
new file mode 100644
index 00000000000..d8711a83d69
Binary files /dev/null and b/res/img/flags/SD.png differ
diff --git a/res/img/flags/SE.png b/res/img/flags/SE.png
new file mode 100644
index 00000000000..81880931f39
Binary files /dev/null and b/res/img/flags/SE.png differ
diff --git a/res/img/flags/SG.png b/res/img/flags/SG.png
new file mode 100644
index 00000000000..6f00e57923a
Binary files /dev/null and b/res/img/flags/SG.png differ
diff --git a/res/img/flags/SH.png b/res/img/flags/SH.png
new file mode 100644
index 00000000000..055dde68bc1
Binary files /dev/null and b/res/img/flags/SH.png differ
diff --git a/res/img/flags/SI.png b/res/img/flags/SI.png
new file mode 100644
index 00000000000..96359834069
Binary files /dev/null and b/res/img/flags/SI.png differ
diff --git a/res/img/flags/SJ.png b/res/img/flags/SJ.png
new file mode 100644
index 00000000000..aafb0f17761
Binary files /dev/null and b/res/img/flags/SJ.png differ
diff --git a/res/img/flags/SK.png b/res/img/flags/SK.png
new file mode 100644
index 00000000000..84c7021f0a9
Binary files /dev/null and b/res/img/flags/SK.png differ
diff --git a/res/img/flags/SL.png b/res/img/flags/SL.png
new file mode 100644
index 00000000000..c5ed1991411
Binary files /dev/null and b/res/img/flags/SL.png differ
diff --git a/res/img/flags/SM.png b/res/img/flags/SM.png
new file mode 100644
index 00000000000..1af1ca284fd
Binary files /dev/null and b/res/img/flags/SM.png differ
diff --git a/res/img/flags/SN.png b/res/img/flags/SN.png
new file mode 100644
index 00000000000..d0b18435618
Binary files /dev/null and b/res/img/flags/SN.png differ
diff --git a/res/img/flags/SO.png b/res/img/flags/SO.png
new file mode 100644
index 00000000000..64e2970b9d4
Binary files /dev/null and b/res/img/flags/SO.png differ
diff --git a/res/img/flags/SR.png b/res/img/flags/SR.png
new file mode 100644
index 00000000000..b072dda835c
Binary files /dev/null and b/res/img/flags/SR.png differ
diff --git a/res/img/flags/SS.png b/res/img/flags/SS.png
new file mode 100644
index 00000000000..83933d4521d
Binary files /dev/null and b/res/img/flags/SS.png differ
diff --git a/res/img/flags/ST.png b/res/img/flags/ST.png
new file mode 100644
index 00000000000..c102721a863
Binary files /dev/null and b/res/img/flags/ST.png differ
diff --git a/res/img/flags/SV.png b/res/img/flags/SV.png
new file mode 100644
index 00000000000..80de92e5569
Binary files /dev/null and b/res/img/flags/SV.png differ
diff --git a/res/img/flags/SX.png b/res/img/flags/SX.png
new file mode 100644
index 00000000000..dd52215c5df
Binary files /dev/null and b/res/img/flags/SX.png differ
diff --git a/res/img/flags/SY.png b/res/img/flags/SY.png
new file mode 100644
index 00000000000..78f45b7c0be
Binary files /dev/null and b/res/img/flags/SY.png differ
diff --git a/res/img/flags/SZ.png b/res/img/flags/SZ.png
new file mode 100644
index 00000000000..2182f4ff933
Binary files /dev/null and b/res/img/flags/SZ.png differ
diff --git a/res/img/flags/TC.png b/res/img/flags/TC.png
new file mode 100644
index 00000000000..3e3e19d4b3c
Binary files /dev/null and b/res/img/flags/TC.png differ
diff --git a/res/img/flags/TD.png b/res/img/flags/TD.png
new file mode 100644
index 00000000000..753bec22b08
Binary files /dev/null and b/res/img/flags/TD.png differ
diff --git a/res/img/flags/TF.png b/res/img/flags/TF.png
new file mode 100644
index 00000000000..6d50a0f544a
Binary files /dev/null and b/res/img/flags/TF.png differ
diff --git a/res/img/flags/TG.png b/res/img/flags/TG.png
new file mode 100644
index 00000000000..8501ada6556
Binary files /dev/null and b/res/img/flags/TG.png differ
diff --git a/res/img/flags/TH.png b/res/img/flags/TH.png
new file mode 100644
index 00000000000..0c884c329e1
Binary files /dev/null and b/res/img/flags/TH.png differ
diff --git a/res/img/flags/TJ.png b/res/img/flags/TJ.png
new file mode 100644
index 00000000000..3c9026fa0f0
Binary files /dev/null and b/res/img/flags/TJ.png differ
diff --git a/res/img/flags/TK.png b/res/img/flags/TK.png
new file mode 100644
index 00000000000..fd605749ea4
Binary files /dev/null and b/res/img/flags/TK.png differ
diff --git a/res/img/flags/TL.png b/res/img/flags/TL.png
new file mode 100644
index 00000000000..b4c834b1d62
Binary files /dev/null and b/res/img/flags/TL.png differ
diff --git a/res/img/flags/TM.png b/res/img/flags/TM.png
new file mode 100644
index 00000000000..d18cb939a9b
Binary files /dev/null and b/res/img/flags/TM.png differ
diff --git a/res/img/flags/TN.png b/res/img/flags/TN.png
new file mode 100644
index 00000000000..21c4b98be71
Binary files /dev/null and b/res/img/flags/TN.png differ
diff --git a/res/img/flags/TO.png b/res/img/flags/TO.png
new file mode 100644
index 00000000000..c828206e35c
Binary files /dev/null and b/res/img/flags/TO.png differ
diff --git a/res/img/flags/TR.png b/res/img/flags/TR.png
new file mode 100644
index 00000000000..f2a5bd22c8a
Binary files /dev/null and b/res/img/flags/TR.png differ
diff --git a/res/img/flags/TT.png b/res/img/flags/TT.png
new file mode 100644
index 00000000000..66d698334bd
Binary files /dev/null and b/res/img/flags/TT.png differ
diff --git a/res/img/flags/TV.png b/res/img/flags/TV.png
new file mode 100644
index 00000000000..7a127f51ae3
Binary files /dev/null and b/res/img/flags/TV.png differ
diff --git a/res/img/flags/TW.png b/res/img/flags/TW.png
new file mode 100644
index 00000000000..2353ba1b0a5
Binary files /dev/null and b/res/img/flags/TW.png differ
diff --git a/res/img/flags/TZ.png b/res/img/flags/TZ.png
new file mode 100644
index 00000000000..7949f65d8ae
Binary files /dev/null and b/res/img/flags/TZ.png differ
diff --git a/res/img/flags/UA.png b/res/img/flags/UA.png
new file mode 100644
index 00000000000..687e305294d
Binary files /dev/null and b/res/img/flags/UA.png differ
diff --git a/res/img/flags/UG.png b/res/img/flags/UG.png
new file mode 100644
index 00000000000..0a21ad15c38
Binary files /dev/null and b/res/img/flags/UG.png differ
diff --git a/res/img/flags/US.png b/res/img/flags/US.png
new file mode 100644
index 00000000000..c3a245b7679
Binary files /dev/null and b/res/img/flags/US.png differ
diff --git a/res/img/flags/UY.png b/res/img/flags/UY.png
new file mode 100644
index 00000000000..21a347c6fc6
Binary files /dev/null and b/res/img/flags/UY.png differ
diff --git a/res/img/flags/UZ.png b/res/img/flags/UZ.png
new file mode 100644
index 00000000000..643b6ae0cf6
Binary files /dev/null and b/res/img/flags/UZ.png differ
diff --git a/res/img/flags/VA.png b/res/img/flags/VA.png
new file mode 100644
index 00000000000..63a13c0e812
Binary files /dev/null and b/res/img/flags/VA.png differ
diff --git a/res/img/flags/VC.png b/res/img/flags/VC.png
new file mode 100644
index 00000000000..da991a9344c
Binary files /dev/null and b/res/img/flags/VC.png differ
diff --git a/res/img/flags/VE.png b/res/img/flags/VE.png
new file mode 100644
index 00000000000..e75e17c9f04
Binary files /dev/null and b/res/img/flags/VE.png differ
diff --git a/res/img/flags/VG.png b/res/img/flags/VG.png
new file mode 100644
index 00000000000..46f93cad1ec
Binary files /dev/null and b/res/img/flags/VG.png differ
diff --git a/res/img/flags/VI.png b/res/img/flags/VI.png
new file mode 100644
index 00000000000..8c849a733e3
Binary files /dev/null and b/res/img/flags/VI.png differ
diff --git a/res/img/flags/VN.png b/res/img/flags/VN.png
new file mode 100644
index 00000000000..6ea2122f9d1
Binary files /dev/null and b/res/img/flags/VN.png differ
diff --git a/res/img/flags/VU.png b/res/img/flags/VU.png
new file mode 100644
index 00000000000..bad3ba4d46e
Binary files /dev/null and b/res/img/flags/VU.png differ
diff --git a/res/img/flags/WF.png b/res/img/flags/WF.png
new file mode 100644
index 00000000000..d94359dcc40
Binary files /dev/null and b/res/img/flags/WF.png differ
diff --git a/res/img/flags/WS.png b/res/img/flags/WS.png
new file mode 100644
index 00000000000..f8b80e5ba9b
Binary files /dev/null and b/res/img/flags/WS.png differ
diff --git a/res/img/flags/YE.png b/res/img/flags/YE.png
new file mode 100644
index 00000000000..8b9bbd89428
Binary files /dev/null and b/res/img/flags/YE.png differ
diff --git a/res/img/flags/YT.png b/res/img/flags/YT.png
new file mode 100644
index 00000000000..328879361e5
Binary files /dev/null and b/res/img/flags/YT.png differ
diff --git a/res/img/flags/ZA.png b/res/img/flags/ZA.png
new file mode 100644
index 00000000000..7f0a52d3b24
Binary files /dev/null and b/res/img/flags/ZA.png differ
diff --git a/res/img/flags/ZM.png b/res/img/flags/ZM.png
new file mode 100644
index 00000000000..87adc3afaa2
Binary files /dev/null and b/res/img/flags/ZM.png differ
diff --git a/res/img/flags/ZW.png b/res/img/flags/ZW.png
new file mode 100644
index 00000000000..742c9f7e718
Binary files /dev/null and b/res/img/flags/ZW.png differ
diff --git a/res/img/fullscreen.svg b/res/img/fullscreen.svg
new file mode 100644
index 00000000000..e333abb6fbe
--- /dev/null
+++ b/res/img/fullscreen.svg
@@ -0,0 +1,23 @@
+
+
\ No newline at end of file
diff --git a/res/img/hangup.svg b/res/img/hangup.svg
new file mode 100644
index 00000000000..be038d2b30e
--- /dev/null
+++ b/res/img/hangup.svg
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/res/img/hide.png b/res/img/hide.png
new file mode 100644
index 00000000000..c5aaf0dd0de
Binary files /dev/null and b/res/img/hide.png differ
diff --git a/res/img/icon-address-delete.svg b/res/img/icon-address-delete.svg
new file mode 100644
index 00000000000..1289d5aafce
--- /dev/null
+++ b/res/img/icon-address-delete.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/icon-call.svg b/res/img/icon-call.svg
new file mode 100644
index 00000000000..0ca5c29e9d2
--- /dev/null
+++ b/res/img/icon-call.svg
@@ -0,0 +1,8 @@
+
+
+
diff --git a/res/img/icon-context-delete.svg b/res/img/icon-context-delete.svg
new file mode 100644
index 00000000000..fba9fa117b7
--- /dev/null
+++ b/res/img/icon-context-delete.svg
@@ -0,0 +1,10 @@
+
+
+
diff --git a/res/img/icon-context-fave-on.svg b/res/img/icon-context-fave-on.svg
new file mode 100644
index 00000000000..2ae172d8eb8
--- /dev/null
+++ b/res/img/icon-context-fave-on.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/icon-context-fave.svg b/res/img/icon-context-fave.svg
new file mode 100644
index 00000000000..451e1849c8f
--- /dev/null
+++ b/res/img/icon-context-fave.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/icon-context-low-on.svg b/res/img/icon-context-low-on.svg
new file mode 100644
index 00000000000..7578c6335c2
--- /dev/null
+++ b/res/img/icon-context-low-on.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/icon-context-low.svg b/res/img/icon-context-low.svg
new file mode 100644
index 00000000000..663f3ca9eb4
--- /dev/null
+++ b/res/img/icon-context-low.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/icon-context-mute-mentions.svg b/res/img/icon-context-mute-mentions.svg
new file mode 100644
index 00000000000..3693b7a82a6
--- /dev/null
+++ b/res/img/icon-context-mute-mentions.svg
@@ -0,0 +1,11 @@
+
+
+
diff --git a/res/img/icon-context-mute-off-copy.svg b/res/img/icon-context-mute-off-copy.svg
new file mode 100644
index 00000000000..861f2975de2
--- /dev/null
+++ b/res/img/icon-context-mute-off-copy.svg
@@ -0,0 +1,10 @@
+
+
+
diff --git a/res/img/icon-context-mute-off.svg b/res/img/icon-context-mute-off.svg
new file mode 100644
index 00000000000..d801823b5df
--- /dev/null
+++ b/res/img/icon-context-mute-off.svg
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/img/icon-context-mute.svg b/res/img/icon-context-mute.svg
new file mode 100644
index 00000000000..f53b868a76c
--- /dev/null
+++ b/res/img/icon-context-mute.svg
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/img/icon-delete-pink.svg b/res/img/icon-delete-pink.svg
new file mode 100644
index 00000000000..aafa87f1b22
--- /dev/null
+++ b/res/img/icon-delete-pink.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/res/img/icon-email-user.svg b/res/img/icon-email-user.svg
new file mode 100644
index 00000000000..2d41e06f980
--- /dev/null
+++ b/res/img/icon-email-user.svg
@@ -0,0 +1,17 @@
+
+
diff --git a/res/img/icon-invite-people.svg b/res/img/icon-invite-people.svg
new file mode 100644
index 00000000000..f13a03ed702
--- /dev/null
+++ b/res/img/icon-invite-people.svg
@@ -0,0 +1,24 @@
+
+
diff --git a/res/img/icon-mx-user.svg b/res/img/icon-mx-user.svg
new file mode 100644
index 00000000000..5780277f380
--- /dev/null
+++ b/res/img/icon-mx-user.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/res/img/icon-return.svg b/res/img/icon-return.svg
new file mode 100644
index 00000000000..80da0f82aa8
--- /dev/null
+++ b/res/img/icon-return.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/res/img/icon-text-cancel.svg b/res/img/icon-text-cancel.svg
new file mode 100644
index 00000000000..ce28d128aa4
--- /dev/null
+++ b/res/img/icon-text-cancel.svg
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/res/img/icon_context_delete.svg b/res/img/icon_context_delete.svg
new file mode 100644
index 00000000000..896b94ad136
--- /dev/null
+++ b/res/img/icon_context_delete.svg
@@ -0,0 +1,11 @@
+
+
+
diff --git a/res/img/icon_context_fave.svg b/res/img/icon_context_fave.svg
new file mode 100644
index 00000000000..da7b14a1f43
--- /dev/null
+++ b/res/img/icon_context_fave.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/res/img/icon_context_fave_on.svg b/res/img/icon_context_fave_on.svg
new file mode 100644
index 00000000000..e22e92d36ed
--- /dev/null
+++ b/res/img/icon_context_fave_on.svg
@@ -0,0 +1,29 @@
+
+
+
diff --git a/res/img/icon_context_low.svg b/res/img/icon_context_low.svg
new file mode 100644
index 00000000000..ea579ef4c5c
--- /dev/null
+++ b/res/img/icon_context_low.svg
@@ -0,0 +1,11 @@
+
+
+
diff --git a/res/img/icon_context_low_on.svg b/res/img/icon_context_low_on.svg
new file mode 100644
index 00000000000..28300f9a743
--- /dev/null
+++ b/res/img/icon_context_low_on.svg
@@ -0,0 +1,30 @@
+
+
+
diff --git a/res/img/icon_context_message.svg b/res/img/icon_context_message.svg
new file mode 100644
index 00000000000..f2ceccfa78b
--- /dev/null
+++ b/res/img/icon_context_message.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/icon_context_message_dark.svg b/res/img/icon_context_message_dark.svg
new file mode 100644
index 00000000000..b4336cc377b
--- /dev/null
+++ b/res/img/icon_context_message_dark.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/icon_context_person.svg b/res/img/icon_context_person.svg
new file mode 100644
index 00000000000..fff019d3778
--- /dev/null
+++ b/res/img/icon_context_person.svg
@@ -0,0 +1,85 @@
+
+
diff --git a/res/img/icon_context_person_on.svg b/res/img/icon_context_person_on.svg
new file mode 100644
index 00000000000..362944332d3
--- /dev/null
+++ b/res/img/icon_context_person_on.svg
@@ -0,0 +1,85 @@
+
+
diff --git a/res/img/icon_copy_message.svg b/res/img/icon_copy_message.svg
new file mode 100644
index 00000000000..8d8887bb228
--- /dev/null
+++ b/res/img/icon_copy_message.svg
@@ -0,0 +1,86 @@
+
+
diff --git a/res/img/icon_copy_message_dark.svg b/res/img/icon_copy_message_dark.svg
new file mode 100644
index 00000000000..b81e617d8cb
--- /dev/null
+++ b/res/img/icon_copy_message_dark.svg
@@ -0,0 +1,77 @@
+
+
diff --git a/res/img/icon_person.svg b/res/img/icon_person.svg
new file mode 100644
index 00000000000..4be70df0db9
--- /dev/null
+++ b/res/img/icon_person.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/res/img/icons-apps-active.svg b/res/img/icons-apps-active.svg
new file mode 100644
index 00000000000..ea222d0511a
--- /dev/null
+++ b/res/img/icons-apps-active.svg
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/res/img/icons-apps.svg b/res/img/icons-apps.svg
new file mode 100644
index 00000000000..affd8e64083
--- /dev/null
+++ b/res/img/icons-apps.svg
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/res/img/icons-close-button.svg b/res/img/icons-close-button.svg
new file mode 100644
index 00000000000..f960d73a3ce
--- /dev/null
+++ b/res/img/icons-close-button.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/icons-close.svg b/res/img/icons-close.svg
new file mode 100644
index 00000000000..453b51082f6
--- /dev/null
+++ b/res/img/icons-close.svg
@@ -0,0 +1,23 @@
+
+
+
diff --git a/res/img/icons-create-room.svg b/res/img/icons-create-room.svg
new file mode 100644
index 00000000000..252bd2df3b3
--- /dev/null
+++ b/res/img/icons-create-room.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/res/img/icons-directory.svg b/res/img/icons-directory.svg
new file mode 100644
index 00000000000..2688b847136
--- /dev/null
+++ b/res/img/icons-directory.svg
@@ -0,0 +1,24 @@
+
+
\ No newline at end of file
diff --git a/res/img/icons-files.svg b/res/img/icons-files.svg
new file mode 100644
index 00000000000..97ba4228e3f
--- /dev/null
+++ b/res/img/icons-files.svg
@@ -0,0 +1,29 @@
+
+
\ No newline at end of file
diff --git a/res/img/icons-groups.svg b/res/img/icons-groups.svg
new file mode 100644
index 00000000000..8f89ba83c4c
--- /dev/null
+++ b/res/img/icons-groups.svg
@@ -0,0 +1,26 @@
+
+
+
diff --git a/res/img/icons-hide-apps.svg b/res/img/icons-hide-apps.svg
new file mode 100644
index 00000000000..b622e97f71e
--- /dev/null
+++ b/res/img/icons-hide-apps.svg
@@ -0,0 +1,34 @@
+
+
+
diff --git a/res/img/icons-hide-stickers.svg b/res/img/icons-hide-stickers.svg
new file mode 100644
index 00000000000..f28e8646e67
--- /dev/null
+++ b/res/img/icons-hide-stickers.svg
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/res/img/icons-home.svg b/res/img/icons-home.svg
new file mode 100644
index 00000000000..eb5484c8831
--- /dev/null
+++ b/res/img/icons-home.svg
@@ -0,0 +1,27 @@
+
+
+
diff --git a/res/img/icons-notifications.svg b/res/img/icons-notifications.svg
new file mode 100644
index 00000000000..66a49d6c0cf
--- /dev/null
+++ b/res/img/icons-notifications.svg
@@ -0,0 +1,19 @@
+
+
\ No newline at end of file
diff --git a/res/img/icons-people.svg b/res/img/icons-people.svg
new file mode 100644
index 00000000000..8854506127e
--- /dev/null
+++ b/res/img/icons-people.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/res/img/icons-pin.svg b/res/img/icons-pin.svg
new file mode 100644
index 00000000000..a6fbf13baaa
--- /dev/null
+++ b/res/img/icons-pin.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/res/img/icons-room-add.svg b/res/img/icons-room-add.svg
new file mode 100644
index 00000000000..fc0ab750b65
--- /dev/null
+++ b/res/img/icons-room-add.svg
@@ -0,0 +1,23 @@
+
+
+
diff --git a/res/img/icons-room.svg b/res/img/icons-room.svg
new file mode 100644
index 00000000000..d2abb21301c
--- /dev/null
+++ b/res/img/icons-room.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/res/img/icons-search-copy.svg b/res/img/icons-search-copy.svg
new file mode 100644
index 00000000000..b026718b846
--- /dev/null
+++ b/res/img/icons-search-copy.svg
@@ -0,0 +1,10 @@
+
+
+
diff --git a/res/img/icons-search.svg b/res/img/icons-search.svg
new file mode 100644
index 00000000000..d85709e66c4
--- /dev/null
+++ b/res/img/icons-search.svg
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/img/icons-settings-room.svg b/res/img/icons-settings-room.svg
new file mode 100644
index 00000000000..117d134c95d
--- /dev/null
+++ b/res/img/icons-settings-room.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/icons-settings.svg b/res/img/icons-settings.svg
new file mode 100644
index 00000000000..3ca2b655f4d
--- /dev/null
+++ b/res/img/icons-settings.svg
@@ -0,0 +1,15 @@
+
+
diff --git a/res/img/icons-show-apps.svg b/res/img/icons-show-apps.svg
new file mode 100644
index 00000000000..3438157301c
--- /dev/null
+++ b/res/img/icons-show-apps.svg
@@ -0,0 +1,33 @@
+
+
+
diff --git a/res/img/icons-show-stickers.svg b/res/img/icons-show-stickers.svg
new file mode 100644
index 00000000000..26779a3940b
--- /dev/null
+++ b/res/img/icons-show-stickers.svg
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/res/img/icons-upload.svg b/res/img/icons-upload.svg
new file mode 100644
index 00000000000..b0101e87a0f
--- /dev/null
+++ b/res/img/icons-upload.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/res/img/icons-video.svg b/res/img/icons-video.svg
new file mode 100644
index 00000000000..d367f496096
--- /dev/null
+++ b/res/img/icons-video.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/res/img/icons_ellipsis.svg b/res/img/icons_ellipsis.svg
new file mode 100644
index 00000000000..ba600ccacc3
--- /dev/null
+++ b/res/img/icons_ellipsis.svg
@@ -0,0 +1 @@
+
diff --git a/res/img/icons_global.svg b/res/img/icons_global.svg
new file mode 100644
index 00000000000..6c07d3c48ed
--- /dev/null
+++ b/res/img/icons_global.svg
@@ -0,0 +1,19 @@
+
+
\ No newline at end of file
diff --git a/res/img/info.png b/res/img/info.png
new file mode 100644
index 00000000000..699fd64e013
Binary files /dev/null and b/res/img/info.png differ
diff --git a/res/img/leave.svg b/res/img/leave.svg
new file mode 100644
index 00000000000..1acbe593138
--- /dev/null
+++ b/res/img/leave.svg
@@ -0,0 +1,23 @@
+
+
+
diff --git a/res/img/list-close.png b/res/img/list-close.png
new file mode 100644
index 00000000000..82b322f9d4e
Binary files /dev/null and b/res/img/list-close.png differ
diff --git a/res/img/list-close.svg b/res/img/list-close.svg
new file mode 100644
index 00000000000..cd88b2a88fc
--- /dev/null
+++ b/res/img/list-close.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/res/img/list-open.png b/res/img/list-open.png
new file mode 100644
index 00000000000..f8c8063197c
Binary files /dev/null and b/res/img/list-open.png differ
diff --git a/res/img/list-open.svg b/res/img/list-open.svg
new file mode 100644
index 00000000000..e180be88704
--- /dev/null
+++ b/res/img/list-open.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/res/img/maximise.svg b/res/img/maximise.svg
new file mode 100644
index 00000000000..79c6c0ab8b8
--- /dev/null
+++ b/res/img/maximise.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/res/img/maximize.svg b/res/img/maximize.svg
new file mode 100644
index 00000000000..4f9e10191f8
--- /dev/null
+++ b/res/img/maximize.svg
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/res/img/member_chevron.png b/res/img/member_chevron.png
new file mode 100644
index 00000000000..cbbd289dcf4
Binary files /dev/null and b/res/img/member_chevron.png differ
diff --git a/res/img/menu.png b/res/img/menu.png
new file mode 100755
index 00000000000..b45f88950f0
Binary files /dev/null and b/res/img/menu.png differ
diff --git a/res/img/minimise.svg b/res/img/minimise.svg
new file mode 100644
index 00000000000..491756b15aa
--- /dev/null
+++ b/res/img/minimise.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/res/img/minimize.svg b/res/img/minimize.svg
new file mode 100644
index 00000000000..410b0bc08e1
--- /dev/null
+++ b/res/img/minimize.svg
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/res/img/mod.svg b/res/img/mod.svg
new file mode 100644
index 00000000000..847baf98f94
--- /dev/null
+++ b/res/img/mod.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/res/img/network-matrix.svg b/res/img/network-matrix.svg
new file mode 100644
index 00000000000..bb8278ae39b
--- /dev/null
+++ b/res/img/network-matrix.svg
@@ -0,0 +1,14 @@
+
+
+
diff --git a/res/img/newmessages.png b/res/img/newmessages.png
new file mode 100644
index 00000000000..a22156ab214
Binary files /dev/null and b/res/img/newmessages.png differ
diff --git a/res/img/newmessages.svg b/res/img/newmessages.svg
new file mode 100644
index 00000000000..a2ffca90201
--- /dev/null
+++ b/res/img/newmessages.svg
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/res/img/notif-active.svg b/res/img/notif-active.svg
new file mode 100644
index 00000000000..9eb279f851e
--- /dev/null
+++ b/res/img/notif-active.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/res/img/notif-slider.svg b/res/img/notif-slider.svg
new file mode 100644
index 00000000000..55fa06d11ad
--- /dev/null
+++ b/res/img/notif-slider.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/res/img/placeholder.png b/res/img/placeholder.png
new file mode 100644
index 00000000000..7da32f259c1
Binary files /dev/null and b/res/img/placeholder.png differ
diff --git a/res/img/plus.svg b/res/img/plus.svg
new file mode 100644
index 00000000000..e1d59ec6f42
--- /dev/null
+++ b/res/img/plus.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/res/img/right_search.svg b/res/img/right_search.svg
new file mode 100644
index 00000000000..b430a6be199
--- /dev/null
+++ b/res/img/right_search.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/scrolldown.svg b/res/img/scrolldown.svg
new file mode 100644
index 00000000000..d6599c5fc76
--- /dev/null
+++ b/res/img/scrolldown.svg
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/res/img/scrollto.svg b/res/img/scrollto.svg
new file mode 100644
index 00000000000..75df053a68e
--- /dev/null
+++ b/res/img/scrollto.svg
@@ -0,0 +1,21 @@
+
+
\ No newline at end of file
diff --git a/res/img/scrollup.svg b/res/img/scrollup.svg
new file mode 100644
index 00000000000..1692f2a6c0a
--- /dev/null
+++ b/res/img/scrollup.svg
@@ -0,0 +1,91 @@
+
+
diff --git a/res/img/search-button.svg b/res/img/search-button.svg
new file mode 100644
index 00000000000..f4808842fff
--- /dev/null
+++ b/res/img/search-button.svg
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/res/img/search-icon-vector.svg b/res/img/search-icon-vector.svg
new file mode 100644
index 00000000000..5780277f380
--- /dev/null
+++ b/res/img/search-icon-vector.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/res/img/search.png b/res/img/search.png
new file mode 100644
index 00000000000..2f98d290482
Binary files /dev/null and b/res/img/search.png differ
diff --git a/res/img/search.svg b/res/img/search.svg
new file mode 100644
index 00000000000..bd4cd9200c6
--- /dev/null
+++ b/res/img/search.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/selected.png b/res/img/selected.png
new file mode 100644
index 00000000000..8931cba75ff
Binary files /dev/null and b/res/img/selected.png differ
diff --git a/res/img/settings-big.png b/res/img/settings-big.png
new file mode 100644
index 00000000000..cb2e0a62d06
Binary files /dev/null and b/res/img/settings-big.png differ
diff --git a/res/img/settings-big.svg b/res/img/settings-big.svg
new file mode 100644
index 00000000000..c9587d58c21
--- /dev/null
+++ b/res/img/settings-big.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/res/img/settings.png b/res/img/settings.png
new file mode 100644
index 00000000000..264b3c9bc3f
Binary files /dev/null and b/res/img/settings.png differ
diff --git a/res/img/settings.svg b/res/img/settings.svg
new file mode 100644
index 00000000000..4190c7b8dec
--- /dev/null
+++ b/res/img/settings.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/res/img/sound-indicator.svg b/res/img/sound-indicator.svg
new file mode 100644
index 00000000000..9b8de53d812
--- /dev/null
+++ b/res/img/sound-indicator.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/spinner.gif b/res/img/spinner.gif
new file mode 100644
index 00000000000..ab4871214b1
Binary files /dev/null and b/res/img/spinner.gif differ
diff --git a/res/img/stickerpack-placeholder.png b/res/img/stickerpack-placeholder.png
new file mode 100644
index 00000000000..79801144385
Binary files /dev/null and b/res/img/stickerpack-placeholder.png differ
diff --git a/res/img/tick.svg b/res/img/tick.svg
new file mode 100644
index 00000000000..6177f15f5e0
--- /dev/null
+++ b/res/img/tick.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/res/img/trans.png b/res/img/trans.png
new file mode 100644
index 00000000000..8ba2310a063
Binary files /dev/null and b/res/img/trans.png differ
diff --git a/res/img/typing.png b/res/img/typing.png
new file mode 100644
index 00000000000..066a0ce8fda
Binary files /dev/null and b/res/img/typing.png differ
diff --git a/res/img/upload-big.png b/res/img/upload-big.png
new file mode 100644
index 00000000000..c11c0c452de
Binary files /dev/null and b/res/img/upload-big.png differ
diff --git a/res/img/upload-big.svg b/res/img/upload-big.svg
new file mode 100644
index 00000000000..6099c2e9760
--- /dev/null
+++ b/res/img/upload-big.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/res/img/upload.png b/res/img/upload.png
new file mode 100644
index 00000000000..7457bcd0f13
Binary files /dev/null and b/res/img/upload.png differ
diff --git a/res/img/upload.svg b/res/img/upload.svg
new file mode 100644
index 00000000000..039014a2f30
--- /dev/null
+++ b/res/img/upload.svg
@@ -0,0 +1,19 @@
+
+
\ No newline at end of file
diff --git a/res/img/video-mute.svg b/res/img/video-mute.svg
new file mode 100644
index 00000000000..6de60ba39be
--- /dev/null
+++ b/res/img/video-mute.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/res/img/video-unmute.svg b/res/img/video-unmute.svg
new file mode 100644
index 00000000000..a6c6c3b6815
--- /dev/null
+++ b/res/img/video-unmute.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/res/img/video.png b/res/img/video.png
new file mode 100644
index 00000000000..2a788f6fa47
Binary files /dev/null and b/res/img/video.png differ
diff --git a/res/img/voice-mute.svg b/res/img/voice-mute.svg
new file mode 100644
index 00000000000..336641078e5
--- /dev/null
+++ b/res/img/voice-mute.svg
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/res/img/voice-unmute.svg b/res/img/voice-unmute.svg
new file mode 100644
index 00000000000..0d7e6f429f3
--- /dev/null
+++ b/res/img/voice-unmute.svg
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/res/img/voice.png b/res/img/voice.png
new file mode 100644
index 00000000000..5ba765b0f45
Binary files /dev/null and b/res/img/voice.png differ
diff --git a/res/img/voice.svg b/res/img/voice.svg
new file mode 100644
index 00000000000..ff87270ba50
--- /dev/null
+++ b/res/img/voice.svg
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/res/img/voip-chevron.svg b/res/img/voip-chevron.svg
new file mode 100644
index 00000000000..5f7cbe71531
--- /dev/null
+++ b/res/img/voip-chevron.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/res/img/voip-mute.png b/res/img/voip-mute.png
new file mode 100644
index 00000000000..a16d1001e57
Binary files /dev/null and b/res/img/voip-mute.png differ
diff --git a/res/img/voip.png b/res/img/voip.png
new file mode 100644
index 00000000000..e8f05bcc377
Binary files /dev/null and b/res/img/voip.png differ
diff --git a/res/img/warning.png b/res/img/warning.png
new file mode 100644
index 00000000000..c5553530a84
Binary files /dev/null and b/res/img/warning.png differ
diff --git a/res/img/warning.svg b/res/img/warning.svg
new file mode 100644
index 00000000000..b9a96a88e5b
--- /dev/null
+++ b/res/img/warning.svg
@@ -0,0 +1,31 @@
+
+
+
diff --git a/res/img/warning2.png b/res/img/warning2.png
new file mode 100644
index 00000000000..db0fd4a897d
Binary files /dev/null and b/res/img/warning2.png differ
diff --git a/res/img/warning_yellow.svg b/res/img/warning_yellow.svg
new file mode 100644
index 00000000000..4d227517d28
--- /dev/null
+++ b/res/img/warning_yellow.svg
@@ -0,0 +1,34 @@
+
+
+
+
diff --git a/res/img/zoom.png b/res/img/zoom.png
new file mode 100644
index 00000000000..f05ea959b44
Binary files /dev/null and b/res/img/zoom.png differ
diff --git a/res/media/busy.mp3 b/res/media/busy.mp3
new file mode 100644
index 00000000000..fec27ba4c59
Binary files /dev/null and b/res/media/busy.mp3 differ
diff --git a/res/media/busy.ogg b/res/media/busy.ogg
new file mode 100644
index 00000000000..5d64a7d0d98
Binary files /dev/null and b/res/media/busy.ogg differ
diff --git a/res/media/callend.mp3 b/res/media/callend.mp3
new file mode 100644
index 00000000000..50c34e56401
Binary files /dev/null and b/res/media/callend.mp3 differ
diff --git a/res/media/callend.ogg b/res/media/callend.ogg
new file mode 100644
index 00000000000..927ce1f6340
Binary files /dev/null and b/res/media/callend.ogg differ
diff --git a/res/media/message.mp3 b/res/media/message.mp3
new file mode 100644
index 00000000000..b87eeda7c2d
Binary files /dev/null and b/res/media/message.mp3 differ
diff --git a/res/media/message.ogg b/res/media/message.ogg
new file mode 100644
index 00000000000..adc74437d02
Binary files /dev/null and b/res/media/message.ogg differ
diff --git a/res/media/ring.mp3 b/res/media/ring.mp3
new file mode 100644
index 00000000000..36200cd89d5
Binary files /dev/null and b/res/media/ring.mp3 differ
diff --git a/res/media/ring.ogg b/res/media/ring.ogg
new file mode 100644
index 00000000000..708213bfaca
Binary files /dev/null and b/res/media/ring.ogg differ
diff --git a/res/media/ringback.mp3 b/res/media/ringback.mp3
new file mode 100644
index 00000000000..6ee34bf3953
Binary files /dev/null and b/res/media/ringback.mp3 differ
diff --git a/res/media/ringback.ogg b/res/media/ringback.ogg
new file mode 100644
index 00000000000..7dbfdcd017b
Binary files /dev/null and b/res/media/ringback.ogg differ
diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss
new file mode 100644
index 00000000000..31773ebd09d
--- /dev/null
+++ b/res/themes/dark/css/_dark.scss
@@ -0,0 +1,204 @@
+
+// typical text (dark-on-white in light skin)
+$primary-fg-color: #dddddd;
+$primary-bg-color: #2d2d2d;
+
+// used for focusing form controls
+$focus-bg-color: #101010;
+
+// used for dialog box text
+$light-fg-color: #747474;
+
+// button UI (white-on-green in light skin)
+$accent-fg-color: $primary-bg-color;
+$accent-color: #76CFA6;
+
+$selection-fg-color: $primary-fg-color;
+
+$focus-brightness: 200%;
+
+// red warning colour
+$warning-color: #ff0064;
+
+// groups
+$info-plinth-bg-color: #454545;
+
+$other-user-pill-bg-color: rgba(255, 255, 255, 0.1);
+
+$preview-bar-bg-color: #333;
+
+// left-panel style muted accent color
+$secondary-accent-color: $primary-bg-color;
+$tertiary-accent-color: #454545;
+
+// stop the tinter trying to change the secondary accent color
+// by overriding the key to something untintable
+// XXX: this is a bit of a hack.
+#mx_theme_secondaryAccentColor {
+ color: #c0ffee ! important;
+}
+
+#mx_theme_tertiaryAccentColor {
+ color: #c0ffee ! important;
+}
+
+// used by RoomDirectory permissions
+$plinth-bg-color: #474747;
+
+// used by RoomDropTarget
+$droptarget-bg-color: rgba(45,45,45,0.5);
+
+// used by AddressSelector
+$selected-color: #000000;
+
+// selected for hoverover & selected event tiles
+$event-selected-color: #353535;
+
+// used for the hairline dividers in RoomView
+$primary-hairline-color: #474747;
+
+// used for the border of input text fields
+$input-border-color: #3a3a3a;
+
+// apart from login forms, which have stronger border
+$strong-input-border-color: #656565;
+
+// used for UserSettings EditableText
+$input-underline-color: $primary-fg-color;
+$input-fg-color: $primary-fg-color;
+
+// context menus
+$menu-border-color: rgba(187, 187, 187, 0.5);
+$menu-bg-color: #373737;
+
+$avatar-initial-color: #2d2d2d;
+$avatar-bg-color: #ffffff;
+
+$h3-color: $primary-fg-color;
+
+$dialog-background-bg-color: #000;
+$lightbox-background-bg-color: #000;
+
+$greyed-fg-color: #888;
+
+$neutral-badge-color: #888;
+
+$preview-widget-bar-color: $menu-bg-color;
+$preview-widget-fg-color: $greyed-fg-color;
+
+$blockquote-bar-color: #ddd;
+$blockquote-fg-color: #777;
+
+$settings-grey-fg-color: #a2a2a2;
+
+$voip-decline-color: #f48080;
+$voip-accept-color: #80f480;
+
+$rte-bg-color: #353535;
+$rte-code-bg-color: #000;
+
+// ********************
+
+$roomtile-name-color: rgba(186, 186, 186, 0.8);
+$roomtile-selected-bg-color: #333;
+$roomtile-focused-bg-color: rgba(255, 255, 255, 0.2);
+
+$roomsublist-background: rgba(0, 0, 0, 0.2);
+$roomsublist-label-fg-color: $h3-color;
+$roomsublist-label-bg-color: $tertiary-accent-color;
+$roomsublist-chevron-color: $accent-color;
+
+$panel-divider-color: rgba(118, 207, 166, 0.2);
+
+// ********************
+
+$widget-menu-bar-bg-color: $tertiary-accent-color;
+
+// ********************
+
+// event tile lifecycle
+$event-encrypting-color: rgba(171, 221, 188, 0.4);
+$event-sending-color: #888;
+$event-notsent-color: #f44;
+
+// event redaction
+$event-redacted-fg-color: #606060;
+$event-redacted-border-color: #000000;
+
+// event timestamp
+$event-timestamp-color: #acacac;
+
+$edit-button-url: "../../img/icon_context_message_dark.svg";
+$copy-button-url: "../../img/icon_copy_message_dark.svg";
+
+// e2e
+$e2e-verified-color: #76cfa5; // N.B. *NOT* the same as $accent-color
+$e2e-unverified-color: #e8bf37;
+$e2e-warning-color: #ba6363;
+
+/*** ImageView ***/
+$lightbox-bg-color: #454545;
+$lightbox-fg-color: #ffffff;
+$lightbox-border-color: #ffffff;
+
+// unused?
+$progressbar-color: #000;
+
+// XXX: copypasted from _base in order to pick up the right FG color...
+@define-mixin mx_DialogButton {
+ /* align images in buttons (eg spinners) */
+ vertical-align: middle;
+ border: 0px;
+ border-radius: 36px;
+ font-family: $font-family;
+ font-size: 14px;
+ color: $accent-fg-color;
+ background-color: $accent-color;
+ width: auto;
+ padding: 7px;
+ padding-left: 1.5em;
+ padding-right: 1.5em;
+ cursor: pointer;
+ display: inline-block;
+ outline: none;
+}
+
+// Nasty hacks to apply a filter to arbitrary monochrome artwork to make it
+// better match the theme. Typically applied to dark grey 'off' buttons or
+// light grey 'on' buttons.
+.mx_filterFlipColor {
+ filter: invert(1);
+}
+
+.gm-scrollbar .thumb {
+ filter: invert(1);
+}
+
+// markdown overrides:
+.mx_EventTile_content .markdown-body pre:hover {
+ border-color: #808080 !important; // inverted due to rules below
+}
+.mx_EventTile_content .markdown-body {
+ pre, code {
+ filter: invert(1);
+ }
+
+ pre code {
+ filter: none;
+ }
+
+ table {
+ tr {
+ background-color: #000000;
+ }
+
+ tr:nth-child(2n) {
+ background-color: #080808;
+ }
+ }
+}
+
+// Add a line to the right side of the left panel to distinguish it from the middle panel
+.mx_LeftPanel {
+ border-right: 1px solid $tertiary-accent-color;
+}
diff --git a/res/themes/dark/css/dark.scss b/res/themes/dark/css/dark.scss
new file mode 100644
index 00000000000..b69f096db76
--- /dev/null
+++ b/res/themes/dark/css/dark.scss
@@ -0,0 +1,4 @@
+@import "../../light/css/_base.scss";
+@import "_dark.scss";
+@import "../../../../res/css/_components.scss";
+
diff --git a/res/themes/light/css/_base.scss b/res/themes/light/css/_base.scss
new file mode 100644
index 00000000000..5d5f5d7c909
--- /dev/null
+++ b/res/themes/light/css/_base.scss
@@ -0,0 +1,177 @@
+/* Open Sans lacks combining diacritics, so these will fall through
+ to the next font. Helevetica's diacritics however do not combine
+ nicely with Open Sans (on OSX, at least) and result in a huge
+ horizontal mess. Arial empirically gets it right, hence prioritising
+ Arial here. */
+$font-family: 'Open Sans', Arial, Helvetica, Sans-Serif;
+
+// typical text (dark-on-white in light skin)
+$primary-fg-color: #454545;
+$primary-bg-color: #ffffff;
+
+// used for dialog box text
+$light-fg-color: #747474;
+
+// used for focusing form controls
+$focus-bg-color: #dddddd;
+
+// button UI (white-on-green in light skin)
+$accent-fg-color: #ffffff;
+$accent-color: #76CFA6;
+
+$selection-fg-color: $primary-bg-color;
+
+$focus-brightness: 125%;
+
+// red warning colour
+$warning-color: #ff0064;
+$mention-user-pill-bg-color: #ff0064;
+$other-user-pill-bg-color: rgba(0, 0, 0, 0.1);
+
+// pinned events indicator
+$pinned-unread-color: #ff0064; // $warning-color
+$pinned-color: #888;
+
+// informational plinth
+$info-plinth-bg-color: #f7f7f7;
+$info-plinth-fg-color: #888;
+
+$preview-bar-bg-color: #f7f7f7;
+
+// left-panel style muted accent color
+$secondary-accent-color: #eaf5f0;
+$tertiary-accent-color: #d3efe1;
+
+// used by RoomDirectory permissions
+$plinth-bg-color: $secondary-accent-color;
+
+// used by RoomDropTarget
+$droptarget-bg-color: rgba(255,255,255,0.5);
+
+// used by AddressSelector
+$selected-color: $secondary-accent-color;
+
+// selected for hoverover & selected event tiles
+$event-selected-color: #f7f7f7;
+
+// used for the hairline dividers in RoomView
+$primary-hairline-color: #e5e5e5;
+
+// used for the border of input text fields
+$input-border-color: #f0f0f0;
+
+// apart from login forms, which have stronger border
+$strong-input-border-color: #c7c7c7;
+
+// used for UserSettings EditableText
+$input-underline-color: rgba(151, 151, 151, 0.5);
+$input-fg-color: rgba(74, 74, 74, 0.9);
+
+// context menus
+$menu-border-color: rgba(187, 187, 187, 0.5);
+$menu-bg-color: #f6f6f6;
+
+$avatar-initial-color: #ffffff;
+$avatar-bg-color: #ffffff;
+
+$h3-color: #3d3b39;
+
+$dialog-background-bg-color: #e9e9e9;
+$lightbox-background-bg-color: #000;
+
+$greyed-fg-color: #888;
+
+$neutral-badge-color: #dbdbdb;
+
+$preview-widget-bar-color: #ddd;
+$preview-widget-fg-color: $greyed-fg-color;
+
+$blockquote-bar-color: #ddd;
+$blockquote-fg-color: #777;
+
+$settings-grey-fg-color: #a2a2a2;
+
+$voip-decline-color: #f48080;
+$voip-accept-color: #80f480;
+
+$rte-bg-color: #e9e9e9;
+$rte-code-bg-color: rgba(0, 0, 0, 0.04);
+$rte-room-pill-color: #aaa;
+
+// ********************
+
+$roomtile-name-color: rgba(69, 69, 69, 0.8);
+$roomtile-selected-bg-color: rgba(255, 255, 255, 0.8);
+$roomtile-focused-bg-color: rgba(255, 255, 255, 0.9);
+
+$roomtile-transparent-focused-color: rgba(0, 0, 0, 0.1);
+
+$roomsublist-background: rgba(0, 0, 0, 0.05);
+$roomsublist-label-fg-color: $h3-color;
+$roomsublist-label-bg-color: $tertiary-accent-color;
+$roomsublist-chevron-color: $accent-color;
+
+$panel-divider-color: rgba(118, 207, 166, 0.2);
+
+// ********************
+
+$widget-menu-bar-bg-color: $tertiary-accent-color;
+
+// ********************
+
+// event tile lifecycle
+$event-encrypting-color: #abddbc;
+$event-sending-color: #ddd;
+$event-notsent-color: #f44;
+
+// event redaction
+$event-redacted-fg-color: #e2e2e2;
+$event-redacted-border-color: #cccccc;
+
+// event timestamp
+$event-timestamp-color: #acacac;
+
+$edit-button-url: "../../img/icon_context_message.svg";
+$copy-button-url: "../../img/icon_copy_message.svg";
+
+// e2e
+$e2e-verified-color: #76cfa5; // N.B. *NOT* the same as $accent-color
+$e2e-unverified-color: #e8bf37;
+$e2e-warning-color: #ba6363;
+
+/*** ImageView ***/
+$lightbox-bg-color: #454545;
+$lightbox-fg-color: #ffffff;
+$lightbox-border-color: #ffffff;
+
+// unused?
+$progressbar-color: #000;
+
+// ***** Mixins! *****
+
+@define-mixin mx_DialogButton {
+ /* align images in buttons (eg spinners) */
+ vertical-align: middle;
+ border: 0px;
+ border-radius: 36px;
+ font-family: $font-family;
+ font-size: 14px;
+ color: $accent-fg-color;
+ background-color: $accent-color;
+ width: auto;
+ padding: 7px;
+ padding-left: 1.5em;
+ padding-right: 1.5em;
+ cursor: pointer;
+ display: inline-block;
+ outline: none;
+}
+
+@define-mixin mx_DialogButton_hover {
+}
+
+@define-mixin mx_DialogButton_small {
+ @mixin mx_DialogButton;
+ font-size: 15px;
+ padding: 0px 1.5em 0px 1.5em;
+}
diff --git a/res/themes/light/css/light.scss b/res/themes/light/css/light.scss
new file mode 100644
index 00000000000..2099f41f604
--- /dev/null
+++ b/res/themes/light/css/light.scss
@@ -0,0 +1,3 @@
+@import "_base.scss";
+@import "../../../../res/css/_components.scss";
+
diff --git a/scripts/fixup-imports.pl b/scripts/fixup-imports.pl
new file mode 100755
index 00000000000..3929ab88c9c
--- /dev/null
+++ b/scripts/fixup-imports.pl
@@ -0,0 +1,27 @@
+#!/usr/bin/perl -pi
+
+# pass in a list of filenames whose imports should be fixed up to be relative
+# to matrix-react-sdk rather than vector-web.
+# filenames must be relative to src/ - e.g. ./components/moo/Moo.js
+
+# run with something like:
+# sierra:src matthew$ grep -ril 'require(.matrix-react-sdk' . | xargs ../scripts/fixup-imports.pl
+# sierra:src matthew$ grep -ril 'import.*matrix-react-sdk' . | xargs ../scripts/fixup-imports.pl
+
+# e.g. turning:
+# var rate_limited_func = require('matrix-react-sdk/lib/ratelimitedfunc');
+#
+# into:
+# const rate_limited_func = require('../../ratelimitedfunc');
+#
+# ...if the current file is two levels deep inside lib.
+
+$depth = () = $ARGV =~ m#/#g;
+$depth--;
+$prefix = $depth > 0 ? ('../' x $depth) : './';
+
+s/= require\(['"]matrix-react-sdk\/lib\/(.*?)['"]\)/= require('$prefix$1')/;
+s/= require\(['"]matrix-react-sdk['"]\)/= require('${prefix}index')/;
+
+s/^(import .* from )['"]matrix-react-sdk\/lib\/(.*?)['"]/$1'$prefix$2'/;
+s/^(import .* from )['"]matrix-react-sdk['"]/$1'${prefix}index'/;
diff --git a/src/VectorConferenceHandler.js b/src/VectorConferenceHandler.js
new file mode 100644
index 00000000000..19081726b29
--- /dev/null
+++ b/src/VectorConferenceHandler.js
@@ -0,0 +1,138 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+"use strict";
+
+import Promise from 'bluebird';
+var Matrix = require("matrix-js-sdk");
+var Room = Matrix.Room;
+var CallHandler = require('./CallHandler');
+
+// FIXME: this is Riot (Vector) specific code, but will be removed shortly when
+// we switch over to jitsi entirely for video conferencing.
+
+// FIXME: This currently forces Vector to try to hit the matrix.org AS for conferencing.
+// This is bad because it prevents people running their own ASes from being used.
+// This isn't permanent and will be customisable in the future: see the proposal
+// at docs/conferencing.md for more info.
+var USER_PREFIX = "fs_";
+var DOMAIN = "matrix.org";
+
+function ConferenceCall(matrixClient, groupChatRoomId) {
+ this.client = matrixClient;
+ this.groupRoomId = groupChatRoomId;
+ this.confUserId = module.exports.getConferenceUserIdForRoom(this.groupRoomId);
+}
+
+ConferenceCall.prototype.setup = function() {
+ var self = this;
+ return this._joinConferenceUser().then(function() {
+ return self._getConferenceUserRoom();
+ }).then(function(room) {
+ // return a call for *this* room to be placed. We also tack on
+ // confUserId to speed up lookups (else we'd need to loop every room
+ // looking for a 1:1 room with this conf user ID!)
+ var call = Matrix.createNewMatrixCall(self.client, room.roomId);
+ call.confUserId = self.confUserId;
+ call.groupRoomId = self.groupRoomId;
+ return call;
+ });
+};
+
+ConferenceCall.prototype._joinConferenceUser = function() {
+ // Make sure the conference user is in the group chat room
+ var groupRoom = this.client.getRoom(this.groupRoomId);
+ if (!groupRoom) {
+ return Promise.reject("Bad group room ID");
+ }
+ var member = groupRoom.getMember(this.confUserId);
+ if (member && member.membership === "join") {
+ return Promise.resolve();
+ }
+ return this.client.invite(this.groupRoomId, this.confUserId);
+};
+
+ConferenceCall.prototype._getConferenceUserRoom = function() {
+ // Use an existing 1:1 with the conference user; else make one
+ var rooms = this.client.getRooms();
+ var confRoom = null;
+ 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) {
+ confRoom = rooms[i];
+ break;
+ }
+ }
+ if (confRoom) {
+ return Promise.resolve(confRoom);
+ }
+ return this.client.createRoom({
+ preset: "private_chat",
+ invite: [this.confUserId]
+ }).then(function(res) {
+ return new Room(res.room_id);
+ });
+};
+
+/**
+ * Check if this user ID is in fact a conference bot.
+ * @param {string} userId The user ID to check.
+ * @return {boolean} True if it is a conference bot.
+ */
+module.exports.isConferenceUser = function(userId) {
+ if (userId.indexOf("@" + USER_PREFIX) !== 0) {
+ return false;
+ }
+ var base64part = userId.split(":")[0].substring(1 + USER_PREFIX.length);
+ if (base64part) {
+ var decoded = new Buffer(base64part, "base64").toString();
+ // ! $STUFF : $STUFF
+ return /^!.+:.+/.test(decoded);
+ }
+ return false;
+};
+
+module.exports.getConferenceUserIdForRoom = function(roomId) {
+ // abuse browserify's core node Buffer support (strip padding ='s)
+ var base64RoomId = new Buffer(roomId).toString("base64").replace(/=/g, "");
+ return "@" + USER_PREFIX + base64RoomId + ":" + DOMAIN;
+};
+
+module.exports.createNewMatrixCall = function(client, roomId) {
+ var confCall = new ConferenceCall(
+ client, roomId
+ );
+ return confCall.setup();
+};
+
+module.exports.getConferenceCallForRoom = function(roomId) {
+ // search for a conference 1:1 call for this group chat room ID
+ var activeCall = CallHandler.getAnyActiveCall();
+ if (activeCall && activeCall.confUserId) {
+ var thisRoomConfUserId = module.exports.getConferenceUserIdForRoom(
+ roomId
+ );
+ if (thisRoomConfUserId === activeCall.confUserId) {
+ return activeCall;
+ }
+ }
+ return null;
+};
+
+module.exports.ConferenceCall = ConferenceCall;
+
+module.exports.slot = 'conference';
diff --git a/src/components/structures/BottomLeftMenu.js b/src/components/structures/BottomLeftMenu.js
new file mode 100644
index 00000000000..d289ca5da1f
--- /dev/null
+++ b/src/components/structures/BottomLeftMenu.js
@@ -0,0 +1,197 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2017 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.
+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 ReactDOM from 'react-dom';
+import sdk from '../../index';
+import dis from '../../dispatcher';
+import Velocity from 'velocity-vector';
+import 'velocity-vector/velocity.ui';
+import SettingsStore from '../../settings/SettingsStore';
+
+const CALLOUT_ANIM_DURATION = 1000;
+
+module.exports = React.createClass({
+ displayName: 'BottomLeftMenu',
+
+ propTypes: {
+ collapsed: React.PropTypes.bool.isRequired,
+ },
+
+ getInitialState: function() {
+ return({
+ directoryHover : false,
+ roomsHover : false,
+ homeHover: false,
+ peopleHover : false,
+ settingsHover : false,
+ });
+ },
+
+ componentWillMount: function() {
+ this._dispatcherRef = dis.register(this.onAction);
+ this._peopleButton = null;
+ this._directoryButton = null;
+ this._createRoomButton = null;
+ this._lastCallouts = {};
+ },
+
+ componentWillUnmount: function() {
+ dis.unregister(this._dispatcherRef);
+ },
+
+ // Room events
+ onDirectoryClick: function() {
+ dis.dispatch({ action: 'view_room_directory' });
+ },
+
+ onDirectoryMouseEnter: function() {
+ this.setState({ directoryHover: true });
+ },
+
+ onDirectoryMouseLeave: function() {
+ this.setState({ directoryHover: false });
+ },
+
+ onRoomsClick: function() {
+ dis.dispatch({ action: 'view_create_room' });
+ },
+
+ onRoomsMouseEnter: function() {
+ this.setState({ roomsHover: true });
+ },
+
+ onRoomsMouseLeave: function() {
+ this.setState({ roomsHover: false });
+ },
+
+ // Home button events
+ onHomeClick: function() {
+ dis.dispatch({ action: 'view_home_page' });
+ },
+
+ onHomeMouseEnter: function() {
+ this.setState({ homeHover: true });
+ },
+
+ onHomeMouseLeave: function() {
+ this.setState({ homeHover: false });
+ },
+
+ // People events
+ onPeopleClick: function() {
+ dis.dispatch({ action: 'view_create_chat' });
+ },
+
+ onPeopleMouseEnter: function() {
+ this.setState({ peopleHover: true });
+ },
+
+ onPeopleMouseLeave: function() {
+ this.setState({ peopleHover: false });
+ },
+
+ // Settings events
+ onSettingsClick: function() {
+ dis.dispatch({ action: 'view_user_settings' });
+ },
+
+ onSettingsMouseEnter: function() {
+ this.setState({ settingsHover: true });
+ },
+
+ onSettingsMouseLeave: function() {
+ this.setState({ settingsHover: false });
+ },
+
+ onAction: function(payload) {
+ let calloutElement;
+ switch (payload.action) {
+ // Incoming instruction: dance!
+ case 'callout_start_chat':
+ calloutElement = this._peopleButton;
+ break;
+ case 'callout_room_directory':
+ calloutElement = this._directoryButton;
+ break;
+ case 'callout_create_room':
+ calloutElement = this._createRoomButton;
+ break;
+ }
+ if (calloutElement) {
+ const lastCallout = this._lastCallouts[payload.action];
+ const now = Date.now();
+ if (lastCallout == undefined || lastCallout < now - CALLOUT_ANIM_DURATION) {
+ this._lastCallouts[payload.action] = now;
+ Velocity(ReactDOM.findDOMNode(calloutElement), "callout.bounce", CALLOUT_ANIM_DURATION);
+ }
+ }
+ },
+
+ // Get the label/tooltip to show
+ getLabel: function(label, show) {
+ if (show) {
+ var RoomTooltip = sdk.getComponent("rooms.RoomTooltip");
+ return ;
+ }
+ },
+
+ _collectPeopleButton: function(e) {
+ this._peopleButton = e;
+ },
+
+ _collectDirectoryButton: function(e) {
+ this._directoryButton = e;
+ },
+
+ _collectCreateRoomButton: function(e) {
+ this._createRoomButton = e;
+ },
+
+ render: function() {
+ const HomeButton = sdk.getComponent('elements.HomeButton');
+ const StartChatButton = sdk.getComponent('elements.StartChatButton');
+ const RoomDirectoryButton = sdk.getComponent('elements.RoomDirectoryButton');
+ const CreateRoomButton = sdk.getComponent('elements.CreateRoomButton');
+ const SettingsButton = sdk.getComponent('elements.SettingsButton');
+ const GroupsButton = sdk.getComponent('elements.GroupsButton');
+
+ const groupsButton = SettingsStore.getValue("TagPanel.disableTagPanel") ?
+ : null;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ { groupsButton }
+
+
+
+
+
+ );
+ },
+});
diff --git a/src/components/structures/CompatibilityPage.js b/src/components/structures/CompatibilityPage.js
new file mode 100644
index 00000000000..4cbaab3dfa1
--- /dev/null
+++ b/src/components/structures/CompatibilityPage.js
@@ -0,0 +1,73 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+import { _t } from '../../languageHandler';
+
+module.exports = React.createClass({
+ displayName: 'CompatibilityPage',
+ propTypes: {
+ onAccept: React.PropTypes.func
+ },
+
+ getDefaultProps: function() {
+ return {
+ onAccept: function() {} // NOP
+ };
+ },
+
+ onAccept: function() {
+ this.props.onAccept();
+ },
+
+ render: function() {
+
+ return (
+
+
+
{ _t("Sorry, your browser is not able to run Riot.", {}, { 'b': (sub) => {sub} }) }
+
+ { _t("Riot uses many advanced browser features, some of which are not available or experimental in your current browser.") }
+
+
+ { _t('Please install Chrome or Firefox for the best experience.',
+ {},
+ {
+ 'chromeLink': (sub) => {sub},
+ 'firefoxLink': (sub) => {sub},
+ },
+ )}
+ { _t('Safari and Opera work too.',
+ {},
+ {
+ 'safariLink': (sub) => {sub},
+ 'operaLink': (sub) => {sub},
+ },
+ )}
+
+
+ { _t("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!") }
+
+
+
+
+ );
+ }
+});
diff --git a/src/components/structures/HomePage.js b/src/components/structures/HomePage.js
new file mode 100644
index 00000000000..457796f5dce
--- /dev/null
+++ b/src/components/structures/HomePage.js
@@ -0,0 +1,109 @@
+/*
+Copyright 2016 OpenMarket Ltd
+Copyright 2017 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.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import request from 'browser-request';
+import { _t } from '../../languageHandler';
+import sanitizeHtml from 'sanitize-html';
+import sdk from '../../index';
+
+class HomePage extends React.Component {
+ static displayName = 'HomePage';
+
+ static propTypes = {
+ // URL base of the team server. Optional.
+ teamServerUrl: PropTypes.string,
+ // Team token. Optional. If set, used to get the static homepage of the team
+ // associated. If unset, homePageUrl will be used.
+ teamToken: PropTypes.string,
+ // URL to use as the iFrame src. Defaults to /home.html.
+ homePageUrl: PropTypes.string,
+ };
+
+ state = {
+ iframeSrc: '',
+ page: '',
+ };
+
+ translate(s) {
+ // default implementation - skins may wish to extend this
+ return sanitizeHtml(_t(s));
+ }
+
+ componentWillMount() {
+ this._unmounted = false;
+
+ if (this.props.teamToken && this.props.teamServerUrl) {
+ this.setState({
+ iframeSrc: `${this.props.teamServerUrl}/static/${this.props.teamToken}/home.html`
+ });
+ }
+ else {
+ // we use request() to inline the homepage into the react component
+ // so that it can inherit CSS and theming easily rather than mess around
+ // with iframes and trying to synchronise document.stylesheets.
+
+ let src = this.props.homePageUrl || 'home.html';
+
+ request(
+ { method: "GET", url: src },
+ (err, response, body) => {
+ if (this._unmounted) {
+ return;
+ }
+
+ if (err || response.status < 200 || response.status >= 300) {
+ console.warn(`Error loading home page: ${err}`);
+ this.setState({ page: _t("Couldn't load home page") });
+ return;
+ }
+
+ body = body.replace(/_t\(['"]([\s\S]*?)['"]\)/mg, (match, g1)=>this.translate(g1));
+ this.setState({ page: body });
+ }
+ );
+ }
+ }
+
+ componentWillUnmount() {
+ this._unmounted = true;
+ }
+
+ render() {
+ if (this.state.iframeSrc) {
+ return (
+
+
+ );
+ }
+ }
+}
+
+module.exports = HomePage;
\ No newline at end of file
diff --git a/src/components/structures/LeftPanel.js b/src/components/structures/LeftPanel.js
new file mode 100644
index 00000000000..5acceb10095
--- /dev/null
+++ b/src/components/structures/LeftPanel.js
@@ -0,0 +1,226 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import { MatrixClient } from 'matrix-js-sdk';
+import { KeyCode } from '../../Keyboard';
+import sdk from '../../index';
+import dis from '../../dispatcher';
+import VectorConferenceHandler from '../../VectorConferenceHandler';
+
+import SettingsStore from '../../settings/SettingsStore';
+
+
+var LeftPanel = React.createClass({
+ displayName: 'LeftPanel',
+
+ // NB. If you add props, don't forget to update
+ // shouldComponentUpdate!
+ propTypes: {
+ collapsed: PropTypes.bool.isRequired,
+ },
+
+ contextTypes: {
+ matrixClient: PropTypes.instanceOf(MatrixClient),
+ },
+
+ getInitialState: function() {
+ return {
+ searchFilter: '',
+ };
+ },
+
+ componentWillMount: function() {
+ this.focusedElement = null;
+ },
+
+ shouldComponentUpdate: function(nextProps, nextState) {
+ // MatrixChat will update whenever the user switches
+ // rooms, but propagating this change all the way down
+ // the react tree is quite slow, so we cut this off
+ // here. The RoomTiles listen for the room change
+ // events themselves to know when to update.
+ // We just need to update if any of these things change.
+ if (
+ this.props.collapsed !== nextProps.collapsed ||
+ this.props.disabled !== nextProps.disabled
+ ) {
+ return true;
+ }
+
+ if (this.state.searchFilter !== nextState.searchFilter) {
+ return true;
+ }
+
+ return false;
+ },
+
+ _onFocus: function(ev) {
+ this.focusedElement = ev.target;
+ },
+
+ _onBlur: function(ev) {
+ this.focusedElement = null;
+ },
+
+ _onKeyDown: function(ev) {
+ if (!this.focusedElement) return;
+ let handled = false;
+
+ switch (ev.keyCode) {
+ case KeyCode.UP:
+ this._onMoveFocus(true);
+ handled = true;
+ break;
+ case KeyCode.DOWN:
+ this._onMoveFocus(false);
+ handled = true;
+ break;
+ }
+
+ if (handled) {
+ ev.stopPropagation();
+ ev.preventDefault();
+ }
+ },
+
+ _onMoveFocus: function(up) {
+ var element = this.focusedElement;
+
+ // unclear why this isn't needed
+ // var descending = (up == this.focusDirection) ? this.focusDescending : !this.focusDescending;
+ // this.focusDirection = up;
+
+ var descending = false; // are we currently descending or ascending through the DOM tree?
+ var classes;
+
+ do {
+ var child = up ? element.lastElementChild : element.firstElementChild;
+ var sibling = up ? element.previousElementSibling : element.nextElementSibling;
+
+ if (descending) {
+ if (child) {
+ element = child;
+ }
+ else if (sibling) {
+ element = sibling;
+ }
+ else {
+ descending = false;
+ element = element.parentElement;
+ }
+ }
+ else {
+ if (sibling) {
+ element = sibling;
+ descending = true;
+ }
+ else {
+ element = element.parentElement;
+ }
+ }
+
+ if (element) {
+ classes = element.classList;
+ if (classes.contains("mx_LeftPanel")) { // we hit the top
+ element = up ? element.lastElementChild : element.firstElementChild;
+ descending = true;
+ }
+ }
+
+ } while(element && !(
+ classes.contains("mx_RoomTile") ||
+ classes.contains("mx_SearchBox_search") ||
+ classes.contains("mx_RoomSubList_ellipsis")));
+
+ if (element) {
+ element.focus();
+ this.focusedElement = element;
+ this.focusedDescending = descending;
+ }
+ },
+
+ onHideClick: function() {
+ dis.dispatch({
+ action: 'hide_left_panel',
+ });
+ },
+
+ onSearch: function(term) {
+ this.setState({ searchFilter: term });
+ },
+
+ collectRoomList: function(ref) {
+ this._roomList = ref;
+ },
+
+ render: function() {
+ const RoomList = sdk.getComponent('rooms.RoomList');
+ const TagPanel = sdk.getComponent('structures.TagPanel');
+ const BottomLeftMenu = sdk.getComponent('structures.BottomLeftMenu');
+ const CallPreview = sdk.getComponent('voip.CallPreview');
+
+ let topBox;
+ if (this.context.matrixClient.isGuest()) {
+ const LoginBox = sdk.getComponent('structures.LoginBox');
+ topBox = ;
+ } else {
+ const SearchBox = sdk.getComponent('structures.SearchBox');
+ topBox = ;
+ }
+
+ const classes = classNames(
+ "mx_LeftPanel",
+ {
+ "collapsed": this.props.collapsed,
+ },
+ );
+
+ const tagPanelEnabled = !SettingsStore.getValue("TagPanel.disableTagPanel");
+ const tagPanel = tagPanelEnabled ? : ;
+
+ const containerClasses = classNames(
+ "mx_LeftPanel_container", "mx_fadable",
+ {
+ "mx_LeftPanel_container_collapsed": this.props.collapsed,
+ "mx_LeftPanel_container_hasTagPanel": tagPanelEnabled,
+ "mx_fadable_faded": this.props.disabled,
+ },
+ );
+
+ return (
+
+ { tagPanel }
+
+
+ );
+ }
+});
+
+module.exports = LeftPanel;
diff --git a/src/components/structures/LoginBox.js b/src/components/structures/LoginBox.js
new file mode 100644
index 00000000000..a9ea1f95c61
--- /dev/null
+++ b/src/components/structures/LoginBox.js
@@ -0,0 +1,93 @@
+/*
+Copyright 2017 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.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+import { _t } from '../../languageHandler';
+var sdk = require('../../index')
+var dis = require('../../dispatcher');
+var rate_limited_func = require('../../ratelimitedfunc');
+var AccessibleButton = require('../../components/views/elements/AccessibleButton');
+
+module.exports = React.createClass({
+ displayName: 'LoginBox',
+
+ propTypes: {
+ collapsed: React.PropTypes.bool,
+ },
+
+ onToggleCollapse: function(show) {
+ if (show) {
+ dis.dispatch({
+ action: 'show_left_panel',
+ });
+ }
+ else {
+ dis.dispatch({
+ action: 'hide_left_panel',
+ });
+ }
+ },
+
+ onLoginClick: function() {
+ dis.dispatch({ action: 'start_login' });
+ },
+
+ onRegisterClick: function() {
+ dis.dispatch({ action: 'start_registration' });
+ },
+
+ render: function() {
+ var TintableSvg = sdk.getComponent('elements.TintableSvg');
+
+ var toggleCollapse;
+ if (this.props.collapsed) {
+ toggleCollapse =
+
+
+
+ }
+ else {
+ toggleCollapse =
+
+
+
+ }
+
+ var loginButton;
+ if (!this.props.collapsed) {
+ loginButton = (
+
+
+ { _t("Login") }
+
+
+ { _t("Register") }
+
+
+ );
+ }
+
+ var self = this;
+ return (
+
+ { loginButton }
+ { toggleCollapse }
+
+ );
+ }
+});
diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js
new file mode 100644
index 00000000000..ca1e331d156
--- /dev/null
+++ b/src/components/structures/RightPanel.js
@@ -0,0 +1,424 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2017 Vector Creations Ltd
+Copyright 2017 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import { _t } from '../../languageHandler';
+import sdk from '../../index';
+import dis from '../../dispatcher';
+import { MatrixClient } from 'matrix-js-sdk';
+import Analytics from '../../Analytics';
+import RateLimitedFunc from '../../ratelimitedfunc';
+import AccessibleButton from '../../components/views/elements/AccessibleButton';
+import { showGroupInviteDialog, showGroupAddRoomDialog } from '../../GroupAddressPicker';
+import GroupStoreCache from '../../stores/GroupStoreCache';
+
+import { formatCount } from '../../utils/FormattingUtils';
+
+class HeaderButton extends React.Component {
+ constructor() {
+ super();
+ this.onClick = this.onClick.bind(this);
+ }
+
+ onClick(ev) {
+ Analytics.trackEvent(...this.props.analytics);
+ dis.dispatch({
+ action: 'view_right_panel_phase',
+ phase: this.props.clickPhase,
+ });
+ }
+
+ render() {
+ const TintableSvg = sdk.getComponent("elements.TintableSvg");
+ const AccessibleButton = sdk.getComponent("elements.AccessibleButton");
+
+ return
+
+
+ { this.props.badge ? this.props.badge : }
+
+
+ { this.props.isHighlighted ? : }
+
+ ;
+ }
+}
+
+HeaderButton.propTypes = {
+ // Whether this button is highlighted
+ isHighlighted: PropTypes.bool.isRequired,
+ // The phase to swap to when the button is clicked
+ clickPhase: PropTypes.string.isRequired,
+ // The source file of the icon to display
+ iconSrc: PropTypes.string.isRequired,
+
+ // The badge to display above the icon
+ badge: PropTypes.node,
+ // The parameters to track the click event
+ analytics: PropTypes.arrayOf(PropTypes.string).isRequired,
+
+ // Button title
+ title: PropTypes.string.isRequired,
+};
+
+module.exports = React.createClass({
+ displayName: 'RightPanel',
+
+ propTypes: {
+ // TODO: We're trying to move away from these being props, but we need to know
+ // whether we should be displaying a room or group member list
+ roomId: React.PropTypes.string, // if showing panels for a given room, this is set
+ groupId: React.PropTypes.string, // if showing panels for a given group, this is set
+ collapsed: React.PropTypes.bool, // currently unused property to request for a minimized view of the panel
+ },
+
+ contextTypes: {
+ matrixClient: PropTypes.instanceOf(MatrixClient),
+ },
+
+ Phase: {
+ RoomMemberList: 'RoomMemberList',
+ GroupMemberList: 'GroupMemberList',
+ GroupRoomList: 'GroupRoomList',
+ GroupRoomInfo: 'GroupRoomInfo',
+ FilePanel: 'FilePanel',
+ NotificationPanel: 'NotificationPanel',
+ RoomMemberInfo: 'RoomMemberInfo',
+ GroupMemberInfo: 'GroupMemberInfo',
+ },
+
+ componentWillMount: function() {
+ this.dispatcherRef = dis.register(this.onAction);
+ const cli = this.context.matrixClient;
+ cli.on("RoomState.members", this.onRoomStateMember);
+ this._initGroupStore(this.props.groupId);
+ },
+
+ componentWillUnmount: function() {
+ dis.unregister(this.dispatcherRef);
+ if (this.context.matrixClient) {
+ this.context.matrixClient.removeListener("RoomState.members", this.onRoomStateMember);
+ }
+ this._unregisterGroupStore();
+ },
+
+ getInitialState: function() {
+ return {
+ phase: this.props.groupId ? this.Phase.GroupMemberList : this.Phase.RoomMemberList,
+ isUserPrivilegedInGroup: null,
+ };
+ },
+
+ componentWillReceiveProps(newProps) {
+ if (newProps.groupId !== this.props.groupId) {
+ this._unregisterGroupStore();
+ this._initGroupStore(newProps.groupId);
+ }
+ },
+
+ _initGroupStore(groupId) {
+ if (!groupId) return;
+ this._groupStore = GroupStoreCache.getGroupStore(groupId);
+ this._groupStore.registerListener(this.onGroupStoreUpdated);
+ },
+
+ _unregisterGroupStore() {
+ if (this._groupStore) {
+ this._groupStore.unregisterListener(this.onGroupStoreUpdated);
+ }
+ },
+
+ onGroupStoreUpdated: function() {
+ this.setState({
+ isUserPrivilegedInGroup: this._groupStore.isUserPrivileged(),
+ });
+ },
+
+ onCollapseClick: function() {
+ dis.dispatch({
+ action: 'hide_right_panel',
+ });
+ },
+
+ onInviteButtonClick: function() {
+ if (this.context.matrixClient.isGuest()) {
+ dis.dispatch({action: 'view_set_mxid'});
+ return;
+ }
+
+ // call AddressPickerDialog
+ dis.dispatch({
+ action: 'view_invite',
+ roomId: this.props.roomId,
+ });
+ },
+
+ onInviteToGroupButtonClick: function() {
+ showGroupInviteDialog(this.props.groupId).then(() => {
+ this.setState({
+ phase: this.Phase.GroupMemberList,
+ });
+ });
+ },
+
+ onAddRoomToGroupButtonClick: function() {
+ showGroupAddRoomDialog(this.props.groupId).then(() => {
+ this.forceUpdate();
+ });
+ },
+
+ onRoomStateMember: function(ev, state, member) {
+ // redraw the badge on the membership list
+ if (this.state.phase === this.Phase.RoomMemberList && member.roomId === this.props.roomId) {
+ this._delayedUpdate();
+ } else if (this.state.phase === this.Phase.RoomMemberInfo && member.roomId === this.props.roomId &&
+ member.userId === this.state.member.userId) {
+ // refresh the member info (e.g. new power level)
+ this._delayedUpdate();
+ }
+ },
+
+ _delayedUpdate: new RateLimitedFunc(function() {
+ this.forceUpdate(); // eslint-disable-line babel/no-invalid-this
+ }, 500),
+
+ onAction: function(payload) {
+ if (payload.action === "view_user") {
+ dis.dispatch({
+ action: 'show_right_panel',
+ });
+ if (payload.member) {
+ this.setState({
+ phase: this.Phase.RoomMemberInfo,
+ member: payload.member,
+ });
+ } else {
+ if (this.props.roomId) {
+ this.setState({
+ phase: this.Phase.RoomMemberList,
+ });
+ } else if (this.props.groupId) {
+ this.setState({
+ phase: this.Phase.GroupMemberList,
+ member: payload.member,
+ });
+ }
+ }
+ } else if (payload.action === "view_group") {
+ this.setState({
+ phase: this.Phase.GroupMemberList,
+ member: null,
+ });
+ } else if (payload.action === "view_group_room") {
+ this.setState({
+ phase: this.Phase.GroupRoomInfo,
+ groupRoomId: payload.groupRoomId,
+ });
+ } else if (payload.action === "view_group_room_list") {
+ this.setState({
+ phase: this.Phase.GroupRoomList,
+ });
+ } else if (payload.action === "view_group_member_list") {
+ this.setState({
+ phase: this.Phase.GroupMemberList,
+ });
+ } else if (payload.action === "view_group_user") {
+ this.setState({
+ phase: this.Phase.GroupMemberInfo,
+ member: payload.member,
+ });
+ } else if (payload.action === "view_room") {
+ this.setState({
+ phase: this.Phase.RoomMemberList,
+ });
+ } else if (payload.action === "view_right_panel_phase") {
+ this.setState({
+ phase: payload.phase,
+ });
+ }
+ },
+
+ render: function() {
+ const MemberList = sdk.getComponent('rooms.MemberList');
+ const MemberInfo = sdk.getComponent('rooms.MemberInfo');
+ const NotificationPanel = sdk.getComponent('structures.NotificationPanel');
+ const FilePanel = sdk.getComponent('structures.FilePanel');
+
+ const GroupMemberList = sdk.getComponent('groups.GroupMemberList');
+ const GroupMemberInfo = sdk.getComponent('groups.GroupMemberInfo');
+ const GroupRoomList = sdk.getComponent('groups.GroupRoomList');
+ const GroupRoomInfo = sdk.getComponent('groups.GroupRoomInfo');
+
+ const TintableSvg = sdk.getComponent("elements.TintableSvg");
+
+ let inviteGroup;
+
+ let membersBadge;
+ let membersTitle = _t('Members');
+ if ((this.state.phase === this.Phase.RoomMemberList || this.state.phase === this.Phase.RoomMemberInfo)
+ && this.props.roomId
+ ) {
+ const cli = this.context.matrixClient;
+ const room = cli.getRoom(this.props.roomId);
+ let isUserInRoom;
+ if (room) {
+ const numMembers = room.getJoinedMembers().length;
+ membersTitle = _t('%(count)s Members', { count: numMembers });
+ membersBadge =
+ ;
+ }
+ }
+
+ const isPhaseGroup = [
+ this.Phase.GroupMemberInfo,
+ this.Phase.GroupMemberList,
+ ].includes(this.state.phase);
+
+ let headerButtons = [];
+ if (this.props.roomId) {
+ headerButtons = [
+ ,
+ ,
+ ,
+ ];
+ } else if (this.props.groupId) {
+ headerButtons = [
+ ,
+ ,
+ ];
+ }
+
+ if (this.props.roomId || this.props.groupId) {
+ // Hiding the right panel hides it completely and relies on an 'expand' button
+ // being put in the RoomHeader or GroupView header, so only show the minimise
+ // button on these 2 screens or you won't be able to re-expand the panel.
+ headerButtons.push(
+
+
+ );
+ }
+
+ const classes = classNames("mx_RightPanel", "mx_fadable", {
+ "collapsed": this.props.collapsed,
+ "mx_fadable_faded": this.props.disabled,
+ });
+
+ return (
+
+ );
+ },
+});
diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js
new file mode 100644
index 00000000000..76360383d68
--- /dev/null
+++ b/src/components/structures/RoomDirectory.js
@@ -0,0 +1,587 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+
+var MatrixClientPeg = require('../../MatrixClientPeg');
+var ContentRepo = require("matrix-js-sdk").ContentRepo;
+var Modal = require('../../Modal');
+var sdk = require('../../index');
+var dis = require('../../dispatcher');
+
+var linkify = require('linkifyjs');
+var linkifyString = require('linkifyjs/string');
+var linkifyMatrix = require('../../linkify-matrix');
+var sanitizeHtml = require('sanitize-html');
+import Promise from 'bluebird';
+
+import { _t } from '../../languageHandler';
+
+import {instanceForInstanceId, protocolNameForInstanceId} from '../../utils/DirectoryUtils';
+
+linkifyMatrix(linkify);
+
+module.exports = React.createClass({
+ displayName: 'RoomDirectory',
+
+ propTypes: {
+ config: React.PropTypes.object,
+ },
+
+ getDefaultProps: function() {
+ return {
+ config: {},
+ }
+ },
+
+ getInitialState: function() {
+ return {
+ publicRooms: [],
+ loading: true,
+ protocolsLoading: true,
+ instanceId: null,
+ includeAll: false,
+ roomServer: null,
+ filterString: null,
+ }
+ },
+
+ componentWillMount: function() {
+ this._unmounted = false;
+ this.nextBatch = null;
+ this.filterTimeout = null;
+ this.scrollPanel = null;
+ this.protocols = null;
+
+ this.setState({protocolsLoading: true});
+ MatrixClientPeg.get().getThirdpartyProtocols().done((response) => {
+ this.protocols = response;
+ this.setState({protocolsLoading: false});
+ }, (err) => {
+ console.warn(`error loading thirdparty protocols: ${err}`);
+ this.setState({protocolsLoading: false});
+ if (MatrixClientPeg.get().isGuest()) {
+ // Guests currently aren't allowed to use this API, so
+ // ignore this as otherwise this error is literally the
+ // thing you see when loading the client!
+ return;
+ }
+ const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ Modal.createTrackedDialog('Failed to get protocol list from Home Server', '', ErrorDialog, {
+ title: _t('Failed to get protocol list from Home Server'),
+ description: _t('The Home Server may be too old to support third party networks'),
+ });
+ });
+
+ // dis.dispatch({
+ // action: 'panel_disable',
+ // sideDisabled: true,
+ // middleDisabled: true,
+ // });
+ },
+
+ componentWillUnmount: function() {
+ // dis.dispatch({
+ // action: 'panel_disable',
+ // sideDisabled: false,
+ // middleDisabled: false,
+ // });
+ if (this.filterTimeout) {
+ clearTimeout(this.filterTimeout);
+ }
+ this._unmounted = true;
+ },
+
+ refreshRoomList: function() {
+ this.nextBatch = null;
+ this.setState({
+ publicRooms: [],
+ loading: true,
+ });
+ this.getMoreRooms().done();
+ },
+
+ getMoreRooms: function() {
+ if (!MatrixClientPeg.get()) return Promise.resolve();
+
+ const my_filter_string = this.state.filterString;
+ const my_server = this.state.roomServer;
+ // remember the next batch token when we sent the request
+ // too. If it's changed, appending to the list will corrupt it.
+ const my_next_batch = this.nextBatch;
+ const opts = {limit: 20};
+ if (my_server != MatrixClientPeg.getHomeServerName()) {
+ opts.server = my_server;
+ }
+ if (this.state.instanceId) {
+ opts.third_party_instance_id = this.state.instanceId;
+ } else if (this.state.includeAll) {
+ opts.include_all_networks = true;
+ }
+ if (this.nextBatch) opts.since = this.nextBatch;
+ if (my_filter_string) opts.filter = { generic_search_term: my_filter_string } ;
+ return MatrixClientPeg.get().publicRooms(opts).then((data) => {
+ if (
+ my_filter_string != this.state.filterString ||
+ my_server != this.state.roomServer ||
+ my_next_batch != this.nextBatch)
+ {
+ // if the filter or server has changed since this request was sent,
+ // throw away the result (don't even clear the busy flag
+ // since we must still have a request in flight)
+ return;
+ }
+
+ if (this._unmounted) {
+ // if we've been unmounted, we don't care either.
+ return;
+ }
+
+ this.nextBatch = data.next_batch;
+ this.setState((s) => {
+ s.publicRooms.push(...data.chunk);
+ s.loading = false;
+ return s;
+ });
+ return Boolean(data.next_batch);
+ }, (err) => {
+ if (
+ my_filter_string != this.state.filterString ||
+ my_server != this.state.roomServer ||
+ my_next_batch != this.nextBatch)
+ {
+ // as above: we don't care about errors for old
+ // requests either
+ return;
+ }
+
+ if (this._unmounted) {
+ // if we've been unmounted, we don't care either.
+ return;
+ }
+
+ this.setState({ loading: false });
+ console.error("Failed to get publicRooms: %s", JSON.stringify(err));
+ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ Modal.createTrackedDialog('Failed to get public room list', '', ErrorDialog, {
+ title: _t('Failed to get public room list'),
+ description: ((err && err.message) ? err.message : _t('The server may be unavailable or overloaded'))
+ });
+ });
+ },
+
+ /**
+ * A limited interface for removing rooms from the directory.
+ * Will set the room to not be publicly visible and delete the
+ * default alias. In the long term, it would be better to allow
+ * HS admins to do this through the RoomSettings interface, but
+ * this needs SPEC-417.
+ */
+ removeFromDirectory: function(room) {
+ var alias = get_display_alias_for_room(room);
+ var name = room.name || alias || _t('Unnamed room');
+
+ var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
+ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+
+ var desc;
+ if (alias) {
+ desc = _t('Delete the room alias %(alias)s and remove %(name)s from the directory?', {alias: alias, name: name});
+ } else {
+ desc = _t('Remove %(name)s from the directory?', {name: name});
+ }
+
+ Modal.createTrackedDialog('Remove from Directory', '', QuestionDialog, {
+ title: _t('Remove from Directory'),
+ description: desc,
+ onFinished: (should_delete) => {
+ if (!should_delete) return;
+
+ var Loader = sdk.getComponent("elements.Spinner");
+ var modal = Modal.createDialog(Loader);
+ var step = _t('remove %(name)s from the directory.', {name: name});
+
+ MatrixClientPeg.get().setRoomDirectoryVisibility(room.room_id, 'private').then(() => {
+ if (!alias) return;
+ step = _t('delete the alias.');
+ return MatrixClientPeg.get().deleteAlias(alias);
+ }).done(() => {
+ modal.close();
+ this.refreshRoomList();
+ }, (err) => {
+ modal.close();
+ this.refreshRoomList();
+ console.error("Failed to " + step + ": " + err);
+ Modal.createTrackedDialog('Remove from Directory Error', '', ErrorDialog, {
+ title: _t('Error'),
+ description: ((err && err.message) ? err.message : _t('The server may be unavailable or overloaded'))
+ });
+ });
+ }
+ });
+ },
+
+ onRoomClicked: function(room, ev) {
+ if (ev.shiftKey) {
+ ev.preventDefault();
+ this.removeFromDirectory(room);
+ } else {
+ this.showRoom(room);
+ }
+ },
+
+ onOptionChange: function(server, instanceId, includeAll) {
+ // clear next batch so we don't try to load more rooms
+ this.nextBatch = null;
+ this.setState({
+ // Clear the public rooms out here otherwise we needlessly
+ // spend time filtering lots of rooms when we're about to
+ // to clear the list anyway.
+ publicRooms: [],
+ roomServer: server,
+ instanceId: instanceId,
+ includeAll: includeAll,
+ }, this.refreshRoomList);
+ // We also refresh the room list each time even though this
+ // filtering is client-side. It hopefully won't be client side
+ // for very long, and we may have fetched a thousand rooms to
+ // find the five gitter ones, at which point we do not want
+ // to render all those rooms when switching back to 'all networks'.
+ // Easiest to just blow away the state & re-fetch.
+ },
+
+ onFillRequest: function(backwards) {
+ if (backwards || !this.nextBatch) return Promise.resolve(false);
+
+ return this.getMoreRooms();
+ },
+
+ onFilterChange: function(alias) {
+ this.setState({
+ filterString: alias || null,
+ });
+
+ // don't send the request for a little bit,
+ // no point hammering the server with a
+ // request for every keystroke, let the
+ // user finish typing.
+ if (this.filterTimeout) {
+ clearTimeout(this.filterTimeout);
+ }
+ this.filterTimeout = setTimeout(() => {
+ this.filterTimeout = null;
+ this.refreshRoomList();
+ }, 700);
+ },
+
+ onFilterClear: function() {
+ // update immediately
+ this.setState({
+ filterString: null,
+ }, this.refreshRoomList);
+
+ if (this.filterTimeout) {
+ clearTimeout(this.filterTimeout);
+ }
+ },
+
+ onJoinClick: function(alias) {
+ // If we don't have a particular instance id selected, just show that rooms alias
+ if (!this.state.instanceId) {
+ // If the user specified an alias without a domain, add on whichever server is selected
+ // in the dropdown
+ if (alias.indexOf(':') == -1) {
+ alias = alias + ':' + this.state.roomServer;
+ }
+ this.showRoomAlias(alias);
+ } else {
+ // This is a 3rd party protocol. Let's see if we can join it
+ const protocolName = protocolNameForInstanceId(this.protocols, this.state.instanceId);
+ const instance = instanceForInstanceId(this.protocols, this.state.instanceId);
+ const fields = protocolName ? this._getFieldsForThirdPartyLocation(alias, this.protocols[protocolName], instance) : null;
+ if (!fields) {
+ const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ Modal.createTrackedDialog('Unable to join network', '', ErrorDialog, {
+ title: _t('Unable to join network'),
+ description: _t('Riot does not know how to join a room on this network'),
+ });
+ return;
+ }
+ MatrixClientPeg.get().getThirdpartyLocation(protocolName, fields).done((resp) => {
+ if (resp.length > 0 && resp[0].alias) {
+ this.showRoomAlias(resp[0].alias);
+ } else {
+ const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ Modal.createTrackedDialog('Room not found', '', ErrorDialog, {
+ title: _t('Room not found'),
+ description: _t('Couldn\'t find a matching Matrix room'),
+ });
+ }
+ }, (e) => {
+ const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ Modal.createTrackedDialog('Fetching third party location failed', '', ErrorDialog, {
+ title: _t('Fetching third party location failed'),
+ description: _t('Unable to look up room ID from server'),
+ });
+ });
+ }
+ },
+
+ showRoomAlias: function(alias) {
+ this.showRoom(null, alias);
+ },
+
+ showRoom: function(room, room_alias) {
+ var payload = {action: 'view_room'};
+ if (room) {
+ // Don't let the user view a room they won't be able to either
+ // peek or join: fail earlier so they don't have to click back
+ // to the directory.
+ if (MatrixClientPeg.get().isGuest()) {
+ if (!room.world_readable && !room.guest_can_join) {
+ dis.dispatch({action: 'view_set_mxid'});
+ return;
+ }
+ }
+
+ if (!room_alias) {
+ room_alias = get_display_alias_for_room(room);
+ }
+
+ payload.oob_data = {
+ avatarUrl: room.avatar_url,
+ // XXX: This logic is duplicated from the JS SDK which
+ // would normally decide what the name is.
+ name: room.name || room_alias || _t('Unnamed room'),
+ };
+ }
+ // It's not really possible to join Matrix rooms by ID because the HS has no way to know
+ // which servers to start querying. However, there's no other way to join rooms in
+ // this list without aliases at present, so if roomAlias isn't set here we have no
+ // choice but to supply the ID.
+ if (room_alias) {
+ payload.room_alias = room_alias;
+ } else {
+ payload.room_id = room.room_id;
+ }
+ dis.dispatch(payload);
+ },
+
+ getRows: function() {
+ var BaseAvatar = sdk.getComponent('avatars.BaseAvatar');
+
+ if (!this.state.publicRooms) return [];
+
+ var rooms = this.state.publicRooms;
+ var rows = [];
+ var self = this;
+ var guestRead, guestJoin, perms;
+ for (var i = 0; i < rooms.length; i++) {
+ var name = rooms[i].name || get_display_alias_for_room(rooms[i]) || _t('Unnamed room');
+ guestRead = null;
+ guestJoin = null;
+
+ if (rooms[i].world_readable) {
+ guestRead = (
+
+ );
+ }
+ return rows;
+ },
+
+ collectScrollPanel: function(element) {
+ this.scrollPanel = element;
+ },
+
+ _stringLooksLikeId: function(s, field_type) {
+ let pat = /^#[^\s]+:[^\s]/;
+ if (field_type && field_type.regexp) {
+ pat = new RegExp(field_type.regexp);
+ }
+
+ return pat.test(s);
+ },
+
+ _getFieldsForThirdPartyLocation: function(userInput, protocol, instance) {
+ // make an object with the fields specified by that protocol. We
+ // require that the values of all but the last field come from the
+ // instance. The last is the user input.
+ const requiredFields = protocol.location_fields;
+ if (!requiredFields) return null;
+ const fields = {};
+ for (let i = 0; i < requiredFields.length - 1; ++i) {
+ const thisField = requiredFields[i];
+ if (instance.fields[thisField] === undefined) return null;
+ fields[thisField] = instance.fields[thisField];
+ }
+ fields[requiredFields[requiredFields.length - 1]] = userInput;
+ return fields;
+ },
+
+ /**
+ * called by the parent component when PageUp/Down/etc is pressed.
+ *
+ * We pass it down to the scroll panel.
+ */
+ handleScrollKey: function(ev) {
+ if (this.scrollPanel) {
+ this.scrollPanel.handleScrollKey(ev);
+ }
+ },
+
+ render: function() {
+ const SimpleRoomHeader = sdk.getComponent('rooms.SimpleRoomHeader');
+ const Loader = sdk.getComponent("elements.Spinner");
+
+ if (this.state.protocolsLoading) {
+ return (
+
+
+
+
+ );
+ }
+
+ let content;
+ if (this.state.loading) {
+ content =
+
+
;
+ } else {
+ const rows = this.getRows();
+ // we still show the scrollpanel, at least for now, because
+ // otherwise we don't fetch more because we don't get a fill
+ // request from the scrollpanel because there isn't one
+ let scrollpanel_content;
+ if (rows.length == 0) {
+ scrollpanel_content = { _t('No rooms to show') };
+ } else {
+ scrollpanel_content =
+ );
+ }
+});
+
+// Similar to matrix-react-sdk's MatrixTools.getDisplayAliasForRoom
+// but works with the objects we get from the public room list
+function get_display_alias_for_room(room) {
+ return room.canonical_alias || (room.aliases ? room.aliases[0] : "");
+}
diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js
new file mode 100644
index 00000000000..fb82ee067b4
--- /dev/null
+++ b/src/components/structures/RoomSubList.js
@@ -0,0 +1,401 @@
+/*
+Copyright 2017 Vector Creations Ltd
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+var ReactDOM = require('react-dom');
+var classNames = require('classnames');
+var sdk = require('../../index');
+import { Droppable } from 'react-beautiful-dnd';
+import { _t } from '../../languageHandler';
+var dis = require('../../dispatcher');
+var Unread = require('../../Unread');
+var MatrixClientPeg = require('../../MatrixClientPeg');
+var RoomNotifs = require('../../RoomNotifs');
+var FormattingUtils = require('../../utils/FormattingUtils');
+var AccessibleButton = require('../../components/views/elements/AccessibleButton');
+import Modal from '../../Modal';
+import { KeyCode } from '../../Keyboard';
+
+
+// turn this on for drop & drag console debugging galore
+var debug = false;
+
+const TRUNCATE_AT = 10;
+
+var RoomSubList = React.createClass({
+ displayName: 'RoomSubList',
+
+ debug: debug,
+
+ propTypes: {
+ list: React.PropTypes.arrayOf(React.PropTypes.object).isRequired,
+ label: React.PropTypes.string.isRequired,
+ tagName: React.PropTypes.string,
+ editable: React.PropTypes.bool,
+
+ order: React.PropTypes.string.isRequired,
+
+ // passed through to RoomTile and used to highlight room with `!` regardless of notifications count
+ isInvite: React.PropTypes.bool,
+
+ startAsHidden: React.PropTypes.bool,
+ showSpinner: React.PropTypes.bool, // true to show a spinner if 0 elements when expanded
+ collapsed: React.PropTypes.bool.isRequired, // is LeftPanel collapsed?
+ onHeaderClick: React.PropTypes.func,
+ alwaysShowHeader: React.PropTypes.bool,
+ incomingCall: React.PropTypes.object,
+ onShowMoreRooms: React.PropTypes.func,
+ searchFilter: React.PropTypes.string,
+ emptyContent: React.PropTypes.node, // content shown if the list is empty
+ headerItems: React.PropTypes.node, // content shown in the sublist header
+ extraTiles: React.PropTypes.arrayOf(React.PropTypes.node), // extra elements added beneath tiles
+ },
+
+ getInitialState: function() {
+ return {
+ hidden: this.props.startAsHidden || false,
+ truncateAt: TRUNCATE_AT,
+ sortedList: [],
+ };
+ },
+
+ getDefaultProps: function() {
+ return {
+ onHeaderClick: function() {}, // NOP
+ onShowMoreRooms: function() {}, // NOP
+ extraTiles: [],
+ isInvite: false,
+ };
+ },
+
+ componentWillMount: function() {
+ this.setState({
+ sortedList: this.applySearchFilter(this.props.list, this.props.searchFilter),
+ });
+ this.dispatcherRef = dis.register(this.onAction);
+ },
+
+ componentWillUnmount: function() {
+ dis.unregister(this.dispatcherRef);
+ },
+
+ componentWillReceiveProps: function(newProps) {
+ // order the room list appropriately before we re-render
+ //if (debug) console.log("received new props, list = " + newProps.list);
+ this.setState({
+ sortedList: this.applySearchFilter(newProps.list, newProps.searchFilter),
+ });
+ },
+
+ applySearchFilter: function(list, filter) {
+ if (filter === "") return list;
+ return list.filter((room) => {
+ return room.name && room.name.toLowerCase().indexOf(filter.toLowerCase()) >= 0
+ });
+ },
+
+ // The header is collapsable if it is hidden or not stuck
+ // The dataset elements are added in the RoomList _initAndPositionStickyHeaders method
+ isCollapsableOnClick: function() {
+ var stuck = this.refs.header.dataset.stuck;
+ if (this.state.hidden || stuck === undefined || stuck === "none") {
+ return true;
+ } else {
+ return false;
+ }
+ },
+
+ onAction: function(payload) {
+ // XXX: Previously RoomList would forceUpdate whenever on_room_read is dispatched,
+ // but this is no longer true, so we must do it here (and can apply the small
+ // optimisation of checking that we care about the room being read).
+ //
+ // Ultimately we need to transition to a state pushing flow where something
+ // explicitly notifies the components concerned that the notif count for a room
+ // has change (e.g. a Flux store).
+ if (payload.action === 'on_room_read' &&
+ this.props.list.some((r) => r.roomId === payload.roomId)
+ ) {
+ this.forceUpdate();
+ }
+ },
+
+ onClick: function(ev) {
+ if (this.isCollapsableOnClick()) {
+ // The header isCollapsable, so the click is to be interpreted as collapse and truncation logic
+ var isHidden = !this.state.hidden;
+ this.setState({ hidden : isHidden });
+
+ if (isHidden) {
+ // as good a way as any to reset the truncate state
+ this.setState({ truncateAt : TRUNCATE_AT });
+ }
+
+ this.props.onShowMoreRooms();
+ this.props.onHeaderClick(isHidden);
+ } else {
+ // The header is stuck, so the click is to be interpreted as a scroll to the header
+ this.props.onHeaderClick(this.state.hidden, this.refs.header.dataset.originalPosition);
+ }
+ },
+
+ onRoomTileClick(roomId, ev) {
+ dis.dispatch({
+ action: 'view_room',
+ room_id: roomId,
+ clear_search: (ev && (ev.keyCode == KeyCode.ENTER || ev.keyCode == KeyCode.SPACE)),
+ });
+ },
+
+ _shouldShowNotifBadge: function(roomNotifState) {
+ const showBadgeInStates = [RoomNotifs.ALL_MESSAGES, RoomNotifs.ALL_MESSAGES_LOUD];
+ return showBadgeInStates.indexOf(roomNotifState) > -1;
+ },
+
+ _shouldShowMentionBadge: function(roomNotifState) {
+ return roomNotifState != RoomNotifs.MUTE;
+ },
+
+ /**
+ * Total up all the notification counts from the rooms
+ *
+ * @param {Number} If supplied will only total notifications for rooms outside the truncation number
+ * @returns {Array} The array takes the form [total, highlight] where highlight is a bool
+ */
+ roomNotificationCount: function(truncateAt) {
+ var self = this;
+
+ if (this.props.isInvite) {
+ return [0, true];
+ }
+
+ return this.props.list.reduce(function(result, room, index) {
+ if (truncateAt === undefined || index >= truncateAt) {
+ var roomNotifState = RoomNotifs.getRoomNotifsState(room.roomId);
+ var highlight = room.getUnreadNotificationCount('highlight') > 0;
+ var notificationCount = room.getUnreadNotificationCount();
+
+ const notifBadges = notificationCount > 0 && self._shouldShowNotifBadge(roomNotifState);
+ const mentionBadges = highlight && self._shouldShowMentionBadge(roomNotifState);
+ const badges = notifBadges || mentionBadges;
+
+ if (badges) {
+ result[0] += notificationCount;
+ if (highlight) {
+ result[1] = true;
+ }
+ }
+ }
+ return result;
+ }, [0, false]);
+ },
+
+ _updateSubListCount: function() {
+ // Force an update by setting the state to the current state
+ // Doing it this way rather than using forceUpdate(), so that the shouldComponentUpdate()
+ // method is honoured
+ this.setState(this.state);
+ },
+
+ makeRoomTiles: function() {
+ const DNDRoomTile = sdk.getComponent("rooms.DNDRoomTile");
+ const RoomTile = sdk.getComponent("rooms.RoomTile");
+ return this.state.sortedList.map((room, index) => {
+ // XXX: is it evil to pass in this as a prop to RoomTile? Yes.
+
+ // We should only use when editable
+ const RoomTileComponent = this.props.editable ? DNDRoomTile : RoomTile;
+ return 0 || this.props.isInvite}
+ isInvite={this.props.isInvite}
+ refreshSubList={this._updateSubListCount}
+ incomingCall={null}
+ onClick={this.onRoomTileClick}
+ />;
+ });
+ },
+
+ _getHeaderJsx: function() {
+ var TintableSvg = sdk.getComponent("elements.TintableSvg");
+
+ var subListNotifications = this.roomNotificationCount();
+ var subListNotifCount = subListNotifications[0];
+ var subListNotifHighlight = subListNotifications[1];
+
+ var totalTiles = this.props.list.length + (this.props.extraTiles || []).length;
+ var roomCount = totalTiles > 0 ? totalTiles : '';
+
+ var chevronClasses = classNames({
+ 'mx_RoomSubList_chevron': true,
+ 'mx_RoomSubList_chevronRight': this.state.hidden,
+ 'mx_RoomSubList_chevronDown': !this.state.hidden,
+ });
+
+ var badgeClasses = classNames({
+ 'mx_RoomSubList_badge': true,
+ 'mx_RoomSubList_badgeHighlight': subListNotifHighlight,
+ });
+
+ var badge;
+ if (subListNotifCount > 0) {
+ badge =
;
+ } else if (this.props.isInvite) {
+ // no notifications but highlight anyway because this is an invite badge
+ badge =
!
;
+ }
+
+ // When collapsed, allow a long hover on the header to show user
+ // the full tag name and room count
+ var title;
+ if (this.props.collapsed) {
+ title = this.props.label;
+ if (roomCount !== '') {
+ title += " [" + roomCount + "]";
+ }
+ }
+
+ var incomingCall;
+ if (this.props.incomingCall) {
+ var self = this;
+ // Check if the incoming call is for this section
+ var incomingCallRoom = this.props.list.filter(function(room) {
+ return self.props.incomingCall.roomId === room.roomId;
+ });
+
+ if (incomingCallRoom.length === 1) {
+ var IncomingCallBox = sdk.getComponent("voip.IncomingCallBox");
+ incomingCall = ;
+ }
+ }
+
+ var tabindex = this.props.searchFilter === "" ? "0" : "-1";
+
+ return (
+
+ );
+ }
+ }
+});
+
+module.exports = RoomSubList;
diff --git a/src/components/structures/SearchBox.js b/src/components/structures/SearchBox.js
new file mode 100644
index 00000000000..459df3bd262
--- /dev/null
+++ b/src/components/structures/SearchBox.js
@@ -0,0 +1,163 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import { _t } from '../../languageHandler';
+import { KeyCode } from '../../Keyboard';
+import sdk from '../../index';
+import dis from '../../dispatcher';
+import rate_limited_func from '../../ratelimitedfunc';
+import AccessibleButton from '../../components/views/elements/AccessibleButton';
+
+module.exports = React.createClass({
+ displayName: 'SearchBox',
+
+ propTypes: {
+ collapsed: React.PropTypes.bool,
+ onSearch: React.PropTypes.func,
+ },
+
+ getInitialState: function() {
+ return {
+ searchTerm: "",
+ };
+ },
+
+ componentDidMount: function() {
+ this.dispatcherRef = dis.register(this.onAction);
+ },
+
+ componentWillUnmount: function() {
+ dis.unregister(this.dispatcherRef);
+ },
+
+ onAction: function(payload) {
+ switch (payload.action) {
+ case 'view_room':
+ if (this.refs.search && payload.clear_search) {
+ this._clearSearch();
+ }
+ break;
+ case 'focus_room_filter':
+ if (this.refs.search) {
+ this.refs.search.focus();
+ this.refs.search.select();
+ }
+ break;
+ }
+ },
+
+ onChange: function() {
+ if (!this.refs.search) return;
+ this.setState({ searchTerm: this.refs.search.value });
+ this.onSearch();
+ },
+
+ onSearch: new rate_limited_func(
+ function() {
+ this.props.onSearch(this.refs.search.value);
+ },
+ 100
+ ),
+
+ onToggleCollapse: function(show) {
+ if (show) {
+ dis.dispatch({
+ action: 'show_left_panel',
+ });
+ }
+ else {
+ dis.dispatch({
+ action: 'hide_left_panel',
+ });
+ }
+ },
+
+ _onKeyDown: function(ev) {
+ switch (ev.keyCode) {
+ case KeyCode.ESCAPE:
+ this._clearSearch();
+ dis.dispatch({action: 'focus_composer'});
+ break;
+ }
+ },
+
+ _clearSearch: function() {
+ this.refs.search.value = "";
+ this.onChange();
+ },
+
+ render: function() {
+ var TintableSvg = sdk.getComponent('elements.TintableSvg');
+
+ var collapseTabIndex = this.refs.search && this.refs.search.value !== "" ? "-1" : "0";
+
+ var toggleCollapse;
+ if (this.props.collapsed) {
+ toggleCollapse =
+
+
+
+ }
+ else {
+ toggleCollapse =
+
+
+
+ }
+
+ var searchControls;
+ if (!this.props.collapsed) {
+ searchControls = [
+ this.state.searchTerm.length > 0 ?
+ { this._clearSearch(); } }>
+
+
+ :
+ ,
+
+ ];
+ }
+
+ var self = this;
+ return (
+
+ { searchControls }
+ { toggleCollapse }
+
+ );
+ }
+});
diff --git a/src/components/structures/ViewSource.js b/src/components/structures/ViewSource.js
new file mode 100644
index 00000000000..3a5d35a5619
--- /dev/null
+++ b/src/components/structures/ViewSource.js
@@ -0,0 +1,57 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import SyntaxHighlight from '../views/elements/SyntaxHighlight';
+
+
+module.exports = React.createClass({
+ displayName: 'ViewSource',
+
+ propTypes: {
+ content: PropTypes.object.isRequired,
+ onFinished: PropTypes.func.isRequired,
+ },
+
+ componentDidMount: function() {
+ document.addEventListener("keydown", this.onKeyDown);
+ },
+
+ componentWillUnmount: function() {
+ document.removeEventListener("keydown", this.onKeyDown);
+ },
+
+ onKeyDown: function(ev) {
+ if (ev.keyCode == 27) { // escape
+ ev.stopPropagation();
+ ev.preventDefault();
+ this.props.onFinished();
+ }
+ },
+
+ render: function() {
+ return (
+
+ );
+ }
+});
diff --git a/src/components/views/context_menus/GenericElementContextMenu.js b/src/components/views/context_menus/GenericElementContextMenu.js
new file mode 100644
index 00000000000..3f4804dbd11
--- /dev/null
+++ b/src/components/views/context_menus/GenericElementContextMenu.js
@@ -0,0 +1,60 @@
+/*
+Copyright 2017 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import PropTypes from 'prop-types';
+
+/*
+ * This component can be used to display generic HTML content in a contextual
+ * menu.
+ */
+
+
+export default class GenericElementContextMenu extends React.Component {
+ static PropTypes = {
+ element: PropTypes.element.isRequired,
+ // Function to be called when the parent window is resized
+ // This can be used to reposition or close the menu on resize and
+ // ensure that it is not displayed in a stale position.
+ onResize: PropTypes.func,
+ };
+
+ constructor(props) {
+ super(props);
+ this.resize = this.resize.bind(this);
+ }
+
+ componentDidMount() {
+ this.resize = this.resize.bind(this);
+ window.addEventListener("resize", this.resize);
+ }
+
+ componentWillUnmount() {
+ window.removeEventListener("resize", this.resize);
+ }
+
+ resize() {
+ if (this.props.onResize) {
+ this.props.onResize();
+ }
+ }
+
+ render() {
+ return
{ this.props.element }
;
+ }
+}
diff --git a/src/components/views/context_menus/GenericTextContextMenu.js b/src/components/views/context_menus/GenericTextContextMenu.js
new file mode 100644
index 00000000000..2319fe05a25
--- /dev/null
+++ b/src/components/views/context_menus/GenericTextContextMenu.js
@@ -0,0 +1,30 @@
+/*
+Copyright 2017 Michael Telatynski <7t3chguy@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import PropTypes from 'prop-types';
+
+export default class GenericTextContextMenu extends React.Component {
+ static PropTypes = {
+ message: PropTypes.string.isRequired,
+ };
+
+ render() {
+ return
{ this.props.message }
;
+ }
+}
diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js
new file mode 100644
index 00000000000..860d94ea0e3
--- /dev/null
+++ b/src/components/views/context_menus/MessageContextMenu.js
@@ -0,0 +1,326 @@
+/*
+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.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+
+import MatrixClientPeg from '../../../MatrixClientPeg';
+import dis from '../../../dispatcher';
+import sdk from '../../../index';
+import { _t } from '../../../languageHandler';
+import Modal from '../../../Modal';
+import Resend from '../../../Resend';
+import SettingsStore from '../../../settings/SettingsStore';
+import {makeEventPermalink} from '../../../matrix-to';
+import { isUrlPermitted } from '../../../HtmlUtils';
+
+module.exports = React.createClass({
+ displayName: 'MessageContextMenu',
+
+ propTypes: {
+ /* the MatrixEvent associated with the context menu */
+ mxEvent: React.PropTypes.object.isRequired,
+
+ /* an optional EventTileOps implementation that can be used to unhide preview widgets */
+ eventTileOps: React.PropTypes.object,
+
+ /* callback called when the menu is dismissed */
+ onFinished: React.PropTypes.func,
+ },
+
+ getInitialState: function() {
+ return {
+ canRedact: false,
+ canPin: false,
+ };
+ },
+
+ componentWillMount: function() {
+ MatrixClientPeg.get().on('RoomMember.powerLevel', this._checkPermissions);
+ this._checkPermissions();
+ },
+
+ componentWillUnmount: function() {
+ const cli = MatrixClientPeg.get();
+ if (cli) {
+ cli.removeListener('RoomMember.powerLevel', this._checkPermissions);
+ }
+ },
+
+ _checkPermissions: function() {
+ const cli = MatrixClientPeg.get();
+ const room = cli.getRoom(this.props.mxEvent.getRoomId());
+
+ const canRedact = room.currentState.maySendRedactionForEvent(this.props.mxEvent, cli.credentials.userId);
+ let canPin = room.currentState.mayClientSendStateEvent('m.room.pinned_events', cli);
+
+ // HACK: Intentionally say we can't pin if the user doesn't want to use the functionality
+ if (!SettingsStore.isFeatureEnabled("feature_pinning")) canPin = false;
+
+ this.setState({canRedact, canPin});
+ },
+
+ _isPinned: function() {
+ const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
+ const pinnedEvent = room.currentState.getStateEvents('m.room.pinned_events', '');
+ if (!pinnedEvent) return false;
+ return pinnedEvent.getContent().pinned.includes(this.props.mxEvent.getId());
+ },
+
+ onResendClick: function() {
+ Resend.resend(this.props.mxEvent);
+ this.closeMenu();
+ },
+
+ onViewSourceClick: function() {
+ const ViewSource = sdk.getComponent('structures.ViewSource');
+ Modal.createTrackedDialog('View Event Source', '', ViewSource, {
+ content: this.props.mxEvent.event,
+ }, 'mx_Dialog_viewsource');
+ this.closeMenu();
+ },
+
+ onViewClearSourceClick: function() {
+ const ViewSource = sdk.getComponent('structures.ViewSource');
+ Modal.createTrackedDialog('View Clear Event Source', '', ViewSource, {
+ // FIXME: _clearEvent is private
+ content: this.props.mxEvent._clearEvent,
+ }, 'mx_Dialog_viewsource');
+ this.closeMenu();
+ },
+
+ onRedactClick: function() {
+ const ConfirmRedactDialog = sdk.getComponent("dialogs.ConfirmRedactDialog");
+ Modal.createTrackedDialog('Confirm Redact Dialog', '', ConfirmRedactDialog, {
+ onFinished: (proceed) => {
+ if (!proceed) return;
+
+ const cli = MatrixClientPeg.get();
+ cli.redactEvent(this.props.mxEvent.getRoomId(), this.props.mxEvent.getId()).catch(function(e) {
+ const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ // display error message stating you couldn't delete this.
+ const code = e.errcode || e.statusCode;
+ Modal.createTrackedDialog('You cannot delete this message', '', ErrorDialog, {
+ title: _t('Error'),
+ description: _t('You cannot delete this message. (%(code)s)', {code}),
+ });
+ }).done();
+ },
+ }, 'mx_Dialog_confirmredact');
+ this.closeMenu();
+ },
+
+ onCancelSendClick: function() {
+ Resend.removeFromQueue(this.props.mxEvent);
+ this.closeMenu();
+ },
+
+ onForwardClick: function() {
+ dis.dispatch({
+ action: 'forward_event',
+ event: this.props.mxEvent,
+ });
+ this.closeMenu();
+ },
+
+ onPinClick: function() {
+ MatrixClientPeg.get().getStateEvent(this.props.mxEvent.getRoomId(), 'm.room.pinned_events', '')
+ .catch((e) => {
+ // Intercept the Event Not Found error and fall through the promise chain with no event.
+ if (e.errcode === "M_NOT_FOUND") return null;
+ throw e;
+ })
+ .then((event) => {
+ const eventIds = (event ? event.pinned : []) || [];
+ if (!eventIds.includes(this.props.mxEvent.getId())) {
+ // Not pinned - add
+ eventIds.push(this.props.mxEvent.getId());
+ } else {
+ // Pinned - remove
+ eventIds.splice(eventIds.indexOf(this.props.mxEvent.getId()), 1);
+ }
+
+ const cli = MatrixClientPeg.get();
+ cli.sendStateEvent(this.props.mxEvent.getRoomId(), 'm.room.pinned_events', {pinned: eventIds}, '');
+ });
+ this.closeMenu();
+ },
+
+ closeMenu: function() {
+ if (this.props.onFinished) this.props.onFinished();
+ },
+
+ onUnhidePreviewClick: function() {
+ if (this.props.eventTileOps) {
+ this.props.eventTileOps.unhideWidget();
+ }
+ this.closeMenu();
+ },
+
+ onQuoteClick: function() {
+ dis.dispatch({
+ action: 'quote',
+ text: this.props.eventTileOps.getInnerText(),
+ });
+ this.closeMenu();
+ },
+
+ onReplyClick: function() {
+ dis.dispatch({
+ action: 'quote_event',
+ event: this.props.mxEvent,
+ });
+ this.closeMenu();
+ },
+
+ render: function() {
+ const eventStatus = this.props.mxEvent.status;
+ let resendButton;
+ let redactButton;
+ let cancelButton;
+ let forwardButton;
+ let pinButton;
+ let viewClearSourceButton;
+ let unhidePreviewButton;
+ let externalURLButton;
+ let quoteButton;
+ let replyButton;
+
+ if (eventStatus === 'not_sent') {
+ resendButton = (
+
+ );
+ }
+
+ if (this.props.eventTileOps) {
+ if (this.props.eventTileOps.isWidgetHidden()) {
+ unhidePreviewButton = (
+
+ { _t('Unhide Preview') }
+
+ );
+ }
+ }
+
+ // XXX: if we use room ID, we should also include a server where the event can be found (other than in the domain of the event ID)
+ const permalinkButton = (
+
+ );
+ }
+
+ // Bridges can provide a 'external_url' to link back to the source.
+ if (
+ typeof(this.props.mxEvent.event.content.external_url) === "string" &&
+ isUrlPermitted(this.props.mxEvent.event.content.external_url)
+ ) {
+ externalURLButton = (
+
+ );
+ },
+});
diff --git a/src/components/views/context_menus/TagTileContextMenu.js b/src/components/views/context_menus/TagTileContextMenu.js
new file mode 100644
index 00000000000..32f5365b820
--- /dev/null
+++ b/src/components/views/context_menus/TagTileContextMenu.js
@@ -0,0 +1,75 @@
+/*
+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 { _t } from '../../../languageHandler';
+import dis from '../../../dispatcher';
+import TagOrderActions from '../../../actions/TagOrderActions';
+import MatrixClientPeg from '../../../MatrixClientPeg';
+import sdk from '../../../index';
+
+export default class TagTileContextMenu extends React.Component {
+ static propTypes = {
+ tag: PropTypes.string.isRequired,
+ /* callback called when the menu is dismissed */
+ onFinished: PropTypes.func.isRequired,
+ };
+
+ constructor() {
+ super();
+
+ this._onViewCommunityClick = this._onViewCommunityClick.bind(this);
+ this._onRemoveClick = this._onRemoveClick.bind(this);
+ }
+
+ _onViewCommunityClick() {
+ dis.dispatch({
+ action: 'view_group',
+ group_id: this.props.tag,
+ });
+ this.props.onFinished();
+ }
+
+ _onRemoveClick() {
+ dis.dispatch(TagOrderActions.removeTag(
+ // XXX: Context menus don't have a MatrixClient context
+ MatrixClientPeg.get(),
+ this.props.tag,
+ ));
+ this.props.onFinished();
+ }
+
+ render() {
+ const TintableSvg = sdk.getComponent("elements.TintableSvg");
+ return
+
+
+ { _t('View Community') }
+
+
+
+
+ { _t('Remove') }
+
+
;
+ }
+}
diff --git a/src/components/views/dialogs/BugReportDialog.js b/src/components/views/dialogs/BugReportDialog.js
new file mode 100644
index 00000000000..2025b6fc814
--- /dev/null
+++ b/src/components/views/dialogs/BugReportDialog.js
@@ -0,0 +1,213 @@
+/*
+Copyright 2017 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import React from 'react';
+import sdk from '../../../index';
+import SdkConfig from '../../../SdkConfig';
+import Modal from '../../../Modal';
+import { _t } from '../../../languageHandler';
+
+export default class BugReportDialog extends React.Component {
+ constructor(props, context) {
+ super(props, context);
+ this.state = {
+ sendLogs: true,
+ busy: false,
+ err: null,
+ issueUrl: "",
+ text: "",
+ progress: null,
+ };
+ this._unmounted = false;
+ this._onSubmit = this._onSubmit.bind(this);
+ this._onCancel = this._onCancel.bind(this);
+ this._onTextChange = this._onTextChange.bind(this);
+ this._onIssueUrlChange = this._onIssueUrlChange.bind(this);
+ this._onSendLogsChange = this._onSendLogsChange.bind(this);
+ this._sendProgressCallback = this._sendProgressCallback.bind(this);
+ }
+
+ componentWillUnmount() {
+ this._unmounted = true;
+ }
+
+ _onCancel(ev) {
+ this.props.onFinished(false);
+ }
+
+ _onSubmit(ev) {
+ const userText =
+ (this.state.text.length > 0 ? this.state.text + '\n\n': '') + 'Issue: ' +
+ (this.state.issueUrl.length > 0 ? this.state.issueUrl : 'No issue link given');
+
+ this.setState({ busy: true, progress: null, err: null });
+ this._sendProgressCallback(_t("Preparing to send logs"));
+
+ require(['../../../rageshake/submit-rageshake'], (s) => {
+ s(SdkConfig.get().bug_report_endpoint_url, {
+ userText,
+ sendLogs: true,
+ progressCallback: this._sendProgressCallback,
+ }).then(() => {
+ if (!this._unmounted) {
+ this.props.onFinished(false);
+ const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
+ // N.B. first param is passed to piwik and so doesn't want i18n
+ Modal.createTrackedDialog('Bug report sent', '', QuestionDialog, {
+ title: _t('Logs sent'),
+ description: _t('Thank you!'),
+ hasCancelButton: false,
+ });
+ }
+ }, (err) => {
+ if (!this._unmounted) {
+ this.setState({
+ busy: false,
+ progress: null,
+ err: _t("Failed to send logs: ") + `${err.message}`,
+ });
+ }
+ });
+ });
+ }
+
+ _onTextChange(ev) {
+ this.setState({ text: ev.target.value });
+ }
+
+ _onIssueUrlChange(ev) {
+ this.setState({ issueUrl: ev.target.value });
+ }
+
+ _onSendLogsChange(ev) {
+ this.setState({ sendLogs: ev.target.checked });
+ }
+
+ _sendProgressCallback(progress) {
+ if (this._unmounted) {
+ return;
+ }
+ this.setState({progress: progress});
+ }
+
+ render() {
+ const Loader = sdk.getComponent("elements.Spinner");
+
+ let error = null;
+ if (this.state.err) {
+ error =
+ {this.state.err}
+
;
+ }
+
+ let cancelButton = null;
+ if (!this.state.busy) {
+ cancelButton = ;
+ }
+
+ let progress = null;
+ if (this.state.busy) {
+ progress = (
+
+
+ {this.state.progress} ...
+
+ );
+ }
+
+ return (
+
+
+ { _t("Submit debug logs") }
+
+
+
+ { _t(
+ "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.",
+ ) }
+
+
+ { _t(
+ "Click here to create a GitHub issue.",
+ {},
+ {
+ a: (sub) =>
+ { sub }
+ ,
+ },
+ ) }
+
+
+
+
+
+
+
+
+
+ {progress}
+ {error}
+
+
+
+
+ {cancelButton}
+
+
+ );
+ }
+}
+
+BugReportDialog.propTypes = {
+ onFinished: React.PropTypes.func.isRequired,
+};
diff --git a/src/components/views/dialogs/ChangelogDialog.js b/src/components/views/dialogs/ChangelogDialog.js
new file mode 100644
index 00000000000..e71fcdb6240
--- /dev/null
+++ b/src/components/views/dialogs/ChangelogDialog.js
@@ -0,0 +1,94 @@
+/*
+ Copyright 2016 Aviral Dasgupta
+
+ 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 sdk from '../../../index';
+import request from 'browser-request';
+import { _t } from '../../../languageHandler';
+
+const REPOS = ['vector-im/riot-web', 'matrix-org/matrix-react-sdk', 'matrix-org/matrix-js-sdk'];
+
+export default class ChangelogDialog extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {};
+ }
+
+ componentDidMount() {
+ const version = this.props.newVersion.split('-');
+ const version2 = this.props.version.split('-');
+ if(version == null || version2 == null) return;
+ // parse versions of form: [vectorversion]-react-[react-sdk-version]-js-[js-sdk-version]
+ for(let i=0; i {
+ if(body == null) return;
+ this.setState({[REPOS[i]]: JSON.parse(body).commits});
+ });
+ }
+ }
+
+ _elementsForCommit(commit) {
+ return (
+
;
+ }
+
+ const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
+ return (
+
+ { body }
+
+ );
+ }
+}
diff --git a/src/components/views/dialogs/SetPasswordDialog.js b/src/components/views/dialogs/SetPasswordDialog.js
new file mode 100644
index 00000000000..31c4ad7a3fb
--- /dev/null
+++ b/src/components/views/dialogs/SetPasswordDialog.js
@@ -0,0 +1,137 @@
+/*
+Copyright 2017 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.
+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 sdk from '../../../index';
+import { _t } from '../../../languageHandler';
+import Modal from '../../../Modal';
+
+const WarmFuzzy = function(props) {
+ const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
+ let title = _t('You have successfully set a password!');
+ if (props.didSetEmail) {
+ title = _t('You have successfully set a password and an email address!');
+ }
+ const advice = _t('You can now return to your account after signing out, and sign in on other devices.');
+ let extraAdvice = null;
+ if (!props.didSetEmail) {
+ extraAdvice = _t('Remember, you can always set an email address in user settings if you change your mind.');
+ }
+
+ return
+
+ { _t('This will allow you to return to your account after signing out, and sign in on other devices.') }
+
+
+
+ { this.state.error }
+
+
+
+ );
+ },
+});
diff --git a/src/components/views/directory/NetworkDropdown.js b/src/components/views/directory/NetworkDropdown.js
new file mode 100644
index 00000000000..b45bd286f2b
--- /dev/null
+++ b/src/components/views/directory/NetworkDropdown.js
@@ -0,0 +1,254 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import React from 'react';
+import MatrixClientPeg from '../../../MatrixClientPeg';
+import {instanceForInstanceId} from '../../../utils/DirectoryUtils';
+
+const DEFAULT_ICON_URL = "img/network-matrix.svg";
+
+export default class NetworkDropdown extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.dropdownRootElement = null;
+ this.ignoreEvent = null;
+
+ this.onInputClick = this.onInputClick.bind(this);
+ this.onRootClick = this.onRootClick.bind(this);
+ this.onDocumentClick = this.onDocumentClick.bind(this);
+ this.onMenuOptionClick = this.onMenuOptionClick.bind(this);
+ this.onInputKeyUp = this.onInputKeyUp.bind(this);
+ this.collectRoot = this.collectRoot.bind(this);
+ this.collectInputTextBox = this.collectInputTextBox.bind(this);
+
+ this.inputTextBox = null;
+
+ const server = MatrixClientPeg.getHomeServerName();
+ this.state = {
+ expanded: false,
+ selectedServer: server,
+ selectedInstance: null,
+ includeAllNetworks: false,
+ };
+ }
+
+ componentWillMount() {
+ // Listen for all clicks on the document so we can close the
+ // menu when the user clicks somewhere else
+ document.addEventListener('click', this.onDocumentClick, false);
+
+ // fire this now so the defaults can be set up
+ this.props.onOptionChange(this.state.selectedServer, this.state.selectedInstance, this.state.includeAllNetworks);
+ }
+
+ componentWillUnmount() {
+ document.removeEventListener('click', this.onDocumentClick, false);
+ }
+
+ componentDidUpdate() {
+ if (this.state.expanded && this.inputTextBox) {
+ this.inputTextBox.focus();
+ }
+ }
+
+ onDocumentClick(ev) {
+ // Close the dropdown if the user clicks anywhere that isn't
+ // within our root element
+ if (ev !== this.ignoreEvent) {
+ this.setState({
+ expanded: false,
+ });
+ }
+ }
+
+ onRootClick(ev) {
+ // This captures any clicks that happen within our elements,
+ // such that we can then ignore them when they're seen by the
+ // click listener on the document handler, ie. not close the
+ // dropdown immediately after opening it.
+ // NB. We can't just stopPropagation() because then the event
+ // doesn't reach the React onClick().
+ this.ignoreEvent = ev;
+ }
+
+ onInputClick(ev) {
+ this.setState({
+ expanded: !this.state.expanded,
+ });
+ ev.preventDefault();
+ }
+
+ onMenuOptionClick(server, instance, includeAll) {
+ this.setState({
+ expanded: false,
+ selectedServer: server,
+ selectedInstanceId: instance ? instance.instance_id : null,
+ includeAll: includeAll,
+ });
+ this.props.onOptionChange(server, instance ? instance.instance_id : null, includeAll);
+ }
+
+ onInputKeyUp(e) {
+ if (e.key == 'Enter') {
+ this.setState({
+ expanded: false,
+ selectedServer: e.target.value,
+ selectedNetwork: null,
+ });
+ this.props.onOptionChange(e.target.value, null);
+ }
+ }
+
+ collectRoot(e) {
+ if (this.dropdownRootElement) {
+ this.dropdownRootElement.removeEventListener('click', this.onRootClick, false);
+ }
+ if (e) {
+ e.addEventListener('click', this.onRootClick, false);
+ }
+ this.dropdownRootElement = e;
+ }
+
+ collectInputTextBox(e) {
+ this.inputTextBox = e;
+ }
+
+ _getMenuOptions() {
+ const options = [];
+
+ let servers = [];
+ if (this.props.config.servers) {
+ servers = servers.concat(this.props.config.servers);
+ }
+
+ if (servers.indexOf(MatrixClientPeg.getHomeServerName()) == -1) {
+ servers.unshift(MatrixClientPeg.getHomeServerName());
+ }
+
+ // For our own HS, we can use the instance_ids given in the third party protocols
+ // response to get the server to filter the room list by network for us.
+ // We can't get thirdparty protocols for remote server yet though, so for those
+ // we can only show the default room list.
+ for (const server of servers) {
+ options.push(this._makeMenuOption(server, null, true));
+ if (server == MatrixClientPeg.getHomeServerName()) {
+ options.push(this._makeMenuOption(server, null, false));
+ if (this.props.protocols) {
+ for (const proto of Object.keys(this.props.protocols)) {
+ if (!this.props.protocols[proto].instances) continue;
+
+ const sortedInstances = this.props.protocols[proto].instances;
+ sortedInstances.sort(function(x, y) {
+ const a = x.desc
+ const b = y.desc
+ if (a < b) {
+ return -1;
+ } else if (a > b) {
+ return 1;
+ } else {
+ return 0;
+ }
+ });
+
+ for (const instance of sortedInstances) {
+ if (!instance.instance_id) continue;
+ options.push(this._makeMenuOption(server, instance, false));
+ }
+ }
+ }
+ }
+ }
+
+ return options;
+ }
+
+ _makeMenuOption(server, instance, includeAll, handleClicks) {
+ if (handleClicks === undefined) handleClicks = true;
+
+ let icon;
+ let name;
+ let span_class;
+ let key;
+
+ if (!instance && includeAll) {
+ key = server;
+ name = server;
+ span_class = 'mx_NetworkDropdown_menu_all';
+ } else if (!instance) {
+ key = server + '_all';
+ name = 'Matrix';
+ icon = ;
+ span_class = 'mx_NetworkDropdown_menu_network';
+ } else {
+ key = server + '_inst_' + instance.instance_id;
+ const imgUrl = instance.icon ?
+ MatrixClientPeg.get().mxcUrlToHttp(instance.icon, 25, 25, 'crop', true) :
+ DEFAULT_ICON_URL;
+ icon = ;
+ name = instance.desc;
+ span_class = 'mx_NetworkDropdown_menu_network';
+ }
+
+ const click_handler = handleClicks ? this.onMenuOptionClick.bind(this, server, instance, includeAll) : null;
+
+ return
+ {icon}
+ {name}
+
+ }
+
+ render() {
+ let current_value;
+
+ let menu;
+ if (this.state.expanded) {
+ const menu_options = this._getMenuOptions();
+ menu =
;
+ }
+}
+
+NetworkDropdown.propTypes = {
+ onOptionChange: React.PropTypes.func.isRequired,
+ protocols: React.PropTypes.object,
+ // The room directory config. May have a 'servers' key that is a list of server names to include in the dropdown
+ config: React.PropTypes.object,
+};
+
+NetworkDropdown.defaultProps = {
+ protocols: {},
+ config: {},
+};
diff --git a/src/components/views/elements/ImageView.js b/src/components/views/elements/ImageView.js
new file mode 100644
index 00000000000..f3ad5a96968
--- /dev/null
+++ b/src/components/views/elements/ImageView.js
@@ -0,0 +1,205 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+
+var MatrixClientPeg = require('../../../MatrixClientPeg');
+
+import {formatDate} from '../../../DateUtils';
+var filesize = require('filesize');
+var AccessibleButton = require('../../../components/views/elements/AccessibleButton');
+const Modal = require('../../../Modal');
+const sdk = require('../../../index');
+import { _t } from '../../../languageHandler';
+
+module.exports = React.createClass({
+ displayName: 'ImageView',
+
+ propTypes: {
+ src: React.PropTypes.string.isRequired, // the source of the image being displayed
+ name: React.PropTypes.string, // the main title ('name') for the image
+ link: React.PropTypes.string, // the link (if any) applied to the name of the image
+ width: React.PropTypes.number, // width of the image src in pixels
+ height: React.PropTypes.number, // height of the image src in pixels
+ fileSize: React.PropTypes.number, // size of the image src in bytes
+ onFinished: React.PropTypes.func.isRequired, // callback when the lightbox is dismissed
+
+ // the event (if any) that the Image is displaying. Used for event-specific stuff like
+ // redactions, senders, timestamps etc. Other descriptors are taken from the explicit
+ // properties above, which let us use lightboxes to display images which aren't associated
+ // with events.
+ mxEvent: React.PropTypes.object,
+ },
+
+ // XXX: keyboard shortcuts for managing dialogs should be done by the modal
+ // dialog base class somehow, surely...
+ componentDidMount: function() {
+ document.addEventListener("keydown", this.onKeyDown);
+ },
+
+ componentWillUnmount: function() {
+ document.removeEventListener("keydown", this.onKeyDown);
+ },
+
+ onKeyDown: function(ev) {
+ if (ev.keyCode == 27) { // escape
+ ev.stopPropagation();
+ ev.preventDefault();
+ this.props.onFinished();
+ }
+ },
+
+ onRedactClick: function() {
+ const ConfirmRedactDialog = sdk.getComponent("dialogs.ConfirmRedactDialog");
+ Modal.createTrackedDialog('Confirm Redact Dialog', 'Image View', ConfirmRedactDialog, {
+ onFinished: (proceed) => {
+ if (!proceed) return;
+ var self = this;
+ MatrixClientPeg.get().redactEvent(
+ this.props.mxEvent.getRoomId(), this.props.mxEvent.getId()
+ ).catch(function(e) {
+ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ // display error message stating you couldn't delete this.
+ var code = e.errcode || e.statusCode;
+ Modal.createTrackedDialog('You cannot delete this image.', '', ErrorDialog, {
+ title: _t('Error'),
+ description: _t('You cannot delete this image. (%(code)s)', {code: code})
+ });
+ }).done();
+ }
+ });
+ },
+
+ getName: function () {
+ var name = this.props.name;
+ if (name && this.props.link) {
+ name = { name };
+ }
+ return name;
+ },
+
+ render: function() {
+
+/*
+ // In theory max-width: 80%, max-height: 80% on the CSS should work
+ // but in practice, it doesn't, so do it manually:
+
+ var width = this.props.width || 500;
+ var height = this.props.height || 500;
+
+ var maxWidth = document.documentElement.clientWidth * 0.8;
+ var maxHeight = document.documentElement.clientHeight * 0.8;
+
+ var widthFrac = width / maxWidth;
+ var heightFrac = height / maxHeight;
+
+ var displayWidth;
+ var displayHeight;
+ if (widthFrac > heightFrac) {
+ displayWidth = Math.min(width, maxWidth);
+ displayHeight = (displayWidth / width) * height;
+ } else {
+ displayHeight = Math.min(height, maxHeight);
+ displayWidth = (displayHeight / height) * width;
+ }
+
+ var style = {
+ width: displayWidth,
+ height: displayHeight
+ };
+*/
+ var style, res;
+
+ if (this.props.width && this.props.height) {
+ style = {
+ width: this.props.width,
+ height: this.props.height,
+ };
+ res = style.width + "x" + style.height + "px";
+ }
+
+ var size;
+ if (this.props.fileSize) {
+ size = filesize(this.props.fileSize);
+ }
+
+ var size_res;
+ if (size && res) {
+ size_res = size + ", " + res;
+ }
+ else {
+ size_res = size || res;
+ }
+
+ var showEventMeta = !!this.props.mxEvent;
+
+ var eventMeta;
+ if(showEventMeta) {
+ // Figure out the sender, defaulting to mxid
+ let sender = this.props.mxEvent.getSender();
+ const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
+ if (room) {
+ const member = room.getMember(sender);
+ if (member) sender = member.name;
+ }
+
+ eventMeta = (
+ { _t('Uploaded on %(date)s by %(user)s', {date: formatDate(new Date(this.props.mxEvent.getTs())), user: sender}) }
+
+ );
+ }
+});
diff --git a/src/components/views/elements/InlineSpinner.js b/src/components/views/elements/InlineSpinner.js
new file mode 100644
index 00000000000..adb916fcf06
--- /dev/null
+++ b/src/components/views/elements/InlineSpinner.js
@@ -0,0 +1,33 @@
+/*
+Copyright 2017 New Vector Ltd.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+const React = require('react');
+
+module.exports = React.createClass({
+ displayName: 'InlineSpinner',
+
+ render: function() {
+ var w = this.props.w || 16;
+ var h = this.props.h || 16;
+ var imgClass = this.props.imgClassName || "";
+
+ return (
+
+
+
+ );
+ }
+});
diff --git a/src/components/views/elements/Spinner.js b/src/components/views/elements/Spinner.js
new file mode 100644
index 00000000000..2b620f12c59
--- /dev/null
+++ b/src/components/views/elements/Spinner.js
@@ -0,0 +1,34 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+
+module.exports = React.createClass({
+ displayName: 'Spinner',
+
+ render: function() {
+ var w = this.props.w || 32;
+ var h = this.props.h || 32;
+ var imgClass = this.props.imgClassName || "";
+ return (
+
+
+
+ );
+ }
+});
diff --git a/src/components/views/elements/SyntaxHighlight.js b/src/components/views/elements/SyntaxHighlight.js
new file mode 100644
index 00000000000..82b5ae572cf
--- /dev/null
+++ b/src/components/views/elements/SyntaxHighlight.js
@@ -0,0 +1,53 @@
+/*
+Copyright 2017 Michael Telatynski <7t3chguy@gmail.com>
+
+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 {highlightBlock} from 'highlight.js';
+
+export default class SyntaxHighlight extends React.Component {
+ static propTypes = {
+ className: PropTypes.string,
+ children: PropTypes.node,
+ };
+
+ constructor(props, context) {
+ super(props, context);
+
+ this._ref = this._ref.bind(this);
+ }
+
+ // componentDidUpdate used here for reusability
+ // componentWillReceiveProps fires too early to call highlightBlock on.
+ componentDidUpdate() {
+ if (this._el) highlightBlock(this._el);
+ }
+
+ // call componentDidUpdate because _ref is fired on initial render
+ // which does not fire componentDidUpdate
+ _ref(el) {
+ this._el = el;
+ this.componentDidUpdate();
+ }
+
+ render() {
+ const { className, children } = this.props;
+
+ return
+ { children }
+
;
+ }
+}
diff --git a/src/components/views/globals/MatrixToolbar.js b/src/components/views/globals/MatrixToolbar.js
new file mode 100644
index 00000000000..f85a30bcdfb
--- /dev/null
+++ b/src/components/views/globals/MatrixToolbar.js
@@ -0,0 +1,46 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import { _t } from '../../../languageHandler';
+import Notifier from '../../../Notifier';
+import AccessibleButton from '../../../components/views/elements/AccessibleButton';
+
+module.exports = React.createClass({
+ displayName: 'MatrixToolbar',
+
+ hideToolbar: function() {
+ Notifier.setToolbarHidden(true);
+ },
+
+ onClick: function() {
+ Notifier.setEnabled(true);
+ },
+
+ render: function() {
+ return (
+
+ );
+ },
+});
diff --git a/src/components/views/globals/NewVersionBar.js b/src/components/views/globals/NewVersionBar.js
new file mode 100644
index 00000000000..527df5f8641
--- /dev/null
+++ b/src/components/views/globals/NewVersionBar.js
@@ -0,0 +1,107 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import sdk from '../../../index';
+import Modal from '../../../Modal';
+import PlatformPeg from '../../../PlatformPeg';
+import { _t } from '../../../languageHandler';
+
+/**
+ * Check a version string is compatible with the Changelog
+ * dialog ([vectorversion]-react-[react-sdk-version]-js-[js-sdk-version])
+ */
+function checkVersion(ver) {
+ const parts = ver.split('-');
+ return parts.length == 5 && parts[1] == 'react' && parts[3] == 'js';
+}
+
+export default React.createClass({
+ propTypes: {
+ version: React.PropTypes.string.isRequired,
+ newVersion: React.PropTypes.string.isRequired,
+ releaseNotes: React.PropTypes.string,
+ },
+
+ displayReleaseNotes: function(releaseNotes) {
+ const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog');
+ Modal.createTrackedDialog('Display release notes', '', QuestionDialog, {
+ title: _t("What's New"),
+ description:
{releaseNotes}
,
+ button: _t("Update"),
+ onFinished: (update) => {
+ if(update && PlatformPeg.get()) {
+ PlatformPeg.get().installUpdate();
+ }
+ }
+ });
+ },
+
+ displayChangelog: function() {
+ const ChangelogDialog = sdk.getComponent('dialogs.ChangelogDialog');
+ Modal.createTrackedDialog('Display Changelog', '', ChangelogDialog, {
+ version: this.props.version,
+ newVersion: this.props.newVersion,
+ onFinished: (update) => {
+ if(update && PlatformPeg.get()) {
+ PlatformPeg.get().installUpdate();
+ }
+ }
+ });
+ },
+
+ onUpdateClicked: function() {
+ PlatformPeg.get().installUpdate();
+ },
+
+ render: function() {
+ let action_button;
+ // If we have release notes to display, we display them. Otherwise,
+ // we display the Changelog Dialog which takes two versions and
+ // automatically tells you what's changed (provided the versions
+ // are in the right format)
+ if (this.props.releaseNotes) {
+ action_button = (
+
+ );
+ } else if (checkVersion(this.props.version) && checkVersion(this.props.newVersion)) {
+ action_button = (
+
+ );
+ } else if (PlatformPeg.get()) {
+ action_button = (
+
+ );
+ }
+ return (
+
+
+
+ {_t("A new version of Riot is available.")}
+
+ {action_button}
+
+ );
+ }
+});
diff --git a/src/components/views/globals/PasswordNagBar.js b/src/components/views/globals/PasswordNagBar.js
new file mode 100644
index 00000000000..93f4fe06e59
--- /dev/null
+++ b/src/components/views/globals/PasswordNagBar.js
@@ -0,0 +1,64 @@
+/*
+Copyright 2017 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.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import sdk from '../../../index';
+import Modal from '../../../Modal';
+import dis from '../../../dispatcher';
+import { _t } from '../../../languageHandler';
+
+export default React.createClass({
+ onUpdateClicked: function() {
+ const SetPasswordDialog = sdk.getComponent('dialogs.SetPasswordDialog');
+ Modal.createTrackedDialog('Set Password Dialog', 'Password Nag Bar', SetPasswordDialog, {
+ onFinished: (passwordChanged) => {
+ if (!passwordChanged) {
+ return;
+ }
+ // Notify SessionStore that the user's password was changed
+ dis.dispatch({
+ action: 'password_changed',
+ });
+ },
+ });
+ },
+
+ render: function() {
+ const toolbarClasses = "mx_MatrixToolbar mx_MatrixToolbar_clickable";
+ return (
+
+
+
+ { _t(
+ "To return to your account in future you need to set a password",
+ {},
+ { 'u': (sub) => { sub } },
+ ) }
+
+
+
+ );
+ },
+});
diff --git a/src/components/views/globals/UpdateCheckBar.js b/src/components/views/globals/UpdateCheckBar.js
new file mode 100644
index 00000000000..53801311d8c
--- /dev/null
+++ b/src/components/views/globals/UpdateCheckBar.js
@@ -0,0 +1,91 @@
+/*
+Copyright 2017 Michael Telatynski <7t3chguy@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import { _t } from '../../../languageHandler';
+import PlatformPeg from '../../../PlatformPeg';
+import AccessibleButton from '../../../components/views/elements/AccessibleButton';
+
+export default React.createClass({
+ propTypes: {
+ status: React.PropTypes.string.isRequired,
+ // Currently for error detail but will be usable for download progress
+ // once that is a thing that squirrel passes through electron.
+ detail: React.PropTypes.string,
+ },
+
+ getDefaultProps: function() {
+ return {
+ detail: '',
+ }
+ },
+
+ getStatusText: function() {
+ // we can't import the enum from riot-web as we don't want matrix-react-sdk
+ // to depend on riot-web. so we grab it as a normal object via API instead.
+ const updateCheckStatusEnum = PlatformPeg.get().getUpdateCheckStatusEnum();
+ switch(this.props.status) {
+ case updateCheckStatusEnum.ERROR:
+ return _t('Error encountered (%(errorDetail)s).', { errorDetail: this.props.detail });
+ case updateCheckStatusEnum.CHECKING:
+ return _t('Checking for an update...');
+ case updateCheckStatusEnum.NOTAVAILABLE:
+ return _t('No update available.');
+ case updateCheckStatusEnum.DOWNLOADING:
+ return _t('Downloading update...');
+ }
+ },
+
+ hideToolbar: function() {
+ PlatformPeg.get().stopUpdateCheck();
+ },
+
+ render: function() {
+ const message = this.getStatusText();
+ const warning = _t('Warning');
+
+ if (!'getUpdateCheckStatusEnum' in PlatformPeg.get()) {
+ return ;
+ }
+
+ const updateCheckStatusEnum = PlatformPeg.get().getUpdateCheckStatusEnum();
+ const doneStatuses = [
+ updateCheckStatusEnum.ERROR,
+ updateCheckStatusEnum.NOTAVAILABLE,
+ ];
+
+ let image;
+ if (doneStatuses.includes(this.props.status)) {
+ image = ;
+ } else {
+ image = ;
+ }
+
+ return (
+
+ {image}
+
+ {message}
+
+
+
+
+
+ );
+ }
+});
diff --git a/src/components/views/login/CountryDropdown.js b/src/components/views/login/CountryDropdown.js
index 3fd28e32d2f..8c4467bb991 100644
--- a/src/components/views/login/CountryDropdown.js
+++ b/src/components/views/login/CountryDropdown.js
@@ -70,7 +70,7 @@ export default class CountryDropdown extends React.Component {
}
_flagImgForIso2(iso2) {
- return ;
+ return ;
}
_getShortOption(iso2) {
diff --git a/src/components/views/messages/DateSeparator.js b/src/components/views/messages/DateSeparator.js
new file mode 100644
index 00000000000..a0ea7045027
--- /dev/null
+++ b/src/components/views/messages/DateSeparator.js
@@ -0,0 +1,61 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2018 Michael Telatynski <7t3chguy@gmail.com>
+
+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 { _t } from '../../../languageHandler';
+import {formatFullDateNoTime} from '../../../DateUtils';
+
+function getdaysArray() {
+ return [
+ _t('Sunday'),
+ _t('Monday'),
+ _t('Tuesday'),
+ _t('Wednesday'),
+ _t('Thursday'),
+ _t('Friday'),
+ _t('Saturday'),
+ ];
+}
+
+export default class DateSeparator extends React.Component {
+ static propTypes = {
+ ts: PropTypes.number.isRequired,
+ };
+
+ getLabel() {
+ const date = new Date(this.props.ts);
+ const today = new Date();
+ const yesterday = new Date();
+ const days = getdaysArray();
+ yesterday.setDate(today.getDate() - 1);
+
+ if (date.toDateString() === today.toDateString()) {
+ return _t('Today');
+ } else if (date.toDateString() === yesterday.toDateString()) {
+ return _t('Yesterday');
+ } else if (today.getTime() - date.getTime() < 6 * 24 * 60 * 60 * 1000) {
+ return days[date.getDay()];
+ } else {
+ return formatFullDateNoTime(date);
+ }
+ }
+
+ render() {
+ return
{ this.getLabel() }
;
+ }
+}
diff --git a/src/components/views/messages/MessageTimestamp.js b/src/components/views/messages/MessageTimestamp.js
new file mode 100644
index 00000000000..0bbb3f631e3
--- /dev/null
+++ b/src/components/views/messages/MessageTimestamp.js
@@ -0,0 +1,36 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2018 Michael Telatynski <7t3chguy@gmail.com>
+
+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 {formatFullDate, formatTime} from '../../../DateUtils';
+
+export default class MessageTimestamp extends React.Component {
+ static propTypes = {
+ ts: PropTypes.number.isRequired,
+ showTwelveHour: PropTypes.bool,
+ };
+
+ render() {
+ const date = new Date(this.props.ts);
+ return (
+
+ { formatTime(date, this.props.showTwelveHour) }
+
+ );
+ }
+}
diff --git a/src/components/views/rooms/DNDRoomTile.js b/src/components/views/rooms/DNDRoomTile.js
new file mode 100644
index 00000000000..69c2f979edf
--- /dev/null
+++ b/src/components/views/rooms/DNDRoomTile.js
@@ -0,0 +1,65 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import React from 'react';
+import { Draggable } from 'react-beautiful-dnd';
+import RoomTile from '../../../components/views/rooms/RoomTile';
+
+import classNames from 'classnames';
+
+export default class DNDRoomTile extends React.PureComponent {
+ constructor() {
+ super();
+ this.getClassName = this.getClassName.bind(this);
+ }
+
+ getClassName(isDragging) {
+ return classNames({
+ "mx_DNDRoomTile": true,
+ "mx_DNDRoomTile_dragging": isDragging,
+ });
+ }
+
+ render() {
+ const props = this.props;
+
+ return
+
+ { (provided, snapshot) => {
+ return (
+
+
+
+
+
+
+ { provided.placeholder }
+
+ );
+ } }
+
+
;
+ }
+}
diff --git a/src/components/views/rooms/RoomDropTarget.js b/src/components/views/rooms/RoomDropTarget.js
new file mode 100644
index 00000000000..3cb10630fa1
--- /dev/null
+++ b/src/components/views/rooms/RoomDropTarget.js
@@ -0,0 +1,35 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+
+module.exports = React.createClass({
+ displayName: 'RoomDropTarget',
+
+ render: function() {
+ return (
+
+
+
+ { this.props.label }
+
+
+
+ );
+ }
+});
diff --git a/src/components/views/rooms/RoomTooltip.js b/src/components/views/rooms/RoomTooltip.js
new file mode 100644
index 00000000000..b17f54ef3c1
--- /dev/null
+++ b/src/components/views/rooms/RoomTooltip.js
@@ -0,0 +1,120 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+var ReactDOM = require('react-dom');
+var dis = require('../../../dispatcher');
+import classNames from 'classnames';
+
+const MIN_TOOLTIP_HEIGHT = 25;
+
+module.exports = React.createClass({
+ displayName: 'RoomTooltip',
+
+ propTypes: {
+ // Class applied to the element used to position the tooltip
+ className: React.PropTypes.string.isRequired,
+ // Class applied to the tooltip itself
+ tooltipClassName: React.PropTypes.string,
+ // The tooltip is derived from either the room name or a label
+ room: React.PropTypes.object,
+ label: React.PropTypes.node,
+ },
+
+ // Create a wrapper for the tooltip outside the parent and attach it to the body element
+ componentDidMount: function() {
+ this.tooltipContainer = document.createElement("div");
+ this.tooltipContainer.className = "mx_RoomTileTooltip_wrapper";
+ document.body.appendChild(this.tooltipContainer);
+ window.addEventListener('scroll', this._renderTooltip, true);
+
+ this.parent = ReactDOM.findDOMNode(this).parentNode;
+
+ this._renderTooltip();
+ },
+
+ componentDidUpdate: function() {
+ this._renderTooltip();
+ },
+
+ // Remove the wrapper element, as the tooltip has finished using it
+ componentWillUnmount: function() {
+ dis.dispatch({
+ action: 'view_tooltip',
+ tooltip: null,
+ parent: null,
+ });
+
+ ReactDOM.unmountComponentAtNode(this.tooltipContainer);
+ document.body.removeChild(this.tooltipContainer);
+ window.removeEventListener('scroll', this._renderTooltip, true);
+ },
+
+ _updatePosition(style) {
+ const parentBox = this.parent.getBoundingClientRect();
+ let offset = 0;
+ if (parentBox.height > MIN_TOOLTIP_HEIGHT) {
+ offset = Math.floor((parentBox.height - MIN_TOOLTIP_HEIGHT) / 2);
+ }
+ style.top = (parentBox.top - 2) + window.pageYOffset + offset;
+ style.left = 6 + parentBox.right + window.pageXOffset;
+ return style;
+ },
+
+ _renderTooltip: function() {
+ var label = this.props.room ? this.props.room.name : this.props.label;
+
+ // Add the parent's position to the tooltips, so it's correctly
+ // positioned, also taking into account any window zoom
+ // NOTE: The additional 6 pixels for the left position, is to take account of the
+ // tooltips chevron
+ var parent = ReactDOM.findDOMNode(this).parentNode;
+ var style = {};
+ style = this._updatePosition(style);
+ style.display = "block";
+
+ const tooltipClasses = classNames(
+ "mx_RoomTooltip", this.props.tooltipClassName,
+ );
+
+ var tooltip = (
+
+
+ { label }
+
+ );
+
+ // Render the tooltip manually, as we wish it not to be rendered within the parent
+ this.tooltip = ReactDOM.render(tooltip, this.tooltipContainer);
+
+ // Tell the roomlist about us so it can manipulate us if it wishes
+ dis.dispatch({
+ action: 'view_tooltip',
+ tooltip: this.tooltip,
+ parent: parent,
+ });
+ },
+
+ render: function() {
+ // Render a placeholder
+ return (
+
+
+ );
+ },
+});
diff --git a/src/components/views/rooms/SearchBar.js b/src/components/views/rooms/SearchBar.js
new file mode 100644
index 00000000000..a196c5b78d9
--- /dev/null
+++ b/src/components/views/rooms/SearchBar.js
@@ -0,0 +1,71 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+var MatrixClientPeg = require('../../../MatrixClientPeg');
+var sdk = require('../../../index');
+var classNames = require('classnames');
+var AccessibleButton = require('../../../components/views/elements/AccessibleButton');
+import { _t } from '../../../languageHandler';
+
+module.exports = React.createClass({
+ displayName: 'SearchBar',
+
+ getInitialState: function() {
+ return ({
+ scope: 'Room'
+ });
+ },
+
+ onThisRoomClick: function() {
+ this.setState({ scope: 'Room' });
+ },
+
+ onAllRoomsClick: function() {
+ this.setState({ scope: 'All' });
+ },
+
+ onSearchChange: function(e) {
+ if (e.keyCode === 13) { // on enter...
+ this.onSearch();
+ }
+ if (e.keyCode === 27) { // escape...
+ this.props.onCancelClick();
+ }
+ },
+
+ onSearch: function() {
+ this.props.onSearch(this.refs.search_term.value, this.state.scope);
+ },
+
+ render: function() {
+ var searchButtonClasses = classNames({ mx_SearchBar_searchButton : true, mx_SearchBar_searching: this.props.searchInProgress });
+ var thisRoomClasses = classNames({ mx_SearchBar_button : true, mx_SearchBar_unselected : this.state.scope !== 'Room' });
+ var allRoomsClasses = classNames({ mx_SearchBar_button : true, mx_SearchBar_unselected : this.state.scope !== 'All' });
+
+ return (
+
+
+
+ {_t("This Room")}
+ {_t("All Rooms")}
+
+
+ );
+ }
+});
diff --git a/src/components/views/settings/IntegrationsManager.js b/src/components/views/settings/IntegrationsManager.js
new file mode 100644
index 00000000000..29ae4af93df
--- /dev/null
+++ b/src/components/views/settings/IntegrationsManager.js
@@ -0,0 +1,63 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+var sdk = require('../../../index');
+var MatrixClientPeg = require('../../../MatrixClientPeg');
+var dis = require('../../../dispatcher');
+
+module.exports = React.createClass({
+ displayName: 'IntegrationsManager',
+
+ propTypes: {
+ src: React.PropTypes.string.isRequired, // the source of the integration manager being embedded
+ onFinished: React.PropTypes.func.isRequired, // callback when the lightbox is dismissed
+ },
+
+ // XXX: keyboard shortcuts for managing dialogs should be done by the modal
+ // dialog base class somehow, surely...
+ componentDidMount: function() {
+ this.dispatcherRef = dis.register(this.onAction);
+ document.addEventListener("keydown", this.onKeyDown);
+ },
+
+ componentWillUnmount: function() {
+ dis.unregister(this.dispatcherRef);
+ document.removeEventListener("keydown", this.onKeyDown);
+ },
+
+ onKeyDown: function(ev) {
+ if (ev.keyCode == 27) { // escape
+ ev.stopPropagation();
+ ev.preventDefault();
+ this.props.onFinished();
+ }
+ },
+
+ onAction: function(payload) {
+ if (payload.action === 'close_scalar') {
+ this.props.onFinished();
+ }
+ },
+
+ render: function() {
+ return (
+
+ );
+ }
+});
diff --git a/src/components/views/settings/Notifications.js b/src/components/views/settings/Notifications.js
new file mode 100644
index 00000000000..39774778e18
--- /dev/null
+++ b/src/components/views/settings/Notifications.js
@@ -0,0 +1,919 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import React from 'react';
+import Promise from 'bluebird';
+import sdk from '../../../index';
+import { _t } from '../../../languageHandler';
+import MatrixClientPeg from '../../../MatrixClientPeg';
+import UserSettingsStore from '../../../UserSettingsStore';
+import SettingsStore, {SettingLevel} from '../../../settings/SettingsStore';
+import Modal from '../../../Modal';
+import {
+ NotificationUtils,
+ VectorPushRulesDefinitions,
+ PushRuleVectorState,
+ ContentRules
+} from '../../../notifications';
+
+// TODO: this "view" component still has far too much application logic in it,
+// which should be factored out to other files.
+
+// TODO: this component also does a lot of direct poking into this.state, which
+// is VERY NAUGHTY.
+
+
+/**
+ * Rules that Vector used to set in order to override the actions of default rules.
+ * These are used to port peoples existing overrides to match the current API.
+ * These can be removed and forgotten once everyone has moved to the new client.
+ */
+const LEGACY_RULES = {
+ "im.vector.rule.contains_display_name": ".m.rule.contains_display_name",
+ "im.vector.rule.room_one_to_one": ".m.rule.room_one_to_one",
+ "im.vector.rule.room_message": ".m.rule.message",
+ "im.vector.rule.invite_for_me": ".m.rule.invite_for_me",
+ "im.vector.rule.call": ".m.rule.call",
+ "im.vector.rule.notices": ".m.rule.suppress_notices"
+};
+
+function portLegacyActions(actions) {
+ const decoded = NotificationUtils.decodeActions(actions);
+ if (decoded !== null) {
+ return NotificationUtils.encodeActions(decoded);
+ } else {
+ // We don't recognise one of the actions here, so we don't try to
+ // canonicalise them.
+ return actions;
+ }
+}
+
+module.exports = React.createClass({
+ displayName: 'Notifications',
+
+ phases: {
+ LOADING: "LOADING", // The component is loading or sending data to the hs
+ DISPLAY: "DISPLAY", // The component is ready and display data
+ ERROR: "ERROR" // There was an error
+ },
+
+ propTypes: {
+ // The array of threepids from the JS SDK (required for email notifications)
+ threepids: React.PropTypes.array.isRequired,
+ // The brand string set when creating an email pusher
+ brand: React.PropTypes.string,
+ },
+
+ getDefaultProps: function() {
+ return {
+ threepids: []
+ };
+ },
+
+ getInitialState: function() {
+ return {
+ phase: this.phases.LOADING,
+ masterPushRule: undefined, // The master rule ('.m.rule.master')
+ vectorPushRules: [], // HS default push rules displayed in Vector UI
+ vectorContentRules: { // Keyword push rules displayed in Vector UI
+ vectorState: PushRuleVectorState.ON,
+ rules: []
+ },
+ externalPushRules: [], // Push rules (except content rule) that have been defined outside Vector UI
+ externalContentRules: [] // Keyword push rules that have been defined outside Vector UI
+ };
+ },
+
+ componentWillMount: function() {
+ this._refreshFromServer();
+ },
+
+ onEnableNotificationsChange: function(event) {
+ const self = this;
+ this.setState({
+ phase: this.phases.LOADING
+ });
+
+ MatrixClientPeg.get().setPushRuleEnabled('global', self.state.masterPushRule.kind, self.state.masterPushRule.rule_id, !event.target.checked).done(function() {
+ self._refreshFromServer();
+ });
+ },
+
+ onEnableDesktopNotificationsChange: function(event) {
+ SettingsStore.setValue(
+ "notificationsEnabled", null,
+ SettingLevel.DEVICE,
+ event.target.checked,
+ ).finally(() => {
+ this.forceUpdate();
+ });
+ },
+
+ onEnableDesktopNotificationBodyChange: function(event) {
+ SettingsStore.setValue(
+ "notificationBodyEnabled", null,
+ SettingLevel.DEVICE,
+ event.target.checked,
+ ).finally(() => {
+ this.forceUpdate();
+ });
+ },
+
+ onEnableAudioNotificationsChange: function(event) {
+ SettingsStore.setValue(
+ "audioNotificationsEnabled", null,
+ SettingLevel.DEVICE,
+ event.target.checked,
+ ).finally(() => {
+ this.forceUpdate();
+ });
+ },
+
+ onEnableEmailNotificationsChange: function(address, event) {
+ let emailPusherPromise;
+ if (event.target.checked) {
+ const data = {}
+ data['brand'] = this.props.brand || 'Riot';
+ emailPusherPromise = UserSettingsStore.addEmailPusher(address, data);
+ } else {
+ const emailPusher = UserSettingsStore.getEmailPusher(this.state.pushers, address);
+ emailPusher.kind = null;
+ emailPusherPromise = MatrixClientPeg.get().setPusher(emailPusher);
+ }
+ emailPusherPromise.done(() => {
+ this._refreshFromServer();
+ }, (error) => {
+ const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ Modal.createTrackedDialog('Error saving email notification preferences', '', ErrorDialog, {
+ title: _t('Error saving email notification preferences'),
+ description: _t('An error occurred whilst saving your email notification preferences.'),
+ });
+ });
+ },
+
+ onNotifStateButtonClicked: function(event) {
+ // FIXME: use .bind() rather than className metadata here surely
+ const vectorRuleId = event.target.className.split("-")[0];
+ const newPushRuleVectorState = event.target.className.split("-")[1];
+
+ if ("_keywords" === vectorRuleId) {
+ this._setKeywordsPushRuleVectorState(newPushRuleVectorState)
+ }
+ else {
+ const rule = this.getRule(vectorRuleId);
+ if (rule) {
+ this._setPushRuleVectorState(rule, newPushRuleVectorState);
+ }
+ }
+ },
+
+ onKeywordsClicked: function(event) {
+ const self = this;
+
+ // Compute the keywords list to display
+ let keywords = [];
+ for (let i in this.state.vectorContentRules.rules) {
+ const rule = this.state.vectorContentRules.rules[i];
+ keywords.push(rule.pattern);
+ }
+ if (keywords.length) {
+ // As keeping the order of per-word push rules hs side is a bit tricky to code,
+ // display the keywords in alphabetical order to the user
+ keywords.sort();
+
+ keywords = keywords.join(", ");
+ }
+ else {
+ keywords = "";
+ }
+
+ const TextInputDialog = sdk.getComponent("dialogs.TextInputDialog");
+ Modal.createTrackedDialog('Keywords Dialog', '', TextInputDialog, {
+ title: _t('Keywords'),
+ description: _t('Enter keywords separated by a comma:'),
+ button: _t('OK'),
+ value: keywords,
+ onFinished: function onFinished(should_leave, newValue) {
+
+ if (should_leave && newValue !== keywords) {
+ let newKeywords = newValue.split(',');
+ for (let i in newKeywords) {
+ newKeywords[i] = newKeywords[i].trim();
+ }
+
+ // Remove duplicates and empty
+ newKeywords = newKeywords.reduce(function(array, keyword){
+ if (keyword !== "" && array.indexOf(keyword) < 0) {
+ array.push(keyword);
+ }
+ return array;
+ },[]);
+
+ self._setKeywords(newKeywords);
+ }
+ }
+ });
+ },
+
+ getRule: function(vectorRuleId) {
+ for (let i in this.state.vectorPushRules) {
+ const rule = this.state.vectorPushRules[i];
+ if (rule.vectorRuleId === vectorRuleId) {
+ return rule;
+ }
+ }
+ },
+
+ _setPushRuleVectorState: function(rule, newPushRuleVectorState) {
+ if (rule && rule.vectorState !== newPushRuleVectorState) {
+
+ this.setState({
+ phase: this.phases.LOADING
+ });
+
+ const self = this;
+ const cli = MatrixClientPeg.get();
+ const deferreds = [];
+ const ruleDefinition = VectorPushRulesDefinitions[rule.vectorRuleId];
+
+ if (rule.rule) {
+ const actions = ruleDefinition.vectorStateToActions[newPushRuleVectorState];
+
+ if (!actions) {
+ // The new state corresponds to disabling the rule.
+ deferreds.push(cli.setPushRuleEnabled('global', rule.rule.kind, rule.rule.rule_id, false));
+ }
+ else {
+ // The new state corresponds to enabling the rule and setting specific actions
+ deferreds.push(this._updatePushRuleActions(rule.rule, actions, true));
+ }
+ }
+
+ Promise.all(deferreds).done(function() {
+ self._refreshFromServer();
+ }, function(error) {
+ const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ console.error("Failed to change settings: " + error);
+ Modal.createTrackedDialog('Failed to change settings', '', ErrorDialog, {
+ title: _t('Failed to change settings'),
+ description: ((error && error.message) ? error.message : _t('Operation failed')),
+ onFinished: self._refreshFromServer
+ });
+ });
+ }
+ },
+
+ _setKeywordsPushRuleVectorState: function(newPushRuleVectorState) {
+ // Is there really a change?
+ if (this.state.vectorContentRules.vectorState === newPushRuleVectorState
+ || this.state.vectorContentRules.rules.length === 0) {
+ return;
+ }
+
+ const self = this;
+ const cli = MatrixClientPeg.get();
+
+ this.setState({
+ phase: this.phases.LOADING
+ });
+
+ // Update all rules in self.state.vectorContentRules
+ const deferreds = [];
+ for (let i in this.state.vectorContentRules.rules) {
+ const rule = this.state.vectorContentRules.rules[i];
+
+ let enabled, actions;
+ switch (newPushRuleVectorState) {
+ case PushRuleVectorState.ON:
+ if (rule.actions.length !== 1) {
+ actions = PushRuleVectorState.actionsFor(PushRuleVectorState.ON);
+ }
+
+ if (this.state.vectorContentRules.vectorState === PushRuleVectorState.OFF) {
+ enabled = true;
+ }
+ break;
+
+ case PushRuleVectorState.LOUD:
+ if (rule.actions.length !== 3) {
+ actions = PushRuleVectorState.actionsFor(PushRuleVectorState.LOUD);
+ }
+
+ if (this.state.vectorContentRules.vectorState === PushRuleVectorState.OFF) {
+ enabled = true;
+ }
+ break;
+
+ case PushRuleVectorState.OFF:
+ enabled = false;
+ break;
+ }
+
+ if (actions) {
+ // Note that the workaround in _updatePushRuleActions will automatically
+ // enable the rule
+ deferreds.push(this._updatePushRuleActions(rule, actions, enabled));
+ }
+ else if (enabled != undefined) {
+ deferreds.push(cli.setPushRuleEnabled('global', rule.kind, rule.rule_id, enabled));
+ }
+ }
+
+ Promise.all(deferreds).done(function(resps) {
+ self._refreshFromServer();
+ }, function(error) {
+ const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ console.error("Can't update user notification settings: " + error);
+ Modal.createTrackedDialog('Can\'t update user notifcation settings', '', ErrorDialog, {
+ title: _t('Can\'t update user notification settings'),
+ description: ((error && error.message) ? error.message : _t('Operation failed')),
+ onFinished: self._refreshFromServer
+ });
+ });
+ },
+
+ _setKeywords: function(newKeywords) {
+ this.setState({
+ phase: this.phases.LOADING
+ });
+
+ const self = this;
+ const cli = MatrixClientPeg.get();
+ const removeDeferreds = [];
+
+ // Remove per-word push rules of keywords that are no more in the list
+ const vectorContentRulesPatterns = [];
+ for (let i in self.state.vectorContentRules.rules) {
+ const rule = self.state.vectorContentRules.rules[i];
+
+ vectorContentRulesPatterns.push(rule.pattern);
+
+ if (newKeywords.indexOf(rule.pattern) < 0) {
+ removeDeferreds.push(cli.deletePushRule('global', rule.kind, rule.rule_id));
+ }
+ }
+
+ // If the keyword is part of `externalContentRules`, remove the rule
+ // before recreating it in the right Vector path
+ for (let i in self.state.externalContentRules) {
+ const rule = self.state.externalContentRules[i];
+
+ if (newKeywords.indexOf(rule.pattern) >= 0) {
+ removeDeferreds.push(cli.deletePushRule('global', rule.kind, rule.rule_id));
+ }
+ }
+
+ const onError = function(error) {
+ const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
+ console.error("Failed to update keywords: " + error);
+ Modal.createTrackedDialog('Failed to update keywords', '', ErrorDialog, {
+ title: _t('Failed to update keywords'),
+ description: ((error && error.message) ? error.message : _t('Operation failed')),
+ onFinished: self._refreshFromServer
+ });
+ }
+
+ // Then, add the new ones
+ Promise.all(removeDeferreds).done(function(resps) {
+ const deferreds = [];
+
+ let pushRuleVectorStateKind = self.state.vectorContentRules.vectorState;
+ if (pushRuleVectorStateKind === PushRuleVectorState.OFF) {
+ // When the current global keywords rule is OFF, we need to look at
+ // the flavor of rules in 'vectorContentRules' to apply the same actions
+ // when creating the new rule.
+ // Thus, this new rule will join the 'vectorContentRules' set.
+ if (self.state.vectorContentRules.rules.length) {
+ pushRuleVectorStateKind = PushRuleVectorState.contentRuleVectorStateKind(self.state.vectorContentRules.rules[0]);
+ }
+ else {
+ // ON is default
+ pushRuleVectorStateKind = PushRuleVectorState.ON;
+ }
+ }
+
+ for (let i in newKeywords) {
+ const keyword = newKeywords[i];
+
+ if (vectorContentRulesPatterns.indexOf(keyword) < 0) {
+ if (self.state.vectorContentRules.vectorState !== PushRuleVectorState.OFF) {
+ deferreds.push(cli.addPushRule
+ ('global', 'content', keyword, {
+ actions: PushRuleVectorState.actionsFor(pushRuleVectorStateKind),
+ pattern: keyword
+ }));
+ }
+ else {
+ deferreds.push(self._addDisabledPushRule('global', 'content', keyword, {
+ actions: PushRuleVectorState.actionsFor(pushRuleVectorStateKind),
+ pattern: keyword
+ }));
+ }
+ }
+ }
+
+ Promise.all(deferreds).done(function(resps) {
+ self._refreshFromServer();
+ }, onError);
+ }, onError);
+ },
+
+ // Create a push rule but disabled
+ _addDisabledPushRule: function(scope, kind, ruleId, body) {
+ const cli = MatrixClientPeg.get();
+ return cli.addPushRule(scope, kind, ruleId, body).then(() =>
+ cli.setPushRuleEnabled(scope, kind, ruleId, false)
+ );
+ },
+
+ // Check if any legacy im.vector rules need to be ported to the new API
+ // for overriding the actions of default rules.
+ _portRulesToNewAPI: function(rulesets) {
+ const self = this;
+ const needsUpdate = [];
+ const cli = MatrixClientPeg.get();
+
+ for (let kind in rulesets.global) {
+ const ruleset = rulesets.global[kind];
+ for (let i = 0; i < ruleset.length; ++i) {
+ const rule = ruleset[i];
+ if (rule.rule_id in LEGACY_RULES) {
+ console.log("Porting legacy rule", rule);
+ needsUpdate.push( function(kind, rule) {
+ return cli.setPushRuleActions(
+ 'global', kind, LEGACY_RULES[rule.rule_id], portLegacyActions(rule.actions)
+ ).then(() =>
+ cli.deletePushRule('global', kind, rule.rule_id)
+ ).catch( (e) => {
+ console.warn(`Error when porting legacy rule: ${e}`);
+ });
+ }(kind, rule));
+ }
+ }
+ }
+
+ if (needsUpdate.length > 0) {
+ // If some of the rules need to be ported then wait for the porting
+ // to happen and then fetch the rules again.
+ return Promise.all(needsUpdate).then(() =>
+ cli.getPushRules()
+ );
+ } else {
+ // Otherwise return the rules that we already have.
+ return rulesets;
+ }
+ },
+
+ _refreshFromServer: function() {
+ const self = this;
+ const pushRulesPromise = MatrixClientPeg.get().getPushRules().then(self._portRulesToNewAPI).then(function(rulesets) {
+
+ /// XXX seriously? wtf is this?
+ MatrixClientPeg.get().pushRules = rulesets;
+
+ // Get homeserver default rules and triage them by categories
+ const rule_categories = {
+ // The master rule (all notifications disabling)
+ '.m.rule.master': 'master',
+
+ // The default push rules displayed by Vector UI
+ '.m.rule.contains_display_name': 'vector',
+ '.m.rule.contains_user_name': 'vector',
+ '.m.rule.room_one_to_one': 'vector',
+ '.m.rule.message': 'vector',
+ '.m.rule.invite_for_me': 'vector',
+ //'.m.rule.member_event': 'vector',
+ '.m.rule.call': 'vector',
+ '.m.rule.suppress_notices': 'vector'
+
+ // Others go to others
+ };
+
+ // HS default rules
+ const defaultRules = {master: [], vector: {}, others: []};
+
+ for (let kind in rulesets.global) {
+ for (let i = 0; i < Object.keys(rulesets.global[kind]).length; ++i) {
+ const r = rulesets.global[kind][i];
+ const cat = rule_categories[r.rule_id];
+ r.kind = kind;
+
+ if (r.rule_id[0] === '.') {
+ if (cat === 'vector') {
+ defaultRules.vector[r.rule_id] = r;
+ }
+ else if (cat === 'master') {
+ defaultRules.master.push(r);
+ }
+ else {
+ defaultRules['others'].push(r);
+ }
+ }
+ }
+ }
+
+ // Get the master rule if any defined by the hs
+ if (defaultRules.master.length > 0) {
+ self.state.masterPushRule = defaultRules.master[0];
+ }
+
+ // parse the keyword rules into our state
+ const contentRules = ContentRules.parseContentRules(rulesets);
+ self.state.vectorContentRules = {
+ vectorState: contentRules.vectorState,
+ rules: contentRules.rules,
+ };
+ self.state.externalContentRules = contentRules.externalRules;
+
+ // Build the rules displayed in the Vector UI matrix table
+ self.state.vectorPushRules = [];
+ self.state.externalPushRules = [];
+
+ const vectorRuleIds = [
+ '.m.rule.contains_display_name',
+ '.m.rule.contains_user_name',
+ '_keywords',
+ '.m.rule.room_one_to_one',
+ '.m.rule.message',
+ '.m.rule.invite_for_me',
+ //'im.vector.rule.member_event',
+ '.m.rule.call',
+ '.m.rule.suppress_notices'
+ ];
+ for (let i in vectorRuleIds) {
+ const vectorRuleId = vectorRuleIds[i];
+
+ if (vectorRuleId === '_keywords') {
+ // keywords needs a special handling
+ // For Vector UI, this is a single global push rule but translated in Matrix,
+ // it corresponds to all content push rules (stored in self.state.vectorContentRule)
+ self.state.vectorPushRules.push({
+ "vectorRuleId": "_keywords",
+ "description" : (
+
+ { _t('Messages containing keywords',
+ {},
+ { 'span': (sub) =>
+ {sub}
+ },
+ )}
+
+ ),
+ "vectorState": self.state.vectorContentRules.vectorState
+ });
+ }
+ else {
+ const ruleDefinition = VectorPushRulesDefinitions[vectorRuleId];
+ const rule = defaultRules.vector[vectorRuleId];
+
+ const vectorState = ruleDefinition.ruleToVectorState(rule);
+
+ //console.log("Refreshing vectorPushRules for " + vectorRuleId +", "+ ruleDefinition.description +", " + rule +", " + vectorState);
+
+ self.state.vectorPushRules.push({
+ "vectorRuleId": vectorRuleId,
+ "description" : _t(ruleDefinition.description), // Text from VectorPushRulesDefinitions.js
+ "rule": rule,
+ "vectorState": vectorState,
+ });
+
+ // if there was a rule which we couldn't parse, add it to the external list
+ if (rule && !vectorState) {
+ rule.description = ruleDefinition.description;
+ self.state.externalPushRules.push(rule);
+ }
+ }
+ }
+
+ // Build the rules not managed by Vector UI
+ const otherRulesDescriptions = {
+ '.m.rule.message': _t('Notify for all other messages/rooms'),
+ '.m.rule.fallback': _t('Notify me for anything else'),
+ };
+
+ for (let i in defaultRules.others) {
+ const rule = defaultRules.others[i];
+ const ruleDescription = otherRulesDescriptions[rule.rule_id];
+
+ // Show enabled default rules that was modified by the user
+ if (ruleDescription && rule.enabled && !rule.default) {
+ rule.description = ruleDescription;
+ self.state.externalPushRules.push(rule);
+ }
+ }
+ });
+
+ const pushersPromise = MatrixClientPeg.get().getPushers().then(function(resp) {
+ self.setState({pushers: resp.pushers});
+ });
+
+ Promise.all([pushRulesPromise, pushersPromise]).then(function() {
+ self.setState({
+ phase: self.phases.DISPLAY
+ });
+ }, function(error) {
+ console.error(error);
+ self.setState({
+ phase: self.phases.ERROR
+ });
+ }).finally(() => {
+ // actually explicitly update our state having been deep-manipulating it
+ self.setState({
+ masterPushRule: self.state.masterPushRule,
+ vectorContentRules: self.state.vectorContentRules,
+ vectorPushRules: self.state.vectorPushRules,
+ externalContentRules: self.state.externalContentRules,
+ externalPushRules: self.state.externalPushRules,
+ });
+ }).done();
+ },
+
+ _updatePushRuleActions: function(rule, actions, enabled) {
+ const cli = MatrixClientPeg.get();
+
+ return cli.setPushRuleActions(
+ 'global', rule.kind, rule.rule_id, actions
+ ).then( function() {
+ // Then, if requested, enabled or disabled the rule
+ if (undefined != enabled) {
+ return cli.setPushRuleEnabled(
+ 'global', rule.kind, rule.rule_id, enabled
+ );
+ }
+ });
+ },
+
+ renderNotifRulesTableRow: function(title, className, pushRuleVectorState) {
+ return (
+
+ );
+ }
+
+ // When enabled, the master rule inhibits all existing rules
+ // So do not show all notification settings
+ if (this.state.masterPushRule && this.state.masterPushRule.enabled) {
+ return (
+
+ {masterPushRuleDiv}
+
+
+ { _t('All notifications are currently disabled for all targets.') }.
+
+ { _t('Add an email address above to configure email notifications') }
+
;
+ } else {
+ // This only supports the first email address in your profile for now
+ emailNotificationsRow = this.emailNotificationsRow(
+ emailThreepids[0].address,
+ `${_t('Enable email notifications')} (${emailThreepids[0].address})`
+ );
+ }
+
+ // Build external push rules
+ const externalRules = [];
+ for (let i in this.state.externalPushRules) {
+ const rule = this.state.externalPushRules[i];
+ externalRules.push(
{ _t(rule.description) }
);
+ }
+
+ // Show keywords not displayed by the vector UI as a single external push rule
+ let externalKeywords = [];
+ for (let i in this.state.externalContentRules) {
+ const rule = this.state.externalContentRules[i];
+ externalKeywords.push(rule.pattern);
+ }
+ if (externalKeywords.length) {
+ externalKeywords = externalKeywords.join(", ");
+ externalRules.push(
{ _t('Notifications on the following keywords follow rules which can’t be displayed here:') } { externalKeywords }
);
+ }
+
+ let devicesSection;
+ if (this.state.pushers === undefined) {
+ devicesSection =
{ _t('Unable to fetch notification target list') }
+ } else if (this.state.pushers.length == 0) {
+ devicesSection = null;
+ } else {
+ // TODO: It would be great to be able to delete pushers from here too,
+ // and this wouldn't be hard to add.
+ const rows = [];
+ for (let i = 0; i < this.state.pushers.length; ++i) {
+ rows.push(
);
+ }
+
+ let advancedSettings;
+ if (externalRules.length) {
+ advancedSettings = (
+
+
{ _t('Advanced notification settings') }
+ { _t('There are advanced notifications which are not shown here') }.
+ { _t('You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply') }.
+
+ );
+ }
+});
diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json
index f7f674cf9af..cb223f5aafa 100644
--- a/src/i18n/strings/ar.json
+++ b/src/i18n/strings/ar.json
@@ -23,5 +23,48 @@
"Your homeserver's URL": "عنوان خادوم المنزل",
"Your identity server's URL": "عنوان خادوم التعريف",
"Analytics": "التحاليل",
- "The information being sent to us to help make Riot.im better includes:": "تحتوي المعلومات التي تُرسل إلينا للمساعدة بتحسين جودة Riot.im الآتي:"
+ "The information being sent to us to help make Riot.im better includes:": "تحتوي المعلومات التي تُرسل إلينا للمساعدة بتحسين جودة Riot.im الآتي:",
+ "Couldn't find a matching Matrix room": "لا يمكن إيجاد غرفة مايتركس متطابقة",
+ "Unavailable": "غير متوفر",
+ "A new version of Riot is available.": "هناك نسخة جديدة مِن رايوت متوفرة.",
+ "All Rooms": "كل الغُرف",
+ "All messages": "كل الرسائل",
+ "All notifications are currently disabled for all targets.": "كل التنبيهات غير مفعلة حالياً للجميع.",
+ "Direct Chat": "دردشة مباشرة",
+ "Please set a password!": "يرجى تعيين كلمة مرور !",
+ "You have successfully set a password!": "تم تعيين كلمة السر بنجاح !",
+ "Can't update user notification settings": "لا يمكن تحديث إعدادات الإشعارات الخاصة بالمستخدم",
+ "Explore Room State": "إكتشاف حالة الغرفة",
+ "All messages (noisy)": "كل الرسائل (صوت مرتفع)",
+ "Update": "تحديث",
+ "What's New": "آخِر المُستجدّات",
+ "Toolbox": "علبة الأدوات",
+ "Add an email address above to configure email notifications": "أضف بريداً إلكترونياً أعلاه من أجل ضبط الإشعارات عبر البريد الإلكتروني",
+ "Collecting logs": "تجميع السجلات",
+ "No update available.": "لا يوجد هناك أي تحديث.",
+ "An error occurred whilst saving your email notification preferences.": "حدث خطأ ما أثناء عملية حفظ إعدادات الإشعارات عبر البريد الإلكتروني.",
+ "Bug report sent": "تم إرسال تقرير الأخطاء",
+ "Collecting app version information": "تجميع المعلومات حول نسخة التطبيق",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "إلغاء مُعرف الغرفة %(alias)s وحذف %(name)s من الدليل؟",
+ "Changelog": "سِجل التغييرات",
+ "Send Account Data": "إرسال بيانات الحساب",
+ "Waiting for response from server": "في انتظار الرد مِن الخادوم",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "سيسمح لك هذا بالعودة إلى حسابك بعد الخروج، وتسجيل الدخول على الأجهزة الأخرى.",
+ "Directory": "الدليل",
+ "Send logs": "إرسال السِجلات",
+ "Download this file": "تنزيل هذا الملف",
+ "Thank you!": "شكرًا !",
+ "Advanced notification settings": "الإعدادات المتقدمة للإشعارات",
+ "Call invitation": "دعوة لمحادثة",
+ "delete the alias.": "إلغاء المُعرف.",
+ "Developer Tools": "أدوات التطوير",
+ "Downloading update...": "عملية تنزيل التحديث جارية …",
+ "State Key": "مفتاح الحالة",
+ "Back": "العودة",
+ "What's new?": "ما الجديد ؟",
+ "You have successfully set a password and an email address!": "لقد قمت بتعيين كلمة سرية و إدخال عنوان للبريد الإلكتروني بنجاح !",
+ "Cancel Sending": "إلغاء الإرسال",
+ "Collapse panel": "طي الجدول",
+ "Set Password": "تعيين كلمة سرية",
+ "Checking for an update...": "البحث عن تحديث …"
}
diff --git a/src/i18n/strings/az.json b/src/i18n/strings/az.json
new file mode 100644
index 00000000000..24f19a9ce6d
--- /dev/null
+++ b/src/i18n/strings/az.json
@@ -0,0 +1,28 @@
+{
+ "Collecting app version information": "Proqramın versiyası haqqında məlumatın yığılması",
+ "Collecting logs": "Jurnalların bir yığım",
+ "Uploading report": "Hesabatın göndərilməsi",
+ "Waiting for response from server": "Serverdən cavabın gözlənməsi",
+ "Messages containing my display name": "Mənim adımı özündə saxlayan mesajlar",
+ "Messages containing my user name": "Mənim istifadəçinin adımı özündə saxlayan mesaj",
+ "Messages in one-to-one chats": "Fərdi çatlarda mesajlar",
+ "Messages in group chats": "Qrup çatlarında mesajlar",
+ "When I'm invited to a room": "Nə vaxt ki, məni otağa dəvət edirlər",
+ "Call invitation": "Dəvət zəngi",
+ "Messages sent by bot": "Botla göndərilmiş mesajlar",
+ "Error saving email notification preferences": "Email üzrə xəbərdarlıqların qurmalarının saxlanılması səhv",
+ "An error occurred whilst saving your email notification preferences.": "Email üzrə bildirişin qurmalarının saxlanılması səhv yarandı.",
+ "Keywords": "Açar sözlər",
+ "Enter keywords separated by a comma:": "Vergül bölünmüş açar sözləri daxil edin:",
+ "OK": "OK",
+ "Failed to change settings": "Qurmaları dəyişdirməyi bacarmadı",
+ "Operation failed": "Əməliyyatın nasazlığı",
+ "Can't update user notification settings": "Bildirişin istifadəçi qurmalarını yeniləməyə müvəffəq olmur",
+ "Failed to update keywords": "Açar sözləri yeniləməyi bacarmadı",
+ "Messages containing keywords": "Müəyyən açar sözləri özündə saxlayan mesajlar",
+ "Notify for all other messages/rooms": "Bütün başqa mesajdan/otaqlardan xəbər vermək",
+ "Notify me for anything else": "Bütün qalan hadisələrdə xəbər vermək",
+ "Enable notifications for this account": "Bu hesab üçün xəbərdarlıqları qoşmaq",
+ "All notifications are currently disabled for all targets.": "Bütün qurğular üçün bütün bildirişlər kəsilmişdir.",
+ "Add an email address above to configure email notifications": "Email-i bildirişlər üçün ünvanı əlavə edin"
+}
diff --git a/src/i18n/strings/be.json b/src/i18n/strings/be.json
index 0967ef424bc..7e79f5d355b 100644
--- a/src/i18n/strings/be.json
+++ b/src/i18n/strings/be.json
@@ -1 +1,75 @@
-{}
+{
+ "Couldn't find a matching Matrix room": "Не атрымалася знайсці адпаведны пакой Matrix",
+ "Enable audible notifications in web client": "Ўключыць гукавыя апавяшчэнні ў вэб-кліенце",
+ "All messages (noisy)": "Усе паведамленні (гучна)",
+ "Reject": "Адхіліць",
+ "Failed to forget room %(errCode)s": "Не атрымалася забыць пакой %(errCode)s",
+ "Failed to update keywords": "Не атрымалася абнавіць ключавыя словы",
+ "All messages": "Усе паведамленні",
+ "All notifications are currently disabled for all targets.": "Усе апавяшчэнні ў цяперашні час адключаныя для ўсіх мэтаў.",
+ "Fetching third party location failed": "Не ўдалося атрымаць месцазнаходжанне трэцяга боку",
+ "Guests can join": "Госці могуць далучыцца",
+ "Enable them now": "Уключыць іх зараз",
+ "Notification targets": "Мэты апавяшчэння",
+ "Failed to set direct chat tag": "Не ўдалося ўсталяваць тэг прамога чата",
+ "Failed to get protocol list from Home Server": "Не ўдалося атрымаць спіс пратаколаў ад хатняга сервера",
+ "Failed to set Direct Message status of room": "Не ўдалося ўсталяваць статут прамога паведамлення пакою",
+ "Favourite": "Улюбёнае",
+ "Quote": "Цытата",
+ "Dismiss": "Aдхіліць",
+ "Remove from Directory": "Выдалiць з каталога",
+ "Cancel Sending": "Адмяніць адпраўку",
+ "Failed to add tag %(tagName)s to room": "Не атрымалася дадаць %(tagName)s ў пакоі",
+ "Close": "Зачыніць",
+ "Notifications": "Апавяшчэнні",
+ "Low Priority": "Нізкі прыярытэт",
+ "Riot does not know how to join a room on this network": "Riot не ведае, як увайсці ў пакой у гэтай сетке",
+ "Members": "Удзельнікі",
+ "Can't update user notification settings": "Немагчыма абнавіць налады апавяшчэнняў карыстальніка",
+ "Add an email address above to configure email notifications": "Дадайце адрас электроннай пошты вышэй, каб наладзіць апавяшчэнні",
+ "Failed to change settings": "Не атрымалася змяніць налады",
+ "Noisy": "Шумна",
+ "Resend": "Паўторна",
+ "On": "Уключыць",
+ "Permalink": "Пастаянная спасылка",
+ "remove %(name)s from the directory.": "выдаліць %(name)s з каталога.",
+ "Off": "Выключыць",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Выдаліць псеўданім пакоя %(alias)s і выдаліць %(name)s з каталога?",
+ "Filter room names": "Фільтр iмёнаў пакояў",
+ "Invite to this room": "Запрасіць у гэты пакой",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Апавяшчэнні па наступных ключавых словах прытрымліваюцца правілаў, якія не могуць быць адлюстраваны тут:",
+ "#example": "#прыклад",
+ "Mentions only": "Толькі згадкі",
+ "Failed to get public room list": "Не ўдалося атрымаць спіс агульных пакояў",
+ "Remove": "Выдалiць",
+ "Failed to remove tag %(tagName)s from room": "Не ўдалося выдаліць %(tagName)s з пакоя",
+ "Leave": "Пакінуць",
+ "Enable notifications for this account": "Ўключыць апавяшчэнні для гэтага ўліковага запісу",
+ "Enable desktop notifications": "Ўключыць апавяшчэнні на працоўным стале",
+ "Error": "Памылка",
+ "Directory": "Каталог",
+ "No rooms to show": "Няма пакояў для паказу",
+ "Download this file": "Спампаваць гэты файл",
+ "Search for a room": "Пошук па пакоі",
+ "Operation failed": "Не атрымалася выканаць аперацыю",
+ "delete the alias.": "выдаліць псеўданім.",
+ "Forget": "Забыць",
+ "Mute": "Без гуку",
+ "Error saving email notification preferences": "Памылка захавання налад апавяшчэнняў па электроннай пошце",
+ "Enter keywords separated by a comma:": "Калі ласка, увядзіце ключавыя словы, падзеленыя коскамі:",
+ "The Home Server may be too old to support third party networks": "Хатні сервер можа быць занадта стары для падтрымкі іншых сетак",
+ "powered by Matrix": "працуе на Matrix",
+ "Custom Server Options": "Карыстальніцкія параметры сервера",
+ "Remove %(name)s from the directory?": "Выдаліць %(name)s з каталога?",
+ "Notify me for anything else": "Паведаміць мне што-небудзь яшчэ",
+ "Source URL": "URL-адрас крыніцы",
+ "Enable email notifications": "Ўключыць паведамлення па электроннай пошце",
+ "Files": "Файлы",
+ "Keywords": "Ключавыя словы",
+ "Direct Chat": "Прамы чат",
+ "An error occurred whilst saving your email notification preferences.": "Адбылася памылка падчас захавання налады апавяшчэнняў па электроннай пошце.",
+ "Room not found": "Пакой не знойдзены",
+ "Notify for all other messages/rooms": "Апавяшчаць для ўсіх іншых паведамленняў/пакояў",
+ "There are advanced notifications which are not shown here": "Ёсць пашыраныя апавяшчэння, якія не паказаныя тут",
+ "The server may be unavailable or overloaded": "Сервер можа быць недаступны ці перагружаны"
+}
diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json
index 8111329beff..3ca31b4534f 100644
--- a/src/i18n/strings/bg.json
+++ b/src/i18n/strings/bg.json
@@ -331,8 +331,6 @@
"Hangup": "Затвори",
"Voice call": "Гласово повикване",
"Video call": "Видео повикване",
- "Hide Apps": "Скрий приложенията",
- "Show Apps": "Покажи приложенията",
"Upload file": "Качи файл",
"Show Text Formatting Toolbar": "Показване на лентата с инструменти за форматиране на текст",
"Send an encrypted reply…": "Изпрати шифрован отговор…",
@@ -435,7 +433,6 @@
"Encryption is enabled in this room": "Шифроването е включено в тази стая",
"Encryption is not enabled in this room": "Шифроването не е включено в тази стая",
"Privileged Users": "Потребители с привилегии",
- "%(user)s is a": "%(user)s е",
"No users have specific privileges in this room": "Никой няма специфични привилегии в тази стая",
"Banned users": "Блокирани потребители",
"This room is not accessible by remote Matrix servers": "Тази стая не е достъпна за далечни Matrix сървъри",
@@ -718,8 +715,6 @@
"Loading device info...": "Зареждане на информация за устройството...",
"Encryption key request": "Заявка за ключ за шифроване",
"Otherwise, click here to send a bug report.": "В противен случай, натиснете тук, за да изпратите съобщение за грешка.",
- "Report it": "Съобщи за нея",
- "Bug Report": "Съобщаване за грешка",
"Unable to restore session": "Неуспешно възстановяване на сесията",
"Continue anyway": "Продължи въпреки това",
"Invalid Email Address": "Невалиден имейл адрес",
@@ -729,7 +724,6 @@
"Unable to verify email address.": "Неуспешно потвърждение на имейл адрес.",
"Unable to accept invite": "Неуспешно приемане на поканата",
"Unable to reject invite": "Неуспешно отхвърляне на поканата",
- "Unable to leave room": "Неуспешно напускане на стаята",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Беше направен опит да се зареди конкретна точка в хронологията на тази стая, но не я намери.",
"Unable to remove contact information": "Неуспешно премахване на информацията за контакти",
"This will allow you to reset your password and receive notifications.": "Това ще Ви позволи да възстановите Вашата парола и да получавате известия.",
@@ -786,7 +780,6 @@
"Failed to fetch avatar URL": "Неуспешно изтегляне от адреса на аватара",
"Signed Out": "Излязохте",
"For security, this session has been signed out. Please sign in again.": "Поради мерки за сигурност, тази сесия е прекратена. Моля, влезте отново.",
- "Cryptography data migrated": "Бяха мигрирани криптографските данни",
"Logout": "Излез",
"Sign out": "Изход",
"Error whilst fetching joined communities": "Грешка при извличането на общности, към които сте присъединени",
@@ -848,7 +841,6 @@
"Device ID:": "Идентификатор на устройството:",
"Device key:": "Ключ на устройството:",
"Ignored Users": "Игнорирани потребители",
- "Found a bug?": "Намерихте грешка?",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot събира анонимни статистики, за да ни позволи да подобрим приложението.",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Поверителността е важна за нас, затова за нашите статистики не събираме лични или идентифициращи Вас данни.",
"Learn more about how we use analytics.": "Научете повече за това как използваме статистическите данни.",
@@ -976,7 +968,6 @@
"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.": "Ако преди сте използвали по-нова версия на Riot, Вашата сесия може да не бъде съвместима с текущата версия. Затворете този прозорец и се върнете в по-новата версия.",
"This will be your account name on the homeserver, or you can pick a different server.": "Това ще бъде името на профила Ви на Home сървъра, или можете да изберете друг сървър.",
"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.": "Препоръчваме Ви да минете през процеса за потвърждение за всяко устройство, за да потвърдите, че принадлежат на легитимен собственик. Ако предпочитате, можете да изпратите съобщение без потвърждение.",
- "A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Извършена е еднократна миграция на криптографски данни. Шифроването от край до край няма да работи, ако се върнете към по-стара версия на Riot. Ако искате да използвате криптография от край до край на по-стара версия, първо излезте от Riot. За да запазите историята на съобщенията, експортирайте и импортирайте отново Вашите ключове.",
"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.": "Засечени са данни от по-стара версия на Riot. Това ще доведе до неправилна работа на криптографията от край до край в по-старата версия. Шифрованите от край до край съобщения, които са били обменени наскоро (при използването на по-стара версия), може да не успеят да бъдат разшифровани в тази версия. Това също може да доведе до неуспех в обмяната на съобщения в тази версия. Ако имате проблеми, излезте и влезте отново в профила си. За да запазите историята на съобщенията, експортирайте и импортирайте отново Вашите ключове.",
"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.": "Възстановяването на парола ще нулира всички ключове за шифроване от край до край за всички устройства, правейки историята на шифрования чат невъзможна за четене, освен ако първо не експортирате Вашите ключове за стаята и ги импортирате отново след това. В бъдеще това ще бъде подобрено.",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Вие сте излязли от профила си от всички устройства и вече няма да получавате известия. За да включите известията отново, влезте в профила си от всички устройства",
@@ -995,7 +986,6 @@
"Key request sent.": "Заявката за ключ е изпратена.",
"Re-request encryption keys from your other devices.": "Заявете отново ключове за шифроване от другите Ви устройства.",
"%(user)s is a %(userRole)s": "%(user)s е %(userRole)s",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "Промени, направени във общността Ви, може да не бъдат видяни от другите потребители за най-много 30 минути.",
"Code": "Код",
"Debug Logs Submission": "Изпращане на логове за дебъгване",
"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 contian messages.": "Ако сте изпратили грешка чрез GitHub, логовете за дебъгване могат да ни помогнат да проследим проблема. Логовете за дебъгване съдържат данни за използване на приложението, включващи потребителското Ви име, идентификаторите или псевдонимите на стаите или групите, които сте посетили, и потребителските имена на други потребители. Те не съдържат съобщения.",
@@ -1006,5 +996,162 @@
"Unable to leave community": "Неуспешно напускане на общността",
"Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Промени направени по името и аватара на вашата общност може да не се отразят при другите потребители за до 30 минути.",
"Join this community": "Присъединете се в тази общност",
- "Leave this community": "Напуснете тази общност"
+ "Leave this community": "Напуснете тази общност",
+ "Fetching third party location failed": "Неуспешно извличане на адреса на стаята от друга мрежа",
+ "A new version of Riot is available.": "Налична е нова версия на Riot.",
+ "Couldn't load home page": "Неуспешно зареждане на началната страница",
+ "Send Account Data": "Изпращане на Account Data",
+ "All notifications are currently disabled for all targets.": "В момента известията са изключени за всички цели.",
+ "Uploading report": "Качване на доклада",
+ "Sunday": "Неделя",
+ "Notification targets": "Устройства, получаващи известия",
+ "Today": "Днес",
+ "Files": "Файлове",
+ "You are not receiving desktop notifications": "Не получавате известия на работния плот",
+ "Friday": "Петък",
+ "Update": "Актуализиране",
+ "Unable to fetch notification target list": "Неуспешно извличане на списък с устройства получаващи известия",
+ "Add an email address above to configure email notifications": "За конфигурация на имейл известия добавете имейл адрес по-горе.",
+ "Expand panel": "Разшири панела",
+ "On": "Включено",
+ "%(count)s Members|other": "%(count)s Членове",
+ "Filter room names": "Филтрирай стаи по име",
+ "Changelog": "Списък на промените",
+ "Waiting for response from server": "Изчакване на отговор от сървъра",
+ "Uploaded on %(date)s by %(user)s": "Качено на %(date)s от %(user)s",
+ "Send Custom Event": "Изпрати потребителско събитие",
+ "Advanced notification settings": "Разширени настройки за известяване",
+ "Failed to send logs: ": "Неуспешно изпращане на логове: ",
+ "delete the alias.": "изтрий псевдонима.",
+ "To return to your account in future you need to set a password": "За да се върнете в профила си в бъдеще, трябва да зададете парола",
+ "Forget": "Забрави",
+ "Hide panel": "Скриване на панела",
+ "You cannot delete this image. (%(code)s)": "Не можете да изтриете тази снимка. (%(code)s)",
+ "Cancel Sending": "Откажи изпращането",
+ "This Room": "В тази стая",
+ "The Home Server may be too old to support third party networks": "Home сървърът може да е твърде стар, за да поддържа работа с други мрежи",
+ "Resend": "Изпрати отново",
+ "Room not found": "Стаята не е намерена",
+ "Downloading update...": "Сваляне на нова версия...",
+ "Messages in one-to-one chats": "Съобщения в индивидуални чатове",
+ "Unavailable": "Не е наличен",
+ "View Decrypted Source": "Прегледай разшифрования източник",
+ "Failed to update keywords": "Грешка при обновяване на ключови думи",
+ "Notes:": "Бележки:",
+ "remove %(name)s from the directory.": "премахване %(name)s от директорията.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Известия за следните ключови думи изпълняват правила, които не могат да бъдат показани тук:",
+ "Safari and Opera work too.": "Safari и Opera са други алтернативи.",
+ "Please set a password!": "Моля, въведете парола!",
+ "You have successfully set a password!": "Вие успешно зададохте парола!",
+ "Explore Room State": "Преглед на състоянието на стаята",
+ "Source URL": "URL на източника",
+ "Messages sent by bot": "Съобщения изпратени от бот",
+ "Filter results": "Филтриране на резултати",
+ "Members": "Членове",
+ "No update available.": "Няма нова версия.",
+ "Noisy": "Шумно",
+ "Failed to get protocol list from Home Server": "Неуспешно получаване на списък с протоколи от Home сървър",
+ "Collecting app version information": "Събиране на информация за версията на приложението",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Изтриване на псевдонима %(alias)s на стаята и премахване на %(name)s от директорията?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Това ще Ви позволи да се върнете в профила си след излизане от него, и да влезете от други устройства.",
+ "Enable notifications for this account": "Включване на известия за този профил",
+ "Directory": "Директория",
+ "Invite to this community": "Покани в тази общност",
+ "Search for a room": "Търсене на стая",
+ "Search…": "Търсене…",
+ "Messages containing keywords": "Съобщения, съдържащи ключови думи",
+ "Error saving email notification preferences": "Грешка при запазване на настройките за имейл известяване",
+ "Tuesday": "Вторник",
+ "Enter keywords separated by a comma:": "Ключови думи разделени чрез запетая:",
+ "Forward Message": "Препрати съобщението",
+ "You have successfully set a password and an email address!": "Вие успешно зададохте парола и имейл адрес!",
+ "Remove %(name)s from the directory?": "Премахване на %(name)s от директорията?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot използва много разширени браузър харектеристики, някои от които не са налични или са все още експериментални в настоящия Ви браузър.",
+ "Developer Tools": "Инструменти за разработчика",
+ "Preparing to send logs": "Подготовка за изпращане на логове",
+ "Explore Account Data": "Преглед на данните от профила",
+ "All messages (noisy)": "Всички съобщения (шумно)",
+ "Away": "Отсъстващ",
+ "Saturday": "Събота",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Ако си промените мнението, винаги може да зададете имейл адрес в настройки на потребителя.",
+ "Direct Chat": "Директен чат",
+ "The server may be unavailable or overloaded": "Сървърът не е наличен или е претоварен",
+ "Reject": "Отхвърли",
+ "Failed to set Direct Message status of room": "Неуспешно настройване на стаята като Директен чат",
+ "Monday": "Понеделник",
+ "Remove from Directory": "Премахни от директорията",
+ "Enable them now": "Включете ги сега",
+ "Messages containing my user name": "Съобщения, съдържащи моето потребителско име",
+ "Toolbox": "Инструменти",
+ "Collecting logs": "Събиране на логове",
+ "more": "още",
+ "GitHub issue link:": "Линк към GitHub issue:",
+ "Failed to get public room list": "Неуспешно получаване на списък с публични стаи",
+ "You must specify an event type!": "Трябва да укажате тип на събитието",
+ "(HTTP status %(httpStatus)s)": "(HTTP статус %(httpStatus)s)",
+ "All Rooms": "Във всички стаи",
+ "Please install Chrome or Firefox for the best experience.": "Моля, инсталирайте Chrome или Firefox за най-добро преживяване.",
+ "Wednesday": "Сряда",
+ "Quote": "Цитирай",
+ "Send logs": "Изпращане на логове",
+ "All messages": "Всички съобщения",
+ "Call invitation": "Покана за разговор",
+ "Messages containing my display name": "Съобщения, съдържащи моя псевдоним",
+ "State Key": "State ключ",
+ "Failed to send custom event.": "Неуспешно изпращане на потребителско събитие.",
+ "What's new?": "Какво ново?",
+ "Notify me for anything else": "Извести ме за всичко останало",
+ "When I'm invited to a room": "Когато ме поканят в стая",
+ "Keywords": "Ключови думи",
+ "Click here to create a GitHub issue.": "Натиснете тук, за да създадете GitHub issue.",
+ "Can't update user notification settings": "Неуспешно обновяване на потребителски настройки за известяване",
+ "Notify for all other messages/rooms": "Извести ме за всички други съобщения/стаи",
+ "Unable to look up room ID from server": "Стая с такъв идентификатор не е намерена на сървъра",
+ "Couldn't find a matching Matrix room": "Не успяхме да намерим съответната Matrix стая",
+ "Bug report sent": "Докладът за грешки е изпратен",
+ "Invite to this room": "Покани в тази стая",
+ "You cannot delete this message. (%(code)s)": "Това съобщение не може да бъде изтрито. (%(code)s)",
+ "Thursday": "Четвъртък",
+ "I understand the risks and wish to continue": "Разбирам рисковете и желая да продължа",
+ "Logs sent": "Логовете са изпратени",
+ "Back": "Назад",
+ "Reply": "Отговори",
+ "Show message in desktop notification": "Показване на съдържание в известията на работния плот",
+ "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.": "Логовете за дебъгване съдържат данни за използване на приложението, включващи потребителското Ви име, идентификаторите или псевдонимите на стаите или групите, които сте посетили, и потребителските имена на други потребители. Те не съдържат съобщения.",
+ "Unhide Preview": "Покажи отново прегледа",
+ "Unable to join network": "Неуспешно присъединяване към мрежата",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Възможна конфигурация на настройките за известия в клиент, различен от Riot. Не могат да бъдат променени в Riot, но важат въпреки това",
+ "Sorry, your browser is not able to run Riot.": "За жалост, Вашият браузър не може да пусне Riot.",
+ "Messages in group chats": "Съобщения в групови чатове",
+ "Yesterday": "Вчера",
+ "Error encountered (%(errorDetail)s).": "Възникна грешка (%(errorDetail)s).",
+ "Event Type": "Вид на събитие",
+ "Low Priority": "Нисък приоритет",
+ "What's New": "Какво ново",
+ "Set Password": "Задаване на парола",
+ "Appear Offline": "Показване като офлайн",
+ "An error occurred whilst saving your email notification preferences.": "Възникна грешка при запазване на настройките за имейл известяване.",
+ "Enable audible notifications in web client": "Включване на звукови известия в уеб клиент",
+ "Permalink": "Permalink",
+ "Off": "Изключено",
+ "Riot does not know how to join a room on this network": "Riot не знае как да се присъедини към стая от тази мрежа",
+ "Mentions only": "Само при споменаване",
+ "You can now return to your account after signing out, and sign in on other devices.": "Вече можете да се върнете в профила си след излизане от него и да влезете от други устройства.",
+ "Enable desktop notifications": "Включване на известия на работния плот",
+ "Enable email notifications": "Активиране на имейл известия",
+ "Login": "Вход",
+ "Download this file": "Изтегли този файл",
+ "Pin Message": "Закачи съобщението",
+ "Failed to change settings": "Неуспешна промяна на настройки",
+ "View Community": "Прегледай общността",
+ "%(count)s Members|one": "%(count)s Член",
+ "Event sent!": "Събитието е изпратено!",
+ "View Source": "Прегледай източника",
+ "Event Content": "Съдържание на събитието",
+ "Thank you!": "Благодарим!",
+ "#example": "#пример",
+ "Collapse 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!": "С текущия Ви браузър, изглеждането и усещането на приложението може да бъде неточно, и някои или всички от функциите може да не функционират,работят......... Ако искате може да продължите така или иначе, но сте сами по отношение на евентуалните проблеми, които може да срещнете!",
+ "Checking for an update...": "Проверяване за нова версия...",
+ "There are advanced notifications which are not shown here": "Съществуват разширени настройки за известия, които не са показани тук"
}
diff --git a/src/i18n/strings/bn_BD.json b/src/i18n/strings/bn_BD.json
new file mode 100644
index 00000000000..9e26dfeeb6e
--- /dev/null
+++ b/src/i18n/strings/bn_BD.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/i18n/strings/bn_IN.json b/src/i18n/strings/bn_IN.json
new file mode 100644
index 00000000000..0967ef424bc
--- /dev/null
+++ b/src/i18n/strings/bn_IN.json
@@ -0,0 +1 @@
+{}
diff --git a/src/i18n/strings/bs.json b/src/i18n/strings/bs.json
new file mode 100644
index 00000000000..9e26dfeeb6e
--- /dev/null
+++ b/src/i18n/strings/bs.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json
index 8f9da794b60..9774b5bb208 100644
--- a/src/i18n/strings/ca.json
+++ b/src/i18n/strings/ca.json
@@ -337,8 +337,6 @@
"Hangup": "Penja",
"Voice call": "Trucada de veu",
"Video call": "Trucada de vídeo",
- "Hide Apps": "Amaga les aplicacions",
- "Show Apps": "Mostra les aplicacions",
"Upload file": "Puja el fitxer",
"Show Text Formatting Toolbar": "Mostra la barra d'eines de format de text",
"Send an encrypted reply…": "Envia una resposta encriptada…",
@@ -756,7 +754,6 @@
"Leave Community": "Abandona la comunitat",
"Leave %(groupName)s?": "Voleu sortir de la comunitat %(groupName)s?",
"Leave": "Surt",
- "Unable to leave room": "No s'ha pogut sortir de la sala",
"Community Settings": "Paràmetres de la comunitat",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Aquestes sales es mostren a la pàgina de la comunitat als seus membres i poden entrar-hi fent clic sobre elles.",
"Featured Rooms:": "Sales destacades:",
@@ -872,8 +869,6 @@
"Analytics": "Analítiques",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ha canviat el seu nom visible a %(displayName)s.",
"Server may be unavailable or overloaded": "El servidor pot estar inaccessible o sobrecarregat",
- "Report it": "Informa",
- "Found a bug?": "Has trobat un error?",
"Display name": "Nom visible",
"Identity Server is": "El servidor d'identitat es",
"Submit debug logs": "Enviar logs de depuració",
@@ -882,5 +877,165 @@
"Your language of choice": "El teu idioma preferit",
"Which officially provided instance you are using, if any": "Quina instància oficial estàs utilitzant, si escau",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Si estàs utilitzant el mode Richtext del Rich Text Editor o no",
- "The information being sent to us to help make Riot.im better includes:": "La informació enviada a Riot.im per ajudar-nos a millorar inclou:"
+ "The information being sent to us to help make Riot.im better includes:": "La informació enviada a Riot.im per ajudar-nos a millorar inclou:",
+ "Fetching third party location failed": "S'ha produït un error en obtenir la ubicació de tercers",
+ "A new version of Riot is available.": "Hi ha una nova versió del Riot disponible.",
+ "Couldn't load home page": "No s'ha pogut carregar la pàgina d'inici",
+ "Send Account Data": "Envia les dades del compte",
+ "Advanced notification settings": "Paràmetres avançats de notificacions",
+ "Uploading report": "S'està enviant l'informe",
+ "Sunday": "Diumenge",
+ "Failed to add tag %(tagName)s to room": "No s'ha pogut afegir l'etiqueta %(tagName)s a la sala",
+ "Notification targets": "Objectius de les notificacions",
+ "Failed to set direct chat tag": "No s'ha pogut establir l'etiqueta del xat directe",
+ "Today": "Avui",
+ "Files": "Fitxers",
+ "You are not receiving desktop notifications": "No esteu rebent notificacions d'escriptori",
+ "Friday": "Divendres",
+ "Update": "Actualització",
+ "What's New": "Novetats",
+ "Add an email address above to configure email notifications": "Afegiu més amunt un correu electrònic per a configurar les notificacions",
+ "Expand panel": "Expandeix el panel",
+ "On": "Engegat",
+ "%(count)s Members|other": "%(count)s membres",
+ "Filter room names": "Filtra els noms de les sales",
+ "Changelog": "Registre de canvis",
+ "Waiting for response from server": "S'està esperant una resposta del servidor",
+ "Uploaded on %(date)s by %(user)s": "Pujat el %(date)s per l'usuari %(user)s",
+ "Send Custom Event": "Envia els esdeveniments personalitzats",
+ "All notifications are currently disabled for all targets.": "Actualment totes les notificacions estan inhabilitades per a tots els objectius.",
+ "Failed to send logs: ": "No s'han pogut enviar els logs: ",
+ "delete the alias.": "esborra l'alies.",
+ "To return to your account in future you need to set a password": "Per poder tornar al vostre compte en un futur, heu de set a password",
+ "Forget": "Oblida",
+ "#example": "#exemple",
+ "Hide panel": "Amaga el panel",
+ "You cannot delete this image. (%(code)s)": "No podeu eliminar aquesta imatge. (%(code)s)",
+ "Cancel Sending": "Cancel·la l'enviament",
+ "This Room": "Aquesta sala",
+ "The Home Server may be too old to support third party networks": "El servidor local pot ser massa antic per a ser compatible amb xarxes de tercers",
+ "Resend": "Reenvia",
+ "Room not found": "No s'ha trobat la sala",
+ "Messages containing my display name": "Missatges que contenen el meu nom visible",
+ "Messages in one-to-one chats": "Missatges en xats un a un",
+ "Unavailable": "No disponible",
+ "Error saving email notification preferences": "No s'han pogut desar les preferències de les notificacions a causa d'un error",
+ "View Decrypted Source": "Mostra el codi desencriptat",
+ "Failed to update keywords": "No s'han pogut actualitzar les paraules clau",
+ "Notes:": "Notes:",
+ "remove %(name)s from the directory.": "elimina %(name)s del directori.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Les notificacions sobre les següents paraules clau segueixen regles que no es poden mostrar aquí:",
+ "Safari and Opera work too.": "Safari i Opera també fan la feina.",
+ "Please set a password!": "Si us plau, establiu una contrasenya",
+ "You have successfully set a password!": "Heu establert correctament la contrasenya",
+ "An error occurred whilst saving your email notification preferences.": "S'ha produït un error en desar les vostres preferències de notificació per correu electrònic.",
+ "Explore Room State": "Esbrina els estats de les sales",
+ "Source URL": "URL origen",
+ "Messages sent by bot": "Missatges enviats pel bot",
+ "Filter results": "Resultats del filtre",
+ "Members": "Membres",
+ "No update available.": "No hi ha cap actualització disponible.",
+ "Noisy": "Sorollós",
+ "Failed to get protocol list from Home Server": "No s'ha pogut obtenir la llista de protocols del servidor local",
+ "Collecting app version information": "S'està recollint la informació de la versió de l'aplicació",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Voleu esborrar de la sala l'alies %(alias)s i retirar %(name)s del directori?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Això farà possible que pugueu tronar al vostre compte des de qualsevol dispositiu.",
+ "Enable notifications for this account": "Habilita les notificacions per aquest compte",
+ "Directory": "Directori",
+ "Invite to this community": "Convida a aquesta comunitat",
+ "Search for a room": "Busca una sala",
+ "Search…": "Cerca…",
+ "Messages containing keywords": "Missatges que contenen keywords",
+ "When I'm invited to a room": "Quan sóc convidat a una sala",
+ "Tuesday": "Dimarts",
+ "Enter keywords separated by a comma:": "Introduïu les paraules clau separades per una coma:",
+ "Forward Message": "Reenvia el missatge",
+ "Remove %(name)s from the directory?": "Voleu retirar %(name)s del directori?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utilitza moltes funcions avançades del navegador, algunes de les quals no estan disponibles o són experimentals al vostre navegador actual.",
+ "Developer Tools": "Eines de desenvolupador",
+ "Preparing to send logs": "Preparant l'enviament de logs",
+ "Explore Account Data": "Explora les dades del compte",
+ "Remove from Directory": "Elimina del directori",
+ "Away": "Absent",
+ "Saturday": "Dissabte",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Recordeu-ho, si canvieu d'idea, sempre podreu establir una adreça de correu electrònic a las vostra configuració d'usuari.",
+ "Direct Chat": "Xat directe",
+ "The server may be unavailable or overloaded": "El servidor pot no estar disponible o sobrecarregat",
+ "Reject": "Rebutja",
+ "Failed to set Direct Message status of room": "No s'ha pogut establir l'estat del missatge directe de la sala",
+ "Monday": "Dilluns",
+ "All messages (noisy)": "Tots els missatges (sorollós)",
+ "Enable them now": "Habilita-ho ara",
+ "Messages containing my user name": "Missatges que contenen el meu nom d'usuari",
+ "Toolbox": "Caixa d'eines",
+ "Collecting logs": "S'estan recopilant els registres",
+ "more": "més",
+ "GitHub issue link:": "Enllaç de l'issue de GitHub:",
+ "Failed to get public room list": "No s'ha pogut obtenir el llistat de sales públiques",
+ "You must specify an event type!": "Heu d'especificar un tipus d'esdeveniment",
+ "(HTTP status %(httpStatus)s)": "(Estat de l´HTTP %(httpStatus)s)",
+ "All Rooms": "Totes les sales",
+ "State Key": "Clau d'estat",
+ "Please install Chrome or Firefox for the best experience.": "Si us plau, instal·leu Chrome or Firefox per gaudir d'una millor experiència.",
+ "Wednesday": "Dimecres",
+ "Send logs": "Envia els registres",
+ "All messages": "Tots els missatges",
+ "Call invitation": "Invitació de trucada",
+ "Downloading update...": "Descarregant l'actualització...",
+ "You have successfully set a password and an email address!": "Heu establert correctament la vostra contrasenya i l'adreça de correu electrònic",
+ "Failed to send custom event.": "No s'ha pogut enviar l'esdeveniment personalitzat.",
+ "What's new?": "Què hi ha de nou?",
+ "Notify me for anything else": "Notifica'm per a qualsevol altra cosa",
+ "View Source": "Mostra el codi",
+ "Keywords": "Paraules clau",
+ "Click here to create a GitHub issue.": "Clica aquí per crear una issue a GitHub.",
+ "Can't update user notification settings": "No es poden actualitzar els paràmetres de les notificacions de l'usuari",
+ "Notify for all other messages/rooms": "Notifica per a tots els altres missatges o sales",
+ "Unable to look up room ID from server": "No s'ha pogut cercar l'ID de la sala en el servidor",
+ "Couldn't find a matching Matrix room": "No s'ha pogut trobar una sala de Matrix que coincideixi",
+ "Bug report sent": "S'ha enviat l'informe d'error",
+ "Invite to this room": "Convida a aquesta sala",
+ "You cannot delete this message. (%(code)s)": "No podeu eliminar aquest missatge. (%(code)s)",
+ "Thursday": "Dijous",
+ "I understand the risks and wish to continue": "Entenc el riscos i desitjo continuar",
+ "Logs sent": "Logs enviats",
+ "Back": "Enrere",
+ "Reply": "Respon",
+ "Show message in desktop notification": "Mostra els missatges amb notificacions d'escriptori",
+ "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.": "Els logs de depuració contenen dades d'ús de l'aplicació que inclouen el teu nom d'usuari, les IDs o pseudònims de les sales o grups que has visitat i els noms d'usuari d'altres usuaris. No contenen missatges.",
+ "Unhide Preview": "Mostra la previsualització",
+ "Unable to join network": "No s'ha pogut unir-se a la xarxa",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "És possible que els hàgiu configurat en un client diferent de Riot. No podeu modificar-los amb Riot, però encara s'apliquen",
+ "Sorry, your browser is not able to run Riot.": "Disculpeu, el seu navegador not pot executar Riot.",
+ "Quote": "Cita",
+ "Messages in group chats": "Missatges en xats de grup",
+ "Yesterday": "Ahir",
+ "Error encountered (%(errorDetail)s).": "S'ha trobat un error (%(errorDetail)s).",
+ "Login": "Inicia sessió",
+ "Low Priority": "Baixa prioritat",
+ "Unable to fetch notification target list": "No s'ha pogut obtenir la llista d'objectius de les notificacions",
+ "Appear Offline": "Apareix sense connexió",
+ "Set Password": "Establiu una contrasenya",
+ "Enable audible notifications in web client": "Habilita les notificacions d'àudio al client web",
+ "Permalink": "Enllaç permanent",
+ "Off": "Apagat",
+ "Riot does not know how to join a room on this network": "El Riot no sap com unir-se a una sala en aquesta xarxa",
+ "Mentions only": "Només mencions",
+ "Failed to remove tag %(tagName)s from room": "No s'ha pogut esborrar l'etiqueta %(tagName)s de la sala",
+ "You can now return to your account after signing out, and sign in on other devices.": "Ara podreu tornar a entrar al vostre compte des de altres dispositius.",
+ "Enable desktop notifications": "Habilita les notificacions d'escriptori",
+ "Enable email notifications": "Habilita les notificacions per correu electrònic",
+ "Event Type": "Tipus d'esdeveniment",
+ "Download this file": "Descarrega aquest fitxer",
+ "Pin Message": "Enganxa el missatge",
+ "Failed to change settings": "No s'han pogut modificar els paràmetres",
+ "View Community": "Mira la communitat",
+ "%(count)s Members|one": "%(count)s membre",
+ "Event sent!": "S'ha enviat l'esdeveniment",
+ "Event Content": "Contingut de l'esdeveniment",
+ "Thank you!": "Gràcies!",
+ "Collapse panel": "Col·lapsa el tauler",
+ "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!": "Amb el vostre navegador actual, l'aparença de l'aplicació pot ser completament incorrecta i algunes o totes les funcions poden no funcionar correctament. Si voleu provar-ho de totes maneres, podeu continuar, però esteu sols pel que fa als problemes que pugueu trobar!",
+ "Checking for an update...": "Comprovant si hi ha actualitzacions...",
+ "There are advanced notifications which are not shown here": "Hi ha notificacions avançades que no es mostren aquí"
}
diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json
index 4267954d4c4..920c77dd251 100644
--- a/src/i18n/strings/cs.json
+++ b/src/i18n/strings/cs.json
@@ -90,7 +90,6 @@
"Are you sure you want to upload the following files?": "Určitě chcete nahrát následující soubory?",
"Attachment": "Příloha",
"Autoplay GIFs and videos": "Automaticky přehrávat GIFy a videa",
- "Bug Report": "Hlášení o chybě",
"Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nelze se připojit k domovskému serveru – zkontrolujte prosím své připojení, prověřte, zdali je SSL certifikát vašeho domovského serveru důvěryhodný, a že některé z rozšíření prohlížeče neblokuje komunikaci.",
"Anyone who knows the room's link, apart from guests": "Kdokoliv, kdo má odkaz na místnost, kromě hostů",
"Anyone who knows the room's link, including guests": "Kdokoliv, kdo má odkaz na místnost, a to i hosté",
@@ -207,7 +206,6 @@
"%(senderName)s answered the call.": "%(senderName)s přijal/a hovor.",
"Click to mute audio": "Kliknutím ztlumíte zvuk",
"Failed to verify email address: make sure you clicked the link in the email": "E-mailovou adresu se nepodařilo ověřit. Přesvědčte se, že jste kliknul/a na zaslaný odkaz",
- "Found a bug?": "Našli jste chybu?",
"Guest access is disabled on this Home Server.": "Na tomto domovském serveru je hostům vstup odepřen.",
"Guests cannot join this room even if explicitly invited.": "Hosté nemohou vstoupit do této místnosti, i když jsou přímo pozváni.",
"Hide read receipts": "Skrýt potvrzení o přečtení",
@@ -278,7 +276,6 @@
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Tuto změnu nepůjde vrátit zpět, protože tomuto uživateli nastavujete stejnou úroveň moci, jakou máte vy.",
"Alias (optional)": "Alias (nepovinný)",
"Room name (optional)": "Název místnosti (nepovinný)",
- "Report it": "Nahlásit to",
"Results from DuckDuckGo": "Výsledky z DuckDuckGo",
"Return to login screen": "Vrátit k přihlašovací obrazovce",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot není oprávněn posílat vám upozornění – zkontrolujte prosím nastavení svého prohlížeče",
@@ -306,7 +303,6 @@
"%(senderName)s set a profile picture.": "%(senderName)s si nastavil/a profilový obrázek.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s si změnil/a zobrazované jméno na %(displayName)s.",
"Sets the room topic": "Nastavuje téma místnosti",
- "Show Apps": "Zobrazit aplikace",
"Show panel": "Zobrazit panel",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Zobrazovat časové značky v 12hodinovém formátu (např. 2:30 odp.)",
"Sign in": "Přihlásit",
@@ -530,7 +526,6 @@
"Make Moderator": "Udělit moderátorství",
"and %(count)s others...|one": "a někdo další...",
"Hangup": "Zavěsit",
- "Hide Apps": "Skrýt aplikace",
"Show Text Formatting Toolbar": "Zobrazit nástroje formátování textu",
"Hide Text Formatting Toolbar": "Skrýt nástroje formátování textu",
"Jump to message": "Přeskočit na zprávu",
@@ -560,7 +555,6 @@
"Leave Community": "Odejít ze skupiny",
"Leave %(groupName)s?": "Odejít z %(groupName)s?",
"Leave": "Odejít",
- "Unable to leave room": "Nepodařilo se odejít z místnosti",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Skrýt zprávy o vstupu či odejití (pozvánky, vykopnutí a vykázání zůstanou)",
"Failed to remove user from community": "Nepodařilo se odebrat uživatele ze skupiny",
"Failed to remove room from community": "Nepodařilo se odebrat místnost ze skupiny",
@@ -948,5 +942,158 @@
"expand": "rozbalit",
"Old cryptography data detected": "Nalezeny starší šifrované datové zprávy",
"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.": "Nalezeny datové zprávy ze starší verze Riot. Důsledkem bude, že E2E šifrování nebude ve starší verzi Riot správně fungovat. Šifrované zprávy ze starší verze nemusí být čitelné v nové verzi. Může dojít i k selhání zasílaní zpráv s touto verzí Riot. Pokud zaznamenáte některý z uvedených problému, odhlaste se a přihlaste znovu. Pro zachování historie zpráv exportujte a znovu importujte vaše klíče.",
- "Warning": "Upozornění"
+ "Warning": "Upozornění",
+ "Fetching third party location failed": "Nepodařilo se zjistit umístění třetí strany",
+ "A new version of Riot is available.": "Je dostupná nová verze Riotu.",
+ "I understand the risks and wish to continue": "Rozumím rizikům a přeji si pokračovat",
+ "Couldn't load home page": "Nepodařilo se nahrát úvodní stránku",
+ "Send Account Data": "Poslat data o účtu",
+ "Advanced notification settings": "Pokročilé nastavení upozornění",
+ "Uploading report": "Nahrávám hlášení",
+ "Sunday": "Neděle",
+ "Messages sent by bot": "Zprávy poslané robotem",
+ "Notification targets": "Cíle upozornění",
+ "Failed to set direct chat tag": "Nepodařilo se nastavit štítek přímého chatu",
+ "Today": "Dnes",
+ "Files": "Soubory",
+ "You are not receiving desktop notifications": "Nedostáváte upozornění na desktopu",
+ "Friday": "Pátek",
+ "Update": "Aktualizace",
+ "What's New": "Co je nového",
+ "Add an email address above to configure email notifications": "Abyste mohli nastavovat e-mailová upozornění, musíte uvést svoji e-mailovou adresu v kolonce výše",
+ "Expand panel": "Rozbalit panel",
+ "On": "Zapnout",
+ "%(count)s Members|other": "%(count)s Členů",
+ "Filter room names": "Filtrovat místnosti dle názvu",
+ "Changelog": "Seznam změn",
+ "Waiting for response from server": "Čekám na odezvu ze serveru",
+ "Send Custom Event": "Odeslat vlastní událost",
+ "All notifications are currently disabled for all targets.": "Veškeré notifikace jsou aktuálně pro všechny cíle vypnuty.",
+ "delete the alias.": "smazat alias.",
+ "To return to your account in future you need to set a password": "Abyste se mohli ke svému účtu v budoucnu vrátit, musíte si nastavit heslo",
+ "Forget": "Zapomenout",
+ "Hide panel": "Skrýt panel",
+ "You cannot delete this image. (%(code)s)": "Tento obrázek nemůžete smazat. (%(code)s)",
+ "Cancel Sending": "Zrušit odesílání",
+ "This Room": "Tato místnost",
+ "The Home Server may be too old to support third party networks": "Tento domovský server může být příliš zastaralý na to, aby podporoval sítě třetích stran",
+ "Noisy": "Hlučný",
+ "Room not found": "Místnost nenalezena",
+ "Messages containing my display name": "Zprávy obsahující mé zobrazované jméno",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Vězte, že kdybyste si to rozmysleli, e-mailovou adresu můžete kdykoliv doplnit v uživatelském nastavení.",
+ "Unavailable": "Nedostupné",
+ "Error saving email notification preferences": "Chyba při ukládání nastavení e-mailových upozornění",
+ "View Decrypted Source": "Zobrazit dešifrovaný zdroj",
+ "Failed to update keywords": "Nepodařilo se aktualizovat klíčová slova",
+ "remove %(name)s from the directory.": "odebrat %(name)s z adresáře.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Upozornění na následující klíčová slova se řídí pravidly, která zde nelze zobrazit:",
+ "Safari and Opera work too.": "Safari a Opera fungují taky.",
+ "Please set a password!": "Prosím nastavte si heslo!",
+ "You have successfully set a password!": "Úspěšně jste si nastavili heslo!",
+ "Explore Room State": "Prohlížet stav místnosti",
+ "Source URL": "Zdrojová URL",
+ "Failed to add tag %(tagName)s to room": "Nepodařilo se přidat štítek %(tagName)s k místnosti",
+ "Filter results": "Filtrovat výsledky",
+ "Members": "Členové",
+ "No update available.": "Není dostupná žádná aktualizace.",
+ "Resend": "Poslat znovu",
+ "Failed to get protocol list from Home Server": "Z domovského serveru se nepodařilo získat seznam protokolů",
+ "Collecting app version information": "Sbírání informací o verzi aplikace",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Smazat alias místnosti %(alias)s a odstranit %(name)s z adresáře?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Toto vám umožní vrátit se po odhlášení ke svému účtu a používat jej na ostatních zařízeních.",
+ "Keywords": "Klíčová slova",
+ "Enable notifications for this account": "Zapnout upozornění na tomto účtu",
+ "Directory": "Adresář",
+ "Invite to this community": "Pozvat do této komunity",
+ "Search for a room": "Hledat místnost",
+ "Messages containing keywords": "Zprávy obsahující klíčová slova",
+ "View Source": "Zobrazit zdroj",
+ "Tuesday": "Úterý",
+ "Enter keywords separated by a comma:": "Vložte klíčová slova oddělená čárkou:",
+ "Forward Message": "Přeposlat zprávu",
+ "You have successfully set a password and an email address!": "Úspěšně jste si nastavili heslo a e-mailovou adresu!",
+ "Remove %(name)s from the directory?": "Odebrat %(name)s z adresáře?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot používá mnoho pokročilých funkcí, z nichž některé jsou ve vašem současném prohlížeči nedostupné nebo experimentální.",
+ "Developer Tools": "Nástroje pro vývojáře",
+ "Enable desktop notifications": "Zapnout upozornění na ploše",
+ "Explore Account Data": "Prozkoumat data o účtu",
+ "Remove from Directory": "Odebrat z adresáře",
+ "Away": "Pryč",
+ "Saturday": "Sobota",
+ "Messages in one-to-one chats": "Zprávy v individuálních chatech",
+ "Direct Chat": "Přímý chat",
+ "The server may be unavailable or overloaded": "Server může být nedostupný nebo přetížený",
+ "Reject": "Odmítnout",
+ "Failed to set Direct Message status of room": "Nepodařilo se přiřadit místnosti status Přímé zprávy",
+ "Monday": "Pondělí",
+ "All messages (noisy)": "Všechny zprávy (hlasitě)",
+ "Enable them now": "Povolit nyní",
+ "Messages containing my user name": "Zprávy obsahující mé uživatelské jméno",
+ "Toolbox": "Sada nástrojů",
+ "Collecting logs": "Sbírání logů",
+ "more": "více",
+ "Bug report sent": "Hlášení o chybě bylo odesláno",
+ "You must specify an event type!": "Musíte určit typ události!",
+ "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)",
+ "Invite to this room": "Pozvat do této místnosti",
+ "Please install Chrome or Firefox for the best experience.": "Pro nejlepší zážitek si prosím nainstalujte Chrome nebo Firefox.",
+ "Failed to get public room list": "Nepodařilo se získat seznam veřejných místností",
+ "Send logs": "Odeslat záznamy",
+ "All messages": "Všechny zprávy",
+ "Call invitation": "Pozvánka k hovoru",
+ "Downloading update...": "Stahování aktualizace...",
+ "State Key": "Stavový klíč",
+ "Failed to send custom event.": "Nepodařilo se odeslat vlastní událost.",
+ "What's new?": "Co je nového?",
+ "Notify me for anything else": "Upozorni mě na cokoliv jiného",
+ "When I'm invited to a room": "Pokud jsem pozván do místnosti",
+ "Can't update user notification settings": "Nelze aktualizovat uživatelské nastavení upozornění",
+ "Notify for all other messages/rooms": "Upozorni na všechny ostatní zprávy/místnosti",
+ "Unable to look up room ID from server": "Nelze získat ID místnosti ze serveru",
+ "Couldn't find a matching Matrix room": "Odpovídající Matrix místost nenalezena",
+ "All Rooms": "Všechny místnosti",
+ "You cannot delete this message. (%(code)s)": "Tuto zprávu nemůžete smazat. (%(code)s)",
+ "Thursday": "Čtvrtek",
+ "Search…": "Vyhledat…",
+ "Back": "Zpět",
+ "Failed to change settings": "Nepodařilo se změnit nastavení",
+ "Reply": "Odpovědět",
+ "Show message in desktop notification": "Zobrazovat zprávu v upozornění na ploše",
+ "Unhide Preview": "Zobrazit náhled",
+ "Unable to join network": "Nelze se připojit k síti",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Snad jste je nastavili v jiném klientu než Riot. V Riotu je nemůžete upravit, ale přesto platí",
+ "Sorry, your browser is not able to run Riot.": "Omlouváme se, váš prohlížeč není schopný spustit Riot.",
+ "Uploaded on %(date)s by %(user)s": "Nahráno %(date)s uživatelem %(user)s",
+ "Messages in group chats": "Zprávy ve skupinových chatech",
+ "Yesterday": "Včera",
+ "Error encountered (%(errorDetail)s).": "Nastala chyba (%(errorDetail)s).",
+ "Login": "Přihlásit",
+ "Low Priority": "Nízká priorita",
+ "Riot does not know how to join a room on this network": "Riot neví, jak vstoupit do místosti na této síti",
+ "Set Password": "Nastavit heslo",
+ "Appear Offline": "Jevit se offline",
+ "An error occurred whilst saving your email notification preferences.": "Při ukládání nastavení e-mailových upozornění nastala chyba.",
+ "Enable audible notifications in web client": "Povolit zvuková upozornění ve webové aplikaci",
+ "Permalink": "Trvalý odkaz",
+ "Off": "Vypnout",
+ "#example": "#příklad",
+ "Mentions only": "Pouze zmínky",
+ "Failed to remove tag %(tagName)s from room": "Nepodařilo se odstranit štítek %(tagName)s z místnosti",
+ "Wednesday": "Středa",
+ "You can now return to your account after signing out, and sign in on other devices.": "Nyní se můžete ke svému účtu vrátit i po odhlášení a používat jej na ostatních zařízeních.",
+ "Enable email notifications": "Zapnout upozornění přes e-mail",
+ "Event Type": "Typ události",
+ "Download this file": "Stáhnout tento soubor",
+ "Pin Message": "Připíchnout zprávu",
+ "Thank you!": "Děkujeme vám!",
+ "View Community": "Zobrazit Komunitu",
+ "%(count)s Members|one": "%(count)s Člen",
+ "Event sent!": "Událost odeslána!",
+ "Event Content": "Obsah události",
+ "Unable to fetch notification target list": "Nepodařilo se získat seznam cílů upozornění",
+ "Quote": "Citace",
+ "Collapse panel": "Sbalit 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!": "Vzhled a chování aplikace může být ve vašem aktuální prohlížeči nesprávné a některé nebo všechny funkce mohou být chybné. Chcete-li i přes to pokračovat, nebudeme vám bránit, ale se všemi problémy, na které narazíte, si musíte poradit sami!",
+ "Checking for an update...": "Kontrola aktualizací...",
+ "There are advanced notifications which are not shown here": "Jsou k dispozici pokročilá upozornění, která zde nejsou zobrazena"
}
diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json
index dbcc9fbb2c4..044c251e945 100644
--- a/src/i18n/strings/da.json
+++ b/src/i18n/strings/da.json
@@ -52,7 +52,6 @@
"Are you sure you want to reject the invitation?": "Er du sikker på du vil afvise invitationen?",
"Are you sure you want to upload the following files?": "Er du sikker på du vil sende de følgende filer?",
"Banned users": "Bortviste brugere",
- "Bug Report": "Fejlrapport",
"Bulk Options": "Masseindstillinger",
"Can't load user settings": "Kan ikke indlæse brugerindstillinger",
"Changes to who can read history will only apply to future messages in this room": "Ændringer til hvem der kan læse historie gælder kun for fremtidige meddelelser i dette rum",
@@ -242,5 +241,155 @@
"(unknown failure: %(reason)s)": "(ukendt fejl: %(reason)s)",
"%(senderName)s ended the call.": "%(senderName)s afsluttede opkaldet.",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s startede et %(callType)s opkald.",
- "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s inviterede %(targetDisplayName)s til rummet."
+ "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s inviterede %(targetDisplayName)s til rummet.",
+ "Fetching third party location failed": "Hentning af tredjeparts placering mislykkedes",
+ "A new version of Riot is available.": "En ny version a Riot er tilgængelig.",
+ "Couldn't load home page": "Kunne ikke indlæse startsiden",
+ "Send Account Data": "Send Konto Data",
+ "All notifications are currently disabled for all targets.": "Alle meddelelser er for øjeblikket deaktiveret for alle mål.",
+ "Uploading report": "Uploader rapport",
+ "Sunday": "Søndag",
+ "Messages sent by bot": "Beskeder sendt af en bot",
+ "Notification targets": "Meddelelsesmål",
+ "Failed to set direct chat tag": "Kunne ikke markere rummet som direkte chat",
+ "Today": "I dag",
+ "Files": "Filer",
+ "You are not receiving desktop notifications": "Du modtager ikke skrivebordsmeddelelser",
+ "Friday": "Fredag",
+ "Update": "Opdater",
+ "What's New": "Hvad er nyt",
+ "Add an email address above to configure email notifications": "Tilføj en emailadresse ovenfor for at konfigurere e-mail-underretninger",
+ "Expand panel": "Udvid panel",
+ "On": "Tændt",
+ "Filter room names": "Filtrér rumnavne",
+ "Changelog": "Ændringslog",
+ "Waiting for response from server": "Venter på svar fra server",
+ "Uploaded on %(date)s by %(user)s": "Uploadet den %(date)s af %(user)s",
+ "Send Custom Event": "Send Brugerdefineret Begivenhed",
+ "Off": "Slukket",
+ "Advanced notification settings": "Avancerede notifikationsindstillinger",
+ "delete the alias.": "Slet aliaset.",
+ "To return to your account in future you need to set a password": "For at komme ind på din konto i fremtiden skal du indstille et password",
+ "Forget": "Glem",
+ "#example": "#eksempel",
+ "Hide panel": "Gem panel",
+ "You cannot delete this image. (%(code)s)": "Du kan ikke slette dette billede. (%(code)s)",
+ "Cancel Sending": "Stop Forsendelse",
+ "Warning": "Advarsel",
+ "This Room": "Dette rum",
+ "The Home Server may be too old to support third party networks": "Hjemmeserveren kan være for gammel til at understøtte tredjepartsnetværk",
+ "Room not found": "Rummet ikke fundet",
+ "Messages containing my display name": "Beskeder der indeholder mit viste navn",
+ "Messages in one-to-one chats": "Beskeder i en-til-en chats",
+ "Unavailable": "Utilgængelig",
+ "Error saving email notification preferences": "Fejl ved at gemme e-mail-underretningsindstillinger",
+ "View Decrypted Source": "Se Dekrypteret Kilde",
+ "Failed to update keywords": "Kunne ikke opdatere søgeord",
+ "remove %(name)s from the directory.": "fjern %(name)s fra kataloget.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Meddelelser om følgende søgeord følger regler, der ikke kan vises her:",
+ "Safari and Opera work too.": "Safari og Opera virker også.",
+ "Please set a password!": "Indstil venligst et password!",
+ "You have successfully set a password!": "Du har succesfuldt indstillet et password!",
+ "An error occurred whilst saving your email notification preferences.": "Der opstod en fejl under opbevaring af dine e-mail-underretningsindstillinger.",
+ "Explore Room State": "Udforsk Rum Tilstand",
+ "Source URL": "Kilde URL",
+ "Failed to add tag %(tagName)s to room": "Kunne ikke tilføje tag(s): %(tagName)s til rummet",
+ "Filter results": "Filtrér resultater",
+ "Members": "Medlemmer",
+ "No update available.": "Ingen opdatering tilgængelig.",
+ "Noisy": "Støjende",
+ "Failed to get protocol list from Home Server": "Kunne ikke få protokolliste fra Home Server",
+ "Collecting app version information": "Indsamler app versionsoplysninger",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Slet rumaliaset %(alias)s og fjern %(name)s fra kataloget?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Dette vil tillade dig at vende tilbage til din konto efter at have logget ud og at logge ind på andre enheder.",
+ "Keywords": "Søgeord",
+ "Enable notifications for this account": "Aktivér underretninger for dette brugernavn",
+ "Directory": "Rum katalog",
+ "Invite to this community": "Inviter til dette fællesskab",
+ "Search for a room": "Søg efter et rum",
+ "Search…": "Søg…",
+ "Messages containing keywords": "Beskeder der indeholder keywords",
+ "When I'm invited to a room": "Når jeg bliver inviteret til et rum",
+ "Tuesday": "Tirsdag",
+ "Enter keywords separated by a comma:": "Indtast søgeord adskilt af et komma:",
+ "Forward Message": "Videresend Besked",
+ "Remove %(name)s from the directory?": "Fjern %(name)s fra kataloget?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot bruger mange avancerede browser funktioner, hvoraf nogle af dem ikke er tilgængelige eller er eksperimentelle i din browser.",
+ "Event sent!": "Begivenhed sendt!",
+ "Explore Account Data": "Udforsk Konto Data",
+ "Away": "Ikke til stede",
+ "Saturday": "Lørdag",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Husk, du kan altid indstille en emailadresse i dine bruger indstillinger hvis du ombestemmer dig.",
+ "Direct Chat": "Personlig Chat",
+ "The server may be unavailable or overloaded": "Serveren kan være utilgængelig eller overbelastet",
+ "Reject": "Afvis",
+ "Failed to set Direct Message status of room": "Kunne ikke indstille Direkte Beskedstatus for rummet",
+ "Monday": "Mandag",
+ "Remove from Directory": "Fjern fra Katalog",
+ "Enable them now": "Aktivér dem nu",
+ "Messages containing my user name": "Beskeder der indeholder mit brugernavn",
+ "Toolbox": "Værktøjer",
+ "Collecting logs": "Indsamler logfiler",
+ "more": "mere",
+ "You must specify an event type!": "Du skal angive en begivenhedstype!",
+ "(HTTP status %(httpStatus)s)": "(HTTP tilstand %(httpStatus)s)",
+ "Invite to this room": "Inviter til dette rum",
+ "State Key": "Tilstandsnøgle",
+ "Please install Chrome or Firefox for the best experience.": "Installer venligst Chrome eller Firefox for den bedste oplevelse.",
+ "Failed to get public room list": "Kunne ikke få offentlig rumliste",
+ "Send": "Send",
+ "Send logs": "Send logs",
+ "All messages": "Alle beskeder",
+ "Call invitation": "Opkalds invitation",
+ "Downloading update...": "Downloader opdatering...",
+ "You have successfully set a password and an email address!": "Du har succesfuldt indstillet et password og en emailadresse!",
+ "Failed to send custom event.": "Kunne ikke sende brugerdefinerede begivenhed.",
+ "What's new?": "Hvad er nyt?",
+ "Notify me for anything else": "Underret mig om noget andet",
+ "View Source": "Se Kilde",
+ "Can't update user notification settings": "Kan ikke opdatere brugermeddelelsesindstillinger",
+ "Notify for all other messages/rooms": "Underret om alle andre meddelelser / rum",
+ "Unable to look up room ID from server": "Kunne ikke slå rum-id op på server",
+ "Couldn't find a matching Matrix room": "Kunne ikke finde et matchende Matrix-rum",
+ "Bug report sent": "Fejl rapporteret",
+ "All Rooms": "Alle rum",
+ "You cannot delete this message. (%(code)s)": "Du kan ikke slette denne besked. (%(code)s)",
+ "Thursday": "Torsdag",
+ "I understand the risks and wish to continue": "Jeg forstår risikoen og ønsker at fortsætte",
+ "Back": "Tilbage",
+ "Show message in desktop notification": "Vis besked i skrivebordsnotifikation",
+ "Unhide Preview": "Vis Forhåndsvisning",
+ "Unable to join network": "Kan ikke forbinde til netværket",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du har muligvis konfigureret dem i en anden klient end Riot. Du kan ikke tune dem i Riot, men de gælder stadig",
+ "Sorry, your browser is not able to run Riot.": "Beklager, din browser kan ikke køre Riot.",
+ "Quote": "Citat",
+ "Messages in group chats": "Beskeder i gruppechats",
+ "Yesterday": "I går",
+ "Error encountered (%(errorDetail)s).": "En fejl er opstået (%(errorDetail)s).",
+ "Event Type": "Begivenhedstype",
+ "Low Priority": "Lav prioritet",
+ "Unable to fetch notification target list": "Kan ikke hente meddelelsesmålliste",
+ "Appear Offline": "Fremstå Offline",
+ "Set Password": "Indstil Password",
+ "Enable audible notifications in web client": "Aktivér hørbare underretninger i webklienten",
+ "Permalink": "Permanent link",
+ "Resend": "Send igen",
+ "Riot does not know how to join a room on this network": "Riot ved ikke, hvordan man kan deltage i et rum på dette netværk",
+ "Mentions only": "Kun nævninger",
+ "Failed to remove tag %(tagName)s from room": "Kunne ikke fjerne tag(s): %(tagName)s fra rummet",
+ "Wednesday": "Onsdag",
+ "You can now return to your account after signing out, and sign in on other devices.": "Du kan nu vende tilbage til din konto efter at have logget ud og logge ind på andre enheder.",
+ "Enable desktop notifications": "Aktivér desktop meddelelser",
+ "Enable email notifications": "Aktivér e-mail-underretninger",
+ "Login": "Log ind",
+ "Download this file": "Download denne fil",
+ "Pin Message": "Fasthold Besked",
+ "Failed to change settings": "Kunne ikke ændre indstillinger",
+ "Developer Tools": "Udviklingsværktøjer",
+ "Event Content": "Begivenhedsindhold",
+ "Thank you!": "Tak!",
+ "Collapse panel": "Slå panel sammen",
+ "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!": "Med din nuværnde broser kan udseendet og fornemmelsen af programmet være helt forkert og nogle funktioner virker måske ikke. Hvis du alligevel vil prøve så kan du fortsætte, men det er på egen risiko!",
+ "Checking for an update...": "Checker om der er en opdatering...",
+ "There are advanced notifications which are not shown here": "Der er avancerede meddelelser, som ikke vises her"
}
diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json
index e67c9fcaaa2..6e88c8b2fd7 100644
--- a/src/i18n/strings/de_DE.json
+++ b/src/i18n/strings/de_DE.json
@@ -51,7 +51,6 @@
"Are you sure you want to reject the invitation?": "Bist du sicher, dass du die Einladung ablehnen willst?",
"Are you sure you want to upload the following files?": "Bist du sicher, dass du die folgenden Dateien hochladen möchtest?",
"Banned users": "Verbannte Benutzer",
- "Bug Report": "Fehlerbericht",
"Changes to who can read history will only apply to future messages in this room": "Änderungen, die bestimmen, wer den Chatverlauf lesen kann, gelten nur für zukünftige Nachrichten in diesem Raum",
"Clear Cache and Reload": "Cache leeren und neu laden",
"Confirm your new password": "Neues Passwort bestätigen",
@@ -89,7 +88,6 @@
"Forgot your password?": "Passwort vergessen?",
"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.": "Aus Sicherheitsgründen werden beim Ausloggen alle Ende-zu-Ende-Verschlüsselungs-Schlüssel in diesem Browser gelöscht. Wenn du in späteren Riot-Sitzungen den bisherigen Chatverlauf entschlüsseln möchtest, exportiere bitte deine Schlüssel zur sicheren Aufbewahrung.",
"For security, this session has been signed out. Please sign in again.": "Aus Sicherheitsgründen wurde diese Sitzung beendet. Bitte melde dich erneut an.",
- "Found a bug?": "Fehler gefunden?",
"Guests cannot join this room even if explicitly invited.": "Gäste können diesem Raum nicht beitreten, auch wenn sie explizit eingeladen wurden.",
"Hangup": "Auflegen",
"Homeserver is": "Home-Server:",
@@ -398,7 +396,6 @@
"New passwords don't match": "Die neuen Passwörter stimmen nicht überein",
"olm version:": "Version von olm:",
"Passwords can't be empty": "Passwortfelder dürfen nicht leer sein",
- "Report it": "Melden",
"riot-web version:": "Version von riot-web:",
"Scroll to bottom of page": "Zum Seitenende springen",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Zeitstempel im 12-Stunden-Format anzeigen (z. B. 2:30pm)",
@@ -653,11 +650,9 @@
"Define the power level of a user": "Setze das Berechtigungslevel eines Benutzers",
"Edit": "Editieren",
"Enable automatic language detection for syntax highlighting": "Automatische Spracherkennung für die Syntax-Hervorhebung aktivieren",
- "Hide Apps": "Apps verbergen",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Betreten-/Verlassen-Benachrichtigungen verbergen (gilt nicht für Einladungen/Kicks/Bans)",
"Revoke widget access": "Ziehe Widget-Zugriff zurück",
"Sets the room topic": "Setzt das Raum-Thema",
- "Show Apps": "Apps anzeigen",
"To get started, please pick a username!": "Um zu starten, wähle bitte einen Nutzernamen!",
"Unable to create widget.": "Widget kann nicht erstellt werden.",
"Unbans user with given id": "Verbannung aufheben für Benutzer mit angegebener ID",
@@ -692,7 +687,6 @@
"You are no longer ignoring %(userId)s": "%(userId)s wird nicht mehr ignoriert",
"Message removed by %(userId)s": "Nachricht wurde von %(userId)s entfernt",
"Name or matrix ID": "Name oder Matrix-ID",
- "Unable to leave room": "Verlassen des Raumes fehlgeschlagen",
"Leave": "Verlassen",
"Failed to invite the following users to %(groupId)s:": "Die folgenden Benutzer konnten nicht in die Gruppe %(groupId)s eingeladen werden:",
"Leave %(groupName)s?": "%(groupName)s verlassen?",
@@ -992,7 +986,6 @@
"Key request sent.": "Schlüssel-Anfragen gesendet.",
"Re-request encryption keys from your other devices.": "Verschlüsselungs-Schlüssel von deinen anderen Geräten erneut anfragen.",
"%(user)s is a %(userRole)s": "%(user)s ist ein %(userRole)s",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "Änderungen, die an deiner Community gemacht werden, können bis zu 30 Minuten brauchen, bis sie für andere sichtbar sind.",
"Debug Logs Submission": "Einsenden des Fehlerprotokolls",
"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 contian messages.": "Wenn du einen Fehler via GitHub gemeldet hast, können Fehlerberichte uns helfen um das Problem zu finden. Sie enthalten Anwendungsdaten wie deinen Nutzernamen, Raum- und Gruppen-ID's und Aliase die du besucht hast und Nutzernamen anderer Nutzer. Sie enthalten keine Nachrichten.",
"Submit debug logs": "Fehlerberichte einreichen",
@@ -1003,5 +996,162 @@
"Unable to leave community": "Community konnte nicht verlassen werden",
"Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Änderungen am Namen und Bild deiner Community werden evtl. erst nach 30 Minuten von anderen Nutzern gesehen werden.",
"Join this community": "Community beitreten",
- "Leave this community": "Community verlassen"
+ "Leave this community": "Community verlassen",
+ "Fetching third party location failed": "Das Abrufen des Drittanbieterstandorts ist fehlgeschlagen",
+ "A new version of Riot is available.": "Eine neue Version von Riot ist verfügbar.",
+ "Couldn't load home page": "Startseite konnte nicht geladen werden",
+ "Send Account Data": "Benutzerkonto-Daten senden",
+ "All notifications are currently disabled for all targets.": "Aktuell sind alle Benachrichtigungen für alle Ziele deaktiviert.",
+ "Uploading report": "Lade Bericht hoch",
+ "Sunday": "Sonntag",
+ "Notification targets": "Benachrichtigungsziele",
+ "Today": "Heute",
+ "Files": "Dateien",
+ "You are not receiving desktop notifications": "Du erhältst keine Desktop-Benachrichtigungen",
+ "Friday": "Freitag",
+ "Update": "Aktualisieren",
+ "What's New": "Was ist neu",
+ "Add an email address above to configure email notifications": "Füge oben eine E-Mail-Adresse hinzu, um die E-Mail-Benachrichtigungseinstellungen zu konfigurieren",
+ "Expand panel": "Panel ausklappen",
+ "On": "An",
+ "%(count)s Members|other": "%(count)s Mitglieder",
+ "Filter room names": "Raum-Namen filtern",
+ "Changelog": "Änderungsprotokoll",
+ "Waiting for response from server": "Auf Antwort vom Server warten",
+ "Send Custom Event": "Benutzerdefiniertes Event senden",
+ "Advanced notification settings": "Erweiterte Benachrichtigungs-Einstellungen",
+ "Failed to send logs: ": "Senden von Logs fehlgeschlagen: ",
+ "delete the alias.": "Lösche den Alias.",
+ "To return to your account in future you need to set a password": "Um in Zukunft auf dein Benutzerkonto zugreifen zu können, musst du ein Passwort setzen",
+ "Forget": "Entfernen",
+ "#example": "#Beispiel",
+ "Hide panel": "Panel verbergen",
+ "You cannot delete this image. (%(code)s)": "Das Bild kann nicht gelöscht werden. (%(code)s)",
+ "Cancel Sending": "Senden abbrechen",
+ "This Room": "In diesem Raum",
+ "The Home Server may be too old to support third party networks": "Der Home-Server ist eventuell zu alt, um Drittanbieter-Netzwerke zu unterstützen",
+ "Resend": "Erneut senden",
+ "Room not found": "Raum nicht gefunden",
+ "Messages containing my display name": "Nachrichten, die meinen Anzeigenamen enthalten",
+ "Messages in one-to-one chats": "Nachrichten in Einzel-Chats",
+ "Unavailable": "Nicht verfügbar",
+ "View Decrypted Source": "Entschlüsselten Quellcode ansehen",
+ "Failed to update keywords": "Schlüsselwörter konnten nicht aktualisiert werden",
+ "Notes:": "Notizen:",
+ "remove %(name)s from the directory.": "entferne %(name)s aus dem Verzeichnis.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Die Benachrichtigungen zu den folgenden Schlüsselwörtern folgen Regeln, die hier nicht angezeigt werden können:",
+ "Safari and Opera work too.": "Safari und Opera sind weitere Alternativen.",
+ "Please set a password!": "Bitte setze ein Passwort!",
+ "You have successfully set a password!": "Du hast erfolgreich ein Passwort gesetzt!",
+ "An error occurred whilst saving your email notification preferences.": "Beim Speichern deiner E-Mail-Benachrichtigungseinstellungen ist ein Fehler aufgetreten.",
+ "Explore Room State": "Raum-Status erkunden",
+ "Source URL": "Quell-URL",
+ "Messages sent by bot": "Nachrichten von Bots",
+ "Filter results": "Ergebnisse filtern",
+ "Members": "Mitglieder",
+ "No update available.": "Kein Update verfügbar.",
+ "Noisy": "Laut",
+ "Failed to get protocol list from Home Server": "Fehler beim Abrufen der Protokoll-Liste vom Home-Server",
+ "Collecting app version information": "App-Versionsinformationen werden abgerufen",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Soll der Raum-Alias %(alias)s gelöscht und der %(name)s aus dem Verzeichnis entfernt werden?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Dies erlaubt dir, dich wieder an deinem Konto anzumelden, nachdem du dich abgemeldet hast.",
+ "Keywords": "Schlüsselwörter",
+ "Enable notifications for this account": "Benachrichtigungen für dieses Benutzerkonto aktivieren",
+ "Directory": "Raum-Verzeichnis",
+ "Invite to this community": "In diese Community einladen",
+ "Failed to get public room list": "Die Liste der öffentlichen Räume konnte nicht geladen werden",
+ "Messages containing keywords": "Nachrichten, die Schlüsselwörter enthalten",
+ "Error saving email notification preferences": "Fehler beim Speichern der E-Mail-Benachrichtigungseinstellungen",
+ "Tuesday": "Dienstag",
+ "Enter keywords separated by a comma:": "Schlüsselwörter kommagetrennt eingeben:",
+ "Forward Message": "Nachricht weiterleiten",
+ "You have successfully set a password and an email address!": "Du hast erfolgreich ein Passwort und eine E-Mail-Adresse gesetzt!",
+ "Remove %(name)s from the directory?": "Soll der Raum %(name)s aus dem Verzeichnis entfernt werden?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot nutzt zahlreiche fortgeschrittene Browser-Funktionen, die teilweise in deinem aktuell verwendeten Browser noch nicht verfügbar sind oder sich noch im experimentellen Status befinden.",
+ "Developer Tools": "Entwicklerwerkzeuge",
+ "Preparing to send logs": "Senden von Logs wird vorbereitet",
+ "Enable desktop notifications": "Desktop-Benachrichtigungen aktivieren",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Vergiss nicht, dass du in den Benutzereinstellungen jederzeit eine E-Mail-Adresse setzen kannst, wenn du deine Meinung änderst.",
+ "Explore Account Data": "Benutzerkonto-Daten analysieren",
+ "All messages (noisy)": "Alle Nachrichten (laut)",
+ "Away": "Abwesend",
+ "Saturday": "Samstag",
+ "I understand the risks and wish to continue": "Ich verstehe das Risiko und möchte fortfahren",
+ "Direct Chat": "Direkt-Chat",
+ "The server may be unavailable or overloaded": "Der Server ist vermutlich nicht erreichbar oder überlastet",
+ "Reject": "Ablehnen",
+ "Failed to set Direct Message status of room": "Konnte den direkten Benachrichtigungsstatus nicht setzen",
+ "Monday": "Montag",
+ "Remove from Directory": "Aus dem Raum-Verzeichnis entfernen",
+ "Enable them now": "Aktiviere diese jetzt",
+ "Messages containing my user name": "Nachrichten, die meinen Benutzernamen enthalten",
+ "Toolbox": "Werkzeugkasten",
+ "Collecting logs": "Protokolle werden abgerufen",
+ "more": "mehr",
+ "GitHub issue link:": "Link des GitHub-Problems:",
+ "Bug report sent": "Fehlerbericht wurde gesendet",
+ "You must specify an event type!": "Du musst einen Event-Typ spezifizieren!",
+ "(HTTP status %(httpStatus)s)": "(HTTP-Status %(httpStatus)s)",
+ "Invite to this room": "In diesen Raum einladen",
+ "Please install Chrome or Firefox for the best experience.": "Bitte installiere Chrome oder Firefox für ein optimales Anwendungsergebnis.",
+ "Wednesday": "Mittwoch",
+ "You cannot delete this message. (%(code)s)": "Diese Nachricht kann nicht gelöscht werden. (%(code)s)",
+ "Quote": "Zitat",
+ "Send logs": "Logdateien übermitteln",
+ "All messages": "Alle Nachrichten",
+ "Call invitation": "Anruf-Einladung",
+ "Downloading update...": "Update wird heruntergeladen...",
+ "State Key": "Status-Schlüssel",
+ "Failed to send custom event.": "Senden des benutzerdefinierten Events fehlgeschlagen.",
+ "What's new?": "Was ist neu?",
+ "Notify me for anything else": "Über alles andere benachrichtigen",
+ "When I'm invited to a room": "Wenn ich in einen Raum eingeladen werde",
+ "Click here to create a GitHub issue.": "Klicke hier um ein GithHub-Problem zu erstellen.",
+ "Can't update user notification settings": "Benachrichtigungs-Einstellungen des Benutzers konnten nicht aktualisiert werden",
+ "Notify for all other messages/rooms": "Benachrichtigungen für alle anderen Mitteilungen/Räume aktivieren",
+ "Unable to look up room ID from server": "Es ist nicht möglich, die Raum-ID auf dem Server nachzuschlagen",
+ "Couldn't find a matching Matrix room": "Konnte keinen entsprechenden Matrix-Raum finden",
+ "All Rooms": "In allen Räumen",
+ "Search for a room": "Nach einem Raum suchen",
+ "Thursday": "Donnerstag",
+ "Search…": "Suchen…",
+ "Logs sent": "Logs gesendet",
+ "Back": "Zurück",
+ "Reply": "Antworten",
+ "Show message in desktop notification": "Nachricht in der Desktop-Benachrichtigung anzeigen",
+ "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.": "Fehlerberichte enthalten Anwendungsdaten wie deinen Nutzernamen, Raum- und Gruppen-ID's und Aliase die du besucht hast sowie Nutzernamen anderer Nutzer. Sie enthalten keine Nachrichten.",
+ "Unhide Preview": "Vorschau wieder anzeigen",
+ "Unable to join network": "Es ist nicht möglich, dem Netzwerk beizutreten",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du hast sie eventuell auf einem anderen Matrix-Client und nicht in Riot konfiguriert. Sie können in Riot nicht verändert werden, gelten aber trotzdem",
+ "Sorry, your browser is not able to run Riot.": "Es tut uns leid, aber dein Browser kann Riot nicht ausführen.",
+ "Messages in group chats": "Nachrichten in Gruppen-Chats",
+ "Yesterday": "Gestern",
+ "Error encountered (%(errorDetail)s).": "Es ist ein Fehler aufgetreten (%(errorDetail)s).",
+ "Login": "Anmeldung",
+ "Low Priority": "Niedrige Priorität",
+ "Unable to fetch notification target list": "Liste der Benachrichtigungsempfänger konnte nicht abgerufen werden",
+ "Appear Offline": "Als offline anzeigen",
+ "Set Password": "Passwort einrichten",
+ "Enable audible notifications in web client": "Audio-Benachrichtigungen im Web-Client aktivieren",
+ "Permalink": "Permanenter Link",
+ "Off": "Aus",
+ "Riot does not know how to join a room on this network": "Riot weiß nicht, wie es einem Raum auf diesem Netzwerk beitreten soll",
+ "Mentions only": "Nur, wenn du erwähnt wirst",
+ "You can now return to your account after signing out, and sign in on other devices.": "Du kannst nun zu deinem Benutzerkonto zurückkehren, nachdem du dich abgemeldet hast. Anschließend kannst du dich an anderen Geräten anmelden.",
+ "Enable email notifications": "E-Mail-Benachrichtigungen aktivieren",
+ "Event Type": "Event-Typ",
+ "Download this file": "Datei herunterladen",
+ "Pin Message": "Nachricht anheften",
+ "Failed to change settings": "Einstellungen konnten nicht geändert werden",
+ "View Community": "Community ansehen",
+ "%(count)s Members|one": "%(count)s Mitglied",
+ "Event sent!": "Event gesendet!",
+ "View Source": "Quellcode ansehen",
+ "Event Content": "Event-Inhalt",
+ "Thank you!": "Danke!",
+ "Uploaded on %(date)s by %(user)s": "Hochgeladen: %(date)s von %(user)s",
+ "Collapse panel": "Panel einklappen",
+ "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!": "In deinem aktuell verwendeten Browser können Aussehen und Handhabung der Anwendung unter Umständen noch komplett fehlerhaft sein, so dass einige bzw. im Extremfall alle Funktionen nicht zur Verfügung stehen. Du kannst es trotzdem versuchen und fortfahren, bist dabei aber bezüglich aller auftretenden Probleme auf dich allein gestellt!",
+ "Checking for an update...": "Nach Updates suchen...",
+ "There are advanced notifications which are not shown here": "Es existieren erweiterte Benachrichtigungen, welche hier nicht angezeigt werden"
}
diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json
index ab16f215bcd..b5acd8855ee 100644
--- a/src/i18n/strings/el.json
+++ b/src/i18n/strings/el.json
@@ -36,7 +36,6 @@
"Attachment": "Επισύναψη",
"%(senderName)s banned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.",
"Autoplay GIFs and videos": "Αυτόματη αναπαραγωγή GIFs και βίντεο",
- "Bug Report": "Αναφορά σφάλματος",
"Anyone who knows the room's link, apart from guests": "Oποιοσδήποτε",
"%(items)s and %(lastItem)s": "%(items)s %(lastItem)s",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ένα μήνυμα στάλθηκε στο +%(msisdn)s. Παρακαλώ γράψε τον κωδικό επαλήθευσης που περιέχει",
@@ -117,7 +116,6 @@
"Forgot your password?": "Ξεχάσατε τoν κωδικό πρόσβασης σας;",
"For security, this session has been signed out. Please sign in again.": "Για λόγους ασφαλείας, αυτή η συνεδρία έχει τερματιστεί. Παρακαλούμε συνδεθείτε ξανά.",
"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.": "Για λόγους ασφαλείας, τα κλειδιά κρυπτογράφησης θα διαγράφονται από τον περιηγητή κατά την αποσύνδεση σας. Εάν επιθυμείτε να αποκρυπτογραφήσετε τις συνομιλίες σας στο μέλλον, εξάγετε τα κλειδιά σας και κρατήστε τα ασφαλή.",
- "Found a bug?": "Βρήκατε κάποιο πρόβλημα;",
"Hangup": "Κλείσιμο",
"Historical": "Ιστορικό",
"Homeserver is": "Ο διακομιστής είναι",
@@ -262,7 +260,6 @@
"Remote addresses for this room:": "Απομακρυσμένες διευθύνσεις για το δωμάτιο:",
"Remove Contact Information?": "Αφαίρεση πληροφοριών επαφής;",
"Remove %(threePid)s?": "Αφαίρεση %(threePid)s;",
- "Report it": "Αναφορά",
"Results from DuckDuckGo": "Αποτελέσματα από DuckDuckGo",
"Return to login screen": "Επιστροφή στην οθόνη σύνδεσης",
"Room %(roomId)s not visible": "Το δωμάτιο %(roomId)s δεν είναι ορατό",
@@ -643,5 +640,137 @@
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Η ανεπιβεβαίωτη συσκευή σας '%(displayName)s' ζητά κλειδιά κρυπτογράφησης.",
"Encryption key request": "Αίτημα κλειδιού κρυπτογράφησης",
"Updates": "Ενημερώσεις",
- "Check for update": "Έλεγχος για ενημέρωση"
+ "Check for update": "Έλεγχος για ενημέρωση",
+ "Fetching third party location failed": "Η λήψη τοποθεσίας απέτυχε",
+ "A new version of Riot is available.": "Μία νέα έκδοση του Riot είναι διαθέσιμη.",
+ "All notifications are currently disabled for all targets.": "Όλες οι ειδοποιήσεις είναι προς το παρόν απενεργοποιημένες για όλες τις συσκευές.",
+ "Uploading report": "Αποστολή αναφοράς",
+ "Sunday": "Κυριακή",
+ "Guests can join": "Επισκέπτες μπορούν να συνδεθούν",
+ "Failed to add tag %(tagName)s to room": "Δεν ήταν δυνατή η προσθήκη της ετικέτας %(tagName)s στο δωμάτιο",
+ "Notification targets": "Στόχοι ειδοποιήσεων",
+ "Failed to set direct chat tag": "Δεν ήταν δυνατός ο χαρακτηρισμός της συνομιλίας ως 1-προς-1",
+ "Today": "Σήμερα",
+ "Files": "Αρχεία",
+ "You are not receiving desktop notifications": "Δεν λαμβάνετε ειδοποιήσεις στην επιφάνεια εργασίας",
+ "Friday": "Παρασκευή",
+ "Update": "Ενημέρωση",
+ "Riot does not know how to join a room on this network": "To Riot δεν γνωρίζει πως να συνδεθεί σε δωμάτια που ανήκουν σ' αυτό το δίκτυο",
+ "Add an email address above to configure email notifications": "Προσθέστε μια διεύθυνση ηλεκτρονικής αλληλογραφίας στο παραπάνω πεδίο, για να έχετε τη δυνατότητα να λαμβάνετε ειδοποιήσεις",
+ "Expand panel": "Μεγιστοποίηση καρτέλας",
+ "On": "Ενεργό",
+ "Filter room names": "Φιλτράρισμα δωματίων",
+ "Changelog": "Αλλαγές",
+ "Waiting for response from server": "Αναμονή απάντησης από τον διακομιστή",
+ "Leave": "Αποχώρηση",
+ "Uploaded on %(date)s by %(user)s": "Απεστάλη στις %(date)s από %(user)s",
+ "Advanced notification settings": "Προχωρημένες ρυθμίσεις ειδοποιήσεων",
+ "delete the alias.": "διέγραψε το ψευδώνυμο.",
+ "To return to your account in future you need to set a password": "Για να επιστρέψετε στον λογαριασμό σας μελλοντικα πρέπει να ορίσετε έναν κωδικό πρόσβασης",
+ "Forget": "Παράλειψη",
+ "World readable": "Εμφανές σε όλους",
+ "Hide panel": "Απόκρυψη καρτέλας",
+ "You cannot delete this image. (%(code)s)": "Δεν μπορείτε να διαγράψετε αυτή την εικόνα. (%(code)s)",
+ "Cancel Sending": "Ακύρωση αποστολής",
+ "Warning": "Προειδοποίηση",
+ "This Room": "Στο δωμάτιο",
+ "The Home Server may be too old to support third party networks": "Ο διακομιστής μπορεί να είναι αρκετά παλιός για να υποστηρίζει δίκτυα τρίτων",
+ "Resend": "Αποστολή ξανά",
+ "Room not found": "Το δωμάτιο δεν βρέθηκε",
+ "Messages containing my display name": "Μηνύματα που περιέχουν το όνομα μου",
+ "Messages in one-to-one chats": "Μηνύματα σε 1-προς-1 συνομιλίες",
+ "Unavailable": "Μη διαθέσιμο",
+ "View Decrypted Source": "Προβολή του αποκρυπτογραφημένου κώδικα",
+ "Send": "Αποστολή",
+ "remove %(name)s from the directory.": "αφαίρεση του %(name)s από το ευρετήριο.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Οι ειδοποιήσεις για τις επόμενες λέξεις κλειδία ακολουθούν κανόνες που δεν είναι δυνατόν να εμφανιστούν εδώ:",
+ "Please set a password!": "Παρακαλούμε ορίστε έναν κωδικό πρόσβασης!",
+ "You have successfully set a password!": "Ο κωδικός πρόσβασης ορίστηκε επιτυχώς!",
+ "An error occurred whilst saving your email notification preferences.": "Ένα σφάλμα προέκυψε κατά την αποθήκευση των ρυθμίσεων σας.",
+ "Source URL": "Πηγαίο URL",
+ "Messages sent by bot": "Μηνύματα από bots",
+ "Members": "Μέλη",
+ "No update available.": "Δεν υπάρχει διαθέσιμη ενημέρωση.",
+ "Noisy": "Δυνατά",
+ "Failed to get protocol list from Home Server": "Δεν ήταν δυνατή η εύρεση των διαθέσιμων πρωτοκόλλων από το διακομιστή",
+ "Collecting app version information": "Συγκέντρωση πληροφοριών σχετικά με την έκδοση της εφαρμογής",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Διαγραφή του ψευδώνυμου %(alias)s και αφαίρεση του %(name)s από το ευρετήριο;",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Αυτό θα σας επιτρέψει να επιστρέψετε στον λογαριασμό σας αφού αποσυνδεθείτε και συνδεθείτε από άλλες συσκευές.",
+ "Keywords": "Λέξεις κλειδιά",
+ "Enable notifications for this account": "Ενεργοποίηση ειδοποιήσεων για τον λογαριασμό",
+ "Directory": "Ευρετήριο",
+ "Search for a room": "Αναζήτηση δωματίου",
+ "Messages containing keywords": "Μηνύματα που περιέχουν λέξεις κλειδιά",
+ "Error saving email notification preferences": "Σφάλμα κατά την αποθήκευση των προτιμήσεων",
+ "Tuesday": "Τρίτη",
+ "Enter keywords separated by a comma:": "Προσθέστε λέξεις κλειδιά χωρισμένες με κόμμα:",
+ "I understand the risks and wish to continue": "Κατανοώ του κινδύνους και επιθυμώ να συνεχίσω",
+ "Remove %(name)s from the directory?": "Αφαίρεση του %(name)s από το ευρετήριο;",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Το Riot χρησιμοποιεί αρκετά προχωρημένα χαρακτηριστικά των περιηγητών Ιστού, ορισμένα από τα οποία δεν είναι διαθέσιμα ή είναι σε πειραματικό στάδιο στον περιηγητή σας.",
+ "Unnamed room": "Ανώνυμο δωμάτιο",
+ "Remove from Directory": "Αφαίρεση από το ευρετήριο",
+ "Saturday": "Σάββατο",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Να θυμάστε ότι μπορείτε πάντα να ορίσετε μια διεύθυνση ηλεκτρονικής αλληλογραφίας στις ρυθμίσεις χρήστη αν αλλάξετε γνώμη.",
+ "Direct Chat": "Απευθείας συνομιλία",
+ "The server may be unavailable or overloaded": "Ο διακομιστής είναι μη διαθέσιμος ή υπερφορτωμένος",
+ "Reject": "Απόρριψη",
+ "Failed to set Direct Message status of room": "Δεν ήταν δυνατός ο ορισμός της κατάστασης Direct Message του δωματίου",
+ "Monday": "Δευτέρα",
+ "All messages (noisy)": "Όλα τα μηνύματα (δυνατά)",
+ "Enable them now": "Ενεργοποίηση",
+ "Forward Message": "Προώθηση",
+ "Messages containing my user name": "Μηνύματα που περιέχουν το ψευδώνυμο μου",
+ "Collecting logs": "Συγκέντρωση πληροφοριών",
+ "more": "περισσότερα",
+ "Failed to get public room list": "Δεν ήταν δυνατή η λήψη της λίστας με τα δημόσια δωμάτια",
+ "(HTTP status %(httpStatus)s)": "(Κατάσταση HTTP %(httpStatus)s)",
+ "All Rooms": "Όλα τα δωμάτια",
+ "Wednesday": "Τετάρτη",
+ "Failed to update keywords": "Οι λέξεις κλειδιά δεν ενημερώθηκαν",
+ "Send logs": "Αποστολή πληροφοριών",
+ "All messages": "Όλα τα μηνύματα",
+ "Call invitation": "Πρόσκληση σε κλήση",
+ "Downloading update...": "Γίνεται λήψη της ενημέρωσης...",
+ "You have successfully set a password and an email address!": "Ο κωδικός πρόσβασης και η διεύθυνση ηλεκτρονικής αλληλογραφίας ορίστηκαν επιτυχώς!",
+ "What's new?": "Τι νέο υπάρχει;",
+ "Notify me for anything else": "Ειδοποίηση για οτιδήποτε άλλο",
+ "When I'm invited to a room": "Όταν με προσκαλούν σ' ένα δωμάτιο",
+ "Can't update user notification settings": "Δεν είναι δυνατή η ενημέρωση των ρυθμίσεων ειδοποίησης χρήστη",
+ "Notify for all other messages/rooms": "Ειδοποίηση για όλα τα υπόλοιπα μηνύματα/δωμάτια",
+ "Unable to look up room ID from server": "Δεν είναι δυνατή η εύρεση του ID για το δωμάτιο",
+ "Couldn't find a matching Matrix room": "Δεν βρέθηκε κάποιο δωμάτιο",
+ "Invite to this room": "Πρόσκληση σε αυτό το δωμάτιο",
+ "You cannot delete this message. (%(code)s)": "Δεν μπορείτε να διαγράψετε αυτό το μήνυμα. (%(code)s)",
+ "Thursday": "Πέμπτη",
+ "Search…": "Αναζήτηση…",
+ "Unhide Preview": "Προεπισκόπηση",
+ "Unable to join network": "Δεν είναι δυνατή η σύνδεση στο δίκτυο",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Ισως να έχετε κάνει τις ρυθμίσεις σε άλλη εφαρμογή εκτός του Riot. Δεν μπορείτε να τις αλλάξετε μέσω του Riot αλλά ισχύουν κανονικά",
+ "Sorry, your browser is not able to run Riot.": "Λυπούμαστε, αλλά ο περιηγητές σας δεν υποστηρίζεται από το Riot.",
+ "Messages in group chats": "Μηνύματα σε ομαδικές συνομιλίες",
+ "Yesterday": "Χθές",
+ "Error encountered (%(errorDetail)s).": "Παρουσιάστηκε σφάλμα (%(errorDetail)s).",
+ "Low Priority": "Χαμηλή προτεραιότητα",
+ "What's New": "Τι νέο υπάρχει",
+ "Set Password": "Ορισμός κωδικού πρόσβασης",
+ "Enable audible notifications in web client": "Ενεργοποίηση ηχητικών ειδοποιήσεων",
+ "Permalink": "Μόνιμος σύνδεσμος",
+ "Off": "Ανενεργό",
+ "#example": "#παράδειγμα",
+ "Mentions only": "Μόνο αναφορές",
+ "Failed to remove tag %(tagName)s from room": "Δεν ήταν δυνατή η διαγραφή της ετικέτας %(tagName)s από το δωμάτιο",
+ "You can now return to your account after signing out, and sign in on other devices.": "Μπορείτε να επιστρέψετε στον λογαριασμό σας αφού αποσυνδεθείτε και συνδεθείτε από άλλες συσκευές.",
+ "Enable desktop notifications": "Ενεργοποίηση ειδοποιήσεων στην επιφάνεια εργασίας",
+ "Enable email notifications": "Ενεργοποίηση ειδοποιήσεων μέσω μηνυμάτων ηλ. αλληλογραφίας",
+ "Login": "Σύνδεση",
+ "No rooms to show": "Δεν υπάρχουν δωμάτια για εμφάνιση",
+ "Download this file": "Λήψη αρχείου",
+ "Failed to change settings": "Δεν ήταν δυνατή η αλλαγή των ρυθμίσεων",
+ "View Source": "Προβολή κώδικα",
+ "Unable to fetch notification target list": "Δεν ήταν δυνατή η εύρεση στόχων για τις ειδοποιήσεις",
+ "Quote": "Παράθεση",
+ "Collapse 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!": "Με τον τρέχον περιηγητή, η εμφάνιση και η αίσθηση της εφαρμογής ενδέχεται να είναι εντελώς εσφαλμένη και ορισμένες ή όλες οι λειτουργίες ενδέχεται να μην λειτουργούν. Εάν θέλετε να το δοκιμάσετε ούτως ή άλλως μπορείτε να συνεχίσετε, αλλά είστε μόνοι σας σε ό, τι αφορά τα προβλήματα που μπορεί να αντιμετωπίσετε!",
+ "Checking for an update...": "Γίνεται έλεγχος για ενημέρωση...",
+ "There are advanced notifications which are not shown here": "Υπάρχουν προχωρημένες ειδοποιήσεις οι οποίες δεν εμφανίζονται εδώ"
}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 725ddbaa2f6..4422c754d56 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -100,6 +100,7 @@
"You need to be logged in.": "You need to be logged in.",
"You need to be able to invite users to do that.": "You need to be able to invite users to do that.",
"Unable to create widget.": "Unable to create widget.",
+ "Missing roomId.": "Missing roomId.",
"Failed to send request.": "Failed to send request.",
"This room is not recognised.": "This room is not recognised.",
"Power level must be positive integer.": "Power level must be positive integer.",
@@ -187,6 +188,8 @@
"Message Replies": "Message Replies",
"Message Pinning": "Message Pinning",
"Presence Management": "Presence Management",
+ "Tag Panel": "Tag Panel",
+ "Sticker Messages": "Sticker Messages",
"Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing",
"Use compact timeline layout": "Use compact timeline layout",
"Hide removed messages": "Hide removed messages",
@@ -212,6 +215,17 @@
"Enable URL previews for this room (only affects you)": "Enable URL previews for this room (only affects you)",
"Enable URL previews by default for participants in this room": "Enable URL previews by default for participants in this room",
"Room Colour": "Room Colour",
+ "Collecting app version information": "Collecting app version information",
+ "Collecting logs": "Collecting logs",
+ "Uploading report": "Uploading report",
+ "Waiting for response from server": "Waiting for response from server",
+ "Messages containing my display name": "Messages containing my display name",
+ "Messages containing my user name": "Messages containing my user name",
+ "Messages in one-to-one chats": "Messages in one-to-one chats",
+ "Messages in group chats": "Messages in group chats",
+ "When I'm invited to a room": "When I'm invited to a room",
+ "Call invitation": "Call invitation",
+ "Messages sent by bot": "Messages sent by bot",
"Active call (%(roomName)s)": "Active call (%(roomName)s)",
"unknown caller": "unknown caller",
"Incoming voice call from %(name)s": "Incoming voice call from %(name)s",
@@ -253,16 +267,36 @@
"Failed to set display name": "Failed to set display name",
"Disable Notifications": "Disable Notifications",
"Enable Notifications": "Enable Notifications",
+ "Error saving email notification preferences": "Error saving email notification preferences",
+ "An error occurred whilst saving your email notification preferences.": "An error occurred whilst saving your email notification preferences.",
+ "Keywords": "Keywords",
+ "Enter keywords separated by a comma:": "Enter keywords separated by a comma:",
+ "OK": "OK",
+ "Failed to change settings": "Failed to change settings",
+ "Can't update user notification settings": "Can't update user notification settings",
+ "Failed to update keywords": "Failed to update keywords",
+ "Messages containing keywords": "Messages containing keywords",
+ "Notify for all other messages/rooms": "Notify for all other messages/rooms",
+ "Notify me for anything else": "Notify me for anything else",
+ "Enable notifications for this account": "Enable notifications for this account",
+ "All notifications are currently disabled for all targets.": "All notifications are currently disabled for all targets.",
+ "Add an email address above to configure email notifications": "Add an email address above to configure email notifications",
+ "Enable email notifications": "Enable email notifications",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Notifications on the following keywords follow rules which can’t be displayed here:",
+ "Unable to fetch notification target list": "Unable to fetch notification target list",
+ "Notification targets": "Notification targets",
+ "Advanced notification settings": "Advanced notification settings",
+ "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply",
+ "Enable desktop notifications": "Enable desktop notifications",
+ "Show message in desktop notification": "Show message in desktop notification",
+ "Enable audible notifications in web client": "Enable audible notifications in web client",
+ "Off": "Off",
+ "On": "On",
+ "Noisy": "Noisy",
"Cannot add any more widgets": "Cannot add any more widgets",
"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.",
"Add a widget": "Add a widget",
- "Stickerpack": "Stickerpack",
- "Sticker Messages": "Sticker Messages",
- "You don't currently have any stickerpacks enabled": "You don't currently have any stickerpacks enabled",
- "Click": "Click",
- "here": "here",
- "to add some!": "to add some!",
- "Add a stickerpack": "Add a stickerpack",
"Drop File Here": "Drop File Here",
"Drop file here to upload": "Drop file here to upload",
" (unsupported)": " (unsupported)",
@@ -330,10 +364,6 @@
"Hangup": "Hangup",
"Voice call": "Voice call",
"Video call": "Video call",
- "Hide Apps": "Hide Apps",
- "Show Apps": "Show Apps",
- "Hide Stickers": "Hide Stickers",
- "Show Stickers": "Show Stickers",
"Upload file": "Upload file",
"Show Text Formatting Toolbar": "Show Text Formatting Toolbar",
"Send an encrypted reply…": "Send an encrypted reply…",
@@ -480,7 +510,15 @@
"Advanced": "Advanced",
"This room's internal ID is": "This room's internal ID is",
"Add a topic": "Add a topic",
+ "Search…": "Search…",
+ "This Room": "This Room",
+ "All Rooms": "All Rooms",
"Cancel": "Cancel",
+ "You don't currently have any stickerpacks enabled": "You don't currently have any stickerpacks enabled",
+ "Add a stickerpack": "Add a stickerpack",
+ "Stickerpack": "Stickerpack",
+ "Hide Stickers": "Hide Stickers",
+ "Show Stickers": "Show Stickers",
"Scroll to unread messages": "Scroll to unread messages",
"Jump to first unread message.": "Jump to first unread message.",
"Close": "Close",
@@ -507,6 +545,15 @@
"URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.",
"URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.",
"URL Previews": "URL Previews",
+ "Sunday": "Sunday",
+ "Monday": "Monday",
+ "Tuesday": "Tuesday",
+ "Wednesday": "Wednesday",
+ "Thursday": "Thursday",
+ "Friday": "Friday",
+ "Saturday": "Saturday",
+ "Today": "Today",
+ "Yesterday": "Yesterday",
"Error decrypting audio": "Error decrypting audio",
"Error decrypting attachment": "Error decrypting attachment",
"Decrypt %(text)s": "Decrypt %(text)s",
@@ -584,16 +631,29 @@
"Something went wrong when trying to get your communities.": "Something went wrong when trying to get your communities.",
"Display your community flair in rooms configured to show it.": "Display your community flair in rooms configured to show it.",
"You're not currently a member of any communities.": "You're not currently a member of any communities.",
+ "You are not receiving desktop notifications": "You are not receiving desktop notifications",
+ "Enable them now": "Enable them now",
+ "What's New": "What's New",
+ "Update": "Update",
+ "What's new?": "What's new?",
+ "A new version of Riot is available.": "A new version of Riot is available.",
+ "To return to your account in future you need to set a password": "To return to your account in future you need to set a password",
+ "Set Password": "Set Password",
+ "Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).",
+ "Checking for an update...": "Checking for an update...",
+ "No update available.": "No update available.",
+ "Downloading update...": "Downloading update...",
+ "Warning": "Warning",
"Unknown Address": "Unknown Address",
"NOTE: Apps are not end-to-end encrypted": "NOTE: Apps are not end-to-end encrypted",
"Do you want to load widget from URL:": "Do you want to load widget from URL:",
"Allow": "Allow",
- "Manage sticker packs": "Manage sticker packs",
"Delete Widget": "Delete Widget",
"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?",
"Delete widget": "Delete widget",
"Revoke widget access": "Revoke widget access",
"Minimize apps": "Minimize apps",
+ "Picture": "Picture",
"Edit": "Edit",
"Create new room": "Create new room",
"Unblacklist": "Unblacklist",
@@ -604,6 +664,9 @@
"Delete": "Delete",
"Communities": "Communities",
"Home": "Home",
+ "You cannot delete this image. (%(code)s)": "You cannot delete this image. (%(code)s)",
+ "Uploaded on %(date)s by %(user)s": "Uploaded on %(date)s by %(user)s",
+ "Download this file": "Download this file",
"Integrations Error": "Integrations Error",
"Could not connect to the integration server": "Could not connect to the integration server",
"Manage Integrations": "Manage Integrations",
@@ -674,6 +737,19 @@
"email address": "email address",
"Try using one of the following valid address types: %(validTypesList)s.": "Try using one of the following valid address types: %(validTypesList)s.",
"You have entered an invalid address.": "You have entered an invalid address.",
+ "Preparing to send logs": "Preparing to send logs",
+ "Bug report sent": "Bug report sent",
+ "Logs sent": "Logs sent",
+ "Thank you!": "Thank you!",
+ "Failed to send logs: ": "Failed to send logs: ",
+ "Submit debug logs": "Submit debug logs",
+ "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Debug 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.",
+ "Click here to create a GitHub issue.": "Click here to create a GitHub issue.",
+ "GitHub issue link:": "GitHub issue link:",
+ "Notes:": "Notes:",
+ "Send logs": "Send logs",
+ "Unavailable": "Unavailable",
+ "Changelog": "Changelog",
"Create a new chat or reuse an existing one": "Create a new chat or reuse an existing one",
"Start new chat": "Start new chat",
"You already have existing direct chats with this user:": "You already have existing direct chats with this user:",
@@ -708,8 +784,21 @@
"In future this verification process will be more sophisticated.": "In future this verification process will be more sophisticated.",
"Verify device": "Verify device",
"I verify that the keys match": "I verify that the keys match",
+ "Back": "Back",
+ "Send Custom Event": "Send Custom Event",
+ "You must specify an event type!": "You must specify an event type!",
+ "Event sent!": "Event sent!",
+ "Failed to send custom event.": "Failed to send custom event.",
+ "Event Type": "Event Type",
+ "State Key": "State Key",
+ "Event Content": "Event Content",
+ "Send Account Data": "Send Account Data",
+ "Filter results": "Filter results",
+ "Explore Room State": "Explore Room State",
+ "Explore Account Data": "Explore Account Data",
+ "Toolbox": "Toolbox",
+ "Developer Tools": "Developer Tools",
"An error has occurred.": "An error has occurred.",
- "OK": "OK",
"You added a new device '%(displayName)s', which is requesting encryption keys.": "You added a new device '%(displayName)s', which is requesting encryption keys.",
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Your unverified device '%(displayName)s' is requesting encryption keys.",
"Start verification": "Start verification",
@@ -738,6 +827,14 @@
"To get started, please pick a username!": "To get started, please pick a username!",
"This will be your account name on the homeserver, or you can pick a different server.": "This will be your account name on the homeserver, or you can pick a different server.",
"If you already have a Matrix account you can log in instead.": "If you already have a Matrix account you can log in instead.",
+ "You have successfully set a password!": "You have successfully set a password!",
+ "You have successfully set a password and an email address!": "You have successfully set a password and an email address!",
+ "You can now return to your account after signing out, and sign in on other devices.": "You can now return to your account after signing out, and sign in on other devices.",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Remember, you can always set an email address in user settings if you change your mind.",
+ "Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?",
+ "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)",
+ "Please set a password!": "Please set a password!",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.",
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.",
"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.": "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.",
"Room contains unknown devices": "Room contains unknown devices",
@@ -747,6 +844,36 @@
"Public Chat": "Public Chat",
"Custom": "Custom",
"Alias (optional)": "Alias (optional)",
+ "You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)",
+ "Resend": "Resend",
+ "Cancel Sending": "Cancel Sending",
+ "Forward Message": "Forward Message",
+ "Reply": "Reply",
+ "Pin Message": "Pin Message",
+ "View Source": "View Source",
+ "View Decrypted Source": "View Decrypted Source",
+ "Unhide Preview": "Unhide Preview",
+ "Permalink": "Permalink",
+ "Quote": "Quote",
+ "Source URL": "Source URL",
+ "Away": "Away",
+ "Appear Offline": "Appear Offline",
+ "Failed to set Direct Message status of room": "Failed to set Direct Message status of room",
+ "All messages (noisy)": "All messages (noisy)",
+ "All messages": "All messages",
+ "Mentions only": "Mentions only",
+ "Leave": "Leave",
+ "Forget": "Forget",
+ "Reject": "Reject",
+ "Low Priority": "Low Priority",
+ "Direct Chat": "Direct Chat",
+ "View Community": "View Community",
+ "Sorry, your browser is not able to run Riot.": "Sorry, your browser is not able to run Riot.",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.",
+ "Please install Chrome or Firefox for the best experience.": "Please install Chrome or Firefox for the best experience.",
+ "Safari and Opera work too.": "Safari and Opera work too.",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!",
+ "I understand the risks and wish to continue": "I understand the risks and wish to continue",
"Name": "Name",
"Topic": "Topic",
"Make this room private": "Make this room private",
@@ -776,7 +903,6 @@
"Unable to join community": "Unable to join community",
"Leave Community": "Leave Community",
"Leave %(groupName)s?": "Leave %(groupName)s?",
- "Leave": "Leave",
"Unable to leave community": "Unable to leave community",
"Community Settings": "Community Settings",
"Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.",
@@ -786,17 +912,19 @@
"Featured Users:": "Featured Users:",
"%(inviter)s has invited you to join this community": "%(inviter)s has invited you to join this community",
"Join this community": "Join this community",
+ "Leave this community": "Leave this community",
"You are an administrator of this community": "You are an administrator of this community",
"You are a member of this community": "You are a member of this community",
"Who can join this community?": "Who can join this community?",
"Everyone": "Everyone",
- "Leave this community": "Leave this community",
"Your community hasn't got a Long Description, a HTML page to show to community members. Click here to open settings and give it one!": "Your community hasn't got a Long Description, a HTML page to show to community members. Click here to open settings and give it one!",
"Long Description (HTML)": "Long Description (HTML)",
"Description": "Description",
"Community %(groupId)s not found": "Community %(groupId)s not found",
"This Home server does not support communities": "This Home server does not support communities",
"Failed to load %(groupId)s": "Failed to load %(groupId)s",
+ "Couldn't load home page": "Couldn't load home page",
+ "Login": "Login",
"Reject invitation": "Reject invitation",
"Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?",
"Failed to reject invitation": "Failed to reject invitation",
@@ -817,6 +945,32 @@
"Join an existing community": "Join an existing community",
"To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.",
"You have no visible notifications": "You have no visible notifications",
+ "Members": "Members",
+ "%(count)s Members|other": "%(count)s Members",
+ "%(count)s Members|one": "%(count)s Member",
+ "Invite to this room": "Invite to this room",
+ "Files": "Files",
+ "Notifications": "Notifications",
+ "Hide panel": "Hide panel",
+ "Invite to this community": "Invite to this community",
+ "Failed to get protocol list from Home Server": "Failed to get protocol list from Home Server",
+ "The Home Server may be too old to support third party networks": "The Home Server may be too old to support third party networks",
+ "Failed to get public room list": "Failed to get public room list",
+ "The server may be unavailable or overloaded": "The server may be unavailable or overloaded",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Delete the room alias %(alias)s and remove %(name)s from the directory?",
+ "Remove %(name)s from the directory?": "Remove %(name)s from the directory?",
+ "Remove from Directory": "Remove from Directory",
+ "remove %(name)s from the directory.": "remove %(name)s from the directory.",
+ "delete the alias.": "delete the alias.",
+ "Unable to join network": "Unable to join network",
+ "Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network",
+ "Room not found": "Room not found",
+ "Couldn't find a matching Matrix room": "Couldn't find a matching Matrix room",
+ "Fetching third party location failed": "Fetching third party location failed",
+ "Unable to look up room ID from server": "Unable to look up room ID from server",
+ "Directory": "Directory",
+ "Search for a room": "Search for a room",
+ "#example": "#example",
"Scroll to bottom of page": "Scroll to bottom of page",
"Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present",
"Show devices, send anyway or cancel.": "Show devices, send anyway or cancel.",
@@ -824,13 +978,13 @@
"%(count)s of your messages have not been sent.|one": "Your message was not sent.",
"%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Resend all or cancel all now. You can also select individual messages to resend or cancel.",
"%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Resend message or cancel message now.",
- "Warning": "Warning",
"Connectivity to the server has been lost.": "Connectivity to the server has been lost.",
"Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.",
"%(count)s new messages|other": "%(count)s new messages",
"%(count)s new messages|one": "%(count)s new message",
"Active call": "Active call",
"There's no one else here! Would you like to invite others or stop warning about the empty room?": "There's no one else here! Would you like to invite others or stop warning about the empty room?",
+ "more": "more",
"You seem to be uploading files, are you sure you want to quit?": "You seem to be uploading files, are you sure you want to quit?",
"You seem to be in a call, are you sure you want to quit?": "You seem to be in a call, are you sure you want to quit?",
"Failed to upload file": "Failed to upload file",
@@ -847,6 +1001,9 @@
"Click to mute video": "Click to mute video",
"Click to unmute audio": "Click to unmute audio",
"Click to mute audio": "Click to mute audio",
+ "Expand panel": "Expand panel",
+ "Collapse panel": "Collapse panel",
+ "Filter room names": "Filter room names",
"Clear filter": "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.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.",
@@ -861,7 +1018,6 @@
"Server may be unavailable or overloaded": "Server may be unavailable or overloaded",
"Sign out": "Sign out",
"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.": "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.",
- "Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?",
"Success": "Success",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them",
"Remove Contact Information?": "Remove Contact Information?",
@@ -879,7 +1035,6 @@
"Ignored Users": "Ignored Users",
"Debug Logs Submission": "Debug Logs Submission",
"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 contian messages.": "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 contian messages.",
- "Submit debug logs": "Submit debug logs",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot collects anonymous analytics to allow us to improve the application.",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.",
"Learn more about how we use analytics.": "Learn more about how we use analytics.",
@@ -906,7 +1061,6 @@
"VoIP": "VoIP",
"Email": "Email",
"Add email address": "Add email address",
- "Notifications": "Notifications",
"Profile": "Profile",
"Display name": "Display name",
"Account": "Account",
diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json
index 2ce5cb541bf..a3184fdc384 100644
--- a/src/i18n/strings/en_US.json
+++ b/src/i18n/strings/en_US.json
@@ -46,7 +46,6 @@
"Banned users": "Banned users",
"Bans user with given id": "Bans user with given id",
"Blacklisted": "Blacklisted",
- "Bug Report": "Bug Report",
"Bulk Options": "Bulk Options",
"Call Timeout": "Call Timeout",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.",
@@ -159,12 +158,10 @@
"Forgot your password?": "Forgot your password?",
"For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.",
"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.": "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.",
- "Found a bug?": "Found a bug?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.",
"Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.",
"Hangup": "Hangup",
- "Hide Apps": "Hide Apps",
"Hide read receipts": "Hide read receipts",
"Hide Text Formatting Toolbar": "Hide Text Formatting Toolbar",
"Historical": "Historical",
@@ -282,7 +279,6 @@
"Remove": "Remove",
"Remove %(threePid)s?": "Remove %(threePid)s?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.",
- "Report it": "Report it",
"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.": "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.",
"Results from DuckDuckGo": "Results from DuckDuckGo",
"Return to login screen": "Return to login screen",
@@ -314,7 +310,6 @@
"%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.",
"Settings": "Settings",
- "Show Apps": "Show Apps",
"Show panel": "Show panel",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)",
"Signed Out": "Signed Out",
@@ -710,5 +705,140 @@
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s",
"Robot check is currently unavailable on desktop - please use a web browser": "Robot check is currently unavailable on desktop - please use a web browser",
"Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple",
- "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room."
+ "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.",
+ "Fetching third party location failed": "Fetching third party location failed",
+ "A new version of Riot is available.": "A new version of Riot is available.",
+ "Couldn't load home page": "Couldn't load home page",
+ "All notifications are currently disabled for all targets.": "All notifications are currently disabled for all targets.",
+ "Uploading report": "Uploading report",
+ "Sunday": "Sunday",
+ "Guests can join": "Guests can join",
+ "Messages sent by bot": "Messages sent by bot",
+ "Notification targets": "Notification targets",
+ "Failed to set direct chat tag": "Failed to set direct chat tag",
+ "Today": "Today",
+ "Failed to get protocol list from Home Server": "Failed to get protocol list from Home Server",
+ "You are not receiving desktop notifications": "You are not receiving desktop notifications",
+ "Friday": "Friday",
+ "Update": "Update",
+ "What's New": "What's New",
+ "Add an email address above to configure email notifications": "Add an email address above to configure email notifications",
+ "Expand panel": "Expand panel",
+ "On": "On",
+ "Filter room names": "Filter room names",
+ "Changelog": "Changelog",
+ "Waiting for response from server": "Waiting for response from server",
+ "Leave": "Leave",
+ "Advanced notification settings": "Advanced notification settings",
+ "delete the alias.": "delete the alias.",
+ "To return to your account in future you need to set a password": "To return to your account in future you need to set a password",
+ "Forget": "Forget",
+ "World readable": "World readable",
+ "#example": "#example",
+ "Hide panel": "Hide panel",
+ "You cannot delete this image. (%(code)s)": "You cannot delete this image. (%(code)s)",
+ "Cancel Sending": "Cancel Sending",
+ "Warning": "Warning",
+ "This Room": "This Room",
+ "The Home Server may be too old to support third party networks": "The Home Server may be too old to support third party networks",
+ "Noisy": "Noisy",
+ "Room not found": "Room not found",
+ "Messages containing my display name": "Messages containing my display name",
+ "Messages in one-to-one chats": "Messages in one-to-one chats",
+ "Unavailable": "Unavailable",
+ "View Decrypted Source": "View Decrypted Source",
+ "Failed to update keywords": "Failed to update keywords",
+ "remove %(name)s from the directory.": "remove %(name)s from the directory.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Notifications on the following keywords follow rules which can’t be displayed here:",
+ "Please set a password!": "Please set a password!",
+ "You have successfully set a password!": "You have successfully set a password!",
+ "An error occurred whilst saving your email notification preferences.": "An error occurred while saving your email notification preferences.",
+ "Source URL": "Source URL",
+ "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room",
+ "Members": "Members",
+ "No update available.": "No update available.",
+ "Resend": "Resend",
+ "Files": "Files",
+ "Collecting app version information": "Collecting app version information",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Delete the room alias %(alias)s and remove %(name)s from the directory?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.",
+ "Keywords": "Keywords",
+ "Unpin Message": "Unpin Message",
+ "Enable notifications for this account": "Enable notifications for this account",
+ "Directory": "Directory",
+ "Failed to get public room list": "Failed to get public room list",
+ "Messages containing keywords": "Messages containing keywords",
+ "Error saving email notification preferences": "Error saving email notification preferences",
+ "Tuesday": "Tuesday",
+ "Enter keywords separated by a comma:": "Enter keywords separated by a comma:",
+ "Search…": "Search…",
+ "Remove %(name)s from the directory?": "Remove %(name)s from the directory?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.",
+ "Enable desktop notifications": "Enable desktop notifications",
+ "Unnamed room": "Unnamed room",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Remember, you can always set an email address in user settings if you change your mind.",
+ "All messages (noisy)": "All messages (noisy)",
+ "Saturday": "Saturday",
+ "I understand the risks and wish to continue": "I understand the risks and wish to continue",
+ "Direct Chat": "Direct Chat",
+ "The server may be unavailable or overloaded": "The server may be unavailable or overloaded",
+ "Reject": "Reject",
+ "Failed to set Direct Message status of room": "Failed to set Direct Message status of room",
+ "Monday": "Monday",
+ "Remove from Directory": "Remove from Directory",
+ "Enable them now": "Enable them now",
+ "Messages containing my user name": "Messages containing my user name",
+ "Collecting logs": "Collecting logs",
+ "more": "more",
+ "Search for a room": "Search for a room",
+ "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)",
+ "All Rooms": "All Rooms",
+ "Wednesday": "Wednesday",
+ "Quote": "Quote",
+ "Send": "Send",
+ "Send logs": "Send logs",
+ "All messages": "All messages",
+ "Call invitation": "Call invitation",
+ "Downloading update...": "Downloading update...",
+ "You have successfully set a password and an email address!": "You have successfully set a password and an email address!",
+ "What's new?": "What's new?",
+ "Notify me for anything else": "Notify me for anything else",
+ "When I'm invited to a room": "When I'm invited to a room",
+ "Can't update user notification settings": "Can't update user notification settings",
+ "Notify for all other messages/rooms": "Notify for all other messages/rooms",
+ "Unable to look up room ID from server": "Unable to look up room ID from server",
+ "Couldn't find a matching Matrix room": "Couldn't find a matching Matrix room",
+ "Invite to this room": "Invite to this room",
+ "You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)",
+ "Thursday": "Thursday",
+ "Forward Message": "Forward Message",
+ "Unhide Preview": "Unhide Preview",
+ "Unable to join network": "Unable to join network",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply",
+ "Sorry, your browser is not able to run Riot.": "Sorry, your browser is not able to run Riot.",
+ "Uploaded on %(date)s by %(user)s": "Uploaded on %(date)s by %(user)s",
+ "Messages in group chats": "Messages in group chats",
+ "Yesterday": "Yesterday",
+ "Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).",
+ "Low Priority": "Low Priority",
+ "Unable to fetch notification target list": "Unable to fetch notification target list",
+ "Set Password": "Set Password",
+ "Enable audible notifications in web client": "Enable audible notifications in web client",
+ "Permalink": "Permalink",
+ "Off": "Off",
+ "Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network",
+ "Mentions only": "Mentions only",
+ "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room",
+ "You can now return to your account after signing out, and sign in on other devices.": "You can now return to your account after signing out, and sign in on other devices.",
+ "Enable email notifications": "Enable email notifications",
+ "Login": "Login",
+ "No rooms to show": "No rooms to show",
+ "Download this file": "Download this file",
+ "Pin Message": "Pin Message",
+ "Failed to change settings": "Failed to change settings",
+ "View Source": "View Source",
+ "Collapse panel": "Collapse 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!": "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!",
+ "Checking for an update...": "Checking for an update...",
+ "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here"
}
diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json
index f40b9c711fd..fb852d39a95 100644
--- a/src/i18n/strings/eo.json
+++ b/src/i18n/strings/eo.json
@@ -307,8 +307,6 @@
"Hangup": "Fini vokon",
"Voice call": "Voĉvoko",
"Video call": "Vidvoko",
- "Hide Apps": "Kaŝi aplikaĵojn",
- "Show Apps": "Montri aplikaĵojn",
"Upload file": "Alŝuti dosieron",
"Show Text Formatting Toolbar": "Montri tekstaranĝan breton",
"You do not have permission to post to this room": "Mankas al vi permeso afiŝi en la ĉambro",
@@ -731,7 +729,6 @@
"Unable to reject invite": "Invito ne rifuzeblas",
"Leave Community": "Forlasi komunumon",
"Leave %(groupName)s?": "Ĉu foriri el %(groupName)s?",
- "Unable to leave room": "Ĉambro ne forlaseblas",
"Community Settings": "Komunumaj agordoj",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Tiuj ĉi ĉambroj montriĝas al komunumanoj sur la paĝo de la komunumo. Ili povas aliĝi al la ĉambroj per alklakoj.",
"Featured Rooms:": "Elstarigitaj ĉambroj:",
@@ -813,9 +810,6 @@
"Device ID:": "Aparata identigilo:",
"Device key:": "Aparata ŝlosilo:",
"Ignored Users": "Malatentataj uzantoj",
- "Bug Report": "Cimraporto",
- "Found a bug?": "Ĉu vi trovis cimon?",
- "Report it": "Raporti ĝin",
"Analytics": "Analizo",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot kolektas sennomaj analizajn datumojn por helpi plibonigadon de la programo.",
"Labs": "Eksperimentaj funkcioj",
@@ -963,5 +957,157 @@
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Kiam ĉi tiu paĝo enhavas identigeblajn informojn, ekzemple ĉambron, uzantan aŭ grupan identigilon, ĝi sendiĝas al la servilo sen tiuj.",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s",
"Disable Community Filter Panel": "Malŝalti komunuman filtran breton",
- "Failed to add tag %(tagName)s to room": "Malsukcesis aldoni etikedon %(tagName)s al ĉambro"
+ "Failed to add tag %(tagName)s to room": "Malsukcesis aldoni etikedon %(tagName)s al ĉambro",
+ "Fetching third party location failed": "Malsukcesis trovi lokon de ekstera liveranto",
+ "A new version of Riot is available.": "Nova versio de Riot haveblas.",
+ "I understand the risks and wish to continue": "Mi komprenas la riskojn kaj volas daŭrigi",
+ "Couldn't load home page": "Malsukcesis enlegi hejmpaĝon",
+ "Send Account Data": "Sendi kontajn informojn",
+ "Advanced notification settings": "Specialaj agordoj de sciigoj",
+ "Uploading report": "Alŝutante raporton",
+ "Sunday": "Dimanĉo",
+ "Notification targets": "Celoj de sciigoj",
+ "Failed to set direct chat tag": "Malsukcesis agordi la etikedon de rekta babilo",
+ "Today": "Hodiaŭ",
+ "Files": "Dosieroj",
+ "You are not receiving desktop notifications": "Vi ne ricevadas sciigojn labortablajn",
+ "Friday": "Vendredo",
+ "Update": "Ĝisdatigi",
+ "What's New": "Kio novas",
+ "Add an email address above to configure email notifications": "Aldonu retadreson supre por agordi retpoŝtajn sciigojn",
+ "Expand panel": "Etendi panelon",
+ "On": "Ek",
+ "%(count)s Members|other": "%(count)s Membroj",
+ "Filter room names": "Filtri nomojn de ĉambroj",
+ "Changelog": "Protokolo de ŝanĝoj",
+ "Waiting for response from server": "Atendante respondon el la servilo",
+ "Send Custom Event": "Sendi propran okazon",
+ "All notifications are currently disabled for all targets.": "Ĉiuj sciigoj nun estas malŝaltitaj por ĉiuj aparatoj.",
+ "delete the alias.": "forigi la kromnomon.",
+ "To return to your account in future you need to set a password": "Por reveni al via konto estonte, vi devas agordi pasvorton",
+ "Forget": "Forgesi",
+ "#example": "#ekzemplo",
+ "Hide panel": "Kaŝi panelon",
+ "You cannot delete this image. (%(code)s)": "Vi ne povas forigi tiun ĉi bildon. (%(code)s)",
+ "Cancel Sending": "Nuligi sendon",
+ "This Room": "Ĉi tiu ĉambro",
+ "The Home Server may be too old to support third party networks": "La hejmservilo povas esti tro malnova por subteni retojn de eksteraj liverantoj",
+ "Noisy": "Brua",
+ "Room not found": "Ĉambro ne troviĝis",
+ "Messages containing my display name": "Mesaĝoj enhavantaj mian vidigan nomon",
+ "Messages in one-to-one chats": "Mesaĝoj en duopaj babiloj",
+ "Unavailable": "Nedisponebla",
+ "View Decrypted Source": "Vidi malĉifritan fonton",
+ "Failed to update keywords": "Malsukcesis ĝisdatigi la ŝlosilvortojn",
+ "remove %(name)s from the directory.": "forigi %(name)s de la ujo.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "La sciigoj de la jenaj ŝlosilvortoj sekvas regulojn kiuj ne povas esti montrataj ĉi tie:",
+ "Safari and Opera work too.": "Ankaŭ Safario kaj Opero funkcias.",
+ "Please set a password!": "Bonvolu agordi pasvorton!",
+ "You have successfully set a password!": "Vi sukcese agordis pasvorton!",
+ "An error occurred whilst saving your email notification preferences.": "Eraro okazis dum konservado de agordoj pri retpoŝtaj sciigoj.",
+ "Explore Room State": "Esplori staton de ĉambro",
+ "Source URL": "Fonta URL",
+ "Messages sent by bot": "Mesaĝoj senditaj per roboto",
+ "Filter results": "Filtri rezultojn",
+ "Members": "Anoj",
+ "No update available.": "Neniuj ĝisdatigoj haveblas.",
+ "Resend": "Resendi",
+ "Failed to get protocol list from Home Server": "Malsukcesis akiri liston de protokoloj el la hejmservilo",
+ "Collecting app version information": "Kolektanta informon pri versio de la aplikaĵo",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ĉu forigi la ĉambran kromnomon %(alias)s kaj forigi %(name)s de la ujo?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Tio ĉi permesos al vi reveni al via konto post adiaŭo, kaj saluti kun alia aparato.",
+ "Enable notifications for this account": "Ŝalti sciigojn por tiu ĉi konto",
+ "Directory": "Dosierujo",
+ "Invite to this community": "Inviti al tiu ĉi komunumo",
+ "Failed to get public room list": "Malsukcesis akiri liston de publikaj ĉambroj",
+ "Messages containing keywords": "Mesaĝoj enhavantaj ŝlosilovortojn",
+ "Error saving email notification preferences": "Eraro konservante agordojn pri retpoŝtaj sciigoj",
+ "Tuesday": "Mardo",
+ "Enter keywords separated by a comma:": "Entajpu ŝlosilvortojn apartigitajn per komoj:",
+ "Search…": "Serĉi…",
+ "You have successfully set a password and an email address!": "Vi sukcese agordis pasvorton kaj retpoŝtadreson!",
+ "Remove %(name)s from the directory?": "Ĉu forigi %(name)s de la ujo?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uzas multajn specialajn funkciojn, el kiuj kelkaj ne disponeblas aŭ estas eksperimentaj en via nuna foliumilo.",
+ "Event sent!": "Okazo sendiĝis!",
+ "Explore Account Data": "Esplori kontajn datumojn",
+ "All messages (noisy)": "Ĉiuj mesaĝoj (lauta)",
+ "Away": "Foresta",
+ "Saturday": "Sabato",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Memoru: vi ĉiam povas agordi retpoŝtadreson en viaj agordoj por uzantoj.",
+ "Direct Chat": "Rekta babilo",
+ "The server may be unavailable or overloaded": "La servilo povas esti nedisponebla aŭ troŝarĝita",
+ "Reject": "Rifuzi",
+ "Failed to set Direct Message status of room": "Malsukcesis agordi staton de rekta mesaĝo al la ĉambro",
+ "Monday": "Lundo",
+ "Remove from Directory": "Forigi de ujo",
+ "Enable them now": "Ŝalti ilin nun",
+ "Messages containing my user name": "Mesaĝoj enhavantaj mian salutnomon",
+ "Toolbox": "Ilaro",
+ "Collecting logs": "Kolektante protokolon",
+ "more": "pli",
+ "Bug report sent": "Cimraporto sendiĝis",
+ "You must specify an event type!": "Vi devas specifi tipon de okazo!",
+ "(HTTP status %(httpStatus)s)": "(stato de HTTP %(httpStatus)s)",
+ "Invite to this room": "Inviti al ĉi tiu ĉambro",
+ "Please install Chrome or Firefox for the best experience.": "Bonvolu instali Ĥromon aŭ Fajrovulpon por plej bona sperto.",
+ "Wednesday": "Merkredo",
+ "You cannot delete this message. (%(code)s)": "Vi ne povas forigi tiun ĉi mesaĝon. (%(code)s)",
+ "Quote": "Citi",
+ "Send logs": "Sendi protokolojn",
+ "All messages": "Ĉiuj mesaĝoj",
+ "Call invitation": "Invito al voko",
+ "Downloading update...": "Elŝutanta ĝisdatigon…",
+ "State Key": "Stata ŝlosilo",
+ "Failed to send custom event.": "Malsukcesis sendi propran okazon.",
+ "What's new?": "Kio novas?",
+ "Notify me for anything else": "Sciigu min pri ĉio alia",
+ "When I'm invited to a room": "Kiam mi estas invitita al ĉambro",
+ "Keywords": "Ŝlosilvortoj",
+ "Can't update user notification settings": "Agordoj de sciigoj al uzanto ne ĝisdatigeblas",
+ "Notify for all other messages/rooms": "Sciigu min por ĉiu alia babilejo",
+ "Unable to look up room ID from server": "Ĉambra identigaĵo ne akireblas de la servilo",
+ "Couldn't find a matching Matrix room": "Malsukcesis trovi kongruan ĉambron en Matrix",
+ "All Rooms": "Ĉiuj babilejoj",
+ "Search for a room": "Serĉi ĉambron",
+ "Thursday": "Ĵaŭdo",
+ "Forward Message": "Plusendi mesaĝon",
+ "Back": "Reen",
+ "Failed to change settings": "Malsukcesis ŝanĝi la agordojn",
+ "Reply": "Respondi",
+ "Show message in desktop notification": "Montradi mesaĝojn en labortablaj sciigoj",
+ "Unhide Preview": "Malkaŝi antaŭrigardon",
+ "Unable to join network": "Malsukcesis konektiĝi al la reto",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Vi eble agordis ilin en alia kliento. Vi ne povas agordi ilin en Riot, sed ili ankoraŭ validas",
+ "Sorry, your browser is not able to run Riot.": "Pardonu, via foliumilo ne kapablas funkciigi klienton Riot.",
+ "Uploaded on %(date)s by %(user)s": "Alŝutita je %(date)s de %(user)s",
+ "Messages in group chats": "Mesaĝoj en grupaj babiloj",
+ "Yesterday": "Hieraŭ",
+ "Error encountered (%(errorDetail)s).": "Eraro okazis (%(errorDetail)s).",
+ "Login": "Saluti",
+ "Low Priority": "Malalta prioritato",
+ "Unable to fetch notification target list": "Malsukcesis akiri la liston de celoj por sciigoj",
+ "Appear Offline": "Montriĝi kiel eksterreta",
+ "Set Password": "Agordi pasvorton",
+ "Enable audible notifications in web client": "Ŝalti aŭdeblajn sciigojn en la retkliento",
+ "Permalink": "Konstanta ligilo",
+ "Off": "For",
+ "Riot does not know how to join a room on this network": "Riot ne scias aliĝi al ĉambroj en tiu ĉi reto",
+ "Mentions only": "Nur mencioj",
+ "Failed to remove tag %(tagName)s from room": "Malsukcesis forigi etikedon %(tagName)s el la ĉambro",
+ "You can now return to your account after signing out, and sign in on other devices.": "Vi nun rajtas reveni al via konto post adiaŭo, kaj saluti per ĝi kun aliaj aparatoj.",
+ "Enable desktop notifications": "Ŝalti labortablajn sciigojn",
+ "Enable email notifications": "Ŝalti retpoŝtajn sciigojn",
+ "Event Type": "Tipo de okazo",
+ "Download this file": "Elŝuti ĉi tiun dosieron",
+ "Pin Message": "Fiksi mesaĝon",
+ "Thank you!": "Dankon!",
+ "View Community": "Vidi Komunumon",
+ "%(count)s Members|one": "%(count)s Membro",
+ "Developer Tools": "Evoluigiloj",
+ "View Source": "Vidi fonton",
+ "Event Content": "Enhavo de okazo",
+ "Collapse panel": "Maletendi panelon",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Kun via nuna foliumilo, la aspekto kaj funkciado de la aplikaĵo povas esti tute malĝusta, kaj kelkaj aŭ ĉiu funkcioj eble ne tute funkcios. Se vi tamen volas provi, vi povas daŭrigi, sed vi ricevos nenian subtenon se vi renkontos problemojn!",
+ "Checking for an update...": "Serĉanta ĝisdatigojn…",
+ "There are advanced notifications which are not shown here": "Ekzistas specialaj sciigoj, kiuj ne montriĝas ĉi tie"
}
diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json
index 0241d6a0cc3..36bf4b7b3bb 100644
--- a/src/i18n/strings/es.json
+++ b/src/i18n/strings/es.json
@@ -29,7 +29,6 @@
"Banned users": "Usuarios bloqueados",
"Bans user with given id": "Bloquear usuario por ID",
"Blacklisted": "En lista negra",
- "Bug Report": "Reporte de fallo",
"Bulk Options": "Opciones masivas",
"Call Timeout": "Tiempo de espera de la llamada",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "No se puede conectar al servidor via HTTP, cuando es necesario un enlace HTTPS en la barra de direcciones de tu navegador. Ya sea usando HTTPS o habilitando los scripts inseguros.",
@@ -132,7 +131,6 @@
"Forgot your password?": "¿Olvidaste tu clave?",
"For security, this session has been signed out. Please sign in again.": "Por seguridad, esta sesión ha sido cerrada. Por favor inicia sesión nuevamente.",
"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.": "Por seguridad, al cerrar la sesión borrará cualquier clave de encriptación de extremo a extremo en este navegador. Si quieres ser capaz de descifrar tu historial de conversación, para las futuras sesiones en Riot, por favor exporta las claves de la sala para protegerlas.",
- "Found a bug?": "¿Encontraste un error?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s a %(toPowerLevel)s",
"Guests cannot join this room even if explicitly invited.": "Invitados no pueden unirse a esta sala aun cuando han sido invitados explícitamente.",
"Hangup": "Colgar",
@@ -376,7 +374,6 @@
"Remove": "Eliminar",
"Remove %(threePid)s?": "¿Eliminar %(threePid)s?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s ha solicitado una conferencia Voz-IP.",
- "Report it": "Informar",
"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.": "Reiniciar la contraseña también reiniciará las claves de cifrado extremo-a-extremo, haciendo ilegible el historial de las conversaciones, salvo que exporte previamente las claves de sala, y las importe posteriormente. Esto será mejorado en futuras versiones.",
"Results from DuckDuckGo": "Resultados desde DuckDuckGo",
"Return to login screen": "Volver a la pantalla de inicio de sesión",
@@ -430,10 +427,8 @@
"Define the power level of a user": "Definir el nivel de poder de los usuarios",
"Edit": "Editar",
"Enable automatic language detection for syntax highlighting": "Activar la detección automática del lenguaje para resaltar la sintaxis",
- "Hide Apps": "Ocultar aplicaciones",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Ocultar mensajes de entrada/salida (no afecta invitaciones/kicks/bans)",
"Sets the room topic": "Configura el tema de la sala",
- "Show Apps": "Mostrar aplicaciones",
"To get started, please pick a username!": "Para empezar, ¡por favor elija un nombre de usuario!",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Se ha intentado cargar cierto punto en la cronología de esta sala, pero no tiene permiso para ver el mensaje solicitado.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Se ha intentado cargar cierto punto en la cronología de esta sala, pero no se ha podido encontrarlo.",
@@ -587,5 +582,171 @@
"Invite new community members": "Invita nuevos miembros de la comunidad",
"Name or matrix ID": "Nombre o ID de matrix",
"Invite to Community": "Invitar a la comunidad",
- "Which rooms would you like to add to this community?": "¿Qué salas deseas añadir a esta comunidad?"
+ "Which rooms would you like to add to this community?": "¿Qué salas deseas añadir a esta comunidad?",
+ "Fetching third party location failed": "Falló la obtención de la ubicación de un tercero",
+ "A new version of Riot is available.": "Una nueva versión de Riot está disponible.",
+ "I understand the risks and wish to continue": "Entiendo los riesgos y deseo continuar",
+ "Couldn't load home page": "No se puede cargar la página principal",
+ "Send Account Data": "Enviar Datos de la Cuenta",
+ "Advanced notification settings": "Configuración avanzada de notificaciones",
+ "Uploading report": "Enviando informe",
+ "Sunday": "Domingo",
+ "Guests can join": "Los invitados se pueden unir",
+ "Failed to add tag %(tagName)s to room": "Error al añadir la etiqueta %(tagName)s a la sala",
+ "Notification targets": "Objetivos de notificación",
+ "Failed to set direct chat tag": "Error al establecer la etiqueta de chat directo",
+ "Today": "Hoy",
+ "Files": "Archivos",
+ "You are not receiving desktop notifications": "No estás recibiendo notificaciones de escritorio",
+ "Friday": "Viernes",
+ "Update": "Actualizar",
+ "What's New": "Novedades",
+ "Add an email address above to configure email notifications": "Añade una dirección de correo arriba para configurar las notificaciones por correo",
+ "Expand panel": "Expandir panel",
+ "On": "Encendido",
+ "%(count)s Members|other": "%(count)s miembros",
+ "Filter room names": "Filtrar los nombres de las salas",
+ "Changelog": "Registro de cambios",
+ "Waiting for response from server": "Esperando una respuesta del servidor",
+ "Leave": "Salir",
+ "Uploaded on %(date)s by %(user)s": "Subido el %(date)s por %(user)s",
+ "Send Custom Event": "Enviar Evento Personalizado",
+ "All notifications are currently disabled for all targets.": "Las notificaciones estan desactivadas para todos los objetivos.",
+ "Failed to send logs: ": "Error al enviar registros: ",
+ "delete the alias.": "borrar el alias.",
+ "To return to your account in future you need to set a password": "Para regresar a tu cuenta en el futuro debes establecer una contraseña",
+ "Forget": "Olvidar",
+ "World readable": "Legible por todo el mundo",
+ "Hide panel": "Ocultar panel",
+ "You cannot delete this image. (%(code)s)": "No puedes eliminar esta imagen. (%(code)s)",
+ "Cancel Sending": "Cancelar envío",
+ "This Room": "Esta sala",
+ "The Home Server may be too old to support third party networks": "El Home Server puede ser demasiado antiguo para soportar redes de terceros",
+ "Resend": "Reenviar",
+ "Room not found": "Sala no encontrada",
+ "Messages containing my display name": "Mensajes que contienen mi nombre",
+ "Messages in one-to-one chats": "Mensajes en chats uno a uno",
+ "Unavailable": "No disponible",
+ "View Decrypted Source": "Ver Fuente Descifrada",
+ "Failed to update keywords": "Error al actualizar las palabras clave",
+ "Notes:": "Notas:",
+ "remove %(name)s from the directory.": "retirar %(name)s del directorio.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Las notificaciones de las siguientes palabras clave siguen reglas que no se pueden mostrar aquí:",
+ "Safari and Opera work too.": "Safari y Opera también funcionan.",
+ "Please set a password!": "¡Por favor establece una contraseña!",
+ "You have successfully set a password!": "¡Has establecido una nueva contraseña!",
+ "An error occurred whilst saving your email notification preferences.": "Se ha producido un error al guardar las preferencias de notificación por email.",
+ "Explore Room State": "Explorar Estado de la Sala",
+ "Source URL": "URL de Origen",
+ "Messages sent by bot": "Mensajes enviados por bot",
+ "Filter results": "Filtrar resultados",
+ "Members": "Miembros",
+ "No update available.": "No hay actualizaciones disponibles.",
+ "Noisy": "Ruidoso",
+ "Failed to get protocol list from Home Server": "Error al obtener la lista de protocolos desde el Home Server",
+ "Collecting app version information": "Recolectando información de la versión de la aplicación",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "¿Borrar el alias de la sala %(alias)s y eliminar %(name)s del directorio?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Esto te permitirá regresar a tu cuenta después de cerrar sesión, así como iniciar sesión en otros dispositivos.",
+ "Keywords": "Palabras clave",
+ "Enable notifications for this account": "Habilitar notificaciones para esta cuenta",
+ "Directory": "Directorio",
+ "Invite to this community": "Invitar a esta comunidad",
+ "Search for a room": "Buscar sala",
+ "Messages containing keywords": "Mensajes que contienen palabras clave",
+ "Error saving email notification preferences": "Error al guardar las preferencias de notificación por email",
+ "Tuesday": "Martes",
+ "Enter keywords separated by a comma:": "Introduzca palabras clave separadas por una coma:",
+ "Search…": "Buscar…",
+ "You have successfully set a password and an email address!": "¡Has establecido una nueva contraseña y dirección de correo electrónico!",
+ "Remove %(name)s from the directory?": "¿Retirar %(name)s del directorio?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot usa muchas características avanzadas del navegador, algunas de las cuales no están disponibles en su navegador actual.",
+ "Event sent!": "Evento enviado!",
+ "Preparing to send logs": "Preparando para enviar registros",
+ "Enable desktop notifications": "Habilitar notificaciones de escritorio",
+ "Unnamed room": "Sala sin nombre",
+ "Explore Account Data": "Explorar Datos de la Cuenta",
+ "Remove from Directory": "Retirar del Directorio",
+ "Away": "Ausente",
+ "Saturday": "Sábado",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Recuerda que si es necesario puedes establecer una dirección de email en las preferencias de usuario.",
+ "Direct Chat": "Conversación directa",
+ "The server may be unavailable or overloaded": "El servidor puede estar no disponible o sobrecargado",
+ "Reject": "Rechazar",
+ "Failed to set Direct Message status of room": "No se pudo establecer el estado de Mensaje Directo de la sala",
+ "Monday": "Lunes",
+ "All messages (noisy)": "Todos los mensajes (ruidoso)",
+ "Enable them now": "Habilitarlos ahora",
+ "Messages containing my user name": "Mensajes que contienen mi nombre de usuario",
+ "Toolbox": "Caja de Herramientas",
+ "Collecting logs": "Recolectando registros",
+ "more": "más",
+ "GitHub issue link:": "Enlace de incidencia en GitHub:",
+ "Bug report sent": "Informe de fallo enviado",
+ "You must specify an event type!": "Debes especificar un tipo de evento!",
+ "(HTTP status %(httpStatus)s)": "(estado HTTP %(httpStatus)s)",
+ "Invite to this room": "Invitar a esta sala",
+ "Please install Chrome or Firefox for the best experience.": "Por favor instala Chrome o Firefox para una experiencia óptima.",
+ "Failed to get public room list": "No se pudo obtener la lista de salas públicas",
+ "Send": "Enviar",
+ "Send logs": "Enviar registros",
+ "All messages": "Todos los mensajes",
+ "Call invitation": "Invitación a la llamada",
+ "Thank you!": "¡Gracias!",
+ "Downloading update...": "Descargando actualizaciones...",
+ "State Key": "Clave de estado",
+ "Failed to send custom event.": "Ha fallado el envio del evento personalizado.",
+ "What's new?": "¿Qué hay de nuevo?",
+ "Notify me for anything else": "Notificarme para cualquier otra cosa",
+ "When I'm invited to a room": "Cuando estoy invitado a una sala",
+ "Click here to create a GitHub issue.": "Haz click aquí para crear una incidencia en Github.",
+ "Can't update user notification settings": "No se puede actualizar la configuración de notificaciones del usuario",
+ "Notify for all other messages/rooms": "Notificar para todos los demás mensajes/salas",
+ "Unable to look up room ID from server": "No se puede buscar el ID de la sala desde el servidor",
+ "Couldn't find a matching Matrix room": "No se encontró una sala Matrix que coincida",
+ "All Rooms": "Todas las salas",
+ "You cannot delete this message. (%(code)s)": "No puedes eliminar este mensaje. (%(code)s)",
+ "Thursday": "Jueves",
+ "Forward Message": "Reenviar mensaje",
+ "Logs sent": "Registros enviados",
+ "Back": "Atrás",
+ "Reply": "Responder",
+ "Show message in desktop notification": "Mostrar mensaje en la notificación del escritorio",
+ "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.": "Los registros de depuración contienen datos de uso de la aplicación como nombre de usuario, ID o alias de las salas o grupos que hayas visitado (y nombres de usuario de otros usuarios). No contienen mensajes.",
+ "Unhide Preview": "Mostrar Vista Previa",
+ "Unable to join network": "No se puede unir a la red",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Es posible que los hayas configurado en un cliente que no sea Riot. No puedes ajustarlos en Riot, pero todavía se aplican",
+ "Sorry, your browser is not able to run Riot.": "¡Lo sentimos! Su navegador no puede ejecutar Riot.",
+ "Messages in group chats": "Mensajes en chats de grupo",
+ "Yesterday": "Ayer",
+ "Error encountered (%(errorDetail)s).": "Error encontrado (%(errorDetail)s).",
+ "Login": "Iniciar sesión",
+ "Low Priority": "Baja Prioridad",
+ "Riot does not know how to join a room on this network": "Riot no sabe cómo unirse a una sala en esta red",
+ "Appear Offline": "Mostrarse Desconectado",
+ "Set Password": "Establecer contraseña",
+ "Enable audible notifications in web client": "Habilitar notificaciones audibles en el cliente web",
+ "Permalink": "Enlace permanente",
+ "Off": "Apagado",
+ "#example": "#ejemplo",
+ "Mentions only": "Sólo menciones",
+ "Failed to remove tag %(tagName)s from room": "Error al eliminar la etiqueta %(tagName)s de la sala",
+ "Wednesday": "Miércoles",
+ "You can now return to your account after signing out, and sign in on other devices.": "Ahora puedes regresar a tu cuenta después de cerrar tu sesión, e iniciar sesión en otros dispositivos.",
+ "Enable email notifications": "Habilitar notificaciones por email",
+ "Event Type": "Tipo de Evento",
+ "No rooms to show": "Sin salas para mostrar",
+ "Download this file": "Descargar este archivo",
+ "Pin Message": "Marcar Mensaje",
+ "Failed to change settings": "Error al cambiar la configuración",
+ "View Community": "Ver la comunidad",
+ "%(count)s Members|one": "%(count)s miembro",
+ "Developer Tools": "Herramientas de Desarrollo",
+ "View Source": "Ver Fuente",
+ "Event Content": "Contenido del Evento",
+ "Unable to fetch notification target list": "No se puede obtener la lista de objetivos de notificación",
+ "Quote": "Citar",
+ "Collapse panel": "Colapsar 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!": "En su navegador actual, la apariencia y comportamiento de la aplicación puede ser completamente incorrecta, y algunas de las características podrían no funcionar. Si aún desea probarlo puede continuar, pero ¡no podremos ofrecer soporte por cualquier problema que pudiese tener!",
+ "Checking for an update...": "Comprobando actualizaciones...",
+ "There are advanced notifications which are not shown here": "Hay notificaciones avanzadas que no se muestran aquí"
}
diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json
index 276baab771d..1555cf96930 100644
--- a/src/i18n/strings/eu.json
+++ b/src/i18n/strings/eu.json
@@ -36,7 +36,6 @@
"Invites": "Gonbidapenak",
"Low priority": "Lehentasun baxua",
"No results": "Emaitzarik ez",
- "Bug Report": "Arazte-txostena",
"Join Room": "Elkartu gelara",
"Register": "Eman izena",
"Submit": "Bidali",
@@ -135,7 +134,6 @@
"Start Chat": "Hasi txata",
"Success": "Arrakasta",
"For security, this session has been signed out. Please sign in again.": "Segurtasunagatik saio hau amaitu da. Hasi saioa berriro.",
- "Found a bug?": "Akats bat aurkitu duzu?",
"Guests cannot join this room even if explicitly invited.": "Bisitariak ezin dira gela honetara elkartu ez bazaie zuzenean gonbidatu.",
"Hangup": "Eseki",
"Homeserver is": "Hasiera zerbitzaria:",
@@ -357,7 +355,6 @@
"%(senderName)s removed their profile picture.": "%(senderName)s erabiltzaileak bere profileko argazkia kendu du.",
"Remove %(threePid)s?": "Kendu %(threePid)s?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s erabiltzaileak VoIP konferentzia bat eskatu du.",
- "Report it": "Eman berri",
"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.": "Oraingoz pasahitza aldatzeak gailu guztietako muturretik muturrerako zifratze-gakoak berrezarriko ditu, eta ezin izango dituzu zifratutako txatetako historialak irakurri ez badituzu aurretik zure gelako gakoak esportatzen eta aldaketa eta gero berriro inportatzen.",
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Une honetan egiaztatu gabeko gailuak blokeatzen ari zara, gailu hauetara mezuak bidali ahal izateko egiaztatu behar dituzu.",
"Results from DuckDuckGo": "DuckDuckGo bilatzaileko emaitzak",
@@ -652,7 +649,6 @@
"Do you want to load widget from URL:": "Trepeta bat kargatu nahi duzu URL honetatik:",
"Edit": "Editatu",
"Enable automatic language detection for syntax highlighting": "Gaitu hizkuntza antzemate automatikoa sintaxia nabarmentzeko",
- "Hide Apps": "Ezkutatu aplikazioak",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Ezkutatu elkartze/ateratze mezuak (gonbidapenak/kanporatzeak/debekuak ez dira aldatzen)",
"Integrations Error": "Integrazio errorea",
"Publish this room to the public in %(domain)s's room directory?": "Argitaratu gela hau publikora %(domain)s domeinuko gelen direktorioan?",
@@ -661,7 +657,6 @@
"NOTE: Apps are not end-to-end encrypted": "OHARRA: Aplikazioek ez dute muturretik muturrerako zifratzea",
"Revoke widget access": "Indargabetu trepetaren sarbidea",
"Sets the room topic": "Gelaren mintzagaia ezartzen du",
- "Show Apps": "Erakutsi aplikazioak",
"The maximum permitted number of widgets have already been added to this room.": "Gehienez onartzen diren trepeta kopurua gehitu da gela honetara.",
"To get started, please pick a username!": "Hasteko, hautatu erabiltzaile-izen bat!",
"Unable to create widget.": "Ezin izan da trepeta sortu.",
@@ -812,7 +807,6 @@
"Leave Community": "Atera komunitatetik",
"Leave %(groupName)s?": "Atera %(groupName)s komunitatetik?",
"Leave": "Atera",
- "Unable to leave room": "Ezin izan da gelatik atera",
"Community Settings": "Komunitatearen ezarpenak",
"You are an administrator of this community": "Komunitate honen administratzailea zara",
"You are a member of this community": "Komunitate honetako kidea zara",
@@ -992,7 +986,6 @@
"Key request sent.": "Gako eskaria bidalita.",
"Re-request encryption keys from your other devices.": "Berriz eskatu zifratze-gakoak zure beste gailuetatik.",
"%(user)s is a %(userRole)s": "%(user)s %(userRole)s da",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "Zure komunitateari egindako aldaketak agian ez dira beste erabiltzaileentzat ikusgai egongo 30 minutu pasatu arte.",
"Code": "Kodea",
"Debug Logs Submission": "Arazte-egunkarien bidalketak",
"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 contian messages.": "Akats bat bidali baduzu GitHub bidez, arazte-egunkariek arazoa aurkitzen lagundu gaitzakete. Arazte-egunkariek aplikazioak darabilen datuak dauzkate, zure erabiltzaile izena barne, bisitatu dituzun gelen ID-ak edo ezizenak eta beste erabiltzaileen izenak. Ez dute mezurik.",
@@ -1003,5 +996,162 @@
"Unable to leave community": "Ezinezkoa komunitatetik ateratzea",
"Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Zure komunitatearen izen eta abatarari egindako aldaketak 30 minutu behar ditzakete beste erabiltzaileek ikusi arte.",
"Join this community": "Elkartu komunitate honetara",
- "Leave this community": "Atera komunitate honetatik"
+ "Leave this community": "Atera komunitate honetatik",
+ "Fetching third party location failed": "Huts egin du hirugarrengoen kokalekua eskuratzean",
+ "A new version of Riot is available.": "Riot bertsio berri bat dago eskuragarri.",
+ "Couldn't load home page": "Ezin izan da hasiera orria kargatu",
+ "Send Account Data": "Bidali kontuaren datuak",
+ "All notifications are currently disabled for all targets.": "Une honetan jakinarazpen guztiak helburu guztietarako desgaituta daude.",
+ "Uploading report": "Igoera txostena",
+ "Sunday": "Igandea",
+ "Notification targets": "Jakinarazpenen helburuak",
+ "Today": "Gaur",
+ "Failed to get protocol list from Home Server": "Huts egin du protokoloen zerrenda hasiera zerbitzaritik jasotzean",
+ "You are not receiving desktop notifications": "Ez dituzu mahaigaineko jakinarazpenak jasotzen",
+ "Friday": "Ostirala",
+ "Update": "Eguneratu",
+ "What's New": "Zer dago berri",
+ "Add an email address above to configure email notifications": "Gehitu e-mail helbide bat goian e-mail bidezko jakinarazpenak konfiguratzeko",
+ "Expand panel": "Hedatu panela",
+ "On": "Bai",
+ "%(count)s Members|other": "%(count)s kide",
+ "Filter room names": "Iragazi gelen izenak",
+ "Changelog": "Aldaketa-egunkaria",
+ "Waiting for response from server": "Zerbitzariaren erantzunaren zain",
+ "Send Custom Event": "Bidali gertaera pertsonalizatua",
+ "Advanced notification settings": "Jakinarazpen aurreratuen ezarpenak",
+ "Failed to send logs: ": "Huts egin du egunkariak bidaltzean: ",
+ "delete the alias.": "ezabatu ezizena.",
+ "To return to your account in future you need to set a password": "Etorkizunean kontura itzuli ahal izateko pasahitz bat ezarri behar duzu",
+ "Forget": "Ahaztu",
+ "#example": "#adibidea",
+ "Hide panel": "Ezkutatu panela",
+ "You cannot delete this image. (%(code)s)": "Ezin duzu irudi hau ezabatu. (%(code)s)",
+ "Cancel Sending": "Utzi bidaltzeari",
+ "This Room": "Gela hau",
+ "The Home Server may be too old to support third party networks": "Hasiera zerbitzaria zaharregia izan daiteke hirugarrengoen sarean onartzeko",
+ "Noisy": "Zaratatsua",
+ "Error saving email notification preferences": "Errorea e-mail jakinarazpenen hobespenak gordetzean",
+ "Messages containing my display name": "Nire pantaila-izena duten mezuak",
+ "Messages in one-to-one chats": "Biren arteko txatetako mezuak",
+ "Unavailable": "Eskuraezina",
+ "View Decrypted Source": "Ikusi deszifratutako iturria",
+ "Failed to update keywords": "Huts egin du hitz gakoak eguneratzean",
+ "Notes:": "Oharrak:",
+ "remove %(name)s from the directory.": "kendu %(name)s direktoriotik.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Hitz gako hauen jakinarazpenak hemen bistaratu ezin daitezkeen arauak jarraitzen dituzte:",
+ "Safari and Opera work too.": "Safari eta Opera badabiltza ere.",
+ "Please set a password!": "Ezarri pasahitza mesedez!",
+ "You have successfully set a password!": "Ongi ezarri duzu pasahitza!",
+ "An error occurred whilst saving your email notification preferences.": "Errore bat gertatu da zure e-mail bidezko jakinarazpenen hobespenak gordetzean.",
+ "Explore Room State": "Miatu gelaren egoera",
+ "Source URL": "Iturriaren URLa",
+ "Messages sent by bot": "Botak bidalitako mezuak",
+ "Filter results": "Iragazi emaitzak",
+ "Members": "Kideak",
+ "No update available.": "Ez dago eguneraketarik eskuragarri.",
+ "Resend": "Birbidali",
+ "Files": "Fitxategiak",
+ "Collecting app version information": "Aplikazioaren bertsio-informazioa biltzen",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ezabatu gelaren %(alias)s ezizena eta kendu %(name)s direktoriotik?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Honek zure kontura itzultzea ahalbidetuko dizu, beste gailuetan saioa amaitu eta berriro hasi eta gero.",
+ "Keywords": "Hitz gakoak",
+ "Enable notifications for this account": "Gaitu jakinarazpenak kontu honetarako",
+ "Directory": "Direktorioa",
+ "Invite to this community": "Gonbidatu komunitate honetara",
+ "Failed to get public room list": "Huts egin du gela publikoen zerrenda jasotzean",
+ "Messages containing keywords": "Hitz gakoak dituzten mezuak",
+ "Room not found": "Ez da gela aurkitu",
+ "Tuesday": "Asteartea",
+ "Enter keywords separated by a comma:": "Idatzi hitz gakoak koma bidez banatuta:",
+ "Forward Message": "Birbidali mezua",
+ "You have successfully set a password and an email address!": "Ondo ezarri dituzu pasahitza eta e-mail helbidea!",
+ "Remove %(name)s from the directory?": "Kendu %(name)s direktoriotik?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riotek nabigatzaileen ezaugarri aurreratu ugari erabiltzen ditu, hauetako batzuk ez daude erabilgarri edo esperimentalak dira zure oraingo nabigatzailean.",
+ "Event sent!": "Gertaera bidalita!",
+ "Preparing to send logs": "Egunkariak bidaltzeko prestatzen",
+ "Enable desktop notifications": "Gaitu mahaigaineko jakinarazpenak",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Gogoratu, e-mail helbide bat ezarri dezakezu erabiltzaile-ezarpenetan iritzia aldatzen baduzu.",
+ "Explore Account Data": "Miatu kantuaren datuak",
+ "All messages (noisy)": "Mezu guztiak (ozen)",
+ "Away": "Teklatutik at",
+ "Saturday": "Larunbata",
+ "I understand the risks and wish to continue": "Arriskua ulertzen dut eta jarraitu nahi dut",
+ "Direct Chat": "Txat zuzena",
+ "The server may be unavailable or overloaded": "Zerbitzaria eskuraezin edo gainezka egon daiteke",
+ "Reject": "Baztertu",
+ "Failed to set Direct Message status of room": "Huts egin du Mezu Zuzena egoera gelan ezartzean",
+ "Monday": "Astelehena",
+ "Remove from Directory": "Kendu direktoriotik",
+ "Enable them now": "Gaitu orain",
+ "Messages containing my user name": "Nire erabiltzaile-izena duten mezuak",
+ "Toolbox": "Tresna-kutxa",
+ "Collecting logs": "Egunkariak biltzen",
+ "more": "gehiago",
+ "GitHub issue link:": "Arazoaren esteka GitHuben:",
+ "Bug report sent": "Arazte-txostena bidali da",
+ "You must specify an event type!": "Gertaera mota bat zehaztu behar duzu!",
+ "(HTTP status %(httpStatus)s)": "(HTTP egoera %(httpStatus)s)",
+ "All Rooms": "Gela guztiak",
+ "Please install Chrome or Firefox for the best experience.": "Instalatu Chrome edo Firefox esperientzia onena izateko.",
+ "Wednesday": "Asteazkena",
+ "You cannot delete this message. (%(code)s)": "Ezin duzu mezu hau ezabatu. (%(code)s)",
+ "Quote": "Aipua",
+ "Send logs": "Bidali egunkariak",
+ "All messages": "Mezu guztiak",
+ "Call invitation": "Dei gonbidapena",
+ "Downloading update...": "Eguneraketa deskargatzen...",
+ "State Key": "Egoera gakoa",
+ "Failed to send custom event.": "Huts egin du gertaera pertsonalizatua bidaltzean.",
+ "What's new?": "Zer dago berri?",
+ "Notify me for anything else": "Jakinarazi beste edozer",
+ "When I'm invited to a room": "Gela batetara gonbidatzen nautenean",
+ "Click here to create a GitHub issue.": "Egin klik hemen GitHub-en arazoaren berri emateko.",
+ "Can't update user notification settings": "Ezin dira erabiltzailearen jakinarazpenen ezarpenak eguneratu",
+ "Notify for all other messages/rooms": "Jakinarazi beste mezu/gela guztiak",
+ "Unable to look up room ID from server": "Ezin izan da gelaren IDa zerbitzarian bilatu",
+ "Couldn't find a matching Matrix room": "Ezin izan da bat datorren Matrix gela bat aurkitu",
+ "Invite to this room": "Gonbidatu gela honetara",
+ "Search for a room": "Bilatu gela bat",
+ "Thursday": "Osteguna",
+ "Search…": "Bilatu…",
+ "Logs sent": "Egunkariak bidalita",
+ "Back": "Atzera",
+ "Reply": "Erantzun",
+ "Show message in desktop notification": "Erakutsi mezua mahaigaineko jakinarazpenean",
+ "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.": "Arazte-egunkariek aplikazioak darabilen datuak dauzkate, zure erabiltzaile izena barne, bisitatu dituzun gelen ID-ak edo ezizenak eta beste erabiltzaileen izenak. Ez dute mezurik.",
+ "Unhide Preview": "Ez ezkutatu aurrebista",
+ "Unable to join network": "Ezin izan da sarera elkartu",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Agian Riot ez beste bezero batean konfiguratu dituzu. Ezin dituzu Riot bidez doitu, baina aplikagarriak dira",
+ "Sorry, your browser is not able to run Riot.": "Zure nabigatzaileak ez du Riot erabiltzeko gaitasunik.",
+ "Uploaded on %(date)s by %(user)s": "%(user)s erabiltzaileak %(date)s (e)an igota",
+ "Messages in group chats": "Talde txatetako mezuak",
+ "Yesterday": "Atzo",
+ "Error encountered (%(errorDetail)s).": "Errorea aurkitu da (%(errorDetail)s).",
+ "Login": "Hasi saioa",
+ "Low Priority": "Lehentasun baxua",
+ "Unable to fetch notification target list": "Ezin izan da jakinarazpen helburuen zerrenda eskuratu",
+ "Appear Offline": "Agertu deskonektatuta",
+ "Set Password": "Ezarri pasahitza",
+ "Enable audible notifications in web client": "Gaitu jakinarazpen entzungarriak web bezeroan",
+ "Permalink": "Esteka iraunkorra",
+ "Off": "Ez",
+ "Riot does not know how to join a room on this network": "Riotek ez daki nola elkartu gela batetara sare honetan",
+ "Mentions only": "Aipamenak besterik ez",
+ "You can now return to your account after signing out, and sign in on other devices.": "Zure kontura itzuli zaitezke beste gailuetan saioa amaitu eta berriro hastean.",
+ "Enable email notifications": "Gaitu e-mail bidezko jakinarazpenak",
+ "Event Type": "Gertaera mota",
+ "Download this file": "Deskargatu fitxategi hau",
+ "Pin Message": "Finkatu mezua",
+ "Failed to change settings": "Huts egin du ezarpenak aldatzean",
+ "View Community": "Ikusi komunitatea",
+ "%(count)s Members|one": "Kide %(count)s",
+ "Developer Tools": "Garatzaile-tresnak",
+ "View Source": "Ikusi iturria",
+ "Event Content": "Gertaeraren edukia",
+ "Thank you!": "Eskerrik asko!",
+ "Collapse panel": "Tolestu panela",
+ "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!": "Zure oraingo nabigatzailearekin aplikazioaren itxura eta portaera guztiz okerra izan daiteke, eta funtzio batzuk ez dira ibiliko. Hala ere aurrera jarraitu dezakezu saiatu nahi baduzu, baina zure erantzukizunaren menpe geratzen dira aurkitu ditzakezun arazoak!",
+ "Checking for an update...": "Eguneraketarik dagoen egiaztatzen...",
+ "There are advanced notifications which are not shown here": "Hemen erakusten ez diren jakinarazpen aurreratuak daude"
}
diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json
index 0967ef424bc..2e359e21cb8 100644
--- a/src/i18n/strings/fa.json
+++ b/src/i18n/strings/fa.json
@@ -1 +1,148 @@
-{}
+{
+ "Fetching third party location failed": "تطبیق اطلاعات از منابع دسته سوم با شکست مواجه شد",
+ "Messages in one-to-one chats": "پیامهای درون چتهای یکبهیک",
+ "A new version of Riot is available.": "نسخهی جدید از رایوت موجود است.",
+ "Advanced notification settings": "تنظیمات پیشرفته برای آگاهسازیها",
+ "Uploading report": "در حال بارگذاری گزارش",
+ "Sunday": "یکشنبه",
+ "Guests can join": "میهمانها میتوانند بپیوندند",
+ "Messages sent by bot": "پیامهای ارسال شده توسط ربات",
+ "Notification targets": "هدفهای آگاهسازی",
+ "Failed to set direct chat tag": "تنظیم تگ برای چت مستقیم موفقیتآمیز نبود",
+ "Today": "امروز",
+ "Files": "فایلها",
+ "You are not receiving desktop notifications": "شما آگاهسازیهای دسکتاپ را دریافت نمیکنید",
+ "Friday": "آدینه",
+ "Update": "بهروزرسانی",
+ "Notifications": "آگاهسازیها",
+ "What's New": "تازهها",
+ "Add an email address above to configure email notifications": "آدرس ایمیلتان را به بالا بیفزایید تا بتوانید آگاهسازی با ایمیل را مدیریت کنید",
+ "Expand panel": "پنل را بگشا",
+ "On": "روشن",
+ "Filter room names": "جستجو در گپها",
+ "Changelog": "تغییراتِ بهوجودآمده",
+ "Waiting for response from server": "در انتظار پاسخی از سمت سرور",
+ "Leave": "خروج",
+ "OK": "باشه",
+ "All notifications are currently disabled for all targets.": "همهی آگاهسازیها برای تمام هدفها غیرفعالاند.",
+ "Operation failed": "عملیات شکست خورد",
+ "delete the alias.": "نام مستعار را پاک کن.",
+ "To return to your account in future you need to set a password": "برای بازگشتِ دوباره به اکانتان در آینده نیاز به ثبت یک پسورد دارید",
+ "Forget": "فراموش کن",
+ "World readable": "خواندن جهانی",
+ "Mute": "سکوت",
+ "Hide panel": "پنل را پنهان کن",
+ "You cannot delete this image. (%(code)s)": "شما نمیتوانید این تصویر را پاک کنید. (%(code)s)",
+ "Cancel Sending": "فرستادن را لغو کن",
+ "Warning": "هشدار",
+ "This Room": "این گپ",
+ "Resend": "بازفرست",
+ "Error saving email notification preferences": "خطا در ذخیرهسازی ترجیحات آگاهسازی با ایمیل",
+ "Downloading update...": "در حال بارگیریِ بهروزرسانی...",
+ "#example": "#نمونه",
+ "Remember, you can always set an email address in user settings if you change your mind.": "به خاطر داشته باشید که اگر نظرتان عوض شد میتوانید از بخش تنظیمات یک ایمیل را به اکانتتان متصل کنید.",
+ "Unavailable": "غیرقابلدسترسی",
+ "View Decrypted Source": "دیدن منبع رمزگشایی شده",
+ "Failed to update keywords": "بهروزرسانی کلیدواژهها موفقیتآمیز نبود",
+ "remove %(name)s from the directory.": "%(name)s را از فهرست گپها حذف کن",
+ "Please set a password!": "لطفا یک پسورد اختیار کنید!",
+ "powered by Matrix": "قدرتیافته از ماتریکس",
+ "You have successfully set a password!": "شما با موفقیت رمزتان را انتخاب کردید!",
+ "Favourite": "علاقهمندیها",
+ "All Rooms": "همهی گپها",
+ "Source URL": "آدرس مبدا",
+ "Failed to add tag %(tagName)s to room": "در افزودن تگ %(tagName)s موفقیتآمیز نبود",
+ "Members": "اعضا",
+ "No update available.": "هیچ به روزرسانی جدیدی موجود نیست.",
+ "Noisy": "پرسروصدا",
+ "Failed to get protocol list from Home Server": "دریافت لیست پروتکلها از کارگزار مبدا موفقیتآمیز نبود",
+ "Collecting app version information": "درحال جمعآوری اطلاعات نسخهی برنامه",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "آیا مطمئنید که میخواهید نام مستعار گپ %(alias)s را پاک و %(name)s را از فهرست حذف کنید؟",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "این به شما اجازه خواهد داد که پس از خروج به اکانت خود بازگردید و از سایر دستگاهها وارد شوید.",
+ "Cancel": "لغو",
+ "Enable notifications for this account": "آگاه سازی با رایانامه را برای این اکانت فعال کن",
+ "Directory": "فهرست گپگاهها",
+ "Failed to get public room list": "گرفتن لیست گپگاههای عمومی موفقیتآمیز نبود",
+ "Messages containing keywords": "پیامهای دارای این کلیدواژهها ",
+ "Room not found": "گپ یافت نشد",
+ "Tuesday": "سهشنبه",
+ "Enter keywords separated by a comma:": "کلیدواژهها را وارد کنید؛ از کاما(,) برای جدا کردن آنها از یکدیگر استفاده کنید:",
+ "Forward Message": "هدایت پیام",
+ "Remove %(name)s from the directory?": "آیا مطمئنید میخواهید %(name)s را از فهرست گپها حذف کنید؟",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "رایوت از بسیاری از ویژگیهای پیشرفته در مروگرها استفاده میکند، برخی از این ویژگیها در مرورگر کنونی شما موجود نیستند و یا در حالت آزمایشی قرار دارند.",
+ "Unnamed room": "گپ نامگذاری نشده",
+ "Dismiss": "نادیده بگیر",
+ "Remove from Directory": "از فهرستِ گپها حذف کن",
+ "Saturday": "شنبه",
+ "I understand the risks and wish to continue": "از خطرات این کار آگاهم و مایلم که ادامه بدهم",
+ "Direct Chat": "چت مستقیم",
+ "The server may be unavailable or overloaded": "این سرور ممکن است ناموجود یا بسیار شلوغ باشد",
+ "Reject": "پس زدن",
+ "Failed to set Direct Message status of room": "تنظیم حالت پیام مستقیم برای گپ موفقیتآمیز نبود",
+ "Monday": "دوشنبه",
+ "All messages (noisy)": "همهی پیامها(بلند)",
+ "Enable them now": "همین حالا فعالشان کن",
+ "Messages containing my user name": "پیامهای شامل نامِ کاربری من",
+ "Collecting logs": "درحال جمعآوری گزارشها",
+ "more": "بیشتر",
+ "Search for a room": "جستجوی برای یک گپ",
+ "Search": "جستجو",
+ "(HTTP status %(httpStatus)s)": "(HTTP وضعیت %(httpStatus)s)",
+ "Failed to forget room %(errCode)s": "فراموش کردن گپگاه %(errCode)s موفقیتآمیز نبود",
+ "Wednesday": "چهارشنبه",
+ "Quote": "گفتآورد",
+ "Send": "ارسال",
+ "Error": "خطا",
+ "Send logs": "ارسال گزارشها",
+ "All messages": "همهی پیامها",
+ "unknown error code": "کد خطای ناشناخته",
+ "Call invitation": "دعوت به تماس",
+ "Messages containing my display name": "پیامهای حاوی نماینامِ من",
+ "You have successfully set a password and an email address!": "تخصیص ایمیل و پسوردتان با موفقیت انجام شد!",
+ "What's new?": "تازهها",
+ "Notify me for anything else": "مرا برای هرچیز دیگری باخبر کن",
+ "When I'm invited to a room": "وقتی من به گپی دعوت میشوم",
+ "Close": "بستن",
+ "Can't update user notification settings": "امکان بهروزرسانی تنظیمات آگاهسازی کاربر وجود ندارد",
+ "Notify for all other messages/rooms": "برای همهی پیامها/گپهای دیگر آگاهسازی کن",
+ "Couldn't find a matching Matrix room": "گپگاه مورد نظر در ماتریکس یافت نشد",
+ "Invite to this room": "دعوت به این گپ",
+ "You cannot delete this message. (%(code)s)": "شما نمیتوانید این پیام را پاک کنید. (%(code)s)",
+ "Thursday": "پنجشنبه",
+ "Search…": "جستجو…",
+ "Unhide Preview": "پیشنمایش را نمایان کن",
+ "Unable to join network": "خطا در ورود به شبکه",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "ممکن است شما این تنظیمات را در کارخواهی به جز رایوت اعمال کرده باشید. شما نمیتوانید انها را تغییر دهید اما آنها همچنان تاثیر خود را دارند",
+ "Sorry, your browser is not able to run Riot.": "متاسفانه مرورگر شما نمیتواند رایوت را اجرا کند.",
+ "Uploaded on %(date)s by %(user)s": "آپلود شده در تاریخ %(date)s توسط %(user)s",
+ "Messages in group chats": "پیامهای درون چتهای گروهی",
+ "Yesterday": "دیروز",
+ "Error encountered (%(errorDetail)s).": "خطای رخ داده (%(errorDetail)s).",
+ "Keywords": "کلیدواژهها",
+ "Low Priority": "کم اهمیت",
+ "Unable to fetch notification target list": "ناتوانی در تطبیق لیست آگاهسازیهای هدف",
+ "Set Password": "پسوردتان را انتخاب کنید",
+ "An error occurred whilst saving your email notification preferences.": "خطایی در حین ذخیرهی ترجیجات شما دربارهی رایانامه رخ داد.",
+ "Enable audible notifications in web client": "آگاهسازی صدادار را در کارگزار وب فعال کن",
+ "Permalink": "پایاپیوند",
+ "Off": "خاموش",
+ "Riot does not know how to join a room on this network": "رایوت از چگونگی ورود به یک گپ در این شبکه اطلاعی ندارد",
+ "Mentions only": "فقط نامبردنها",
+ "Failed to remove tag %(tagName)s from room": "خطا در حذف کلیدواژهی %(tagName)s از گپ",
+ "Remove": "حذف کن",
+ "You can now return to your account after signing out, and sign in on other devices.": "اکنون میتوانید پس از خروج به اکانتتان بازگردید و با دستگاههای دیگری وارد شوید.",
+ "Continue": "ادامه",
+ "Enable desktop notifications": "آگاهسازی دسکتاپ را فعال کن",
+ "Enable email notifications": "آگاهسازی با رایانامه را فعال کن",
+ "Login": "ورود",
+ "No rooms to show": "هیچ گپی برای نشان دادن موجود نیست",
+ "Download this file": "بارگیری کن",
+ "Failed to change settings": "تغییر تنظیمات موفقیتآمیز نبود",
+ "Failed to change password. Is your password correct?": "خطا در تغییر گذرواژه. آیا از درستی گذرواژهتان اطمینان دارید؟",
+ "View Source": "دیدن منبع",
+ "Custom Server Options": "تنظیمات سفارشی برای سرور",
+ "Collapse 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!": "با مرورگر کنونی شما، ظاهر و حس استفاده از برنامه ممکن است کاملا اشتباه باشد و برخی یا همهی ویژگیها ممکن است کار نکنند. میتوانید به استفاده ادامه دهید اما مسئولیت هر مشکلی که به آن بربخورید بر عهدهی خودتان است!",
+ "Checking for an update...": "درحال بررسی بهروزرسانیها...",
+ "There are advanced notifications which are not shown here": "آگاهسازیهای پیشرفتهای هستند که در اینجا نشان داده نشدهاند"
+}
diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json
index ae12f57e286..4a83f456c76 100644
--- a/src/i18n/strings/fi.json
+++ b/src/i18n/strings/fi.json
@@ -71,7 +71,6 @@
"Ban": "Anna porttikielto",
"Banned users": "Porttikiellon saanneet käyttäjät",
"Bans user with given id": "Antaa porttikiellon käyttäjälle jolla on annettu tunniste",
- "Bug Report": "Virheraportti",
"Bulk Options": "Bulkkiasetukset",
"Changes your display nickname": "Muuttaa näyttönimesi",
"Changes colour scheme of current room": "Muuttaa tamänhetkisen huoneen väritystä",
@@ -166,8 +165,6 @@
"Forgot your password?": "Unohditko salasanasi?",
"For security, this session has been signed out. Please sign in again.": "Turvallisuussyistä tämä istunto on vanhentunut. Ole hyvä ja kirjaudu uudestaan.",
"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.": "Turvallusuussyistä uloskirjautuminen poistaa kaikki päästä päähän-salausavaimet tästä selaimesta. Jos haluat purkaa keskustelujen salaukset tulevaisuudessa pitää sinun viedä purkuavaimet ja pitää ne turvallisesti tallessa.",
- "Found a bug?": "Löysitkö virheen?",
- "Hide Apps": "Piilota sovellukset",
"Hide read receipts": "Piilota lukukuittaukset",
"Hide Text Formatting Toolbar": "Piilota tekstinmuotoilutyökalupalkki",
"Homeserver is": "Kotipalvelin on",
@@ -475,7 +472,6 @@
"%(targetName)s rejected the invitation.": "%(targetName)s hylkäsi kutsun.",
"Remote addresses for this room:": "Tämän huoneen etäosoitteet:",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s poisti näyttönimensä (%(oldDisplayName)s).",
- "Report it": "Ilmoita siitä",
"Riot does not have permission to send you notifications - please check your browser settings": "Riotilla ei ole oikeuksia lähettää sinulle ilmoituksia. Ole hyvä ja tarkista selaimen asetukset",
"Riot was not given permission to send notifications - please try again": "Riotilla ei saannut oikeuksia lähettää ilmoituksia. Ole hyvä ja yritä uudelleen",
"Room %(roomId)s not visible": "Huone %(roomId)s ei ole näkyvissä",
@@ -680,7 +676,6 @@
"User Options": "Käyttäjä-asetukset",
"Make Moderator": "Anna moderaattorioikeudet",
"Admin Tools": "Ylläpitotyökalut",
- "Show Apps": "Näytä appit",
"Unpin Message": "Poista viestin kiinnitys",
"Jump to message": "Hyppää viestiin",
"No pinned messages.": "Ei kiinnitettyjä viestejä.",
@@ -785,7 +780,6 @@
"Leave Community": "Poistu yhteisöstä",
"Leave %(groupName)s?": "Poistu yhteisöstä %(groupName)s?",
"Leave": "Poistu",
- "Unable to leave room": "Poistuminen epäonnistui",
"Community Settings": "Yhteisöasetukset",
"Add rooms to this community": "Lisää huoneita yhteisöön",
"Featured Rooms:": "Esiinnostetut huoneet:",
@@ -935,5 +929,158 @@
"If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Jos avain täsmää, valitse painike alla. Jos avain ei täsmää, niin joku muu salakuuntelee laitetta ja haluat todennäköisesti painaa estopainiketta.",
"Old cryptography data detected": "Vanhat salaustiedot havaittu",
"Warning": "Varoitus",
- "Access Token:": "Pääsykoodi:"
+ "Access Token:": "Pääsykoodi:",
+ "Fetching third party location failed": "Kolmannen osapuolen paikan haku epäonnistui",
+ "A new version of Riot is available.": "Uusi Riot-versio on saatavilla.",
+ "Couldn't load home page": "Kotisivun lataus epäonnistui",
+ "Send Account Data": "Lähetä tilin tiedot",
+ "All notifications are currently disabled for all targets.": "Kaikki ilmoitukset on kytketty pois kaikilta kohteilta.",
+ "Uploading report": "Ladataan raporttia",
+ "Sunday": "Sunnuntai",
+ "Failed to add tag %(tagName)s to room": "Tagin %(tagName)s lisäämineen huoneelle ei onnistunut",
+ "Notification targets": "Ilmoituksen kohteet",
+ "Failed to set direct chat tag": "Suoran viestittelyn tagin asettaminen epäonnistui",
+ "Today": "Tänään",
+ "Files": "Tiedostot",
+ "You are not receiving desktop notifications": "Et vastaanota työpöytäilmoituksia",
+ "Friday": "Perjantai",
+ "Update": "Päivitä",
+ "What's New": "Mikä on uutta",
+ "Add an email address above to configure email notifications": "Lisää sähköpostiosoite yllä saadaksesi ilmoituksia sähköpostiisi",
+ "Expand panel": "Avaa paneeli",
+ "On": "Päällä",
+ "%(count)s Members|other": "%(count)s jäsentä",
+ "Filter room names": "Suodata",
+ "Changelog": "Muutosloki",
+ "Waiting for response from server": "Odotetaan vastausta palvelimelta",
+ "Send Custom Event": "Lähetä kustomoitu tapahtuma",
+ "Advanced notification settings": "Lisäasetukset ilmoituksille",
+ "delete the alias.": "poista alias.",
+ "To return to your account in future you need to set a password": "Voidaksesi tulevaisuudessa palata tilillesi sinut pitää asettaa salasana",
+ "Forget": "Unohda",
+ "#example": "#esimerkki",
+ "Hide panel": "Piilota paneeli",
+ "You cannot delete this image. (%(code)s)": "Et voi poistaa tätä kuvaa. (%(code)s)",
+ "Cancel Sending": "Peruuta lähetys",
+ "This Room": "Tämä huone",
+ "The Home Server may be too old to support third party networks": "Kotipalvelin saattaa olla liian vanha tukeakseen kolmannen osapuolen verkkoja",
+ "Noisy": "Äänekäs",
+ "Room not found": "Huonetta ei löytynyt",
+ "Downloading update...": "Ladataan päivitystä...",
+ "Messages in one-to-one chats": "Viestit henkilökohtaisissa keskusteluissa",
+ "Unavailable": "Ei saatavilla",
+ "Error saving email notification preferences": "Virhe tallennettaessa sähköposti-ilmoitusasetuksia",
+ "View Decrypted Source": "Näytä purettu lähdekoodi",
+ "Failed to update keywords": "Avainsanojen päivittäminen epäonnistui",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Seuraaviin avainsanoihin liittyvät ilmoitukset seuraavat sääntöjä joita ei voida näyttää tässä:",
+ "Safari and Opera work too.": "Safari ja Opera ovat myös tuettuja.",
+ "Please set a password!": "Ole hyvä ja aseta salasana!",
+ "You have successfully set a password!": "Olet onnistuneesti asettanut salasanan!",
+ "Explore Room State": "Huoneen tila",
+ "Source URL": "Lähde URL",
+ "Messages sent by bot": "Bottien lähettämät viestit",
+ "Filter results": "Suodata",
+ "Members": "Jäsenet",
+ "No update available.": "Ei päivityksiä saatavilla.",
+ "Resend": "Lähetä uudelleen",
+ "Failed to get protocol list from Home Server": "Protokollalistan hakeminen Kotipalvelimelta ei onnistunut",
+ "Collecting app version information": "Haetaan versiotietoja",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Poista huonetunnus %(alias)s ja poista %(name)s hakemistosta?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Tämä mahdollistaa sinut palamaan tilillesi uloskirjautumisen jälkeen sekä kirjautumaan muilla laitteilla.",
+ "Keywords": "Avainsanat",
+ "Enable notifications for this account": "Ota käyttöön ilmoitukset tälle tilille",
+ "Directory": "Hakemisto",
+ "Invite to this community": "Kutsu käyttäjiä",
+ "Search for a room": "Hae huonetta",
+ "Messages containing keywords": "Avainsanoja sisältävät viestit",
+ "View Source": "Näytä lähde",
+ "Tuesday": "Tiistai",
+ "Enter keywords separated by a comma:": "Anna avainsanat eroteltuna pilkuin:",
+ "Search…": "Haku…",
+ "You have successfully set a password and an email address!": "Olet onnistuneesti asettanut salasanan ja sähköpostiosoitteen!",
+ "Remove %(name)s from the directory?": "Poista %(name)s hakemistosta?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot käyttää monia selainominaisuuksia, joista osa selaimesi ei tue tai ne ovat kokeellisia.",
+ "Developer Tools": "Kehitystila",
+ "Enable desktop notifications": "Ota käyttöön työpöytäilmoitukset",
+ "Explore Account Data": "Tilitiedot",
+ "All messages (noisy)": "Kaikki viestit (äänekkäästi)",
+ "Away": "Poissa",
+ "Saturday": "Lauantai",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Muista että voit aina asettaa sähköpostiosoitteen käyttäjäasetuksista jos muutat mielesi.",
+ "Direct Chat": "Suora viestittely",
+ "The server may be unavailable or overloaded": "Palvelin saattaa olla saavuttamaton tai ylikuormitettu",
+ "Reject": "Hylkää",
+ "Failed to set Direct Message status of room": "Huoneen suoran viestittelyn tilan asettaminen epäonnistui",
+ "Monday": "Maanantai",
+ "Remove from Directory": "Poista hakemistosta",
+ "Enable them now": "Ota käyttöön nyt",
+ "Forward Message": "Edelleenlähetä viesti",
+ "Messages containing my user name": "Viestit joissa mainitaan käyttäjänimeni",
+ "Toolbox": "Työkalut",
+ "Collecting logs": "Haetaan lokitietoja",
+ "more": "lisää",
+ "Bug report sent": "Virheraportti lähetetty",
+ "You must specify an event type!": "Sinun on määritettävä tapahtuman tyyppi!",
+ "(HTTP status %(httpStatus)s)": "(HTTP tila %(httpStatus)s)",
+ "All Rooms": "Kaikki huoneet",
+ "Please install Chrome or Firefox for the best experience.": "Asenna Chrome tai Firefox parhaan käyttökokemuksen saavuttamiseksi.",
+ "Failed to get public room list": "Julkisten huoneiden listan hakeminen epäonnistui",
+ "Quote": "Lainaa",
+ "Send logs": "Lähetä lokit",
+ "All messages": "Kaikki viestit",
+ "Call invitation": "Puhelukutsu",
+ "Messages containing my display name": "Viestit joissa mainitaan nimimerkkini",
+ "State Key": "Tila-avain",
+ "Failed to send custom event.": "Kustomoidun tapahtuman lähettäminen epäonnistui.",
+ "What's new?": "Mikä on uutta?",
+ "Notify me for anything else": "Ilmoita minulle kaikesta muusta",
+ "When I'm invited to a room": "Kun minut kutsutaan huoneeseen",
+ "Can't update user notification settings": "Käyttäjän ilmoitusasetusten päivittäminen epäonnistui",
+ "Notify for all other messages/rooms": "Ilmoita kaikista muista viesteistä/huoneista",
+ "Unable to look up room ID from server": "Huone-ID:n haku palvelimelta epäonnistui",
+ "Couldn't find a matching Matrix room": "Vastaavaa Matrix-huonetta ei löytynyt",
+ "Invite to this room": "Kutsu käyttäjiä",
+ "You cannot delete this message. (%(code)s)": "Et voi poistaa tätä viestiä. (%(code)s)",
+ "Thursday": "Torstai",
+ "I understand the risks and wish to continue": "Ymmärrän riskit ja haluan jatkaa",
+ "Back": "Takaisin",
+ "Reply": "Vastaa",
+ "Show message in desktop notification": "Näytä viestit ilmoituskeskuksessa",
+ "Unhide Preview": "Näytä ennakkokatselu",
+ "Unable to join network": "Verkkoon liittyminen epäonnistui",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Olet saattanut muuttaa niitä toisessa asiakasohjelmassa kuin Riot. Et voi muuttaa niitä Riotissa mutta ne pätevät kuitenkin",
+ "Sorry, your browser is not able to run Riot.": "Valitettavasti Riot ei toimi selaimessasi.",
+ "Uploaded on %(date)s by %(user)s": "Ladattu %(date)s käyttäjän %(user)s toimesta",
+ "Messages in group chats": "Viestit ryhmäkeskusteluissa",
+ "Yesterday": "Eilen",
+ "Error encountered (%(errorDetail)s).": "Virhe: %(errorDetail)s.",
+ "Login": "Kirjaudu sisään",
+ "Low Priority": "Matala prioriteetti",
+ "Unable to fetch notification target list": "Ilmoituskohdelistan haku epäonnistui",
+ "Set Password": "Aseta salasana",
+ "Appear Offline": "Offline-tila",
+ "An error occurred whilst saving your email notification preferences.": "Sähköposti-ilmoitusasetuksia tallettaessa tapahtui virhe.",
+ "Enable audible notifications in web client": "Ota käyttöön äänelliset ilmoitukset",
+ "Permalink": "Pysyvä linkki",
+ "remove %(name)s from the directory.": "poista %(name)s hakemistosta.",
+ "Off": "Pois päältä",
+ "Riot does not know how to join a room on this network": "Riot ei tiedä miten liittya huoneeseen tässä verkossa",
+ "Mentions only": "Vain maininnat",
+ "Failed to remove tag %(tagName)s from room": "Tagin %(tagName)s poistaminen huoneelta epäonnistui",
+ "Wednesday": "Keskiviikko",
+ "You can now return to your account after signing out, and sign in on other devices.": "Voit nyt palata tilillesi kirjauduttua ulos, sekä kirjautua muilla laitteilla.",
+ "Enable email notifications": "Ota käyttöön sähköposti-ilmoitukset",
+ "Event Type": "Tapahtuman tyyppi",
+ "Download this file": "Lataa tiedosto",
+ "Pin Message": "Kiinnitä viesti",
+ "Failed to change settings": "Asetusten muuttaminen epäonnistui",
+ "View Community": "Näytä yhteisö",
+ "%(count)s Members|one": "%(count)s jäsen",
+ "Event sent!": "Tapahtuma lähetetty!",
+ "Event Content": "Tapahtuman sisältö",
+ "Thank you!": "Kiitos!",
+ "Collapse panel": "Piilota paneeli",
+ "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!": "Nykyisellä selaimellasi ohjelman ulkonäkö voi olla aivan virheellinen, ja jotkut ominaisuudet eivät saata toimia. Voit jatkaa jos haluat kokeilla mutta et voi odottaa saavasi apua mahdollisesti ilmeneviin ongelmiin!",
+ "Checking for an update...": "Tarkistetaan päivityksen saatavuutta...",
+ "There are advanced notifications which are not shown here": "On kehittyneitä ilmoituksia joita ei näytetä tässä"
}
diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json
index 25cfc6cc82f..b94dae49e40 100644
--- a/src/i18n/strings/fr.json
+++ b/src/i18n/strings/fr.json
@@ -57,7 +57,6 @@
"Banned users": "Utilisateurs bannis",
"Bans user with given id": "Bannit l'utilisateur à partir de son identifiant",
"Blacklisted": "Sur liste noire",
- "Bug Report": "Rapport d'erreur",
"Call Timeout": "Délai d’appel expiré",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Impossible de se connecter au serveur d'accueil en HTTP si l'URL dans la barre de votre explorateur est en HTTPS. Utilisez HTTPS ou activez le support des scripts non-vérifiés.",
"Can't load user settings": "Impossible de charger les paramètres de l'utilisateur",
@@ -133,7 +132,6 @@
"Forget room": "Oublier le salon",
"Forgot your password?": "Mot de passe oublié ?",
"For security, this session has been signed out. Please sign in again.": "Par mesure de sécurité, la session a expiré. Merci de vous authentifier à nouveau.",
- "Found a bug?": "Vous avez trouvé un problème ?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s",
"Hangup": "Raccrocher",
"Hide read receipts": "Cacher les accusés de lecture",
@@ -241,7 +239,6 @@
"%(senderName)s removed their profile picture.": "%(senderName)s a supprimé son image de profil.",
"Remove %(threePid)s?": "Supprimer %(threePid)s ?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s a demandé une téléconférence audio.",
- "Report it": "Le signaler",
"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.": "Pour le moment, réinitialiser le mot de passe va réinitialiser les clés de chiffrement sur tous les appareils, rendant l’historique des salons chiffrés illisible, à moins que vous exportiez d'abord les clés de salon puis que vous les ré-importiez après. Cela sera amélioré prochainement.",
"Return to login screen": "Retourner à l’écran de connexion",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot n’a pas la permission de vous envoyer des notifications - merci de vérifier les paramètres de votre navigateur",
@@ -651,11 +648,9 @@
"Define the power level of a user": "Définir le rang d'un utilisateur",
"Edit": "Modifier",
"Enable automatic language detection for syntax highlighting": "Activer la détection automatique de la langue pour la correction orthographique",
- "Hide Apps": "Masquer les applications",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Masquer les messages d'arrivée/départ (n'affecte pas les invitations/exclusions/bannissements)",
"Revoke widget access": "Révoquer les accès du widget",
"Sets the room topic": "Défini le sujet du salon",
- "Show Apps": "Afficher les applications",
"To get started, please pick a username!": "Pour commencer, choisissez un nom d'utilisateur !",
"Unable to create widget.": "Impossible de créer un widget.",
"Unbans user with given id": "Révoque le bannissement de l'utilisateur à partir de son identifiant",
@@ -862,7 +857,6 @@
"Leave Community": "Quitter la communauté",
"Leave %(groupName)s?": "Quitter %(groupName)s ?",
"Leave": "Quitter",
- "Unable to leave room": "Impossible de partir du salon",
"Community Settings": "Paramètres de la communauté",
"Add rooms to this community": "Ajouter des salons à cette communauté",
"%(inviter)s has invited you to join this community": "%(inviter)s vous a invité à rejoindre cette communauté",
@@ -992,7 +986,6 @@
"Key request sent.": "Demande de clé envoyée.",
"Re-request encryption keys from your other devices.": "Re-demander les clés de chiffrement depuis vos autres appareils.",
"%(user)s is a %(userRole)s": "%(user)s est %(userRole)s",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "Les changements effectués sur votre communauté peuvent ne pas apparaître pour les autres utilisateurs avant 30 minutes.",
"Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Vu par %(displayName)s (%(userName)s) à %(dateTime)s",
"Code": "Code",
"Debug Logs Submission": "Envoi des journaux de débogage",
@@ -1007,13 +1000,159 @@
"Stickerpack": "Pack de stickers",
"Sticker Messages": "Messages sticker",
"You don't currently have any stickerpacks enabled": "Vous n'avez activé aucun pack de stickers pour l'instant",
- "Click": "Cliquer",
- "here": "ici",
- "to add some!": "pour en ajouter !",
"Add a stickerpack": "Ajouter un pack de stickers",
"Hide Stickers": "Masquer les stickers",
"Show Stickers": "Afficher les stickers",
- "Manage sticker packs": "Gérer les packs de stickers",
"Who can join this community?": "Qui peut rejoindre cette communauté ?",
- "Everyone": "Tout le monde"
+ "Everyone": "Tout le monde",
+ "Fetching third party location failed": "Échec de la récupération de la localisation tierce",
+ "A new version of Riot is available.": "Une nouvelle version de Riot est disponible.",
+ "Couldn't load home page": "Impossible de charger la page d'accueil",
+ "Send Account Data": "Envoyer les données du compte",
+ "All notifications are currently disabled for all targets.": "Toutes les notifications sont désactivées pour tous les appareils.",
+ "Uploading report": "Envoi du rapport",
+ "Sunday": "Dimanche",
+ "Notification targets": "Appareils recevant les notifications",
+ "Today": "Aujourd'hui",
+ "Files": "Fichiers",
+ "You are not receiving desktop notifications": "Vous ne recevez pas les notifications sur votre bureau",
+ "Friday": "Vendredi",
+ "Update": "Mettre à jour",
+ "What's New": "Nouveautés",
+ "Add an email address above to configure email notifications": "Ajouter une adresse e-mail pour la configuration des notifications par e-mail",
+ "Expand panel": "Dévoiler le panneau",
+ "On": "Activé",
+ "%(count)s Members|other": "%(count)s membres",
+ "Filter room names": "Filtrer les salons par nom",
+ "Changelog": "Journal des modifications",
+ "Waiting for response from server": "En attente d’une réponse du serveur",
+ "Send Custom Event": "Envoyer l'événement personnalisé",
+ "Advanced notification settings": "Paramètres de notification avancés",
+ "delete the alias.": "supprimer l'alias.",
+ "To return to your account in future you need to set a password": "Pour pouvoir retrouver votre compte dans le futur, vous devez définir un mot de passe",
+ "Forget": "Oublier",
+ "#example": "#exemple",
+ "Hide panel": "Cacher le panneau",
+ "You cannot delete this image. (%(code)s)": "Vous ne pouvez pas supprimer cette image. (%(code)s)",
+ "Cancel Sending": "Annuler l'envoi",
+ "This Room": "Ce salon",
+ "The Home Server may be too old to support third party networks": "Le serveur d'accueil semble trop ancien pour supporter des réseaux tiers",
+ "Noisy": "Bruyant",
+ "Room not found": "Salon non trouvé",
+ "Messages containing my display name": "Messages contenant mon nom affiché",
+ "Messages in one-to-one chats": "Messages dans les discussions directes",
+ "Unavailable": "Indisponible",
+ "View Decrypted Source": "Voir la source déchiffrée",
+ "Failed to update keywords": "Échec dans la mise à jour des mots-clés",
+ "remove %(name)s from the directory.": "supprimer %(name)s du répertoire.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Les notifications pour les mots-clés suivant répondent à des critères qui ne peuvent pas être affichés ici :",
+ "Safari and Opera work too.": "Safari et Opera fonctionnent également.",
+ "Please set a password!": "Veuillez définir un mot de passe !",
+ "You have successfully set a password!": "Vous avez défini un mot de passe avec succès !",
+ "An error occurred whilst saving your email notification preferences.": "Une erreur est survenue lors de la sauvegarde de vos préférences de notification par e-mail.",
+ "Explore Room State": "Parcourir l'état du salon",
+ "Source URL": "URL de la source",
+ "Messages sent by bot": "Messages envoyés par des robots",
+ "Filter results": "Filtrer les résultats",
+ "Members": "Membres",
+ "No update available.": "Aucune mise à jour disponible.",
+ "Resend": "Renvoyer",
+ "Failed to get protocol list from Home Server": "Échec lors de la récupération de la liste sur le serveur",
+ "Collecting app version information": "Récupération des informations de version de l’application",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Supprimer l'alias %(alias)s du salon et supprimer %(name)s du répertoire ?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Cela vous permettra de retourner sur votre compte après vous être déconnecté, et de vous identifier sur d'autres appareils.",
+ "Keywords": "Mots-clés",
+ "Enable notifications for this account": "Activer les notifications pour ce compte",
+ "Directory": "Répertoire",
+ "Invite to this community": "Inviter à cette communauté",
+ "Failed to get public room list": "Échec lors de la récupération de la liste des salons publics",
+ "Messages containing keywords": "Messages contenant des mots-clés",
+ "Error saving email notification preferences": "Erreur lors de la sauvegarde des préférences de notification par e-mail",
+ "Tuesday": "Mardi",
+ "Enter keywords separated by a comma:": "Entrez les mots-clés séparés par une virgule :",
+ "Search…": "Rechercher…",
+ "You have successfully set a password and an email address!": "Vous avez défini un mot de passe et une adresse e-mail avec succès !",
+ "Remove %(name)s from the directory?": "Supprimer %(name)s du répertoire ?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utilise de nombreuses fonctionnalités avancées du navigateur, certaines ne sont pas disponibles ou expérimentales dans votre navigateur actuel.",
+ "Developer Tools": "Outils de développement",
+ "Enable desktop notifications": "Activer les notifications de bureau",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Souvenez-vous que vous pourrez toujours définir une adresse e-mail dans les paramètres de l'utilisateur si vous changez d’avis.",
+ "Explore Account Data": "Explorer les données du compte",
+ "Remove from Directory": "Supprimer du répertoire",
+ "Away": "Absent",
+ "Saturday": "Samedi",
+ "I understand the risks and wish to continue": "Je comprends les risques et souhaite continuer",
+ "Direct Chat": "Discussion directe",
+ "The server may be unavailable or overloaded": "Le serveur est indisponible ou surchargé",
+ "Reject": "Rejeter",
+ "Failed to set Direct Message status of room": "Échec du réglage de l'état du salon en Discussion directe",
+ "Monday": "Lundi",
+ "All messages (noisy)": "Tous les messages (fort)",
+ "Enable them now": "Les activer maintenant",
+ "Messages containing my user name": "Message contenant mon nom d'utilisateur",
+ "Toolbox": "Boîte à outils",
+ "Collecting logs": "Récupération des journaux",
+ "more": "plus",
+ "Bug report sent": "Rapport d'erreur envoyé",
+ "You must specify an event type!": "Vous devez spécifier un type d'événement !",
+ "(HTTP status %(httpStatus)s)": "(état HTTP %(httpStatus)s)",
+ "Invite to this room": "Inviter dans ce salon",
+ "Please install Chrome or Firefox for the best experience.": "Veuillez installer Chrome ou Firefox pour une expérience optimale.",
+ "Wednesday": "Mercredi",
+ "You cannot delete this message. (%(code)s)": "Vous ne pouvez pas supprimer ce message. (%(code)s)",
+ "Quote": "Citer",
+ "Send logs": "Envoyer les journaux",
+ "All messages": "Tous les messages",
+ "Call invitation": "Appel entrant",
+ "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 ?",
+ "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",
+ "Notify for all other messages/rooms": "Me notifier pour tous les autres messages/salons",
+ "Unable to look up room ID from server": "Impossible de récupérer l'ID du salon sur le serveur",
+ "Couldn't find a matching Matrix room": "Impossible de trouver un salon Matrix correspondant",
+ "All Rooms": "Tous les salons",
+ "Search for a room": "Rechercher un salon",
+ "Thursday": "Jeudi",
+ "Forward Message": "Transférer le message",
+ "Back": "Retour",
+ "Reply": "Répondre",
+ "Show message in desktop notification": "Afficher le message dans les notifications de bureau",
+ "Unhide Preview": "Dévoiler l'aperçu",
+ "Unable to join network": "Impossible de rejoindre le réseau",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Vous les avez probablement configurées dans un autre client que Riot. Vous ne pouvez pas les configurer dans Riot mais elles s'appliquent quand même",
+ "Sorry, your browser is not able to run Riot.": "Désolé, Riot n'est pas supporté par votre navigateur.",
+ "Uploaded on %(date)s by %(user)s": "Téléchargé le %(date)s par %(user)s",
+ "Messages in group chats": "Messages dans les discussions de groupe",
+ "Yesterday": "Hier",
+ "Error encountered (%(errorDetail)s).": "Erreur rencontrée (%(errorDetail)s).",
+ "Login": "Connexion",
+ "Low Priority": "Priorité basse",
+ "Unable to fetch notification target list": "Impossible de récupérer la liste des appareils recevant les notifications",
+ "Appear Offline": "Apparaître Hors ligne",
+ "Set Password": "Définir un mot de passe",
+ "Enable audible notifications in web client": "Activer les notifications sonores pour le client web",
+ "Permalink": "Permalien",
+ "Off": "Désactivé",
+ "Riot does not know how to join a room on this network": "Riot ne peut pas joindre un salon sur ce réseau",
+ "Mentions only": "Seulement les mentions",
+ "You can now return to your account after signing out, and sign in on other devices.": "Vous pouvez maintenant revenir sur votre compte après vous être déconnecté, et vous identifier sur d'autres appareils.",
+ "Enable email notifications": "Activer les notifications par e-mail",
+ "Event Type": "Type d'événement",
+ "Download this file": "Télécharger ce fichier",
+ "Pin Message": "Épingler le message",
+ "Failed to change settings": "Échec de la mise à jour des paramètres",
+ "View Community": "Voir la communauté",
+ "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!": "Depuis votre navigateur actuel, le visuel et le ressenti de l'application pourraient être complètement erronés, et certaines fonctionnalités pourraient ne pas être supportées. Vous pouvez continuer malgré tout, mais vous n'aurez aucune aide si vous rencontrez des problèmes !",
+ "%(count)s Members|one": "%(count)s membre",
+ "Event sent!": "Événement envoyé !",
+ "Event Content": "Contenu de l'événement",
+ "Thank you!": "Merci !",
+ "Collapse panel": "Cacher le panneau",
+ "When I'm invited to a room": "Quand je suis invité dans un salon",
+ "Checking for an update...": "Recherche de mise à jour...",
+ "There are advanced notifications which are not shown here": "Il existe une configuration avancée des notifications qui ne peut être affichée ici"
}
diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json
index bc86593fc4a..564230f6137 100644
--- a/src/i18n/strings/gl.json
+++ b/src/i18n/strings/gl.json
@@ -302,8 +302,6 @@
"Hangup": "Quedada",
"Voice call": "Chamada de voz",
"Video call": "Chamada de vídeo",
- "Hide Apps": "Agochar Apps",
- "Show Apps": "Mostrar Apps",
"Upload file": "Subir ficheiro",
"Show Text Formatting Toolbar": "Mostrar barra de formato de texto",
"Send an encrypted reply…": "Enviar unha resposta cifrada…",
@@ -736,7 +734,6 @@
"Leave Community": "Deixar a comunidade",
"Leave %(groupName)s?": "Deixar %(groupName)s?",
"Leave": "Saír",
- "Unable to leave room": "Non puido deixar a sala",
"Community Settings": "Axustes da comunidade",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Estas salas son mostradas aos membros da comunidade na páxina da comunidade. Os membros da comunidade poden unirse as salas pulsando en elas.",
"Add rooms to this community": "Engadir salas a esta comunidade",
@@ -826,9 +823,6 @@
"Device ID:": "ID de dispositivo:",
"Device key:": "Chave do dispositivo:",
"Ignored Users": "Usuarias ignoradas",
- "Bug Report": "Informe de fallo",
- "Found a bug?": "Atopou un fallo?",
- "Report it": "Informe",
"Analytics": "Analytics",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot recolle información analítica anónima para permitirnos mellorar o aplicativo.",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "A intimidade impórtanos, así que non recollemos información personal ou identificable nos datos dos nosos análises.",
@@ -989,7 +983,6 @@
"Flair will appear if enabled in room settings": "O Aura aparecerá si está habilitada nas preferencias da sala",
"Flair will not appear": "O Aura non aparecerá",
"Display your community flair in rooms configured to show it.": "Mostrar o aura da súa comunidade en salas configuradas para mostralo.",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "Os cambios feitos a súa comunidade poderían tardar uns 30 minutos en ser visibles para os membros.",
"Did you know: you can use communities to filter your Riot.im experience!": "Sabía que pode utilizar as comunidades para mellorar a súa experiencia con Riot.im!",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Para establecer un filtro, arrastre un avatar da comunidade sobre o panel de filtros na parte esquerda da pantalla. Pode pulsar nun avatar no panel de filtrado en calquer moemento para ver só salas e xente asociada a esa comunidade.",
"Deops user with given id": "Degradar usuaria co id dado",
@@ -1003,5 +996,162 @@
"Debug Logs Submission": "Envío de rexistro de depuración",
"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 contian messages.": "Si enviou un reporte de fallo a través de GitHub, os informes poden axudarnos a examinar o problema. Os informes de fallo conteñen datos do uso do aplicativo incluíndo o seu nome de usuaria, os IDs ou alcumes das salas e grupos que visitou e os nomes de usuaria de outras personas. Non conteñen mensaxes.",
"Submit debug logs": "Enviar informes de depuración",
- "Opens the Developer Tools dialog": "Abre o cadro de Ferramentas de Desenvolvedoras"
+ "Opens the Developer Tools dialog": "Abre o cadro de Ferramentas de Desenvolvedoras",
+ "Fetching third party location failed": "Fallo ao obter a localización de terceiros",
+ "A new version of Riot is available.": "Está dispoñible unha nova versión de Riot.",
+ "Couldn't load home page": "Non se cargou a páxina de inicio",
+ "Send Account Data": "Enviar datos da conta",
+ "All notifications are currently disabled for all targets.": "Todas as notificacións están deshabilitadas para todos os destinos.",
+ "Uploading report": "Informe da subida",
+ "Sunday": "Domingo",
+ "Notification targets": "Obxetivos das notificacións",
+ "Today": "Hoxe",
+ "Failed to get protocol list from Home Server": "Fallo ao obter a lista de protocolo desde o servidor",
+ "You are not receiving desktop notifications": "Non está a recibir notificacións de escritorio",
+ "Friday": "Venres",
+ "Update": "Actualizar",
+ "What's New": "Qué hai de novo",
+ "Add an email address above to configure email notifications": "Engada un enderezo de correo electrónico para configurar as notificacións",
+ "Expand panel": "Expandir panel",
+ "On": "On",
+ "%(count)s Members|other": "%(count)s Membros",
+ "Filter room names": "Filtrar nomes de sala",
+ "Changelog": "Rexistro de cambios",
+ "Waiting for response from server": "Agardando pola resposta do servidor",
+ "Send Custom Event": "Enviar evento personalizado",
+ "Advanced notification settings": "Axustes avanzados de notificación",
+ "Failed to send logs: ": "Fallo ao enviar os informes: ",
+ "delete the alias.": "borrar alcume.",
+ "To return to your account in future you need to set a password": "Para voltar a súa conta no futuro debe establecer un contrasinal>/u>",
+ "Forget": "Esquecer",
+ "#example": "#exemplo",
+ "Hide panel": "Agochar panel",
+ "You cannot delete this image. (%(code)s)": "Non pode eliminar esta imaxe. (%(code)s)",
+ "Cancel Sending": "Cancelar o envío",
+ "This Room": "Esta sala",
+ "The Home Server may be too old to support third party networks": "O servidor de inicio podería ser demasiando antigo como para aceptar redes de terceiros",
+ "Noisy": "Ruidoso",
+ "Error saving email notification preferences": "Fallo ao cargar os axustes de notificacións",
+ "Messages containing my display name": "Mensaxes que conteñen o meu nome público",
+ "Messages in one-to-one chats": "Mensaxes en chats un-a-un",
+ "Unavailable": "Non dispoñible",
+ "View Decrypted Source": "Ver a fonte descifrada",
+ "Failed to update keywords": "Fallo ao actualizar as palabras chave",
+ "Notes:": "Notas:",
+ "remove %(name)s from the directory.": "eliminar %(name)s do directorio.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Notificacións das reglas de seguimento das seguintes palabras que non se mostrarán aquí:",
+ "Safari and Opera work too.": "Safari e Opera tamén funcionan.",
+ "Please set a password!": "Por favor estableza un contrasinal!",
+ "You have successfully set a password!": "Mudou con éxito o seu contrasinal!",
+ "An error occurred whilst saving your email notification preferences.": "Algo fallou mentras se gardaban as súas preferencias de notificaicón.",
+ "Explore Room State": "Explorar estado da sala",
+ "Search for a room": "Buscar unha sala",
+ "Source URL": "URL fonte",
+ "Messages sent by bot": "Mensaxes enviadas por bot",
+ "Filter results": "Filtrar resultados",
+ "Members": "Membresía",
+ "No update available.": "Sen actualizacións.",
+ "Resend": "Voltar a enviar",
+ "Files": "Ficheiros",
+ "Collecting app version information": "Obtendo información sobre a versión da app",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Eliminar o alcume da sala %(alias)s e borrar %(name)s do directorio?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Esto permitiralle voltar a súa conta tras desconectarse, e conectarse en outros dispositivos.",
+ "Keywords": "Palabras chave",
+ "Enable notifications for this account": "Habilitar notificacións para esta conta",
+ "Directory": "Directorio",
+ "Invite to this community": "Convidar a esta comunidade",
+ "Failed to get public room list": "Fallo ao obter a lista de salas públicas",
+ "Messages containing keywords": "Mensaxes que conteñen palabras chave",
+ "Room not found": "Non se atopou a sala",
+ "Tuesday": "Martes",
+ "Enter keywords separated by a comma:": "Introduza palabras chave separadas por vírgulas:",
+ "Search…": "Buscar…",
+ "Remove %(name)s from the directory?": "Eliminar %(name)s do directorio?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utiliza características avanzadas do navegador, algunhas das cales non están dispoñibles ou son experimentales no seu navegador actual.",
+ "Developer Tools": "Ferramentas para desenvolver",
+ "Preparing to send logs": "Preparándose para enviar informe",
+ "Enable desktop notifications": "Habilitar notificacións de escritorio",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Lembre, sempre poderá poñer un enderezo de correo nos axustes de usuario si cambia de idea.",
+ "Explore Account Data": "Explorar datos da conta",
+ "All messages (noisy)": "Todas as mensaxes (alto)",
+ "Away": "Fóra",
+ "Saturday": "Sábado",
+ "I understand the risks and wish to continue": "Entendos os riscos e desexo continuar",
+ "Direct Chat": "Chat directo",
+ "The server may be unavailable or overloaded": "O servidor podería non estar dispoñible ou sobrecargado",
+ "Reject": "Rexeitar",
+ "Failed to set Direct Message status of room": "Fallo ao establecer o estado Mensaxe Directa da sala",
+ "Monday": "Luns",
+ "Remove from Directory": "Eliminar do directorio",
+ "Enable them now": "Habilitalas agora",
+ "Messages containing my user name": "Mensaxes que conteñen o meu nome de usuaria",
+ "Toolbox": "Ferramentas",
+ "Collecting logs": "Obtendo rexistros",
+ "more": "máis",
+ "GitHub issue link:": "Ligazón ao reporte en GitHub:",
+ "Bug report sent": "Enviado o informe de fallo",
+ "You must specify an event type!": "Debe indicar un tipo de evento!",
+ "(HTTP status %(httpStatus)s)": "(Estado HTTP %(httpStatus)s)",
+ "All Rooms": "Todas as Salas",
+ "State Key": "Chave do estado",
+ "Please install Chrome or Firefox for the best experience.": "Por favor instale Chrome ou Firefox para a mellor experiencia de usuaria.",
+ "Wednesday": "Mércores",
+ "Quote": "Cita",
+ "Send logs": "Enviar informes",
+ "All messages": "Todas as mensaxes",
+ "Call invitation": "Convite de chamada",
+ "Downloading update...": "Descargando actualización...",
+ "You have successfully set a password and an email address!": "Estableceu correctamente un contrasinal e enderezo de correo!",
+ "Failed to send custom event.": "Fallo ao enviar evento personalizado.",
+ "What's new?": "Qué hai de novo?",
+ "Notify me for anything else": "Notificarme todo o demáis",
+ "When I'm invited to a room": "Cando son convidado a unha sala",
+ "Click here to create a GitHub issue.": "Pulse aquí para crear un reporte en GitHub.",
+ "Can't update user notification settings": "Non se poden actualizar os axutes de notificación",
+ "Notify for all other messages/rooms": "Notificar para todas as outras mensaxes/salas",
+ "Unable to look up room ID from server": "Non se puido atopar o ID da sala do servidor",
+ "Couldn't find a matching Matrix room": "Non coincide con ningunha sala de Matrix",
+ "Invite to this room": "Convidar a esta sala",
+ "You cannot delete this message. (%(code)s)": "Non pode eliminar esta mensaxe. (%(code)s)",
+ "Thursday": "Xoves",
+ "Forward Message": "Reenviar mensaxe",
+ "Logs sent": "Informes enviados",
+ "Back": "Atrás",
+ "Reply": "Resposta",
+ "Show message in desktop notification": "Mostrar mensaxe nas notificacións de escritorio",
+ "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Os informes de depuración conteñen datos de utilización do aplicativo como o seu nome de usuaria, os IDs ou alcumes de salas e grupos que vostede visitou e os nomes de usuaria de outras usuarias. Non conteñen mensaxes.",
+ "Unhide Preview": "Desagochar a vista previsa",
+ "Unable to join network": "Non se puido conectar a rede",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Pode que os configurase nun cliente diferente de Riot. Non pode establecelos desde Riot pero aínda así aplicaranse",
+ "Sorry, your browser is not able to run Riot.": "Desculpe, o seu navegador non pode executar Riot.",
+ "Uploaded on %(date)s by %(user)s": "Subido a %(date)s por %(user)s",
+ "Messages in group chats": "Mensaxes en grupos de chat",
+ "Yesterday": "Onte",
+ "Error encountered (%(errorDetail)s).": "Houbo un erro (%(errorDetail)s).",
+ "Login": "Conectar",
+ "Low Priority": "Baixa prioridade",
+ "Unable to fetch notification target list": "Non se puido procesar a lista de obxetivo de notificacións",
+ "Appear Offline": "Aparecer fora de liña",
+ "Set Password": "Establecer contrasinal",
+ "Enable audible notifications in web client": "Habilitar notificacións audibles no cliente web",
+ "Permalink": "Ligazón permanente",
+ "Off": "Off",
+ "Riot does not know how to join a room on this network": "Riot non sabe cómo conectar con unha sala en esta rede",
+ "Mentions only": "Só mencións",
+ "You can now return to your account after signing out, and sign in on other devices.": "Pode voltar a súa contra tras desconectarse, e conectarse en outros dispositivos.",
+ "Enable email notifications": "Habilitar notificacións de correo",
+ "Event Type": "Tipo de evento",
+ "Download this file": "Descargue este ficheiro",
+ "Pin Message": "Fixar mensaxe",
+ "Failed to change settings": "Fallo ao cambiar os axustes",
+ "View Community": "Ver Comunidade",
+ "%(count)s Members|one": "%(count)s Membro",
+ "Event sent!": "Evento enviado!",
+ "View Source": "Ver fonte",
+ "Event Content": "Contido do evento",
+ "Thank you!": "Grazas!",
+ "Collapse panel": "Agochar 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!": "Co seu navegador actual a apareciencia e uso do aplicativo poderían estar totalmente falseadas, e algunhas características poderían non funcionar. Se quere pode continuar, pero debe ser consciente de que poden haber fallos!",
+ "Checking for an update...": "Comprobando as actualizacións...",
+ "There are advanced notifications which are not shown here": "Existen notificacións avanzadas que non se mostran aquí"
}
diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json
index e3de41600a4..9543a64b8f2 100644
--- a/src/i18n/strings/he.json
+++ b/src/i18n/strings/he.json
@@ -85,5 +85,164 @@
"Unnamed room": "חדר ללא שם",
"World readable": "העולם קריא",
"Guests can join": "אורחים יכולים להצטרף",
- "No rooms to show": "אין חדרים להצגה"
+ "No rooms to show": "אין חדרים להצגה",
+ "Fetching third party location failed": "נסיון להביא מיקום צד שלישי נכשל",
+ "A new version of Riot is available.": "יצאה גרסה חדשה של Riot.",
+ "Couldn't load home page": "כשל בטעינת דף הבית",
+ "Send Account Data": "שלח נתוני משתמש",
+ "All notifications are currently disabled for all targets.": "התראות מנוטרלות לכלל המערכת.",
+ "Uploading report": "מעדכן דוח",
+ "Sunday": "ראשון",
+ "Failed to add tag %(tagName)s to room": "נכשל בעת הוספת תג %(tagName)s לחדר",
+ "Notification targets": "יעדי התראה",
+ "Failed to set direct chat tag": "נכשל בעת סימון תג לשיחה ישירה",
+ "Today": "היום",
+ "Files": "קבצים",
+ "You are not receiving desktop notifications": "אתה לא מקבל התראות משולחן העבודה",
+ "Friday": "שישי",
+ "Update": "עדכון",
+ "What's New": "מה חדש",
+ "Add an email address above to configure email notifications": "הוסף כתובת דואר אלקטורני למעלה בכדי להגדיר התראות",
+ "Expand panel": "הרחב מסגרת",
+ "On": "דלוק",
+ "%(count)s Members|other": " םישמתשמ %(count)s",
+ "Filter room names": "סנן שמות חדרים",
+ "Changelog": "דו\"ח שינויים",
+ "Waiting for response from server": "ממתין לתשובה מהשרת",
+ "Send Custom Event": "שלח אירוע מותאם אישית",
+ "Advanced notification settings": "הגדרות מתקדמות להתראות",
+ "Failed to send logs: ": "כשל במשלוח יומנים: ",
+ "delete the alias.": "מחיקת כינוי.",
+ "To return to your account in future you need to set a password": "להשתמש בחשבונך בעתיד, עליך להגדיר סיסמא",
+ "Forget": "שכח",
+ "#example": "#דוגמא",
+ "Hide panel": "הסתר מסגרת",
+ "You cannot delete this image. (%(code)s)": "אי אפשר למחוק את התמונה. (%(code)s)",
+ "Cancel Sending": "ביטול שליחה",
+ "This Room": "החדר הזה",
+ "The Home Server may be too old to support third party networks": "שרת הבית ישן ואינו יכול לתמוך ברשתות צד שלישי",
+ "Noisy": "רועש",
+ "Error saving email notification preferences": "שגיאה בעת שמירת הגדרות התראה באמצעות הדואר האלקטרוני",
+ "Messages containing my display name": "הודעות המכילות את שם התצוגה שלי",
+ "Messages in one-to-one chats": "הודעות בשיחות פרטיות",
+ "Unavailable": "לא זמין",
+ "View Decrypted Source": "הצג מקור מפוענח",
+ "Failed to update keywords": "נכשל עדכון מילים",
+ "Notes:": "הערות:",
+ "remove %(name)s from the directory.": "הסר את %(name)s מהרשימה.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "התראה על מילות המפתח הבאות עוקבת אחר החוקים שאינם יכולים להיות מוצגים כאן:",
+ "Safari and Opera work too.": "Safari וגם Opera עובדים.",
+ "Please set a password!": "נא להגדיר סיסמא!",
+ "You have successfully set a password!": "שינוי סיסמא בוצע בהצלחה!",
+ "An error occurred whilst saving your email notification preferences.": "קרתה שגיאה בזמן שמירת הגדרות התראה באמצעות הדואר האלקטרוני.",
+ "Explore Room State": "גלה מצב החדר",
+ "Source URL": "כתובת URL אתר המקור",
+ "Messages sent by bot": "הודעות שנשלחו באמצעות בוט",
+ "Filter results": "סנן התוצאות",
+ "Members": "חברים",
+ "No update available.": "אין עדכון זמין.",
+ "Resend": "שלח מחדש",
+ "Failed to get protocol list from Home Server": "נכשל בעת נסיון קבלת רשימת פרוטוקולים משרת הבית",
+ "Collecting app version information": "אוסף מידע על גרסת היישום",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "מחק כינוי %(alias)s של החדר והסר את %(name)s מהרשימה?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "זה יאפשר לך לחזור לחשבונך אחרי התנתקות ולהתחבר באמצעות התקנים אחרים.",
+ "Keywords": "מילות מפתח",
+ "Enable notifications for this account": "אפשר התראות לחשבון זה",
+ "Directory": "ספרייה",
+ "Invite to this community": "הזמן לקהילה זו",
+ "Failed to get public room list": "נכשלה קבלת רשימת חדרים ציבוריים",
+ "Messages containing keywords": "הודעות המכילות מילות מפתח ",
+ "Room not found": "חדר לא נמצא",
+ "Tuesday": "שלישי",
+ "Enter keywords separated by a comma:": "הכנס מילים מופרדות באמצעות פסיק:",
+ "Forward Message": "העבר הודעה",
+ "Remove %(name)s from the directory?": "הסר את %(name)s מהרשימה?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot משתמש במספר רב של אפשרויות מתקדמות בדפדפן, חלק מהן לא זמינות או בשלבי נסיון בדפדפן שבשימושך כרגע.",
+ "Event sent!": "ארוע נשלח!",
+ "Preparing to send logs": "מתכונן לשלוח יומנים",
+ "Enable desktop notifications": "אפשר התראות בשולחן העבודה",
+ "Remember, you can always set an email address in user settings if you change your mind.": "להזכירך: תמיד ניתן לשנות כתובת אימייל בהגדרות משתש. למקרה שתתחרט/י.",
+ "Explore Account Data": "גלה פרטי משתמש",
+ "All messages (noisy)": "כל ההודעות (רועש)",
+ "Away": "מרוחק",
+ "Saturday": "שבת",
+ "I understand the risks and wish to continue": "אני מבין את הסיכונים אבל מבקש להמשיך",
+ "Direct Chat": "שיחה ישירה",
+ "The server may be unavailable or overloaded": "השרת אינו זמין או עמוס",
+ "Reject": "דחה",
+ "Failed to set Direct Message status of room": "נכשל בעת סימון מצב הודעה ישירה של החדר",
+ "Monday": "שני",
+ "Remove from Directory": "הסר מהרשימה",
+ "Enable them now": "אפשר אותם כעת",
+ "Messages containing my user name": "הודעות המכילות את שם המשתמש שלי",
+ "Toolbox": "תיבת כלים",
+ "Collecting logs": "אוסף יומנים לנפוי שגיאה (דבאג)",
+ "more": "עוד",
+ "GitHub issue link:": "קישור לדווח תקלה בGitHub:",
+ "Search for a room": "חפש חדר",
+ "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.": "יומני ניפוי שגיאה (דבאג) מכילים מידע על שימוש ביישום, כולל שם משתמש, מזהים או כינויים שהתמשת בהם. בחדרי שיחוח, או קבוצות בהם השתתפת. וגם שמות משתמשים אחרים. אך אינם כוללים הודעות.",
+ "(HTTP status %(httpStatus)s)": "(מצב HTTP %(httpStatus)s )",
+ "All Rooms": "כל החדרים",
+ "State Key": "מקש מצב",
+ "Please install Chrome or Firefox for the best experience.": "אנא התקן Firefox או Chrome לחוויה מיטבית.",
+ "Wednesday": "רביעי",
+ "Quote": "ציטוט",
+ "Send logs": "שלח יומנים",
+ "All messages": "כל ההודעות",
+ "Call invitation": "הזמנה לשיחה",
+ "Downloading update...": "מוריד עדכון...",
+ "You have successfully set a password and an email address!": "הצלחת להגדיר סיסמא וכתובת אימייל!",
+ "Failed to send custom event.": "כשל במשלוח ארוע מותאם אישית.",
+ "What's new?": "מה חדש?",
+ "Notify me for anything else": "התראה לי על כל דבר אחר",
+ "When I'm invited to a room": "מתי אני מוזמן לחדר",
+ "Click here to create a GitHub issue.": "הקלק כאן ליצירת דווח תקלה ב: GitHub .",
+ "Can't update user notification settings": "לא ניתן לעדכן הגדרות התראה למשתמש",
+ "Notify for all other messages/rooms": "התראה לכל שאר ההודעות/החדרים",
+ "Unable to look up room ID from server": "לא ניתן לאתר מזהה חדר על השרת",
+ "Couldn't find a matching Matrix room": "לא נמצא חדר כזה ב מטריקס",
+ "Invite to this room": "הזמן לחדר זה",
+ "You cannot delete this message. (%(code)s)": "לא ניתן למחוק הודעה זו. (%(code)s)",
+ "Thursday": "חמישי",
+ "Search…": "חפש…",
+ "Logs sent": "יומנים נשלחו",
+ "Back": "אחורה",
+ "Reply": "תשובה",
+ "Show message in desktop notification": "הצג הודעה בהתראות שולחן עבודה",
+ "You must specify an event type!": "חובה להגדיר סוג ארוע!",
+ "Unhide Preview": "הצג מחדש תצוגה מקדימה",
+ "Unable to join network": "לא ניתן להצטרף לרשת",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "יתכן כי בצעת את ההגדרות בצד לקוח ולא ב Riot. לא תוכל לעדכן אותם ב Riot אבל הם עדיין תקפים",
+ "Sorry, your browser is not able to run Riot.": "מצטערים, הדפדפן שלך הוא אינו יכול להריץ את Riot.",
+ "Uploaded on %(date)s by %(user)s": "עודכן ב %(date)s ע\"י %(user)s",
+ "Messages in group chats": "הודעות בקבוצות השיחה",
+ "Yesterday": "אתמול",
+ "Error encountered (%(errorDetail)s).": "ארעה שגיעה %(errorDetail)s .",
+ "Login": "התחבר",
+ "Low Priority": "עדיפות נמוכה",
+ "Unable to fetch notification target list": "לא ניתן לאחזר רשימת יעדי התראה",
+ "Appear Offline": "מופיע מקוון",
+ "Set Password": "הגדר סיסמא",
+ "Enable audible notifications in web client": "אפשר התראות קוליות בדפדפן",
+ "Permalink": "קישור קבוע",
+ "Off": "סגור",
+ "Riot does not know how to join a room on this network": "Riot אינו יודע כיצד להצטרף לחדר ברשת זו",
+ "Mentions only": "מאזכר בלבד",
+ "Failed to remove tag %(tagName)s from room": "נכשל בעת נסיון הסרת תג %(tagName)s מהחדר",
+ "You can now return to your account after signing out, and sign in on other devices.": "תוכל עתה לחזור לחשבון שלך רק אחרי התנתקות וחיבור מחדש לחשבון ממכשיר אחר.",
+ "Enable email notifications": "אפשר התראות באמצעות הדואר האלקטרוני",
+ "Event Type": "סוג ארוע",
+ "Download this file": "הורד את הקובץ",
+ "Pin Message": "הצמד הודעה",
+ "Failed to change settings": "נכשל בעת שינוי הגדרות",
+ "View Community": "הצג קהילה",
+ "%(count)s Members|one": " םישמתשמ %(count)s",
+ "Developer Tools": "כלי מפתחים",
+ "View Source": "הצג מקור",
+ "Event Content": "תוכן הארוע",
+ "Thank you!": "רב תודות!",
+ "Collapse 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!": "באמצעות הדפדפן הנוכחי שלך המראה של היישום יכול להיות שגוי לחלוטין וחלק מהאפשרויות לא תתפקדנה. אם תרצה לנסות בכל זאת תוכל אבל אז כל האחריות עליך!",
+ "Checking for an update...": "בודק עדכונים...",
+ "There are advanced notifications which are not shown here": "ישנן התראות מתקדמות אשר אינן מוצגות כאן"
}
diff --git a/src/i18n/strings/hi.json b/src/i18n/strings/hi.json
new file mode 100644
index 00000000000..f8bfb088a89
--- /dev/null
+++ b/src/i18n/strings/hi.json
@@ -0,0 +1,8 @@
+{
+ "A new version of Riot is available.": "रायट के एक नया वर्शन उपलब्ध है।",
+ "All messages": "सारे संदेश",
+ "All Rooms": "सारे कमरे",
+ "Please set a password!": "कृपया एक पासवर्ड सेट करें!",
+ "Continue": "आगे बढ़ें",
+ "You have successfully set a password and an email address!": "आपने सफलतापूर्वक एक पासवर्ड और एक ईमेल एड्रेस सेट कर लिया है!"
+}
diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json
index b7f20d52f77..a55a357a559 100644
--- a/src/i18n/strings/hu.json
+++ b/src/i18n/strings/hu.json
@@ -69,7 +69,6 @@
"Banned users": "Kitiltott felhasználók",
"Bans user with given id": "Kitiltja a felhasználót a megadott ID-vel",
"Blacklisted": "Fekete listára téve",
- "Bug Report": "Hiba jelentés",
"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 homeserver's SSL certificate 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 saját szerver tanúsítványa hiteles legyen, és a böngésző kiterjesztések ne blokkolják a kéréseket.",
@@ -192,7 +191,6 @@
"Forgot your password?": "Elfelejtetted a jelszavad?",
"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.",
- "Found a bug?": "Hibát találtál?",
"%(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.",
"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.",
@@ -309,7 +307,6 @@
"%(senderName)s removed their profile picture.": "%(senderName)s törölte a profil képét.",
"Remove %(threePid)s?": "Töröl: %(threePid)s?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s VoIP konferenciát kezdeményez.",
- "Report it": "Jelent",
"Results from DuckDuckGo": "Eredmények a DuckDuckGo-ból",
"Return to login screen": "Vissza a bejelentkezési képernyőre",
"Riot does not have permission to send you notifications - please check your browser settings": "Riotnak nincs jogosultsága értesítést küldeni neked - ellenőrizd a böngésző beállításait",
@@ -652,13 +649,11 @@
"Define the power level of a user": "A felhasználó szintjének meghatározása",
"Edit": "Szerkeszt",
"Enable automatic language detection for syntax highlighting": "Nyelv automatikus felismerése szintaxis kiemeléshez",
- "Hide Apps": "Alkalmazások elrejtése",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Belép/kilép üzenetek elrejtése (meghívók, kirúgások, kitiltások nem érintettek)",
"AM": "de",
"PM": "du",
"Revoke widget access": "Kisalkalmazás hozzáférésének visszavonása",
"Sets the room topic": "Szoba téma beállítás",
- "Show Apps": "Alkalmazások mutatása",
"To get started, please pick a username!": "Az induláshoz válassz egy felhasználói nevet!",
"Unable to create widget.": "Nem lehet kisalkalmazást létrehozni.",
"Unbans user with given id": "Visszaengedi a megadott azonosítójú felhasználót",
@@ -719,7 +714,6 @@
"Description": "Leírás",
"Name or matrix ID": "Név vagy Matrix azonosító",
"Unable to accept invite": "A meghívót nem lehet elfogadni",
- "Unable to leave room": "A szobát nem lehet elhagyni",
"Leave": "Elhagy",
"Failed to invite the following users to %(groupId)s:": "Az alábbi felhasználókat nem sikerült meghívni a(z) %(groupId)s:",
"Failed to invite users to %(groupId)s": "Nem sikerült meghívni a felhasználókat ebbe a csoportba: %(groupId)s",
@@ -992,7 +986,6 @@
"Key request sent.": "Kulcs kérés elküldve.",
"Re-request encryption keys from your other devices.": "Kulcsok újrakérése a többi eszközödtől.",
"%(user)s is a %(userRole)s": "%(user)s egy %(userRole)s",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "A közösségedben végrehajtott változtatás valószínűleg legalább 30 percig nem lesz látható mások számára.",
"Code": "Kód",
"Debug Logs Submission": "Hibakeresési napló elküldése",
"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 contian messages.": "Ha a GitHubon keresztül küldted be a hibát, a hibakeresési napló segíthet nekünk a javításban. A napló felhasználási adatokat tartalmaz mint a felhasználói neved, az általad meglátogatott szobák vagy csoportok azonosítóját vagy alternatív nevét és mások felhasználói nevét. De nem tartalmazzák az üzeneteket.",
@@ -1007,13 +1000,166 @@
"Stickerpack": "Matrica csomag",
"Sticker Messages": "Matrica üzenetek",
"You don't currently have any stickerpacks enabled": "Nincs engedélyezett matrica csomagod",
- "Click": "Kattints",
- "here": "ide",
- "to add some!": "hogy adj hozzá párat!",
"Add a stickerpack": "Matrica csomag hozzáadása",
"Hide Stickers": "Matricák elrejtése",
"Show Stickers": "Matricák megjelenítése",
- "Manage sticker packs": "Matrica csomagok kezelése",
"Who can join this community?": "Ki tud csatlakozni ehhez a közösséghez?",
- "Everyone": "Mindenki"
+ "Everyone": "Mindenki",
+ "Fetching third party location failed": "Nem sikerült lekérdezni a harmadik fél helyét",
+ "A new version of Riot is available.": "Elérhető egy új Riot verzió.",
+ "Couldn't load home page": "Nem sikerült betölteni a kezdőlapot",
+ "Send Account Data": "Fiókadatok küldése",
+ "All notifications are currently disabled for all targets.": "Minden céleszközön minden értesítés tiltva van.",
+ "Uploading report": "Jelentés feltöltése",
+ "Sunday": "Vasárnap",
+ "Notification targets": "Értesítések célpontja",
+ "Today": "Ma",
+ "Files": "Fájlok",
+ "You are not receiving desktop notifications": "Nem fogadsz asztali értesítéseket",
+ "Friday": "Péntek",
+ "Update": "Frissítés",
+ "What's New": "Újdonságok",
+ "Add an email address above to configure email notifications": "E-mail értesítések beállításához adj meg egy e-mail címet",
+ "Expand panel": "Panel kinyitása",
+ "On": "Be",
+ "%(count)s Members|other": "%(count)s tag",
+ "Filter room names": "Szobanevek szűrése",
+ "Changelog": "Változások",
+ "Waiting for response from server": "Várakozás a szerver válaszára",
+ "Send Custom Event": "Egyéni esemény elküldése",
+ "Advanced notification settings": "Haladó értesítési beállítások",
+ "Failed to send logs: ": "Hiba a napló küldésénél: ",
+ "delete the alias.": "becenév törlése.",
+ "To return to your account in future you need to set a password": "Hogy később visszaléphess a fiókodba, be kell állítanod egy jelszót",
+ "Forget": "Elfelejt",
+ "#example": "#példa",
+ "Hide panel": "Panel elrejtése",
+ "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",
+ "Resend": "Küldés újra",
+ "Room not found": "A szoba nem található",
+ "Messages containing my display name": "A profilnevemet tartalmazó üzenetek",
+ "Messages in one-to-one chats": "Személyes beszélgetések üzenetei",
+ "Unavailable": "Elérhetetlen",
+ "View Decrypted Source": "Visszafejtett forrás megjelenítése",
+ "Failed to update keywords": "Nem lehet frissíteni a kulcsszavakat",
+ "Notes:": "Jegyzetek:",
+ "remove %(name)s from the directory.": "%(name)s szoba törlése a listából.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Az alábbi kulcsszavakról jövő értesítések szabályait nem lehet itt megjeleníteni:",
+ "Safari and Opera work too.": "Safarival és Operával is működik.",
+ "Please set a password!": "Állíts be egy jelszót!",
+ "You have successfully set a password!": "Sikerült beállítani a jelszót!",
+ "An error occurred whilst saving your email notification preferences.": "Hiba történt az e-mail értesítési beállításaid mentése közben.",
+ "Explore Room State": "Szoba állapot felderítése",
+ "Source URL": "Forrás URL",
+ "Messages sent by bot": "Botok üzenetei",
+ "Filter results": "Találatok szűrése",
+ "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",
+ "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.",
+ "Keywords": "Kulcsszavak",
+ "Enable notifications for this account": "Értesítések engedélyezése ehhez a fiókhoz",
+ "Directory": "Könyvtár",
+ "Invite to this community": "Meghívás ebbe a közösségbe",
+ "Search for a room": "Szoba keresése",
+ "Messages containing keywords": "Kulcsszavakat tartalmazó üzenetek",
+ "Error saving email notification preferences": "Hiba az e-mail értesítési beállítások mentésekor",
+ "Tuesday": "Kedd",
+ "Enter keywords separated by a comma:": "Kulcsszavak vesszővel elválasztva:",
+ "Forward Message": "Üzenet továbbítása",
+ "You have successfully set a password and an email address!": "Sikerült beállítani a jelszavad és e-mail címed!",
+ "Remove %(name)s from the directory?": "Törlöd ezt a szobát a listából: %(name)s?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "A Riot sok fejlett böngészőfunkciót használ, amelyeknek egy része egyáltalán nem, vagy csak kísérleti jelleggel érhető el a jelenlegi böngésződben.",
+ "Developer Tools": "Fejlesztői eszközök",
+ "Preparing to send logs": "Előkészülés napló küldéshez",
+ "Enable desktop notifications": "Asztali értesítések engedélyezése",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Ha meggondolod magad, bármikor beállíthatod az e-mail címed a felhasználói beállításoknál.",
+ "Explore Account Data": "Fiókadatok felderítése",
+ "Remove from Directory": "Törlés a listából",
+ "Away": "Távol",
+ "Saturday": "Szombat",
+ "I understand the risks and wish to continue": "Megértettem a kockázatot és folytatom",
+ "Direct Chat": "Közvetlen csevegés",
+ "The server may be unavailable or overloaded": "A szerver nem elérhető vagy túlterhelt",
+ "Reject": "Elutasít",
+ "Failed to set Direct Message status of room": "Nem lehet beállítani a szoba közvetlen beszélgetés státuszát",
+ "Monday": "Hétfő",
+ "All messages (noisy)": "Minden üzenet (hangos)",
+ "Enable them now": "Engedélyezés most",
+ "Messages containing my user name": "A felhasználónevemet tartalmazó üzenetek",
+ "Toolbox": "Eszköztár",
+ "Collecting logs": "Naplók összegyűjtése",
+ "more": "tovább",
+ "GitHub issue link:": "GitHub hibajegy hivatkozás:",
+ "Bug report sent": "Hibajelentés elküldve",
+ "You must specify an event type!": "Meg kell jelölnöd az eseménytípust!",
+ "(HTTP status %(httpStatus)s)": "(HTTP állapot: %(httpStatus)s)",
+ "Invite to this room": "Meghívás a szobába",
+ "Please install Chrome or Firefox for the best experience.": "A legjobb élmény érdekében telepíts Chrome vagy Firefox böngészőt.",
+ "Failed to get public room list": "Nem sikerült lekérdezni a nyilvános szobák listáját",
+ "Quote": "Idéz",
+ "Send logs": "Naplófájlok elküldése",
+ "All messages": "Minden üzenet",
+ "Call invitation": "Hívás meghívó",
+ "Downloading update...": "Frissítés letöltése...",
+ "State Key": "Állapotkulcs",
+ "Failed to send custom event.": "Nem sikerült elküldeni az egyéni eseményt.",
+ "What's new?": "Mik az újdonságok?",
+ "Notify me for anything else": "Értesíts minden egyéb esetben",
+ "When I'm invited to a room": "Amikor meghívnak egy szobába",
+ "Click here to create a GitHub issue.": "Kattints ide GitHub hibajegy nyitásához .",
+ "Can't update user notification settings": "Nem lehet frissíteni az értesítési beállításokat",
+ "Notify for all other messages/rooms": "Értesítés minden más üzenethez/szobához",
+ "Unable to look up room ID from server": "Nem lehet a szoba azonosítóját megkeresni a szerveren",
+ "Couldn't find a matching Matrix room": "Nem található a keresett Matrix szoba",
+ "All Rooms": "Minden szobában",
+ "You cannot delete this message. (%(code)s)": "Nem törölheted ezt az üzenetet. (%(code)s)",
+ "Thursday": "Csütörtök",
+ "Search…": "Keresés…",
+ "Logs sent": "Napló elküldve",
+ "Back": "Vissza",
+ "Reply": "Válasz",
+ "Show message in desktop notification": "Üzenetek megjelenítése az asztali értesítéseknél",
+ "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.": "A hibakereső napló alkalmazás használati adatokat tartalmaz beleértve a felhasználói nevedet, az általad meglátogatott szobák és csoportok azonosítóit alternatív neveit és más felhasználói neveket. Csevegés üzenetek szövegét nem tartalmazza.",
+ "Unhide Preview": "Előnézet mutatása",
+ "Unable to join network": "Nem sikerült kapcsolódni a hálózathoz",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Egy másik, nem Riot-klienssel állítothattad be. A Riotban módosítani nem tudod ezeket, de érvényben vannak",
+ "Sorry, your browser is not able to run Riot.": "Elnézést, a böngésződben nem fut a Riot.",
+ "Uploaded on %(date)s by %(user)s": "Feltöltötte %(user)s ekkor: %(date)s",
+ "Messages in group chats": "Csoportszobák üzenetei",
+ "Yesterday": "Tegnap",
+ "Error encountered (%(errorDetail)s).": "Hiba történt (%(errorDetail)s).",
+ "Login": "Bejelentkezés",
+ "Low Priority": "Alacsony prioritás",
+ "Unable to fetch notification target list": "Nem sikerült letölteni az értesítési célok listáját",
+ "Appear Offline": "Offline látszik",
+ "Set Password": "Jelszó beállítása",
+ "Enable audible notifications in web client": "Hangértesítések engedélyezése a webkliensben",
+ "Permalink": "Állandó hivatkozás",
+ "Off": "Ki",
+ "Riot does not know how to join a room on this network": "A Riot nem tud csatlakozni szobához ezen a hálózaton",
+ "Mentions only": "Csak ha megemlítenek",
+ "Wednesday": "Szerda",
+ "You can now return to your account after signing out, and sign in on other devices.": "Most már kijelentkezés után is vissza tudsz lépni a fiókodba, és más készülékekről is be tudsz lépni.",
+ "Enable email notifications": "E-mail értesítések engedélyezése",
+ "Event Type": "Esemény típusa",
+ "Download this file": "Fájl letöltése",
+ "Pin Message": "Üzenet rögzítése",
+ "Failed to change settings": "A beállítások megváltoztatása nem sikerült",
+ "View Community": "Közösség megtekintése",
+ "%(count)s Members|one": "%(count)s tag",
+ "Event sent!": "Az esemény elküldve!",
+ "View Source": "Forrás megjelenítése",
+ "Event Content": "Esemény tartalma",
+ "Thank you!": "Köszönjük!",
+ "Collapse panel": "Panel becsukása",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Ebben a böngészőben az alkalmazás felülete tele lehet hibával, és az is lehet, hogy egyáltalán nem működik. Ha így is ki szeretnéd próbálni, megteheted, de ha valami gondod van, nem tudunk segíteni!",
+ "Checking for an update...": "Frissítés keresése...",
+ "There are advanced notifications which are not shown here": "Vannak itt nem látható, haladó értesítések"
}
diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json
index e95f3b13af8..5eccf721004 100644
--- a/src/i18n/strings/id.json
+++ b/src/i18n/strings/id.json
@@ -13,7 +13,6 @@
"Are you sure?": "Anda yakin?",
"An error has occurred.": "Telah terjadi kesalahan.",
"Are you sure you want to reject the invitation?": "Anda yakin menolak undangannya?",
- "Bug Report": "Laporan Bug",
"Can't load user settings": "Tidak dapat memuat pengaturan pengguna",
"Change Password": "Ubah Password",
"Click here to fix": "Klik di sini untuk perbaiki",
@@ -56,7 +55,6 @@
"Favourite": "Favorit",
"Favourites": "Favorit",
"Forgot your password?": "Lupa password?",
- "Found a bug?": "Menemukan bug?",
"Import": "Impor",
"Incorrect verification code": "Kode verifikasi tidak benar",
"Invalid Email Address": "Alamat email tidak benar",
@@ -88,7 +86,6 @@
"Public Chat": "Obrolan Publik",
"Reason": "Alasan",
"Register": "Registrasi",
- "Report it": "Laporkan",
"riot-web version:": "riot-web versi:",
"Return to login screen": "Kembali ke halaman masuk",
"Room Colour": "Warna Ruang",
@@ -201,5 +198,151 @@
"Device key:": "Kunci Perangkat:",
"Devices will not yet be able to decrypt history from before they joined the room": "Perangkat tidak akan dapat mendekripsi sejarah sebelum gabung ke ruang",
"Ban": "Blokir",
- "Bans user with given id": "Blokir pengguna dengan id"
+ "Bans user with given id": "Blokir pengguna dengan id",
+ "Fetching third party location failed": "Gagal mengambil lokasi pihak ketiga",
+ "A new version of Riot is available.": "Riot versi baru telah tersedia.",
+ "Couldn't load home page": "Tidak dapat memuat halaman utama",
+ "All notifications are currently disabled for all targets.": "Semua notifikasi saat ini dinonaktifkan untuk semua target.",
+ "Uploading report": "Unggah laporan",
+ "Sunday": "Minggu",
+ "Guests can join": "Tamu dapat gabung",
+ "Messages sent by bot": "Pesan dikirim oleh bot",
+ "Notification targets": "Target notifikasi",
+ "Failed to set direct chat tag": "Gagal mengatur tag obrolan langsung",
+ "Today": "Hari Ini",
+ "Failed to get protocol list from Home Server": "Gagal mendapatkan daftar protokol dari Server Home",
+ "You are not receiving desktop notifications": "Anda tidak menerima notifikasi desktop",
+ "Dismiss": "Abaikan",
+ "Update": "Perbarui",
+ "Notifications": "Notifikasi",
+ "What's New": "Apa Yang Baru",
+ "Add an email address above to configure email notifications": "Tambahkan alamat email di atas untuk konfigurasi notifikasi email",
+ "Expand panel": "Luaskan panel",
+ "On": "Nyala",
+ "Filter room names": "Saring nama ruang",
+ "Changelog": "Daftar perubahan",
+ "Waiting for response from server": "Menunggu respon dari server",
+ "Leave": "Tinggalkan",
+ "Advanced notification settings": "Pengaturan notifikasi lanjutan",
+ "delete the alias.": "hapus alias.",
+ "To return to your account in future you need to set a password": "Untuk kembali ke akun di lain waktu, Anda perlu mengisi password",
+ "Forget": "Lupakan",
+ "World readable": "Terpublikasi Umum",
+ "#example": "#contoh",
+ "Hide panel": "Sembunyikan panel",
+ "You cannot delete this image. (%(code)s)": "Anda tidak dapat menghapus gambar ini. (%(code)s)",
+ "Cancel Sending": "Batalkan pengiriman",
+ "Warning": "Peringatan",
+ "This Room": "Ruang ini",
+ "The Home Server may be too old to support third party networks": "Server Home mungkin terlalu kuno untuk mendukung jaringan pihak ketiga",
+ "Noisy": "Berisik",
+ "Error saving email notification preferences": "Terjadi kesalahan saat menyimpan pilihan notifikasi email",
+ "Messages containing my display name": "Pesan mengandung nama tampilan saya",
+ "Messages in one-to-one chats": "Pesan di obrolan satu-ke-satu",
+ "Unavailable": "Tidak Tersedia",
+ "View Decrypted Source": "Tampilkan Sumber Terdekripsi",
+ "Failed to update keywords": "Gagal memperbarui kata kunci",
+ "remove %(name)s from the directory.": "hapus %(name)s dari direktori.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Notifikasi pada kata kunci berikut mengikuti aturan dimana tidak dapat ditampilkan di sini:",
+ "Please set a password!": "Mohon isi password!",
+ "powered by Matrix": "didukung oleh Matrix",
+ "You have successfully set a password!": "Anda berhasil mengubah password!",
+ "An error occurred whilst saving your email notification preferences.": "Terjadi kesalahan saat menyimpan preferensi notifikasi email Anda.",
+ "All Rooms": "Semua Ruang",
+ "Source URL": "URL sumber",
+ "Failed to add tag %(tagName)s to room": "Gagal menambahkan tag %(tagName)s ke ruang",
+ "Members": "Anggota",
+ "No update available.": "Tidak ada pembaruan.",
+ "Resend": "Kirim Ulang",
+ "Files": "Files",
+ "Collecting app version information": "Mengumpukan informasi versi aplikasi",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Hapus alias ruang %(alias)s dan hapus %(name)s dari direktori?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Hal ini akan memperbolehkan anda kembali ke akun setelah keluar dan masuk kembali di perangkat lain.",
+ "Enable notifications for this account": "Aktifkan notifikasi untuk akun ini",
+ "Directory": "Direktori",
+ "Failed to get public room list": "Gagal mendapatkan daftar ruang publik",
+ "Messages containing keywords": "Pesan mengandung kata kunci",
+ "Room not found": "Ruang tidak ditemukan",
+ "Tuesday": "Selasa",
+ "Enter keywords separated by a comma:": "Masukkan kata kunci dipisahkan oleh koma:",
+ "Search…": "Cari…",
+ "Remove %(name)s from the directory?": "Hapus %(name)s dari direktori?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot menggunakan banyak fitur terdepan dari browser, dimana tidak tersedia atau dalam fase eksperimen di browser Anda.",
+ "Enable desktop notifications": "Aktifkan notifikasi desktop",
+ "Unnamed room": "Ruang tanpa nama",
+ "Friday": "Jumat",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Ingat, Anda selalu dapat mengubah alamat email di pengaturan pengguna jika anda berubah pikiran.",
+ "All messages (noisy)": "Semua pesan (keras)",
+ "Saturday": "Sabtu",
+ "I understand the risks and wish to continue": "Saya mengerti resikonya dan berharap untuk melanjutkan",
+ "Direct Chat": "Obrolan Langsung",
+ "The server may be unavailable or overloaded": "Server mungkin tidak tersedia atau kelebihan muatan",
+ "Reject": "Tolak",
+ "Failed to set Direct Message status of room": "Gagal mengatur status Pesan Langsung dari ruang",
+ "Monday": "Senin",
+ "Remove from Directory": "Hapus dari DIrektori",
+ "Enable them now": "Aktifkan sekarang",
+ "Messages containing my user name": "Pesan mengandung nama pengguna saya",
+ "Collecting logs": "Mengumpulkan catatan",
+ "more": "lagi",
+ "Bug report sent": "Laporan bug terkirim",
+ "(HTTP status %(httpStatus)s)": "(status HTTP %(httpStatus)s)",
+ "Failed to forget room %(errCode)s": "Gagal melupakan ruang %(errCode)s",
+ "Wednesday": "Rabu",
+ "You cannot delete this message. (%(code)s)": "Anda tidak dapat menghapus pesan ini. (%(code)s)",
+ "Quote": "Kutip",
+ "Send": "Kirim",
+ "Error": "Terjadi Kesalahan",
+ "Send logs": "Kirim catatan",
+ "All messages": "Semua pesan",
+ "Call invitation": "Undangan panggilan",
+ "Downloading update...": "Unduh pembaruan...",
+ "You have successfully set a password and an email address!": "Anda telah berhasil mengubah password dan alamat email!",
+ "What's new?": "Apa yang baru?",
+ "Notify me for anything else": "Beritau saya untuk lainnya",
+ "When I'm invited to a room": "Ketika Saya diundang ke ruang",
+ "Cancel": "Batal",
+ "Can't update user notification settings": "Tidak dapat memperbarui pengaturan notifikasi pengguna",
+ "Notify for all other messages/rooms": "Beritau semua pesan/ruang",
+ "Unable to look up room ID from server": "Tidak dapat mencari ID ruang dari server",
+ "Couldn't find a matching Matrix room": "Tidak dapat menemukan ruang Matrix yang sesuai",
+ "Invite to this room": "Undang ke ruang ini",
+ "Search for a room": "Cari ruang obrolan",
+ "Thursday": "Kamis",
+ "Forward Message": "Teruskan Pesan",
+ "Back": "Kembali",
+ "Show message in desktop notification": "Tampilkan pesan pada desktop",
+ "Unhide Preview": "Tampilkan Pratinjau",
+ "Unable to join network": "Tidak dapat bergabung di jaringan",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Anda mungkin sudah konfigurasi di klien selain Riot. Anda tidak dapat setel di Riot tetap berlaku",
+ "Sorry, your browser is not able to run Riot.": "Maaf, browser Anda tidak dapat menjalankan Riot.",
+ "Uploaded on %(date)s by %(user)s": "Diunggah pada %(date)s oleh %(user)s",
+ "Messages in group chats": "Pesan di obrolan grup",
+ "Yesterday": "Kemarin",
+ "Error encountered (%(errorDetail)s).": "Terjadi kesalahan (%(errorDetail)s).",
+ "Keywords": "Kata Kunci",
+ "Low Priority": "Prioritas Rendah",
+ "Unable to fetch notification target list": "Tidak dapat mengambil daftar notifikasi target",
+ "Set Password": "Ubah Password",
+ "Enable audible notifications in web client": "Aktifkan notifikasi suara di klien web",
+ "Permalink": "Permalink",
+ "Off": "Mati",
+ "Riot does not know how to join a room on this network": "Riot tidak tau bagaimana gabung ruang di jaringan ini",
+ "Mentions only": "Hanya jika disinggung",
+ "Failed to remove tag %(tagName)s from room": "Gagal menghapus tag %(tagName)s dari ruang",
+ "Remove": "Hapus",
+ "You can now return to your account after signing out, and sign in on other devices.": "Anda dapat kembali ke akun setelah keluar dan masuk kembali di perangkat lain.",
+ "Enable email notifications": "Aktifkan notifikasi email",
+ "Login": "Masuk",
+ "No rooms to show": "Tidak ada ruang ditunjukkan",
+ "Download this file": "Unduh file ini",
+ "Failed to change settings": "Gagal mengubah pengaturan",
+ "Failed to change password. Is your password correct?": "Gagal untuk mengubah password. Apakah password Anda benar?",
+ "View Source": "Tampilkan Sumber",
+ "Custom Server Options": "Pilihan Server Khusus",
+ "Thank you!": "Terima kasih!",
+ "Collapse panel": "Lipat 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!": "Dengan browser ini, tampilan dari aplikasi mungkin tidak sesuai, dan beberapa atau bahkan semua fitur mungkin tidak berjalan. Jika Anda ingin tetap mencobanya, Anda bisa melanjutkan, tapi Anda tanggung sendiri jika muncul masalah yang terjadi!",
+ "Checking for an update...": "Cek pembaruan...",
+ "There are advanced notifications which are not shown here": "Ada notifikasi lanjutan yang tidak ditampilkan di sini"
}
diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json
index 84b6a357e26..0c07d832242 100644
--- a/src/i18n/strings/it.json
+++ b/src/i18n/strings/it.json
@@ -356,8 +356,6 @@
"Hangup": "Riaggancia",
"Voice call": "Chiamata vocale",
"Video call": "Chiamata video",
- "Hide Apps": "Nascondi apps",
- "Show Apps": "Mostra apps",
"Upload file": "Invia file",
"Show Text Formatting Toolbar": "Mostra barra di formattazione testo",
"Send an encrypted reply…": "Invia una risposta criptata…",
@@ -776,9 +774,7 @@
"Leave Community": "Esci dalla comunità",
"Leave %(groupName)s?": "Uscire da %(groupName)s?",
"Leave": "Esci",
- "Unable to leave room": "Impossibile uscire dalla stanza",
"Community Settings": "Impostazioni comunità",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "Le modifiche fatte alla tua comunità potrebbero non essere visibili agli altri utenti per i prossimi 30 minuti.",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Queste stanze sono mostrate ai membri della comunità nella pagina della stessa. I membri della comunità possono entrare nelle stanze cliccandoci sopra.",
"Featured Rooms:": "Stanze in evidenza:",
"Featured Users:": "Utenti in evidenza:",
@@ -992,12 +988,8 @@
"Failed to remove tag %(tagName)s from room": "Rimozione etichetta %(tagName)s dalla stanza fallita",
"Failed to add tag %(tagName)s to room": "Aggiunta etichetta %(tagName)s alla stanza fallita",
"Stickerpack": "Pacchetto adesivi",
- "Click": "Clicca",
- "here": "qui",
- "to add some!": "per aggiungerne alcuni!",
"Hide Stickers": "Nascondi gli adesivi",
"Show Stickers": "Mostra gli adesivi",
- "Manage sticker packs": "Gestisci pacchetti di adesivi",
"Unable to join community": "Impossibile unirsi alla comunità",
"Unable to leave community": "Impossibile uscire dalla comunità",
"Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Le modifiche al nome e all'avatar effettuate alla tua comunità potrebbero non essere visibili agli altri utenti per i prossimi 30 minuti.",
@@ -1005,5 +997,162 @@
"Leave this community": "Esci da questa comunità",
"Sticker Messages": "Messaggi adesivi",
"You don't currently have any stickerpacks enabled": "Non hai ancora alcun pacchetto di adesivi attivato",
- "Add a stickerpack": "Aggiungi un pacchetto di adesivi"
+ "Add a stickerpack": "Aggiungi un pacchetto di adesivi",
+ "Fetching third party location failed": "Rilevazione posizione di terze parti fallita",
+ "A new version of Riot is available.": "È disponibile una nuova versione di Riot.",
+ "Couldn't load home page": "Impossibile caricare la pagina principale",
+ "Send Account Data": "Invia dati account",
+ "Advanced notification settings": "Impostazioni di notifica avanzate",
+ "Uploading report": "Sto caricando il report",
+ "Sunday": "Domenica",
+ "Notification targets": "Obiettivi di notifica",
+ "Today": "Oggi",
+ "Files": "File",
+ "You are not receiving desktop notifications": "Non stai ricevendo le notifiche sul desktop",
+ "Friday": "Venerdì",
+ "Update": "Aggiornamento",
+ "Riot does not know how to join a room on this network": "Riot non sa come entrare nella stanza su questa rete",
+ "Add an email address above to configure email notifications": "Aggiungi un indirizzo email sopra per configurare le notifiche via email",
+ "Expand panel": "Espandi il pannello",
+ "On": "Acceso",
+ "%(count)s Members|other": "%(count)s membri",
+ "Filter room names": "Filtra i nomi delle stanze",
+ "Changelog": "Cambiamenti",
+ "Waiting for response from server": "In attesa di una risposta dal server",
+ "Send Custom Event": "Invia Evento Personalizzato",
+ "All notifications are currently disabled for all targets.": "Tutte le notifiche sono disabilitate per tutti gli obbiettivi.",
+ "Failed to send logs: ": "Invio dei log fallito: ",
+ "delete the alias.": "elimina l'alias.",
+ "To return to your account in future you need to set a password": "Per tornare nel tuo account in futuro devi impostare una password",
+ "Forget": "Dimentica",
+ "Hide panel": "Nascondi pannello",
+ "You cannot delete this image. (%(code)s)": "Non puoi eliminare quest'immagine. (%(code)s)",
+ "Cancel Sending": "Annulla invio",
+ "This Room": "Questa stanza",
+ "The Home Server may be too old to support third party networks": "Il server Home potrebbe essere troppo vecchio per supportare reti di terze parti",
+ "Noisy": "Rumoroso",
+ "Error saving email notification preferences": "Errore nel salvataggio delle preferenze di notifica email",
+ "Messages containing my display name": "Messaggi contenenti il mio nome visualizzato",
+ "Messages in one-to-one chats": "Messaggi in chat uno-a-uno",
+ "Unavailable": "Non disponibile",
+ "View Decrypted Source": "Visualizza sorgente decifrato",
+ "Failed to update keywords": "Impossibile aggiornare le parole chiave",
+ "Notes:": "Note:",
+ "remove %(name)s from the directory.": "rimuovi %(name)s dalla lista.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Le notifiche alle seguenti parole chiave seguono regole che non possono essere mostrate qui:",
+ "Safari and Opera work too.": "Anche Safari e Opera vanno bene.",
+ "Please set a password!": "Imposta una password!",
+ "You have successfully set a password!": "Hai impostato una password con successo!",
+ "An error occurred whilst saving your email notification preferences.": "Si è verificato un errore durante il salvataggio delle tue preferenze sulle notifiche email.",
+ "Explore Room State": "Esplora Stato Stanza",
+ "Source URL": "URL d'origine",
+ "Messages sent by bot": "Messaggi inviati dai bot",
+ "Filter results": "Filtra risultati",
+ "Members": "Membri",
+ "No update available.": "Nessun aggiornamento disponibile.",
+ "Resend": "Reinvia",
+ "Failed to get protocol list from Home Server": "Impossibile ottenere la lista di protocolli dal server Home",
+ "Collecting app version information": "Raccolta di informazioni sulla versione dell'applicazione",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Eliminare l'alias %(alias)s e rimuovere %(name)s dalla lista?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Questo ti permetterà di ritornare al tuo account dopo esserti disconnesso e accedere in altri dispositivi.",
+ "Keywords": "Parole chiave",
+ "Enable notifications for this account": "Abilita le notifiche per questo account",
+ "Directory": "Lista",
+ "Invite to this community": "Invita a questa comunità",
+ "Failed to get public room list": "Impossibile ottenere la lista delle stanze pubbliche",
+ "Messages containing keywords": "Messaggi contenenti parole chiave",
+ "Room not found": "Stanza non trovata",
+ "Tuesday": "Martedì",
+ "Enter keywords separated by a comma:": "Inserisci le parole chiave separate da virgole:",
+ "Search…": "Cerca…",
+ "You have successfully set a password and an email address!": "Hai impostato con successo una password e un indirizzo email!",
+ "Remove %(name)s from the directory?": "Rimuovere %(name)s dalla lista?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utilizza molte funzioni avanzate del browser, alcune delle quali non sono disponibili o sono sperimentali nel tuo browser attuale.",
+ "Developer Tools": "Strumenti per Sviluppatori",
+ "Preparing to send logs": "Preparazione invio dei log",
+ "Enable desktop notifications": "Abilita le notifiche desktop",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Ricorda, puoi sempre specificare un indirizzo email nelle impostazioni utente se cambi idea.",
+ "Explore Account Data": "Esplora dati account",
+ "All messages (noisy)": "Tutti i messaggi (rumoroso)",
+ "Away": "Assente",
+ "Saturday": "Sabato",
+ "I understand the risks and wish to continue": "Sono consapevole dei rischi e vorrei continuare",
+ "Direct Chat": "Chat Diretta",
+ "The server may be unavailable or overloaded": "Il server potrebbe essere non disponibile o sovraccarico",
+ "Reject": "Rifiuta",
+ "Failed to set Direct Message status of room": "Impossibile impostare lo stato di Messaggio Diretto alla stanza",
+ "Monday": "Lunedì",
+ "Remove from Directory": "Rimuovi dalla lista",
+ "Enable them now": "Abilitale adesso",
+ "Messages containing my user name": "Messaggi contenenti il mio nome utente",
+ "Toolbox": "Strumenti",
+ "Collecting logs": "Sto recuperando i log",
+ "more": "altro",
+ "GitHub issue link:": "Link segnalazione su GitHub:",
+ "Bug report sent": "Rapporto inviato",
+ "You must specify an event type!": "Devi specificare un tipo di evento!",
+ "(HTTP status %(httpStatus)s)": "(stato HTTP %(httpStatus)s)",
+ "All Rooms": "Tutte le stanze",
+ "Please install Chrome or Firefox for the best experience.": "Installa Chrome o Firefox per la migliore esperienza d'uso.",
+ "Wednesday": "Mercoledì",
+ "You cannot delete this message. (%(code)s)": "Non puoi eliminare questo messaggio. (%(code)s)",
+ "Quote": "Cita",
+ "Send logs": "Invia i log",
+ "All messages": "Tutti i messaggi",
+ "Call invitation": "Invito ad una chiamata",
+ "Downloading update...": "Scaricamento aggiornamento...",
+ "State Key": "Chiave dello Stato",
+ "Failed to send custom event.": "Impossibile inviare evento personalizzato.",
+ "What's new?": "Cosa c'è di nuovo?",
+ "Notify me for anything else": "Notificami per qualsiasi altra cosa",
+ "When I'm invited to a room": "Quando vengo invitato/a in una stanza",
+ "Click here to create a GitHub issue.": "Clicca qui per creare una segnalazione su GitHub.",
+ "Can't update user notification settings": "Impossibile aggiornare le impostazioni di notifica dell'utente",
+ "Notify for all other messages/rooms": "Notifica per tutti gli altri messaggi/stanze",
+ "Unable to look up room ID from server": "Impossibile consultare l'ID stanza dal server",
+ "Couldn't find a matching Matrix room": "Impossibile trovare una stanza Matrix corrispondente",
+ "Invite to this room": "Invita in questa stanza",
+ "Search for a room": "Cerca una stanza",
+ "Thursday": "Giovedì",
+ "Forward Message": "Inoltra messaggio",
+ "Logs sent": "Log inviati",
+ "Back": "Indietro",
+ "Failed to change settings": "Impossibile modificare le impostazioni",
+ "Reply": "Rispondi",
+ "Show message in desktop notification": "Mostra i messaggi nelle notifiche desktop",
+ "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.": "I log di debug contengono dati di utilizzo dell'applicazione inclusi il nome utente, gli ID o alias delle stanze o gruppi visitati e i nomi degli altri utenti. Non contengono messaggi.",
+ "Unhide Preview": "Mostra anteprima",
+ "Unable to join network": "Impossibile collegarsi alla rete",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Potresti averli configurati in un client diverso da Riot. Non puoi cambiarli in Riot ma sono comunque applicati",
+ "Sorry, your browser is not able to run Riot.": "Spiacenti, ma il tuo browser non è in grado di utilizzare Riot.",
+ "Uploaded on %(date)s by %(user)s": "Caricato il %(date)s da %(user)s",
+ "Messages in group chats": "Messaggi nelle chat di gruppo",
+ "Yesterday": "Ieri",
+ "Error encountered (%(errorDetail)s).": "Errore riscontrato (%(errorDetail)s).",
+ "Login": "Entra",
+ "Low Priority": "Priorità bassa",
+ "What's New": "Novità",
+ "Appear Offline": "Appari offline",
+ "Set Password": "Imposta Password",
+ "Enable audible notifications in web client": "Abilita notifiche audio nel client web",
+ "Permalink": "Link permanente",
+ "Off": "Spento",
+ "#example": "#esempio",
+ "Mentions only": "Solo le citazioni",
+ "You can now return to your account after signing out, and sign in on other devices.": "Ora puoi tornare al tuo account dopo esserti disconnesso e accedere su altri dispositivi.",
+ "Enable email notifications": "Abilita le notifiche email",
+ "Event Type": "Tipo di Evento",
+ "Download this file": "Scarica questo file",
+ "Pin Message": "Blocca messaggio",
+ "Thank you!": "Grazie!",
+ "View Community": "Vedi la comunità",
+ "%(count)s Members|one": "%(count)s membro",
+ "Event sent!": "Evento inviato!",
+ "View Source": "Visualizza sorgente",
+ "Event Content": "Contenuto dell'Evento",
+ "Unable to fetch notification target list": "Impossibile ottenere la lista di obiettivi notifiche",
+ "Collapse panel": "Riduci pannello",
+ "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!": "Con il tuo attuale browser, l'aspetto e la sensazione generale dell'applicazione potrebbero essere completamente sbagliati e alcune delle funzionalità potrebbero non funzionare. Se vuoi provare comunque puoi continuare, ma non riceverai aiuto per qualsiasi problema tu possa riscontrare!",
+ "Checking for an update...": "Controllo aggiornamenti...",
+ "There are advanced notifications which are not shown here": "Ci sono notifiche avanzate che non sono mostrate qui"
}
diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json
index 032dacd1aac..9cf8a924268 100644
--- a/src/i18n/strings/ja.json
+++ b/src/i18n/strings/ja.json
@@ -54,5 +54,65 @@
"Camera": "カメラ",
"Are you sure?": "本当によろしいですか?",
"OK": "OK",
- "Operation failed": "操作に失敗しました"
+ "Operation failed": "操作に失敗しました",
+ "Thursday": "木曜日",
+ "Messages in one-to-one chats": "一対一のチャットでのメッセージ",
+ "A new version of Riot is available.": "新しいバージョンのRiotが利用可能です。",
+ "All Rooms": "全ての部屋",
+ "You cannot delete this message. (%(code)s)": "あなたはこの発言を削除できません (%(code)s)",
+ "Send": "送信",
+ "All messages": "全ての発言",
+ "Uploading report": "レポートのアップロード",
+ "Sunday": "日曜日",
+ "Direct Chat": "対話",
+ "Today": "今日",
+ "Files": "添付ファイル",
+ "Room not found": "部屋が見つかりません",
+ "Set Password": "パスワードを設定",
+ "Sorry, your browser is not able to run Riot.": "申し訳ありません。あなたのブラウザではRiotは動作できません。",
+ "Monday": "月曜日",
+ "Messages in group chats": "グループチャットのメッセージ",
+ "Friday": "金曜日",
+ "All messages (noisy)": "全ての発言(通知音あり)",
+ "Yesterday": "昨日",
+ "Messages sent by bot": "ボットから送信されたメッセージ",
+ "Low Priority": "低優先度",
+ "Messages containing my user name": "自身のユーザー名を含むメッセージ",
+ "Members": "参加者",
+ "Add an email address above to configure email notifications": "メール通知を設定するためには、メールアドレスを追加してください",
+ "Collecting logs": "ログの収集",
+ "No update available.": "更新はありません。",
+ "An error occurred whilst saving your email notification preferences.": "電子メール通知設定を保存中にエラーが発生しました。",
+ "Failed to change settings": "設定の変更に失敗しました",
+ "Mentions only": "呼び掛けられた時のみ",
+ "Collecting app version information": "アプリのバージョン情報を収集",
+ "Filter room names": "部屋名検索",
+ "Changelog": "変更履歴",
+ "Invite to this room": "この部屋へ招待",
+ "Waiting for response from server": "サーバからの応答を待っています",
+ "Wednesday": "水曜日",
+ "Leave": "退室",
+ "Enable notifications for this account": "このアカウントで通知を行う",
+ "Failed to update keywords": "キーワードの更新に失敗しました",
+ "Enable email notifications": "電子メールでの通知を行う",
+ "Directory": "部屋一覧",
+ "Download this file": "この添付ファイルをダウンロード",
+ "Failed to get public room list": "公開部屋一覧の取得に失敗しました",
+ "Call invitation": "通話への招待",
+ "Forget": "忘れる",
+ "Messages containing keywords": "keywordsを含むメッセージ",
+ "Error saving email notification preferences": "電子メール通知設定の保存エラー",
+ "Tuesday": "火曜日",
+ "Enter keywords separated by a comma:": "キーワードをコンマで区切って入力:",
+ "Search…": "検索…",
+ "Saturday": "土曜日",
+ "Hide panel": "右欄を非表示",
+ "Warning": "警告",
+ "This Room": "この部屋",
+ "When I'm invited to a room": "部屋に招待された時",
+ "Keywords": "キーワード",
+ "Resend": "再送信",
+ "Can't update user notification settings": "ユーザー通知の設定を更新できません",
+ "Messages containing my display name": "自身の表示名を含むメッセージ",
+ "Enable desktop notifications": "デスクトップ画面に通知を行う"
}
diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json
index 183a5193209..32ca09aee16 100644
--- a/src/i18n/strings/ko.json
+++ b/src/i18n/strings/ko.json
@@ -47,7 +47,6 @@
"Ban": "차단",
"Banned users": "차단한 사용자",
"Blacklisted": "요주의",
- "Bug Report": "오류 보고",
"Can't load user settings": "사용사 설정을 불러올 수 없어요",
"Change Password": "비밀번호 바꾸기",
"Changes your display nickname": "보여줄 별명을 바꾸기",
@@ -193,7 +192,6 @@
"Forgot your password?": "비밀번호를 잊어버리셨어요?",
"For security, this session has been signed out. Please sign in again.": "보안을 위해서, 이 세션에서 로그아웃했어요. 다시 로그인해주세요.",
"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.": "보안을 위해서, 로그아웃하면 이 브라우저에서 모든 종단간 암호화 키를 없앨 거에요. 이후 라이엇에서 이야기를 해독하고 싶으시면, 방 키를 내보내서 안전하게 보관하세요.",
- "Found a bug?": "오류를 찾으셨나요?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s를 %(fromPowerLevel)s에서 %(toPowerLevel)s로",
"Guest access is disabled on this Home Server.": "손님은 이 홈 서버에 접근하실 수 없어요.",
"Guests cannot join this room even if explicitly invited.": "손님은 분명하게 초대받았어도 이 방에 들어가실 수 없어요.",
@@ -314,7 +312,6 @@
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s님이 별명 (%(oldDisplayName)s)을 지우셨어요.",
"Remove %(threePid)s?": "%(threePid)s 지우시겠어요?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s님이 인터넷전화 회의를 요청하셨어요.",
- "Report it": "보고하기",
"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.": "비밀번호를 다시 설정하면 현재 모든 장치의 종단간 암호화 키가 다시 설정되고, 먼저 방의 키를 내보내고 나중에 다시 불러오지 않는 한, 암호화한 이야기 기록을 읽을 수 없게 되어요. 앞으로는 이 기능을 더 좋게 만들 거에요.",
"Results from DuckDuckGo": "덕덕고에서 검색한 결과",
"Return to login screen": "로그인 화면으로 돌아가기",
@@ -644,5 +641,145 @@
"You added a new device '%(displayName)s', which is requesting encryption keys.": "새 장치 '%(displayName)s'를 추가했고 암호화 키를 요청하고 있어요.",
"Your unverified device '%(displayName)s' is requesting encryption keys.": "인증하지 않은 장치 '%(displayName)s'가 암호화 키를 요청하고 있어요.",
"Encryption key request": "암호화 키 요청",
- "Edit": "수정하기"
+ "Edit": "수정하기",
+ "Fetching third party location failed": "타사 위치를 불러오지 못했어요",
+ "A new version of Riot is available.": "라이엇의 새 버전을 사용하실 수 있어요.",
+ "Couldn't load home page": "중심 화면을 불러올 수 없어요",
+ "All notifications are currently disabled for all targets.": "현재 모든 알림이 모든 상대에게서 꺼졌어요.",
+ "Uploading report": "보고를 올리는 중",
+ "Sunday": "일요일",
+ "Guests can join": "손님이 들어올 수 있어요",
+ "Messages sent by bot": "봇이 보낸 메시지",
+ "Notification targets": "알림 대상",
+ "Failed to set direct chat tag": "직접 이야기 지정을 설정하지 못했어요",
+ "Today": "오늘",
+ "Failed to get protocol list from Home Server": "홈 서버에서 프로토콜 목록을 얻지 못했어요",
+ "You are not receiving desktop notifications": "컴퓨터 알림을 받지 않고 있어요",
+ "Friday": "금요일",
+ "Update": "업데이트",
+ "What's New": "새로운 점",
+ "Add an email address above to configure email notifications": "이메일 알림을 설정하기 위해 이메일 주소를 추가해주세요",
+ "Expand panel": "확장 패널",
+ "On": "켜기",
+ "Filter room names": "방 이름 거르기",
+ "Changelog": "바뀐 점",
+ "Waiting for response from server": "서버에서 응답을 기다리는 중",
+ "Leave": "떠나기",
+ "Advanced notification settings": "고급 알림 설정",
+ "delete the alias.": "가명을 지울게요.",
+ "To return to your account in future you need to set a password": "나중에 계정으로 돌아가려면 비밀번호 설정을 해야만 해요",
+ "Forget": "잊기",
+ "World readable": "세계에 보이기",
+ "Hide panel": "패널 숨기기",
+ "You cannot delete this image. (%(code)s)": "이 사진을 지우실 수 없어요. (%(code)s)",
+ "Cancel Sending": "보내기 취소",
+ "Warning": "주의",
+ "This Room": "방",
+ "The Home Server may be too old to support third party networks": "타사 네트워크를 지원하기에는 홈 서버가 너무 오래된 걸 수 있어요",
+ "Resend": "다시 보내기",
+ "Error saving email notification preferences": "이메일 알림을 설정하는데 오류가 일어났어요",
+ "Messages containing my display name": "내 별명이 적힌 메시지",
+ "Messages in one-to-one chats": "1:1 이야기의 메시지",
+ "Unavailable": "이용할 수 없음",
+ "View Decrypted Source": "해독된 출처 보기",
+ "Send": "보내기",
+ "remove %(name)s from the directory.": "목록에서 %(name)s을 지웠어요.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "여기 표시될 수 없는 규칙에 따라 다음 키워드는 알리지 않아요:",
+ "Please set a password!": "비밀번호를 설정해주세요!",
+ "You have successfully set a password!": "비밀번호를 설정했어요!",
+ "An error occurred whilst saving your email notification preferences.": "이메일 알림을 설정하다가 오류가 일어났어요.",
+ "Source URL": "출처 URL",
+ "Failed to add tag %(tagName)s to room": "방에 %(tagName)s로 지정하지 못했어요",
+ "Members": "구성원",
+ "No update available.": "업데이트가 없어요.",
+ "Noisy": "소리",
+ "Files": "파일",
+ "Collecting app version information": "앱 버전 정보를 수집하는 중",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "방 가명 %(alias)s 을 지우고 목록에서 %(name)s를 지우시겠어요?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "이런 식으로 로그아웃한 뒤 계정으로 돌아가, 다른 장치에서 로그인하실 수 있어요.",
+ "Enable notifications for this account": "이 계정의 알림 받기",
+ "Directory": "목록",
+ "Search for a room": "방에서 찾기",
+ "Messages containing keywords": "키워드가 적힌 메시지",
+ "Room not found": "방을 찾지 못했어요",
+ "Tuesday": "화요일",
+ "Enter keywords separated by a comma:": "키워드를 쉼표로 구분해 입력해주세요:",
+ "Search…": "찾기…",
+ "Remove %(name)s from the directory?": "목록에서 %(name)s을 지우시겠어요?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "라이엇은 많은 고급 브라우저 기능을 사용해요. 일부는 현재 브라우저에서 쓸 수 없거나 실험적이에요.",
+ "Developer Tools": "개발자 도구",
+ "Enable desktop notifications": "컴퓨터에서 알림 받기",
+ "Unnamed room": "이름없는 방",
+ "Remove from Directory": "목록에서 지우기",
+ "Saturday": "토요일",
+ "Remember, you can always set an email address in user settings if you change your mind.": "잊지마세요, 마음이 바뀌면 언제라도 사용자 설정에서 이메일 주소를 바꾸실 수 있다는 걸요.",
+ "Direct Chat": "직접 이야기하기",
+ "The server may be unavailable or overloaded": "서버를 쓸 수 없거나 과부하일 수 있어요",
+ "Reject": "거절하기",
+ "Failed to set Direct Message status of room": "방의 쪽지 상태를 설정하지 못했어요",
+ "Monday": "월요일",
+ "All messages (noisy)": "모든 메시지 (크게)",
+ "Enable them now": "지금 켜기",
+ "Forward Message": "메시지 전달",
+ "Messages containing my user name": "내 사용자 이름이 적힌 메시지",
+ "Toolbox": "도구상자",
+ "Collecting logs": "로그 수집 중",
+ "more": "더 보기",
+ "Bug report sent": "오류 보고서를 보냈어요",
+ "(HTTP status %(httpStatus)s)": "(HTTP 상태 %(httpStatus)s)",
+ "All Rooms": "모든 방",
+ "Failed to get public room list": "공개한 방 목록을 얻지 못했어요",
+ "Quote": "인용하기",
+ "Failed to update keywords": "키워드를 갱신하지 못했어요",
+ "Send logs": "로그 보내기",
+ "All messages": "모든 메시지",
+ "Call invitation": "전화가 왔어요",
+ "Downloading update...": "업데이트를 받는 중...",
+ "You have successfully set a password and an email address!": "비밀번호와 이메일 주소를 설정했어요!",
+ "What's new?": "새로운 점은?",
+ "Notify me for anything else": "모든 걸 알리기",
+ "When I'm invited to a room": "방에 초대받았을 때",
+ "Keywords": "키워드",
+ "Can't update user notification settings": "사용자 알림 설정을 갱신할 수 없어요",
+ "Notify for all other messages/rooms": "다른 모든 메시지/방 알리기",
+ "Unable to look up room ID from server": "서버에서 방 ID를 찾아볼 수 없어요",
+ "Couldn't find a matching Matrix room": "일치하는 매트릭스 방을 찾을 수 없어요",
+ "Invite to this room": "이 방에 초대하기",
+ "You cannot delete this message. (%(code)s)": "이 메시지를 지우실 수 없어요. (%(code)s)",
+ "Thursday": "목요일",
+ "I understand the risks and wish to continue": "위험할 수 있는 걸 알고 계속하기를 바라요",
+ "Back": "돌아가기",
+ "Failed to change settings": "설정을 바꾸지 못했어요",
+ "Show message in desktop notification": "컴퓨터 알림에서 내용 보이기",
+ "Unhide Preview": "미리보기를 숨기지 않기",
+ "Unable to join network": "네트워크에 들어갈 수 없어요",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "라이엇이 아닌 다른 클라이언트에서 구성하셨을 수도 있어요. 라이엇에서 조정할 수는 없지만 여전히 적용되있을 거에요",
+ "Sorry, your browser is not able to run Riot.": "죄송해요. 브라우저에서 라이엇을 켤 수가 없어요.",
+ "Uploaded on %(date)s by %(user)s": "by %(user)s가 %(date)s에 올림",
+ "Messages in group chats": "이야기 모임의 메시지",
+ "Yesterday": "어제",
+ "Error encountered (%(errorDetail)s).": "오류가 일어났어요 (%(errorDetail)s).",
+ "Low Priority": "낮은 우선순위",
+ "Riot does not know how to join a room on this network": "라이엇이 이 네트워크에서 방에 들어가는 법을 알 수 없어요",
+ "Appear Offline": "미접속으로 표시하기",
+ "Set Password": "비밀번호 설정",
+ "Enable audible notifications in web client": "웹 클라이언트에서 알림 소리 켜기",
+ "Permalink": "고유주소",
+ "Off": "끄기",
+ "#example": "#예",
+ "Mentions only": "답만 하기",
+ "Failed to remove tag %(tagName)s from room": "방에서 %(tagName)s 지정을 지우지 못했어요",
+ "Wednesday": "수요일",
+ "You can now return to your account after signing out, and sign in on other devices.": "계정을 로그아웃하신 뒤에 계정으로 돌아가, 다른 장치에서 로그인하실 수 있어요.",
+ "Enable email notifications": "이메일로 알림 받기",
+ "Login": "로그인",
+ "No rooms to show": "보여드릴 방이 없어요",
+ "Download this file": "이 파일 받기",
+ "Thank you!": "감사합니다!",
+ "View Source": "출처 보기",
+ "Unable to fetch notification target list": "알림 대상 목록을 불러올 수 없어요",
+ "Collapse 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!": "현재 브라우저에서는, 응용 프로그램의 모양과 기능이 완벽하게 맞지 않거나, 일부 혹은 모든 기능이 작동하지 않을 수 있어요. 계속할 수는 있지만, 맞닥뜨리는 모든 문제는 직접 해결하셔야해요!",
+ "Checking for an update...": "업데이트를 확인하는 중...",
+ "There are advanced notifications which are not shown here": "여기 보이지 않는 고급 알림이 있어요"
}
diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json
index 38cc9081119..277b0cf427c 100644
--- a/src/i18n/strings/lt.json
+++ b/src/i18n/strings/lt.json
@@ -12,5 +12,185 @@
"Your identity server's URL": "Jūsų identifikavimo serverio URL adresas",
"Analytics": "Statistika",
"The information being sent to us to help make Riot.im better includes:": "Informacijoje, kuri yra siunčiama Riot.im tobulinimui yra:",
- "We also record each page you use in the app (currently ), your User Agent () and your device resolution ().": "Mes taip pat saugome kiekvieną puslapį, kurį jūs naudojate programėlėje (dabartinis ), jūsų paskyros agentas () ir jūsų įrenginio rezoliucija ()."
+ "We also record each page you use in the app (currently ), your User Agent () and your device resolution ().": "Mes taip pat saugome kiekvieną puslapį, kurį jūs naudojate programėlėje (dabartinis ), jūsų paskyros agentas () ir jūsų įrenginio rezoliucija ().",
+ "Fetching third party location failed": "Nepavyko gauti trečios šalies vietos",
+ "A new version of Riot is available.": "Yra 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",
+ "Advanced notification settings": "Išplėstiniai pranešimų nustatymai",
+ "Uploading report": "Išsiunčiama ataskaita",
+ "Sunday": "Sekmadienis",
+ "Guests can join": "Svečiai gali prisijungti",
+ "Notification targets": "Pranešimo objektai",
+ "Today": "Šiandien",
+ "Files": "Failai",
+ "You are not receiving desktop notifications": "Jūs negaunate darbalaukio pranešimų",
+ "Friday": "Penktadienis",
+ "Update": "Atnaujinti",
+ "Notifications": "Pranešimai",
+ "Unable to fetch notification target list": "Nėra galimybės rasti pranešimo objektų sąrašui",
+ "Add an email address above to configure email notifications": "Norėdami gauti pranešimus el. paštu įveskite į aukščiau esantį laukelį el. pašto adresą",
+ "Expand panel": "Išskleisti skydelį",
+ "On": "Įjungta",
+ "%(count)s Members|other": "%(count)s nariai",
+ "Filter room names": "Filtruoti kambarių pavadinimus",
+ "Changelog": "Keitinių žurnalas",
+ "Waiting for response from server": "Laukiama atsakymo iš serverio",
+ "Failed to change password. Is your password correct?": "Nepavyko pakeisti slaptažodžio. Ar Jūsų slaptažodis teisingas?",
+ "Uploaded on %(date)s by %(user)s": "Atnaujinta %(date)s vartotojo %(user)s",
+ "OK": "Gerai",
+ "Send Custom Event": "Siųsti pasirinktinį įvykį",
+ "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 set a password": "Ateityje norėdami prisijungti prie savo paskyros turite susigalvoti slaptažodį",
+ "Forget": "Pamiršti",
+ "World readable": "Visiems skaitomas",
+ "Mute": "Užtildyti",
+ "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ą",
+ "Warning": "Įspėjimas",
+ "This Room": "Šis pokalbių kambarys",
+ "The Home Server may be too old to support third party networks": "Serveris gali būti per senas ir negali palaikyti trečių šalių tinklų",
+ "Resend": "Siųsti iš naujo",
+ "Room not found": "Kambarys nerastas",
+ "Downloading update...": "Atsiunčiamas atnaujinimas...",
+ "Messages in one-to-one chats": "Žinutės asmeniniuose pokalbiuose",
+ "Unavailable": "Neprieinamas",
+ "Error saving email notification preferences": "Klaida, įrašant pranešimų el. paštu nuostatas",
+ "View Decrypted Source": "Peržiūrėti iššifruotą šaltinį",
+ "Failed to update keywords": "Nepavyko atnaujinti raktažodžių",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Pranešimai šiems raktažodžiams yra uždrausti taisyklėmis:",
+ "Safari and Opera work too.": "Naudojant Safari ir Opera taip pat gerai veikia.",
+ "Please set a password!": "Prašau įrašykite slaptažodį!",
+ "powered by Matrix": "palaikomas Matrix",
+ "You have successfully set a password!": "Jūs sėkmingai įrašėte slaptažodį!",
+ "Favourite": "Svarbūs",
+ "All Rooms": "Visi pokalbių kambariai",
+ "Explore Room State": "Peržiūrėti pokalbių kambario būseną",
+ "Source URL": "Šaltinio URL adresas",
+ "Messages sent by bot": "Roboto siunčiamos žinutės",
+ "Cancel": "Atšaukti",
+ "Filter results": "Išfiltruoti rezultatus",
+ "Members": "Nariai",
+ "No update available.": "Nėra prieinamų atnaujinimų.",
+ "Noisy": "Triukšmingas",
+ "Failed to get protocol list from Home Server": "Nepavyko gauti protokolų sąrašo iš serverio",
+ "Collecting app version information": "Renkama programėlės versijos informacija",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ar ištrinti kambarį %(alias)s ir %(name)s kambario pavadinimą iš katalogo?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Tai leis Jums grįžti prie paskyros po atsijungimo ir prisijungti kituose įrenginiuose.",
+ "Keywords": "Raktažodžiai",
+ "Unpin Message": "Atsegti žinutę",
+ "Enable notifications for this account": "Įjungti pranešimus šiai paskyrai",
+ "Remove": "Šalinti",
+ "Directory": "Katalogas",
+ "Invite to this community": "Pakviesti į šią bendruomenę",
+ "Search for a room": "Ieškoti kambario",
+ "Messages containing keywords": "Žinutės, kuriose yra raktažodžiai",
+ "When I'm invited to a room": "Kai aš esu pakviestas į pokalbių kambarį",
+ "Tuesday": "Antradienis",
+ "Enter keywords separated by a comma:": "Įveskite kableliais atskirtus raktažodžius:",
+ "Search…": "Paieška…",
+ "You have successfully set a password and an email address!": "Jūs sėkmingai įrašėte slaptažodį ir el. pašto adresą!",
+ "Remove %(name)s from the directory?": "Ar ištrinti %(name)s iš katalogo?",
+ "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!",
+ "Bug report sent": "Klaidos ataskaita išsiųsta",
+ "Unnamed room": "Kambarys be pavadinimo",
+ "Dismiss": "Nutraukti",
+ "Explore Account Data": "Peržiūrėti paskyros duomenis",
+ "Remove from Directory": "Šalinti iš katalogo",
+ "Away": "Neaktyvus",
+ "Download this file": "Atsisiųsti šį failą",
+ "Saturday": "Šeštadienis",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Nepamirškite, kad galite, bet kada įrašyti savo el. pašto adresą paskyros nustatymuose.",
+ "Direct Chat": "Tiesioginis pokalbis",
+ "The server may be unavailable or overloaded": "Gali būti, kad serveris yra neprieinamas arba perkrautas",
+ "Online": "Prisijungęs",
+ "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 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ė",
+ "Collecting logs": "Renkami žurnalai",
+ "more": "daugiau",
+ "Rooms": "Kambariai",
+ "Failed to get public room list": "Nepavyko gauti viešų pokalbių kambarių sąrašo",
+ "Search": "Ieškoti",
+ "You must specify an event type!": "Privalote nurodyti įvykio tipą!",
+ "(HTTP status %(httpStatus)s)": "(HTTP būsena %(httpStatus)s)",
+ "Failed to forget room %(errCode)s": "Nepavyko pašalinti pokalbių kambario %(errCode)s",
+ "What's New": "Kas naujo",
+ "Please install Chrome or Firefox for the best experience.": "Prašau įdiekite Chrome arba Firefox geriausiam rezultatui gauti.",
+ "Wednesday": "Trečiadienis",
+ "Send": "Siųsti",
+ "Error": "Klaida",
+ "Send logs": "Siųsti žurnalus",
+ "All messages": "Visos žinutės",
+ "unknown error code": "nežinomas klaidos kodas",
+ "Call invitation": "Pakvietimas skambinant",
+ "Messages containing my display name": "Žinutės, kuriose paminėtas mano vardas",
+ "State Key": "Būklės raktas",
+ "Failed to send custom event.": "Nepavyko išsiųsti pasirinktinio įvykio.",
+ "What's new?": "Kas naujo?",
+ "Notify me for anything else": "Pranešti man apie visa kita",
+ "View Source": "Peržiūrėti šaltinį",
+ "Close": "Užverti",
+ "Can't update user notification settings": "Nepavyksta atnaujinti naudotojo pranešimų nustatymų",
+ "Notify for all other messages/rooms": "Pranešti apie visas kitas žinutes/pokalbių kambarius",
+ "Unable to look up room ID from server": "Nepavyko gauti kambario ID iš serverio",
+ "Couldn't find a matching Matrix room": "Nepavyko rasti atitinkamo Matrix kambario",
+ "Invite to this room": "Pakviesti į šį kambarį",
+ "You cannot delete this message. (%(code)s)": "Jūs negalite trinti šios žinutės. (%(code)s)",
+ "Thursday": "Ketvirtadienis",
+ "Forward Message": "Persiųsti žinutę",
+ "Back": "Atgal",
+ "Reply": "Atsakyti",
+ "Show message in desktop notification": "Rodyti žinutes darbalaukio pranešimuose",
+ "Reject": "Atmesti",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Jūs turbūt juos sukonfigūravote kitoje programėlėje nei Riot. Negalite jų koreguoti Riot programėlėje, bet jie vistiek yra taikomi",
+ "Sorry, your browser is not able to run Riot.": "Atleiskite, jūsų naršyklė negali paleisti Riot.",
+ "Quote": "Citata",
+ "Messages in group chats": "Žinutės grupės pokalbiuose",
+ "Yesterday": "Vakar",
+ "Error encountered (%(errorDetail)s).": "Gauta 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",
+ "Set Password": "Nustatyti slaptažodį",
+ "Appear Offline": "Neprisijungęs",
+ "An error occurred whilst saving your email notification preferences.": "Įrašant pranešimų el. paštu nuostatas, įvyko klaida.",
+ "Unable to join network": "Nepavyko prisijungti prie tinklo",
+ "Permalink": "Pastovioji nuoroda",
+ "Register": "Registruotis",
+ "Off": "Išjungta",
+ "Edit": "Koreguoti",
+ "#example": "#pavyzdys",
+ "Mentions only": "Tik paminėjimai",
+ "remove %(name)s from the directory.": "šalinti %(name)s iš katalogo.",
+ "You can now return to your account after signing out, and sign in on other devices.": "Po atsijungimo galite grįžti prie savo paskyros ir prisijungti kituose įrenginiuose.",
+ "Continue": "Tęsti",
+ "Enable desktop notifications": "Įjungti darbalaukio pranešimus",
+ "Enable email notifications": "Įjungti pranešimus el. paštu",
+ "Event Type": "Įvykio tipas",
+ "No rooms to show": "Nėra kambarių rodymui",
+ "Add rooms to this community": "Įtraukti kambarius į šią bendruomenę",
+ "Pin Message": "Prisegti žinutę",
+ "Failed to change settings": "Nepavyko pakeisti nustatymų",
+ "Leave": "Atsijungti",
+ "View Community": "Peržiūrėti bendruomenes",
+ "%(count)s Members|one": "%(count)s narys",
+ "Developer Tools": "Programuotojo įrankiai",
+ "Unhide Preview": "Rodyti paržiūrą",
+ "Custom Server Options": "Pasirinktiniai serverio nustatymai",
+ "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"
}
diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json
index 8bb4d0a9bc9..a4a222a6027 100644
--- a/src/i18n/strings/lv.json
+++ b/src/i18n/strings/lv.json
@@ -46,7 +46,6 @@
"Banned users": "Banotie/bloķētie lietotāji (kuriem liegta pieeja)",
"Bans user with given id": "Bloķē (liedz pieeju) lietotāju pēc uzdotā ID (nobano)",
"Blacklisted": "Melnajā sarakstā iekļautie",
- "Bug Report": "Paziņojums par kļūdu",
"Bulk Options": "Grupveida darbību parametri",
"Call Timeout": "Savienojuma gaidīšanas noilgums",
"Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Neizdodas savienoties ar bāzes serveri. Pārbaudi tīkla savienojumu un pārliecinies, ka bāzes servera SSL sertifikāts ir uzticams, kā arī pārlūkā instalētie paplašinājumi nebloķē pieprasījumus.",
@@ -178,7 +177,6 @@
"Forgot your password?": "Aizmirsi paroli?",
"For security, this session has been signed out. Please sign in again.": "Drošības nolūkos, šī sesija ir beigusies. Lūdzu, pieraksties par jaunu.",
"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.": "Drošības nolūkos, izrakstīšanās dzēsīs jebkādas ierīce-ierīce šifrēšanas atslēgas no šī pārlūka. Ja Tu vēlies saglabāt iespēju atšifrēt tavu saziņas vēsturi no Riot nākotnes sesijām, lūdzu eksportē tavas istabas atslēgas, saglabājot tās drošā vietā.",
- "Found a bug?": "Pamanīji kļūdu?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s no %(fromPowerLevel)s uz %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Šajā Bāzes serverī viesu pierakstīšanās nav iespējama.",
"Guests cannot join this room even if explicitly invited.": "Viesi nevar pievienoties šai istabai, pat ja ir uzaicināti.",
@@ -304,7 +302,6 @@
"Remove": "Dzēst",
"Remove %(threePid)s?": "Dzēst %(threePid)s?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s vēlas VoIP konferenci.",
- "Report it": "Ziņot par to",
"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.": "Paroles atiestatīšana atiestatīs visas ierīce-ierīce šifrēšanas atslēgas visās ierīcēs, padarot čata šifrēto ziņu vēsturi nelasāmu, ja vien Tu pirms tam neesi eksportējis savas istabas atslēgas un atkārtoti importējis tās atpakaļ. Nākotnē šo ir plānots uzlabot.",
"Results from DuckDuckGo": "Rezultāti no DuckDuckGo",
"Return to login screen": "Atgriezties uz pierakstīšanās lapu",
@@ -654,7 +651,6 @@
"Do you want to load widget from URL:": "Vai vēlies ielādēt widžetu no URL:",
"Edit": "Rediģēt",
"Enable automatic language detection for syntax highlighting": "Iespējot automātisko valodas noteikšanu sintakses iezīmējumiem",
- "Hide Apps": "Slēpt aplikācijas",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Slēpt ziņas par pievienošanos istabai vai došanos prom no tās (tas neietekmē uzaicinājumus, vai izsperšanas/banošanas darbības)",
"Integrations Error": "Integrācijas kļūda",
"Publish this room to the public in %(domain)s's room directory?": "Publicēt šo istabu publiskajā %(domain)s katalogā?",
@@ -662,7 +658,6 @@
"PM": "PM",
"NOTE: Apps are not end-to-end encrypted": "PIEZĪME: Aplikācijās nav ierīce-ierīce šifrēšanas",
"Sets the room topic": "Iestata istabas tematu",
- "Show Apps": "Rādīt aplikācijas",
"The maximum permitted number of widgets have already been added to this room.": "Maksimāli atļautais vidžetu skaits šai istabai jau sasniegts.",
"To get started, please pick a username!": "Lai sāktu, lūdzu izvēlies lietotājvārdu!",
"Unable to create widget.": "Nav iespējams izveidot widžetu.",
@@ -918,7 +913,6 @@
"Failed to remove the room from the summary of %(groupId)s": "Neizdevās dzēst istabu no %(groupId)s kopsavilkuma",
"The room '%(roomName)s' could not be removed from the summary.": "Istabu '%(roomName)s' neizdevās dzēst no kopsavilkuma.",
"Leave Community": "Atstāt kopienu",
- "Unable to leave room": "Nav iespējams atstāt istabu",
"Community Settings": "Kopienas iestatījumi",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Šīs istabas tiek rādītas kopienas dalībniekiem šīs kopienas lapā. Kopienas dalībnieki var pievienoties istabām, uzklikšķinot uz tām.",
"Your community hasn't got a Long Description, a HTML page to show to community members. Click here to open settings and give it one!": "Jūsu kopienai nav plašāka HTML-lapas apraksta ko parādīt dalībniekiem. Klikšķini šeit, lai atvērtu iestatījumus un to pievienotu!",
@@ -926,8 +920,6 @@
"Failed to load %(groupId)s": "Neizdevās ielādēt %(groupId)s",
"This Home server does not support communities": "Šis Bāzes serveris neatbalsta kopienas",
"This room is not public. You will not be able to rejoin without an invite.": "Šīs istaba nav publiska. Tu nevari tajā ieiet bez uzaicinājuma.",
- "Cryptography data migrated": "Sifrēšanas dati tika pārnesti",
- "A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Veikta vienreizēja šifrēšanas datu pārnese. Sifrēšana (end-to-end) nedarbosies, ja Tu atgriezīses pie vecākas Riot versijas. Ja nepieciešams izmantot end-to-end šifrēšanu, izmantojot vecāku versija, vispirms izraksties no Riot. Lai saglabātu ziņu vēsturi, eksportē un tad importē savas kripto-atslēgas.",
"Old cryptography data detected": "Tika uzieti novecojuši šifrēšanas dati",
"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.": "Uzieti dati no vecākas Riot versijas. Tas novedīs pie \"end-to-end\" šifrēšanas problēmām vecākajā versijā. Šajā versijā nevar tikt atšifrēti ziņojumi, kuri radīti izmantojot vecākajā versijā \"end-to-end\" šifrētas ziņas. Tas var arī novest pie ziņapmaiņas, kas veikta ar šo versiju, neizdošanās. Ja rodas ķibeles, izraksties un par jaunu pieraksties sistēmā. Lai saglabātu ziņu vēsturi, eksportē un tad importē savas šifrēšanas atslēgas.",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Radi kopienu, lai apvienotu lietotājus un istabas. Izveido mājaslapu, lai iezīmētu Matrix visumā savu klātbūtni, vietu un telpu.",
@@ -982,7 +974,6 @@
"Unable to accept invite": "Nav iespējams pieņemt uzaicinājumu",
"Unable to reject invite": "Nav iespējams noraidīt uzaicinājumu",
"Leave %(groupName)s?": "Atstāt %(groupName)s?",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "Izmaiņas, kuras izdarītas Tavā kopienā, var neparādīties citiem lietotājiem līdz pat 30 minūtēm.",
"%(inviter)s has invited you to join this community": "%(inviter)s uzaicina Tevi pievienoties šai kopienai",
"You are an administrator of this community": "Tu esi šīs kopienas administrators",
"You are a member of this community": "Tu esi šīs kopienas biedrs",
@@ -1000,5 +991,162 @@
"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 contian messages.": "Ja esi paziņojis par kļūdu caur GitHub, atutošanas logfaili var mums palīdzēt identificēt problēmu. Atutošanas logfaili satur programmas lietošanas datus, tostarp Tavu lietotājvārdu, istabu/grupu Id vai aliases, kuras esi apmeklējis un citu lietotāju lietotājvārdus. Tie nesatur pašas ziņas.",
"Submit debug logs": "Iesniegt atutošanas logfailus",
"Opens the Developer Tools dialog": "Atver Izstrādātāja instrumentus",
- "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Skatījis %(displayName)s (%(userName)s) %(dateTime)s"
+ "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Skatījis %(displayName)s (%(userName)s) %(dateTime)s",
+ "Fetching third party location failed": "Neizdevās iegūt trešās puses atrašanās vietu",
+ "A new version of Riot is available.": "Pieejama jauna Riot versija.",
+ "Couldn't load home page": "Neizdevās ielādēt sākumlapu",
+ "Send Account Data": "Sūtīt konta datus",
+ "All notifications are currently disabled for all targets.": "Visiem saņēmējiem visi paziņojumi ir atspējoti.",
+ "Uploading report": "Augšuplādē atskaiti",
+ "Sunday": "svētdiena",
+ "Notification targets": "Paziņojuma mērķi",
+ "Today": "šodien",
+ "Failed to get protocol list from Home Server": "Neizdevās iegūt protokolu sarakstu no Bāzes servera",
+ "You are not receiving desktop notifications": "Darbvirsmas paziņojumi netiek saņemti",
+ "Friday": "piektdiena",
+ "Update": "Aktualizēt",
+ "What's New": "Kas jauns",
+ "Add an email address above to configure email notifications": "Lai konfigurētu epasta paziņojumus, pievieno epasta adresi",
+ "Expand panel": "Izvērst paneli",
+ "On": "ieslēgts",
+ "%(count)s Members|other": "%(count)s biedru",
+ "Filter room names": "Filtrēt pēc istabu nosaukuma",
+ "Changelog": "Izmaiņu saraksts (vēsture)",
+ "Waiting for response from server": "Gaidām atbildi no servera",
+ "Send Custom Event": "Sūtīt individuālu notikumu",
+ "Advanced notification settings": "Paziņojumu papildus iestatījumi",
+ "Failed to send logs: ": "Neizdevās nosūtīt logfailus: ",
+ "delete the alias.": "dzēst aliasi/aizstājējvārdu.",
+ "To return to your account in future you need to set a password": "Lai nākotnē atgrieztos savā kontā, nepieciešams iestatīt paroli",
+ "Forget": "Aizmirst",
+ "#example": "#piemērs",
+ "Hide panel": "Slēpt paneli",
+ "You cannot delete this image. (%(code)s)": "Šo attēlu nevar izdzēst (%(code)s)",
+ "Cancel Sending": "Atcelt sūtīšanu",
+ "This Room": "šajā istabā",
+ "The Home Server may be too old to support third party networks": "Bāzes serveris var būt pārāk novecojis, lai ļautu izmantot trešo pušu tīmekļa resursus",
+ "Noisy": "ar skaņu",
+ "Error saving email notification preferences": "Kļūda saglabājot epasta notifikāciju paziņojumu uzstādījumus",
+ "Messages containing my display name": "Ziņas, kuras satur manu redzamo vārdu",
+ "Messages in one-to-one chats": "Ziņas viens-pret-vienu čatos",
+ "Unavailable": "Nesasniedzams",
+ "View Decrypted Source": "Skatīt atšifrētu avotu",
+ "Failed to update keywords": "Neizdevās aktualizēt atslēgvārdus",
+ "Notes:": "Piezīmes:",
+ "remove %(name)s from the directory.": "dzēst %(name)s no kataloga.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Paziņojumi par šādiem atslēgvārdiem atbilst noteikumiem, kurus šeit nevar parādīt:",
+ "Safari and Opera work too.": "Safari un Opera arī nav skādējami.",
+ "Please set a password!": "Lūdzu iestati paroli!",
+ "You have successfully set a password!": "Esi veiksmīgi iestatījis(usi) paroli!",
+ "An error occurred whilst saving your email notification preferences.": "Saglabājot Tavus epasta paziņojumu uzstādījumus, radās kļūda.",
+ "Explore Room State": "Noskaidrot istabas statusu",
+ "Source URL": "Avota URL adrese",
+ "Messages sent by bot": "Botu nosūtītās ziņas",
+ "Filter results": "Filtrēt rezultātus",
+ "Members": "Biedri",
+ "No update available.": "Nav pieejamu aktualizāciju.",
+ "Resend": "Nosūtīt atkārtoti",
+ "Files": "Faili",
+ "Collecting app version information": "Tiek iegūta programmas versijas informācija",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Dzēst istabas aliasi/aizstājējvārdu %(alias)s un dzēst %(name)s no kataloga?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Tas atļaus Tev atgriezties savā kontā pēc izrakstīšanās, un pierakstīties no citām ierīcēm.",
+ "Keywords": "Atslēgvārdi",
+ "Enable notifications for this account": "Iespējot paziņojumus šim kontam",
+ "Directory": "Katalogs",
+ "Invite to this community": "Uzaicināt šajā kopienā",
+ "Failed to get public room list": "Neizdevās iegūt publisko istabu sarakstu",
+ "Messages containing keywords": "Ziņas, kuras satur atslēgvārdus",
+ "Room not found": "Istaba netika atrasta",
+ "Tuesday": "otrdiena",
+ "Enter keywords separated by a comma:": "Ievadi atslēgvārdus, atdalītus ar komatu:",
+ "Search…": "Meklēju…",
+ "You have successfully set a password and an email address!": "Esi veiksmīgi iestatījis(usi) paroli un epasta adresi!",
+ "Remove %(name)s from the directory?": "Dzēst %(name)s no kataloga?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot izmanto daudzas advancētas tīmekļa pārlūka iespējas, no kurām dažas var nebūt pieejamas vai ir eksperimentālas Tavā pašreizējajā pārlūkā.",
+ "Event sent!": "Notikums nosūtīts!",
+ "Preparing to send logs": "Gatavojos nosūtīt atutošanas logfailus",
+ "Enable desktop notifications": "Iespējot darbvirsmas paziņojumus",
+ "Explore Account Data": "Aplūkot konta datus",
+ "All messages (noisy)": "Visas ziņas (ar skaņu)",
+ "Away": "Prom (nav uz vietas)",
+ "Saturday": "sestdiena",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Atceries, ka vienmēr vari iestatīt epasta adresi lietotāja uzstādījumos, ja pārdomā.",
+ "Direct Chat": "Tiešais čats",
+ "The server may be unavailable or overloaded": "Serveris nav pieejams vai ir pārslogots",
+ "Reject": "Noraidīt",
+ "Failed to set Direct Message status of room": "Neizdevās iestatīt istabas tiešās ziņas statusu",
+ "Monday": "pirmdiena",
+ "Remove from Directory": "Dzēst no kataloga",
+ "Enable them now": "Iespējot tos tagad",
+ "Forward Message": "Pārsūtīt ziņu",
+ "Messages containing my user name": "Ziņas, kuras satur manu lietotājvārdu",
+ "Toolbox": "Instrumentārijs",
+ "Collecting logs": "Tiek iegūti logfaili",
+ "more": "vairāk",
+ "GitHub issue link:": "GitHub problēmpaziņojuma saite:",
+ "Bug report sent": "Kļūdas atskaite nosūtīta",
+ "You must specify an event type!": "Jānorāda notikuma tips!",
+ "(HTTP status %(httpStatus)s)": "(HTTP statuss %(httpStatus)s)",
+ "All Rooms": "visās istabās",
+ "Please install Chrome or Firefox for the best experience.": "Labāko lietošanas pieredzi gūsi uzstādot pārlūkprogrammu Chromium vai Firefox.",
+ "Wednesday": "trešdiena",
+ "You cannot delete this message. (%(code)s)": "Tu nevari dzēst šo ziņu. (%(code)s)",
+ "Quote": "Citāts",
+ "Send logs": "Nosūtīt logfailus",
+ "All messages": "Visas ziņas",
+ "Call invitation": "Uzaicinājuma zvans",
+ "Downloading update...": "Lejupielādēju aktualizāciju...",
+ "State Key": "Stāvokļa atslēga",
+ "Failed to send custom event.": "Individuālo notikumu nosūtīt neizdevās.",
+ "What's new?": "Kas jauns?",
+ "Notify me for anything else": "Paziņot man par jebko citu",
+ "When I'm invited to a room": "Kad esmu uzaicināts/a istabā",
+ "Click here to create a GitHub issue.": "Nospied šeit lai izveidotu GitHub problēmpaziņojumu.",
+ "Can't update user notification settings": "Neizdodas atjaunot lietotāja paziņojumu iestatījumus",
+ "Notify for all other messages/rooms": "Paziņot par visām citām ziņām/istabām",
+ "Unable to look up room ID from server": "Nav iespējams no servera iegūt istabas Id",
+ "Couldn't find a matching Matrix room": "Atbilstoša Matrix istaba netika atrasta",
+ "Invite to this room": "Uzaicināt uz šo istabu",
+ "Search for a room": "Meklēt istabu",
+ "Thursday": "ceturtdiena",
+ "I understand the risks and wish to continue": "Apzinos riskus un vēlos turpināt",
+ "Logs sent": "Logfaili nosūtīti",
+ "Back": "Atpakaļ",
+ "Reply": "Atbildēt",
+ "Show message in desktop notification": "Parādīt ziņu darbvirsmas paziņojumos",
+ "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.": "Atutošanas logfaili satur programmas datus, ieskaitot Tavu lietotājvārdu, istabu/grupu ID vai aliases, kuras esi apmeklējis un citu lietotāju lietotājvārdus. Tie nesatur pašas ziņas.",
+ "Unhide Preview": "Rādīt priekšskatījumu",
+ "Unable to join network": "Nav iespējams pievienoties tīklam",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Droši vien Tu konfigurēji tās kādā citā Matrix klientā, nevis Riot. Nav iespējams tos pārkonfigurēt ar Riot, bet tie joprojām tiek izmantoti",
+ "Sorry, your browser is not able to run Riot.": "Atvaino, diemžēl tavs tīmekļa pārlūks nespēj darbināt Riot.",
+ "Uploaded on %(date)s by %(user)s": "Augšuplādēja %(user)s %(date)s",
+ "Messages in group chats": "Ziņas grupas čatos",
+ "Yesterday": "vakar",
+ "Error encountered (%(errorDetail)s).": "Gadījās kļūda (%(errorDetail)s).",
+ "Login": "Ierakstīties",
+ "Low Priority": "Zemas prioritātes",
+ "Unable to fetch notification target list": "Neizdevās iegūt paziņojumu mērķu sarakstu",
+ "Appear Offline": "Šķiet nesaistē (oflainā)",
+ "Set Password": "Iestatīt paroli",
+ "Enable audible notifications in web client": "Iespējot skaņus paziņojumus web klientā",
+ "Permalink": "Pastāvīgā saite",
+ "Off": "izslēgts",
+ "Riot does not know how to join a room on this network": "Riot nezin kā pievienoties šajā tīklā esošajai istabai",
+ "Mentions only": "Vienīgi atsauces",
+ "You can now return to your account after signing out, and sign in on other devices.": "Tagad vari atgriezties savā kontā arī pēc izrakstīšanās, un pierakstīties no citām ierīcēm.",
+ "Enable email notifications": "Iespējot paziņojumus pa epastu",
+ "Event Type": "Notikuma tips",
+ "Download this file": "Lejupielādēt šo failu",
+ "Pin Message": "Piekabināt ziņu",
+ "Failed to change settings": "Neizdevās nomainīt iestatījumus",
+ "View Community": "Skatīt kopienu",
+ "%(count)s Members|one": "%(count)s biedru",
+ "Developer Tools": "Attīstītāja instrumenti",
+ "View Source": "Skatīt avotu",
+ "Event Content": "Notikuma saturs",
+ "Thank you!": "Tencinam!",
+ "Collapse panel": "Sakļaut (saritināt) paneli",
+ "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!": "Tavā pašreizējā pārlūkā aplikācijas izskats un uzvedība var būt pilnīgi neatbilstoša, kā arī dažas no visām funkcijām var nedarboties. Ja vēlies turpināt izmantot šo pārlūku, Tu vari arī turpināt, apzinoties, ka šajā gadījumā esi viens/a ar iespējamo problēmu!",
+ "Checking for an update...": "Lūkojos pēc aktualizācijas...",
+ "There are advanced notifications which are not shown here": "Pastāv papildus paziņojumi, kuri šeit netiek rādīti"
}
diff --git a/src/i18n/strings/ml.json b/src/i18n/strings/ml.json
index 2deda25ee0d..098c0620064 100644
--- a/src/i18n/strings/ml.json
+++ b/src/i18n/strings/ml.json
@@ -21,5 +21,139 @@
"Failed to change password. Is your password correct?": "രഹസ്യവാക്ക് മാറ്റാന് സാധിച്ചില്ല. രഹസ്യവാക്ക് ശരിയാണോ ?",
"Continue": "മുന്നോട്ട്",
"Microphone": "മൈക്രോഫോൺ",
- "Camera": "ക്യാമറ"
+ "Camera": "ക്യാമറ",
+ "Fetching third party location failed": "തേഡ് പാര്ട്ടി ലൊക്കേഷന് ഫെച്ച് ചെയ്യാന് കഴിഞ്ഞില്ല",
+ "A new version of Riot is available.": "റയട്ടിന്റെ ഒരു പുതിയ പതിപ്പ് ലഭ്യമാണ്.",
+ "All notifications are currently disabled for all targets.": "അറിയിപ്പുകളെല്ലാം നിര്ത്തിയിരിയ്ക്കുന്നു.",
+ "Uploading report": "റിപ്പോര്ട്ട് അപ്ലോഡ് ചെയ്യുന്നു",
+ "Sunday": "ഞായര്",
+ "Guests can join": "അതിഥികള്ക്കും പ്രവേശിക്കാം",
+ "Messages sent by bot": "ബോട്ട് അയയ്ക്കുന്ന സന്ദേശങ്ങള്ക്ക്",
+ "Notification targets": "നോട്ടിഫിക്കേഷന് ടാര്ഗെറ്റുകള്",
+ "Failed to set direct chat tag": "ഡയറക്റ്റ് ചാറ്റ് ടാഗ് സെറ്റ് ചെയ്യാനായില്ല",
+ "Today": "ഇന്ന്",
+ "Failed to get protocol list from Home Server": "ഹോം സെര്വറില് നിന്ന് പ്രോട്ടോക്കോള് ലിസ്റ്റ് നേടാന് സാധിച്ചില്ല",
+ "You are not receiving desktop notifications": "നിങ്ങള്ക്ക് ഇപ്പോള് ഡെസ്ക്ടോപ്പ് നോട്ടിഫിക്കേഷനുകള് ലഭിക്കുന്നില്ല",
+ "Friday": "വെള്ളി",
+ "Update": "പുതുക്കുക",
+ "What's New": "പുതിയ വിശേഷങ്ങള്",
+ "Add an email address above to configure email notifications": "ഇ മെയില് അറിയിപ്പുകൾ ലഭിക്കാന് മുകളില് ഇ-മെയില് വിലാസം നല്കൂ",
+ "Expand panel": "പാനല് വലുതാക്കുക",
+ "On": "ഓണ്",
+ "Filter room names": "റൂം പേരുകള് ഫില്ട്ടര് ചെയ്യുക",
+ "Changelog": "മാറ്റങ്ങളുടെ നാള്വഴി",
+ "Waiting for response from server": "സെര്വറില് നിന്നുള്ള പ്രതികരണത്തിന് കാക്കുന്നു",
+ "Leave": "വിടവാങ്ങുക",
+ "Advanced notification settings": "അറിയപ്പുകളുടെ സങ്കീര്ണമായ സജ്ജീകരണങ്ങള്",
+ "delete the alias.": "ഏലിയാസ് നീക്കം ചെയ്യുക.",
+ "To return to your account in future you need to set a password": "വീണ്ടും ഈ അക്കൌണ്ട് ഉപയോഗിക്കണമെങ്കില് ഒരു രഹസ്യവാക്ക് സെറ്റ് ചെയ്യുക",
+ "Forget": "മറക്കുക",
+ "World readable": "ആർക്കും വായിക്കാവുന്നത്",
+ "#example": "#ഉദാഹരണം",
+ "Hide panel": "പാനല് ഒളിപ്പിക്കുക",
+ "You cannot delete this image. (%(code)s)": "നിങ്ങള്ക്ക് ഈ ചിത്രം നീക്കം ചെയ്യാനാകില്ല. (%(code)s)",
+ "Cancel Sending": "അയയ്ക്കുന്നത് റദ്ദാക്കുക",
+ "Warning": "മുന്നറിയിപ്പ്",
+ "This Room": "ഈ മുറി",
+ "The Home Server may be too old to support third party networks": "തേഡ് പാര്ട്ടി നെറ്റ്വര്ക്കുകളെ പിന്തുണക്കാത്ത വളരെ പഴയ ഹോം സെര്വര് ആയേക്കാം",
+ "Noisy": "ഉച്ചത്തില്",
+ "Room not found": "റൂം കണ്ടെത്താനായില്ല",
+ "Messages containing my display name": "എന്റെ പേര് അടങ്ങിയിരിക്കുന്ന സന്ദേശങ്ങള്ക്ക്",
+ "Messages in one-to-one chats": "നേര്ക്കുനേര് ചാറ്റിലെ സന്ദേശങ്ങള്ക്ക്",
+ "Unavailable": "ലഭ്യമല്ല",
+ "View Decrypted Source": "ഡീക്രിപ്റ്റ് ചെയ്ത സോഴ്സ് കാണുക",
+ "Failed to update keywords": "കീവേഡുകള് പുതുക്കുവാന് സാധിച്ചില്ല",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "ഈ പറയുന്ന കീവേർഡുകളെ പറ്റിയുള്ള അറിയിപ്പുകൾ പിൻതുടരുന്ന നിയമങ്ങൾ ഇവിടെ കാണിക്കുവാൻ സാധ്യമല്ല:",
+ "Please set a password!": "ദയവായി ഒരു രഹസ്യവാക്ക് ക്രമീകരിക്കുക!",
+ "You have successfully set a password!": "രഹസ്യവാക്ക് സജ്ജീകരിച്ചിരിക്കുന്നു!",
+ "An error occurred whilst saving your email notification preferences.": "ഇ-മെയില് വഴി അറിയിയ്ക്കാനുള്ള നിങ്ങളുടെ സജ്ജീകരണങ്ങള് സൂക്ഷിക്കുന്നതില് ഒരു പ്രശ്നമുണ്ടായി.",
+ "Source URL": "സോഴ്സ് യു ആര് എല്",
+ "Failed to add tag %(tagName)s to room": "റൂമിന് %(tagName)s എന്ന ടാഗ് ആഡ് ചെയ്യുവാന് സാധിച്ചില്ല",
+ "Members": "അംഗങ്ങള്",
+ "No update available.": "അപ്ഡേറ്റുകള് ലഭ്യമല്ല.",
+ "Resend": "വീണ്ടും അയയ്ക്കുക",
+ "Files": "ഫയലുകള്",
+ "Collecting app version information": "ആപ്പ് പതിപ്പു വിവരങ്ങള് ശേഖരിക്കുന്നു",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "റൂം ഏലിയാസ് %(alias)s നീക്കം ചെയ്യുകയും %(name)s കള് ഡയറക്ടറിയില് നിന്നും നീക്കം ചെയ്യുകയും ചെയ്യുക ?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "സൈന് ഔട്ട് ചെയ്ത ശേഷം വീണ്ടും നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് മടങ്ങി വരാനും, മറ്റ് ഡിവൈസുകളില് സൈന് ഇന് ചെയ്യാനും ഇത് സഹായിക്കും.",
+ "Keywords": "കീവേഡുകള്",
+ "Enable notifications for this account": "ഈ അക്കൌണ്ടില് നോട്ടിഫിക്കേഷനുകള് ഇനേബിള് ചെയ്യുക",
+ "Directory": "ഡയറക്ടറി",
+ "Failed to get public room list": "പബ്ലിക്ക് റൂം ലിസ്റ്റ് നേടാന് സാധിച്ചില്ല",
+ "Messages containing keywords": "കീവേഡുകള്അടങ്ങിയ സന്ദേശങ്ങള്ക്ക്",
+ "Error saving email notification preferences": "ഇമെയില് നോട്ടിഫിക്കേഷന് സജ്ജീകരണങ്ങള് സൂക്ഷിക്കവേ എറര് നേരിട്ടു",
+ "Tuesday": "ചൊവ്വ",
+ "Enter keywords separated by a comma:": "കീവേഡുകളെ കോമ കൊണ്ട് വേര്ത്തിരിച്ച് ടൈപ്പ് ചെയ്യുക :",
+ "I understand the risks and wish to continue": "കുഴപ്പമാകാന് സാധ്യതയുണ്ടെന്നെനിയ്ക്കു് മനസ്സിലായി, എന്നാലും മുന്നോട്ട് പോകുക",
+ "Remove %(name)s from the directory?": "%(name)s കള് ഡയറക്റ്ററിയില് നിന്നും മാറ്റണോ ?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "റയട്ട് നൂതന ബ്രൌസര് ഫീച്ചറുകള് ഉപയോഗിക്കുന്നു. നിങ്ങളുടെ ബ്രൌസറില് അവയില് പലതും ഇല്ല / പൂര്ണ്ണമല്ല .",
+ "Unnamed room": "പേരില്ലാത്ത റൂം",
+ "All messages (noisy)": "എല്ലാ സന്ദേശങ്ങളും (ഉച്ചത്തിൽ)",
+ "Saturday": "ശനി",
+ "Remember, you can always set an email address in user settings if you change your mind.": "ഓര്ക്കുക, വേണ്ട സമയത്ത് യൂസര് സെറ്റിങ്സില് ഒരു ഇമെയില് വിലാസം നല്കാം.",
+ "Direct Chat": "നേരിട്ടുള്ള ചാറ്റ്",
+ "The server may be unavailable or overloaded": "സെര്വര് ലഭ്യമല്ല അല്ലെങ്കില് ഓവര്ലോഡഡ് ആണ്",
+ "Reject": "നിരസിക്കുക",
+ "Failed to set Direct Message status of room": "റൂമില് നിന്നും ഡയറക്റ്റ് മെസേജ് സ്റ്റാറ്റസ് സജ്ജീകരിക്കാന് കഴിഞ്ഞില്ല",
+ "Monday": "തിങ്കള്",
+ "Remove from Directory": "ഡയറക്റ്ററിയില് നിന്നും നീക്കം ചെയ്യുക",
+ "Enable them now": "ഇപ്പോള് ഇനേബിള് ചെയ്യുക",
+ "Forward Message": "സന്ദേശം ഫോര്വേഡ് ചെയ്യുക",
+ "Messages containing my user name": "എന്റെ യൂസര് നെയിം അടങ്ങിയിരിക്കുന്ന സന്ദേശങ്ങള്ക്ക്",
+ "Collecting logs": "നാള്വഴി ശേഖരിക്കുന്നു",
+ "more": "കൂടുതല്",
+ "Bug report sent": "ബഗ് റിപ്പോർട്ട് അയയ്ക്കുക",
+ "(HTTP status %(httpStatus)s)": "(HTTP സ്റ്റാറ്റസ് %(httpStatus)s)",
+ "All Rooms": "എല്ലാ മുറികളും കാണുക",
+ "Wednesday": "ബുധന്",
+ "You cannot delete this message. (%(code)s)": "നിങ്ങള്ക്ക് ഈ സന്ദേശം നീക്കം ചെയ്യാനാകില്ല. (%(code)s)",
+ "Quote": "ഉദ്ധരിക്കുക",
+ "Send": "അയയ്ക്കുക",
+ "Send logs": "നാള്വഴി അയയ്ക്കുക",
+ "All messages": "എല്ലാ സന്ദേശങ്ങളും",
+ "Call invitation": "വിളിയ്ക്കുന്നു",
+ "Downloading update...": "അപ്ഡേറ്റ് ഡൌണ്ലോഡ് ചെയ്യുന്നു...",
+ "You have successfully set a password and an email address!": "ഇമെയില് വിലാസവും രഹസ്യവാക്കും വിജയകരമായി ക്രമീകരിച്ചിരിക്കുന്നു!",
+ "What's new?": "എന്തൊക്കെ പുതിയ വിശേഷങ്ങള് ?",
+ "Notify me for anything else": "ബാക്കി ഏതിനും എനിക്ക് അറിയിപ്പു നൽകുക",
+ "When I'm invited to a room": "ഞാന് ഒരു റൂമിലേക്ക് ക്ഷണിക്കപ്പെടുമ്പോള്",
+ "Can't update user notification settings": "ഉപയോക്താവിനെ അറിയിയ്ക്കാനുള്ള സജ്ജീകരണം പുതുക്കാനായില്ല",
+ "Notify for all other messages/rooms": "ബാക്കി എല്ലാ സന്ദേശങ്ങൾക്കും/റൂമുകൾക്കും അറിയിപ്പു നൽകുക",
+ "Unable to look up room ID from server": "സെര്വറില് നിന്നും റൂം ഐഡി കണ്ടെത്താനായില്ല",
+ "Couldn't find a matching Matrix room": "ആവശ്യപ്പെട്ട മാട്രിക്സ് റൂം കണ്ടെത്താനായില്ല",
+ "Invite to this room": "ഈ റൂമിലേക്ക് ക്ഷണിക്കുക",
+ "Search for a room": "ഒരു റൂം തിരയുക",
+ "Thursday": "വ്യാഴം",
+ "Search…": "തിരയുക…",
+ "Back": "തിരികെ",
+ "Unhide Preview": "പ്രിവ്യു കാണിക്കുക",
+ "Unable to join network": "നെറ്റ്വര്ക്കില് ജോയിന് ചെയ്യാന് കഴിയില്ല",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "ഇവ റയട്ടല്ലാതെ മറ്റൊരു ക്ലയന്റില് വച്ച് കോണ്ഫിഗര് ചെയ്തതാകാം. റയട്ടില് അവ ലഭിക്കില്ല, എങ്കിലും അവ നിലവിലുണ്ട്",
+ "Sorry, your browser is not able to run Riot.": "ക്ഷമിക്കണം, നിങ്ങളുടെ ബ്രൌസര് റയട്ട് പ്രവര്ത്തിപ്പിക്കാന് പര്യാപ്തമല്ല.",
+ "Uploaded on %(date)s by %(user)s": "%(date)s ല് %(user)s അപ്ലോഡ് ചെയ്തത്",
+ "Messages in group chats": "ഗ്രൂപ്പ് ചാറ്റുകളിലെ സന്ദേശങ്ങള്ക്ക്",
+ "Yesterday": "ഇന്നലെ",
+ "Error encountered (%(errorDetail)s).": "എറര് നേരിട്ടു (%(errorDetail)s).",
+ "Low Priority": "താഴ്ന്ന പരിഗണന",
+ "Unable to fetch notification target list": "നോട്ടിഫിക്കേഷന് ടാര്ഗെറ്റ് ലിസ്റ്റ് നേടാനായില്ല",
+ "Set Password": "രഹസ്യവാക്ക് സജ്ജീകരിക്കുക",
+ "Enable audible notifications in web client": "വെബ് പതിപ്പിലെ അറിയിപ്പുകള് കേള്ക്കാവുന്നതാക്കുക",
+ "Permalink": "പെര്മാലിങ്ക്",
+ "remove %(name)s from the directory.": "%(name)s ഡയറക്റ്ററിയില് നിന്ന് നീക്കം ചെയ്യുക.",
+ "Off": "ഓഫ്",
+ "Riot does not know how to join a room on this network": "ഈ നെറ്റ്വര്ക്കിലെ ഒരു റൂമില് എങ്ങനെ അംഗമാകാമെന്ന് റയട്ടിന് അറിയില്ല",
+ "Mentions only": "മെന്ഷനുകള് മാത്രം",
+ "Failed to remove tag %(tagName)s from room": "റൂമില് നിന്നും %(tagName)s ടാഗ് നീക്കം ചെയ്യുവാന് സാധിച്ചില്ല",
+ "You can now return to your account after signing out, and sign in on other devices.": "നിങ്ങള്ക്ക് ഇപ്പോള് സൈന് ഔട്ട് ചെയ്ത ശേഷവും നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് തിരികെ വരാം, അതു പോലെ മറ്റ് ഡിവൈസുകളില് സൈന് ഇന് ചെയ്യുകയുമാവാം.",
+ "Enable desktop notifications": "ഡെസ്ക്ടോപ്പ് നോട്ടിഫിക്കേഷനുകള് ഇനേബിള് ചെയ്യുക",
+ "Enable email notifications": "ഇമെയില് നോട്ടിഫിക്കേഷനുകള് ഇനേബിള് ചെയ്യുക",
+ "Login": "ലോഗിന്",
+ "No rooms to show": "കാണിക്കാന് റൂമുകളില്ല",
+ "Download this file": "ഈ ഫയല് ഡൌണ്ലോഡ് ചെയ്യുക",
+ "Failed to change settings": "സജ്ജീകരണങ്ങള് മാറ്റുന്നവാന് സാധിച്ചില്ല",
+ "View Source": "സോഴ്സ് കാണുക",
+ "Collapse 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!": "നിങ്ങളുടെ ഇപ്പോളത്തെ ബ്രൌസര് റയട്ട് പ്രവര്ത്തിപ്പിക്കാന് പൂര്ണമായും പര്യാപത്മല്ല. പല ഫീച്ചറുകളും പ്രവര്ത്തിക്കാതെയിരിക്കാം. ഈ ബ്രൌസര് തന്നെ ഉപയോഗിക്കണമെങ്കില് മുന്നോട്ട് പോകാം. പക്ഷേ നിങ്ങള് നേരിടുന്ന പ്രശ്നങ്ങള് നിങ്ങളുടെ ഉത്തരവാദിത്തത്തില് ആയിരിക്കും!",
+ "Checking for an update...": "അപ്ഡേറ്റ് ഉണ്ടോ എന്ന് തിരയുന്നു...",
+ "There are advanced notifications which are not shown here": "ഇവിടെ കാണിക്കാത്ത നൂതന നോട്ടിഫിക്കേഷനുകള് ഉണ്ട്"
}
diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json
index 39199936632..47da50122c6 100644
--- a/src/i18n/strings/nb_NO.json
+++ b/src/i18n/strings/nb_NO.json
@@ -7,5 +7,111 @@
"The version of Riot.im": "Versjonen av Riot.im",
"Whether or not you're logged in (we don't record your user name)": "Om du er logget inn eller ei (vi loggfører ikke brukernavnet ditt)",
"Your language of choice": "Ditt valgte språk",
- "Your homeserver's URL": "Din hjemservers URL"
+ "Your homeserver's URL": "Din hjemservers URL",
+ "Fetching third party location failed": "Kunne ikke hente tredjeparts lokalisering",
+ "Advanced notification settings": "Avanserte varslingsinnstillinger",
+ "Sunday": "Søndag",
+ "Guests can join": "Gjester kan bli med",
+ "Messages sent by bot": "Meldinger sendt av bot",
+ "Notification targets": "Mål for varsel",
+ "Failed to set direct chat tag": "Kunne ikke angi direkte chat-tagg",
+ "Today": "I dag",
+ "Files": "Filer",
+ "You are not receiving desktop notifications": "Du mottar ikke skrivebords varsler",
+ "Friday": "Fredag",
+ "Notifications": "Varsler",
+ "Unable to fetch notification target list": "Kunne ikke hente varsel-mål liste",
+ "Add an email address above to configure email notifications": "Legg til en epost adresse for å sette opp epost varsling",
+ "Expand panel": "Utvid panel",
+ "On": "På",
+ "Filter room names": "Filtrer romnavn",
+ "Leave": "Forlat",
+ "All notifications are currently disabled for all targets.": "Alle varsler er deaktivert for alle mottakere.",
+ "delete the alias.": "Slett aliaset.",
+ "Forget": "Glem",
+ "World readable": "Lesbar for alle",
+ "You cannot delete this image. (%(code)s)": "Du kan ikke slette dette bildet. (%(code)s)",
+ "Source URL": "Kilde URL",
+ "The Home Server may be too old to support third party networks": "Hjemme-serveren kan være for gammel til å støtte tredjeparts-nettverk",
+ "Resend": "Send på nytt",
+ "Error saving email notification preferences": "Feil ved lagring av e-postvarselinnstillinger",
+ "Messages in one-to-one chats": "Meldinger i en-til-en samtaler",
+ "View Decrypted Source": "Vis dekryptert kilde",
+ "Failed to update keywords": "Kunne ikke oppdatere nøkkelord",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Varsler på de følgende nøkkelordene følger regler som ikke kan vises her:",
+ "Room not found": "Rommet ble ikke funnet",
+ "Favourite": "Favoritt",
+ "Cancel Sending": "Avbryt sending",
+ "Failed to add tag %(tagName)s to room": "Kunne ikke legge til tagg %(tagName)s til rom",
+ "Members": "Medlemmer",
+ "Noisy": "Bråkete",
+ "Failed to get protocol list from Home Server": "Kunne ikke hente protokolliste fra Hjemme-Server",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Slett rom alias %(alias)s og fjern %(name)s fra katalogen?",
+ "Enable notifications for this account": "Aktiver varsler for denne konto",
+ "Directory": "Katalog",
+ "Failed to get public room list": "Kunne ikke hente offentlig romliste",
+ "Messages containing keywords": "Meldinger som inneholder nøkkelord",
+ "When I'm invited to a room": "Når jeg blir invitert til et rom",
+ "Tuesday": "Tirsdag",
+ "Enter keywords separated by a comma:": "Angi nøkkelord adskilt med komma:",
+ "I understand the risks and wish to continue": "Jeg forstår risikoen og ønsker å fortsette",
+ "Remove %(name)s from the directory?": "Fjern %(name)s fra katalogen?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot benytter mange avanserte nettleserfunksjoner, og noen av disse er ikke tilgjengelige eller er eksperimentelle på din nåværende nettleser.",
+ "Enable desktop notifications": "Aktiver skrivebordsvarsler",
+ "Unnamed room": "Rom uten navn",
+ "All messages (noisy)": "Alle meldinger (høy)",
+ "Direct Chat": "Direkte Chat",
+ "The server may be unavailable or overloaded": "Serveren kan være utilgjengelig eller overbelastet",
+ "Reject": "Avvis",
+ "Failed to set Direct Message status of room": "Kunne ikke angi status for direkte melding i rommet",
+ "Monday": "Mandag",
+ "Remove from Directory": "Fjern fra katalogen",
+ "Enable them now": "Aktiver dem nå",
+ "Messages containing my user name": "Meldinger som inneholder mitt brukernavn",
+ "more": "mer",
+ "Search for a room": "Søk etter et rom",
+ "Failed to forget room %(errCode)s": "Kunne ikke glemme rommet %(errCode)s",
+ "Wednesday": "Onsdag",
+ "Error": "Feil",
+ "unknown error code": "ukjent feilkode",
+ "Call invitation": "Anropsinvitasjon",
+ "Messages containing my display name": "Meldinger som inneholder mitt visningsnavn",
+ "powered by Matrix": "benytter seg av Matrix",
+ "Notify me for anything else": "Varsle meg om alt annet",
+ "View Source": "Vis kilde",
+ "Keywords": "Nøkkelord",
+ "Close": "Lukk",
+ "Can't update user notification settings": "Kan ikke oppdatere brukervarsel innstillinger",
+ "Notify for all other messages/rooms": "Varsler om alle andre meldinger/rom",
+ "Unable to look up room ID from server": "Kunne ikke slå opp rom-ID fra serveren",
+ "Couldn't find a matching Matrix room": "Kunne ikke finne et samsvarende Matrix rom",
+ "Invite to this room": "Inviter til dette rommet",
+ "You cannot delete this message. (%(code)s)": "Du kan ikke slette denne meldingen. (%(code)s)",
+ "Thursday": "Torsdag",
+ "All messages": "Alle meldinger",
+ "Unable to join network": "Kunne ikke bli med i nettverket",
+ "Sorry, your browser is not able to run Riot.": "Beklager, din nettleser er ikke i stand til å kjøre Riot.",
+ "Uploaded on %(date)s by %(user)s": "Lastet opp den %(date)s av %(user)s",
+ "Messages in group chats": "Meldinger i gruppesamtaler",
+ "Yesterday": "I går",
+ "Low Priority": "Lav Prioritet",
+ "Riot does not know how to join a room on this network": "Riot vet ikke hvordan man kan komme inn på et rom på dette nettverket",
+ "An error occurred whilst saving your email notification preferences.": "En feil oppsto i forbindelse med lagring av epost varsel innstillinger.",
+ "Enable audible notifications in web client": "Aktiver lyd-varsel i webklient",
+ "Permalink": "Permanent lenke",
+ "remove %(name)s from the directory.": "fjern %(name)s fra katalogen.",
+ "Off": "Av",
+ "#example": "#eksempel",
+ "Failed to remove tag %(tagName)s from room": "Kunne ikke fjerne tagg %(tagName)s fra rommet",
+ "Remove": "Fjern",
+ "Enable email notifications": "Aktiver e-postvarsler",
+ "No rooms to show": "Ingen rom å vise",
+ "Download this file": "Last ned filen",
+ "Failed to change settings": "Kunne ikke endre innstillingene",
+ "Unhide Preview": "Vis forhåndsvisning",
+ "Custom Server Options": "Tilpassede serveralternativer",
+ "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"
}
diff --git a/src/i18n/strings/ne.json b/src/i18n/strings/ne.json
new file mode 100644
index 00000000000..9e26dfeeb6e
--- /dev/null
+++ b/src/i18n/strings/ne.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json
index d4bda9c6da0..5647c1f4ef3 100644
--- a/src/i18n/strings/nl.json
+++ b/src/i18n/strings/nl.json
@@ -29,7 +29,6 @@
"Banned users": "Verbannen gebruikers",
"Bans user with given id": "Verbant de gebruiker met het gegeven ID",
"Blacklisted": "Buitengesloten",
- "Bug Report": "Bug report",
"Bulk Options": "Bulk opties",
"Call Timeout": "Gesprek time-out",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Kan niet met de thuisserver verbinden via HTTP wanneer er een HTTPS-URL in je browser balk staat. Gebruik HTTPS of activeer onveilige scripts.",
@@ -262,7 +261,6 @@
"Forgot your password?": "Wachtwoord vergeten?",
"For security, this session has been signed out. Please sign in again.": "Voor veiligheidsredenen is deze sessie uitgelogd. Log alsjeblieft opnieuw in.",
"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.": "In verband met veiligheidsredenen zullen alle end-to-endbeveiligingsleutels van deze browser verwijderd worden. Als je je gespreksgeschiedenis van toekomstige Riot sessies wilt kunnen ontsleutelen, exporteer en bewaar dan de ruimte sleutels.",
- "Found a bug?": "Een fout gevonden?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s van %(fromPowerLevel)s naar %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Gasttoegang is uitgeschakeld op deze thuisserver.",
"Guests cannot join this room even if explicitly invited.": "Gasten kunnen niet tot deze ruimte toetreden, zelfs als ze expliciet uitgenodigd zijn.",
@@ -340,7 +338,6 @@
"Press to start a chat with someone": "Druk op om een gesprek met iemand te starten",
"Remove %(threePid)s?": "%(threePid)s verwijderen?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s heeft een VoIP-gesprek aangevraagd.",
- "Report it": "Melden",
"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.": "Het wachtwoord veranderen betekent momenteel dat alle end-to-endbeveiligingssleutels op alle apparaten veranderen waardoor versleutelde gespreksgeschiedenis onleesbaar wordt, behalve als je eerst de ruimte sleutels exporteert en daarna opnieuw importeert. Dit zal in de toekomst verbeterd worden.",
"Results from DuckDuckGo": "Resultaten van DuckDuckGo",
"Return to login screen": "Naar het inlogscherm terugkeren",
@@ -654,7 +651,6 @@
"Do you want to load widget from URL:": "Wil je de widget laden van de URL:",
"Edit": "Aanpassen",
"Enable automatic language detection for syntax highlighting": "Automatische taaldetectie voor zinsbouwmarkeringen aanzetten",
- "Hide Apps": "Apps verbergen",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Toetreed/verlaat berichten verbergen (uitnodigingen/verwijderingen/verbanningen zullen ongeschonden blijven)",
"Integrations Error": "Integratiesfout",
"Publish this room to the public in %(domain)s's room directory?": "Deze ruimte publiekelijk maken in %(domain)s's ruimte catalogus?",
@@ -663,7 +659,6 @@
"NOTE: Apps are not end-to-end encrypted": "OPMERKING: Apps zijn niet end-to-endbeveiligd",
"Revoke widget access": "Toegang tot widget intrekken",
"Sets the room topic": "Wijzigt het ruimte-onderwerp",
- "Show Apps": "Apps Weergeven",
"The maximum permitted number of widgets have already been added to this room.": "Het maximum aantal toegestane widgets is al aan deze ruimte toegevoegd.",
"To get started, please pick a username!": "Om te beginnen, kies een gebruikersnaam!",
"Unable to create widget.": "Niet in staat om een widget te maken.",
@@ -925,7 +920,6 @@
"Leave Community": "Gemeenschap Verlaten",
"Leave %(groupName)s?": "%(groupName)s verlaten?",
"Leave": "Verlaten",
- "Unable to leave room": "De ruimte kon niet verlaten worden",
"Community Settings": "Gemeenschapsinstellingen",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Deze ruimtes worden aan gemeenschapsleden getoond op de gemeenschapspagina. Gemeenschapsleden kunnen tot de ruimtes toetreden door er op te klikken.",
"%(inviter)s has invited you to join this community": "%(inviter)s heeft jou uitgenodigd om tot deze gemeenschap toe te treden",
@@ -937,8 +931,6 @@
"Community %(groupId)s not found": "Gemeenschap %(groupId)s is niet gevonden",
"This Home server does not support communities": "Deze Thuisserver ondersteunt geen gemeenschappen",
"Failed to load %(groupId)s": "Het is niet gelukt om %(groupId)s te laden",
- "Cryptography data migrated": "Cryptografie gegevens zijn gemigreerd",
- "A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Een eenmalige migratie van cryptografie gegevens heeft plaatsgevonden. Eind-tot-eind versleuteling zal niet werken als je terug gaat naar een oudere versie van Riot. Log eerst uit op Riot als je eind-tot-eind versleuteling wil gebruiken op een oudere versie. Exporteer je sleutels en importeer ze achteraf weer als je de berichtgeschiedenis wilt behouden.",
"Old cryptography data detected": "Oude cryptografie gegevens gedetecteerd",
"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.": "Er zijn gegevens van een oudere versie van Riot gedetecteerd. Dit zal eind-tot-eind versleuteling laten storen in de oudere versie. Eind-tot-eind berichten dat recent zijn uitgewisseld zal misschien niet ontsleutelbaar zijn in deze versie. Dit zou er misschien ook voor kunnen zorgen dat berichten die zijn uitgewisseld in deze versie falen. Indien je problemen ervaart, log opnieuw in. Om de berichtgeschiedenis te behouden, exporteer de sleutels en importeer ze achteraf weer.",
"Your Communities": "Jouw Gemeenschappen",
@@ -994,5 +986,154 @@
"Clear filter": "Filter vrijmaken",
"Failed to set direct chat tag": "Het is niet gelukt om de 'privégesprek' label in te stellen",
"Failed to remove tag %(tagName)s from room": "Het is niet gelukt om de label %(tagName)s van de ruimte te verwijderen",
- "Failed to add tag %(tagName)s to room": "Het is niet gelukt om de label %(tagName)s aan deze ruimte toe te voegen"
+ "Failed to add tag %(tagName)s to room": "Het is niet gelukt om de label %(tagName)s aan deze ruimte toe te voegen",
+ "Fetching third party location failed": "Het ophalen van de locatie van de derde partij is mislukt",
+ "A new version of Riot is available.": "Er is een nieuwe versie van Riot beschikbaar.",
+ "I understand the risks and wish to continue": "Ik begrijp de risico's en wil graag verder gaan",
+ "Couldn't load home page": "Kon de home pagina niet laden",
+ "Send Account Data": "Stuur account informatie",
+ "All notifications are currently disabled for all targets.": "Alle meldingen zijn momenteel uitgeschakeld voor alle doelen.",
+ "Uploading report": "Rapport uploaden",
+ "Sunday": "Zondag",
+ "Notification targets": "Meldingsdoelen",
+ "Today": "Vandaag",
+ "Files": "Bestanden",
+ "You are not receiving desktop notifications": "Je ontvangt momenteel geen desktopmeldingen",
+ "Friday": "Vrijdag",
+ "Update": "Bijwerken",
+ "What's New": "Wat is er nieuw",
+ "Add an email address above to configure email notifications": "Voeg een e-mailadres toe om e-mailmeldingen te ontvangen",
+ "Expand panel": "Paneel uitklappen",
+ "On": "Aan",
+ "%(count)s Members|other": "%(count)s Deelnemers",
+ "Filter room names": "Filter kamernamen",
+ "Changelog": "Logboek van wijzigingen",
+ "Waiting for response from server": "Wachten op antwoord van de server",
+ "Send Custom Event": "Verzend aangepast evenement",
+ "Advanced notification settings": "Geavanceerde meldingsinstellingen",
+ "delete the alias.": "verwijder de alias.",
+ "To return to your account in future you need to set a password": "Om in de toekomst naar je account terug te gaan moet je een wachtwoord instellen",
+ "Forget": "Vergeten",
+ "#example": "#voorbeeld",
+ "Hide panel": "Paneel verbergen",
+ "You cannot delete this image. (%(code)s)": "Je kunt deze afbeelding niet verwijderen. (%(code)s)",
+ "Cancel Sending": "Versturen annuleren",
+ "This Room": "Deze kamer",
+ "The Home Server may be too old to support third party networks": "De thuisserver is misschien te oud om netwerken van derde partijen te ondersteunen",
+ "Resend": "Opnieuw verzenden",
+ "Error saving email notification preferences": "Fout bij het opslaan van de meldingsvoorkeuren voor e-mail",
+ "Messages containing my display name": "Berichten die mijn weergavenaam bevatten",
+ "Messages in one-to-one chats": "Berichten in één-op-één-gesprekken",
+ "Unavailable": "Niet beschikbaar",
+ "View Decrypted Source": "Bekijk ontsleutelde bron",
+ "Failed to update keywords": "Trefwoorden bijwerken mislukt",
+ "remove %(name)s from the directory.": "verwijder %(name)s uit de kamerlijst.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Meldingen op de volgende trefwoorden volgen regels die hier niet kunnen worden getoond:",
+ "Safari and Opera work too.": "Safari en Opera werken ook.",
+ "Please set a password!": "Stel een wachtwoord in!",
+ "You have successfully set a password!": "U heeft met succes een wachtwoord ingesteld!",
+ "An error occurred whilst saving your email notification preferences.": "Er is een fout opgetreden tijdens het opslaan van uw e-mailmeldingsvoorkeuren.",
+ "Explore Room State": "Verken Ruimtetoestand",
+ "Source URL": "Bron-URL",
+ "Messages sent by bot": "Berichten verzonden door een bot",
+ "Filter results": "Resultaten filteren",
+ "Members": "Leden",
+ "No update available.": "Geen update beschikbaar.",
+ "Noisy": "Luidruchtig",
+ "Failed to get protocol list from Home Server": "Protocollijst ophalen van de homeserver mislukt",
+ "Collecting app version information": "App-versieinformatie verzamelen",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "De alias %(alias)s verwijderen en %(name)s uit de kamerlijst verwijderen?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Hiermee kunt u naar uw account terugkeren nadat u zich heeft afgemeld, en u aanmelden op andere apparaten.",
+ "Keywords": "Trefwoorden",
+ "Enable notifications for this account": "Meldingen voor dit account aanzetten",
+ "Directory": "Kamerlijst",
+ "Invite to this community": "Nodig uit in deze community",
+ "Search for a room": "Een kamer opzoeken",
+ "Messages containing keywords": "Berichten die trefwoorden bevatten",
+ "Room not found": "De kamer is niet gevonden",
+ "Tuesday": "Dinsdag",
+ "Enter keywords separated by a comma:": "Voeg trefwoorden toe, gescheiden door een komma:",
+ "Search…": "Zoeken…",
+ "You have successfully set a password and an email address!": "Het instellen van een wachtwoord en e-mailadres is geslaagd!",
+ "Remove %(name)s from the directory?": "%(name)s uit de kamerlijst verwijderen?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot gebrukt veel geavanceerde browserfuncties, waarvan enkele niet (of experimenteel) in uw webbrowser beschikbaar zijn.",
+ "Developer Tools": "Ontwikkelaarsgereedschap",
+ "Enable desktop notifications": "Desktopmeldingen aanzetten",
+ "Explore Account Data": "Bekijk account informatie",
+ "Remove from Directory": "Uit de kamerlijst verwijderen",
+ "Away": "Afwezig",
+ "Saturday": "Zaterdag",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Onthoud dat u altijd een e-mailadres in kan stellen in de gebruikersinstellingen als u zich bedenkt.",
+ "Direct Chat": "Privégesprek",
+ "The server may be unavailable or overloaded": "De server is misschien niet beschikbaar of overbelast",
+ "Reject": "Afwijzen",
+ "Failed to set Direct Message status of room": "Het is mislukt om de directe-berichtenstatus van de kamer in te stellen",
+ "Monday": "Maandag",
+ "All messages (noisy)": "Alle berichten (luid)",
+ "Enable them now": "Deze nu aanzetten",
+ "Messages containing my user name": "Berichten die mijn gebruikersnaam bevatten",
+ "Toolbox": "Eigenschappen",
+ "Collecting logs": "Logboeken verzamelen",
+ "more": "meer",
+ "Bug report sent": "Bug report verzonden",
+ "You must specify an event type!": "Je moet een event-type specificeren!",
+ "(HTTP status %(httpStatus)s)": "(HTTP-status %(httpStatus)s)",
+ "Invite to this room": "Uitnodigen voor deze kamer",
+ "Please install Chrome or Firefox for the best experience.": "Installeer alstublieft Chrome of Firefox voor de beste gebruikerservaring.",
+ "Failed to get public room list": "Lijst met publieke kamers ophalen mislukt",
+ "Send logs": "Logboeken versturen",
+ "All messages": "Alle berichten",
+ "Call invitation": "Oproep-uitnodiging",
+ "Downloading update...": "Update aan het downloaden...",
+ "State Key": "Toestandssleutel",
+ "Failed to send custom event.": "Aangepast Event verzenden mislukt.",
+ "What's new?": "Wat is er nieuw?",
+ "Notify me for anything else": "Stuur een melding voor al het andere",
+ "When I'm invited to a room": "Wanneer ik uitgenodigd word voor een kamer",
+ "Can't update user notification settings": "Het is niet gelukt om de meldingsinstellingen van de gebruiker bij te werken",
+ "Notify for all other messages/rooms": "Stuur een melding voor alle andere berichten/kamers",
+ "Unable to look up room ID from server": "Het is mislukt om de kamer-ID op te halen van de server",
+ "Couldn't find a matching Matrix room": "Het is niet gelukt om een bijbehorende Matrix-kamer te vinden",
+ "All Rooms": "Alle kamers",
+ "You cannot delete this message. (%(code)s)": "Je kunt dit bericht niet verwijderen. (%(code)s)",
+ "Thursday": "Donderdag",
+ "Forward Message": "Bericht doorsturen",
+ "Back": "Terug",
+ "Reply": "Beantwoord",
+ "Show message in desktop notification": "Toon boodschap in bureaublad popup",
+ "Unhide Preview": "Zichtbaar maken preview",
+ "Unable to join network": "Het is mislukt om toe te treden tot dit netwerk",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Je hebt ze mogelijk ingesteld in een andere client dan Riot. Je kunt ze niet aanpassen in Riot maar ze zijn wel actief",
+ "Sorry, your browser is not able to run Riot.": "Sorry, uw browser werkt niet met Riot.",
+ "Uploaded on %(date)s by %(user)s": "Geüpload op %(date)s door %(user)s",
+ "Messages in group chats": "Berichten in groepsgesprekken",
+ "Yesterday": "Gisteren",
+ "Error encountered (%(errorDetail)s).": "Fout ondervonden (%(errorDetail)s).",
+ "Login": "Aanmelden",
+ "Low Priority": "Lage prioriteit",
+ "Unable to fetch notification target list": "Het is mislukt om de lijst van notificatiedoelen op te halen",
+ "Appear Offline": "Lijk offline",
+ "Set Password": "Wachtwoord instellen",
+ "Enable audible notifications in web client": "Geluidsmeldingen in de webclient aanzetten",
+ "Permalink": "Permanente link",
+ "Off": "Uit",
+ "Riot does not know how to join a room on this network": "Riot weet niet hoe het moet deelnemen in een kamer op dit netwerk",
+ "Mentions only": "Alleen vermeldingen",
+ "Wednesday": "Woensdag",
+ "You can now return to your account after signing out, and sign in on other devices.": "U kunt nu terugkeren naar uw account nadat u bent afgemeld, en u aanmelden op andere apparaten.",
+ "Enable email notifications": "E-mailmeldingen aanzetten",
+ "Event Type": "Event-type",
+ "Download this file": "Download dit bestand",
+ "Pin Message": "Bericht vastpinnen",
+ "Failed to change settings": "Instellingen wijzigen mislukt",
+ "View Community": "Gemeenschap Weergeven",
+ "%(count)s Members|one": "%(count)s Deelnemer",
+ "Event sent!": "Event verstuurd!",
+ "View Source": "Bekijk bron",
+ "Event Content": "Event-inhoud",
+ "Thank you!": "Bedankt!",
+ "Collapse panel": "Paneel inklappen",
+ "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!": "Met uw huidige browser kan de applicatie er volledig incorrect uitzien. Tevens is het mogelijk dat niet alle functies naar behoren werken. U kunt doorgaan als u het toch wil proberen, maar bij problemen bent u volledig op uzelf aangewezen!",
+ "Checking for an update...": "Aan het kijken voor een update...",
+ "There are advanced notifications which are not shown here": "Er zijn geavanceerde notificaties die hier niet getoond worden"
}
diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json
index 9f672277f66..042df8aebc2 100644
--- a/src/i18n/strings/pl.json
+++ b/src/i18n/strings/pl.json
@@ -138,7 +138,6 @@
"Missing Media Permissions, click here to request.": "Brakuje uprawnień mediów. Kliknij tutaj, aby ich zażądać.",
"and %(count)s others...|other": "i %(count)s innych...",
"and %(count)s others...|one": "i jeden inny...",
- "Bug Report": "Raport błędu",
"Bulk Options": "Masowe opcje",
"Call Timeout": "Upłynął limit czasu połączenia",
"Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nie można nawiązać połączenia z serwerem - proszę sprawdź twoje połączenie, upewnij się, że certyfikat SSL serwera jest zaufany, i że dodatki przeglądarki nie blokują żądania.",
@@ -257,7 +256,6 @@
"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.",
- "Found a bug?": "Znalazłeś błąd?",
"%(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",
@@ -379,9 +377,7 @@
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s usunął swoją nazwę ekranową (%(oldDisplayName)s).",
"%(senderName)s removed their profile picture.": "%(senderName)s usunął swoje zdjęcie profilowe.",
"Remove %(threePid)s?": "Usunąć %(threePid)s?",
- "Hide Apps": "Ukryj aplikacje",
"%(senderName)s requested a VoIP conference.": "%(senderName)s zażądał grupowego połączenia głosowego VoIP.",
- "Report it": "Zgłoś",
"Results from DuckDuckGo": "Wyniki z DuckDuckGo",
"Return to login screen": "Wróć do ekranu logowania",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot nie ma uprawnień, by wysyłać ci powiadomienia - sprawdź ustawienia swojej przeglądarki",
@@ -420,7 +416,6 @@
"%(senderName)s set a profile picture.": "%(senderName)s ustawił zdjęcie profilowe.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ustawił swoją nazwę na %(displayName)s.",
"Sets the room topic": "Ustaw temat pokoju",
- "Show Apps": "Pokaż aplikacje",
"Show panel": "Pokaż panel",
"Show Text Formatting Toolbar": "Pokaż pasek narzędzi formatowania tekstu",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Pokaż czas w formacie 12-sto godzinnym (n.p. 2:30pm)",
@@ -698,5 +693,172 @@
"Your homeserver's URL": "Adres URL twojego serwera domowego",
"Your identity server's URL": "Adres URL twojego serwera tożsamości",
"The information being sent to us to help make Riot.im better includes:": "Oto informacje przesyłane do nas, służące do poprawy Riot.im:",
- "We also record each page you use in the app (currently ), your User Agent () and your device resolution ().": "Zapisujemy również każdą stronę, z której korzystasz w aplikacji (obecnie ), twój User Agent () oraz rozdzielczość ekranu twojego urządzenia ()."
+ "We also record each page you use in the app (currently ), your User Agent () and your device resolution ().": "Zapisujemy również każdą stronę, z której korzystasz w aplikacji (obecnie ), twój User Agent () oraz rozdzielczość ekranu twojego urządzenia ().",
+ "Fetching third party location failed": "Pobranie lokalizacji zewnętrznej nie powiodło się",
+ "A new version of Riot is available.": "Dostępna jest nowa wersja Riot.",
+ "Couldn't load home page": "Nie można załadować strony startowej",
+ "Send Account Data": "Wyślij dane konta",
+ "All notifications are currently disabled for all targets.": "Wszystkie powiadomienia są obecnie wyłączone dla wszystkich celów.",
+ "Uploading report": "Raport wysyłania",
+ "Sunday": "Niedziela",
+ "Guests can join": "Goście mogą dołączyć",
+ "Failed to add tag %(tagName)s to room": "Nie można dodać tagu %(tagName)s do pokoju",
+ "Notification targets": "Cele powiadomień",
+ "Failed to set direct chat tag": "Nie udało się ustawić znacznika rozmów bezpośrednich",
+ "Today": "Dzisiaj",
+ "Failed to get protocol list from Home Server": "Nie można pobrać listy protokołów z serwera domowego",
+ "You are not receiving desktop notifications": "Nie otrzymujesz powiadomień na pulpit",
+ "Friday": "Piątek",
+ "Update": "Uaktualnienie",
+ "What's New": "Co nowego",
+ "Add an email address above to configure email notifications": "Dodaj adres e-mail powyżej, aby skonfigurować powiadomienia e-mailowe",
+ "Expand panel": "Rozwiń panel",
+ "On": "Włącz",
+ "%(count)s Members|other": "%(count)s Członków",
+ "Filter room names": "Filtruj nazwy pokojów",
+ "Changelog": "Dziennik zmian",
+ "Waiting for response from server": "Czekam na odpowiedź serwera",
+ "Leave": "Opuść",
+ "Send Custom Event": "Wyślij niestandardowe wydarzenie",
+ "Advanced notification settings": "Zaawansowane ustawienia powiadomień",
+ "Failed to send logs: ": "Niepowodzenie wysyłki zapisu rozmów ",
+ "delete the alias.": "usunąć alias.",
+ "To return to your account in future you need to set a password": "Aby wrócić do swojego konta w przyszłości musisz ustawić hasło ",
+ "Forget": "Zapomnij",
+ "World readable": "Całkowicie publiczne",
+ "#example": "#przykład",
+ "Hide panel": "Ukryj panel",
+ "You cannot delete this image. (%(code)s)": "Nie możesz usunąć tego obrazka. (%(code)s)",
+ "Cancel Sending": "Anuluj wysyłanie",
+ "Warning": "Ostrzeżenie",
+ "This Room": "Ten pokój",
+ "The Home Server may be too old to support third party networks": "Serwer domowy może być za stary dla innych sieci",
+ "Resend": "Wyślij jeszcze raz",
+ "Error saving email notification preferences": "Wystąpił błąd podczas zapisywania ustawień powiadomień e-mailowych",
+ "Messages containing my display name": "Wiadomości zawierające moją wyświetlaną nazwę",
+ "Messages in one-to-one chats": "Wiadomości w rozmowach jeden-na-jeden",
+ "Unavailable": "Niedostępny",
+ "View Decrypted Source": "Pokaż zdeszyfrowane źródło",
+ "Send": "Wyślij",
+ "Notes:": "Notatki:",
+ "remove %(name)s from the directory.": "usuń %(name)s z katalogu.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Powiadomienia o słowach kluczowych spełniają reguły, które nie mogą być tu wyświetlone:",
+ "Safari and Opera work too.": "Safari i Opera również się sprawdzą.",
+ "Please set a password!": "Proszę, ustaw hasło!",
+ "You have successfully set a password!": "Hasło zostało zmienione z powodzeniem!",
+ "An error occurred whilst saving your email notification preferences.": "Podczas zapisywania ustawień powiadomień e-mail wystąpił błąd.",
+ "Explore Room State": "Przeglądaj stan pokoju",
+ "Source URL": "Źródłowy URL",
+ "Messages sent by bot": "Wiadomości wysłane przez bota",
+ "Filter results": "Filtruj wyniki",
+ "Members": "Członkowie",
+ "No update available.": "Brak aktualizacji.",
+ "Noisy": "Głośny",
+ "Files": "Pliki",
+ "Collecting app version information": "Zbieranie informacji o wersji aplikacji",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Usuń alias %(alias)s i usuń %(name)s z katalogu?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "To pozwoli Ci powrócić do Twojego konta po wylogowaniu i ponownym zalogowaniu się na innych urządzeniach.",
+ "Keywords": "Słowa kluczowe",
+ "Enable notifications for this account": "Włącz powiadomienia na tym koncie",
+ "Directory": "Księga adresowa",
+ "Invite to this community": "Zaproś do tej społeczności",
+ "Failed to get public room list": "Nie udało się uzyskać publicznej listy pokojowej",
+ "Messages containing keywords": "Wiadomości zawierające słowa kluczowe",
+ "Room not found": "Pokój nie znaleziony",
+ "Tuesday": "Wtorek",
+ "Enter keywords separated by a comma:": "Wpisz słowa kluczowe oddzielone przecinkami:",
+ "Forward Message": "Przekaż wiadomość",
+ "You have successfully set a password and an email address!": "Z powodzeniem ustawiono hasło i adres e-mail dla Twojego konta!",
+ "Remove %(name)s from the directory?": "Usunąć %(name)s z katalogu?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot używa wiele zaawansowanych technologii, które nie są dostępne lub są w fazie testów w Twojej przeglądarce.",
+ "Developer Tools": "Narzędzia programistyczne",
+ "Preparing to send logs": "Przygotowywanie do wysłania zapisu rozmów",
+ "Unnamed room": "Pokój bez nazwy",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Pamiętaj, że zawsze możesz zmienić swój e-mail lub hasło w panelu ustawień użytkownika.",
+ "Explore Account Data": "Odkryj dane konta",
+ "All messages (noisy)": "Wszystkie wiadomości (głośno)",
+ "Away": "Niedostępny",
+ "Saturday": "Sobota",
+ "I understand the risks and wish to continue": "Rozumiem ryzyko i chcę kontynuować",
+ "Direct Chat": "Rozmowa bezpośrednia",
+ "The server may be unavailable or overloaded": "Serwer jest nieosiągalny lub jest przeciążony",
+ "Reject": "Odrzuć",
+ "Failed to set Direct Message status of room": "Nie udało się ustawić statusu Rozmów Bezpośrednich dla pokoju",
+ "Monday": "Poniedziałek",
+ "Remove from Directory": "Usuń z katalogu",
+ "Enable them now": "Włącz je teraz",
+ "Messages containing my user name": "Wiadomości zawierające moją nazwę użytkownika",
+ "Toolbox": "Przybornik",
+ "Collecting logs": "Zbieranie dzienników",
+ "more": "więcej",
+ "GitHub issue link:": "Link do wątku na GitHubie:",
+ "Bug report sent": "Raport błędu wysłany",
+ "You must specify an event type!": "Musisz określić typ wydarzenia!",
+ "(HTTP status %(httpStatus)s)": "(status HTTP %(httpStatus)s)",
+ "All Rooms": "Wszystkie pokoje",
+ "Please install Chrome or Firefox for the best experience.": "Zainstaluj Chrome lub Firefox dla najlepszego doświadczenia.",
+ "Wednesday": "Środa",
+ "You cannot delete this message. (%(code)s)": "Nie możesz usunąć tej wiadomości. (%(code)s)",
+ "Quote": "Cytat",
+ "Failed to update keywords": "Nie udało się zaktualizować słów kluczowych",
+ "Send logs": "Wyślij logi",
+ "All messages": "Wszystkie wiadomości",
+ "Call invitation": "Zaproszenie do rozmowy",
+ "Downloading update...": "Pobieranie aktualizacji...",
+ "State Key": "Klucz stanu",
+ "Failed to send custom event.": "Wysyłanie niestandardowego wydarzenia nie powiodło się.",
+ "What's new?": "Co nowego?",
+ "Notify me for anything else": "Powiadom mnie o całej reszcie",
+ "When I'm invited to a room": "Kiedy zostanę zaproszony do pokoju",
+ "Click here to create a GitHub issue.": "Kliknij tutaj aby założyć wątek na GitHubie dot. problemu.",
+ "Can't update user notification settings": "Nie można zaktualizować ustawień powiadomień użytkownika",
+ "Notify for all other messages/rooms": "Powiadamiaj o wszystkich innych wiadomośsciach/pokojach",
+ "Unable to look up room ID from server": "Nie można wyszukać ID pokoju na serwerze",
+ "Couldn't find a matching Matrix room": "Nie można znaleźć pasującego pokoju Matrix",
+ "Invite to this room": "Zaproś do tego pokoju",
+ "Search for a room": "Szukaj pokoju",
+ "Thursday": "Czwartek",
+ "Search…": "Szukaj…",
+ "Logs sent": "Zapis rozmów wysłany",
+ "Back": "Powrót",
+ "Reply": "Odpowiedz",
+ "Show message in desktop notification": "Pokaż wiadomość w notyfikacji na pulpicie",
+ "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.": "Dziennik błędów zawiera dane użytkowania aplikacji, w tym: twoją nazwę użytkownika, numery ID, aliasy pokojów i grup które odwiedzałeś i loginy innych użytkowników. Nie zawiera wiadomości.",
+ "Unhide Preview": "Odkryj podgląd",
+ "Unable to join network": "Nie można dołączyć do sieci",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Możliwe, że skofigurowałeś je w innym kliencie, niż Riot. Nie możesz ich zmieniać w Riot, ale nadal mają zastosowanie",
+ "Sorry, your browser is not able to run Riot.": "Przepraszamy, Twoja przeglądarka nie jest w stanie uruchomić Riot.",
+ "Uploaded on %(date)s by %(user)s": "Wysłane %(date)s przez %(user)s",
+ "Messages in group chats": "Wiadomości w czatach grupowych",
+ "Yesterday": "Wczoraj",
+ "Error encountered (%(errorDetail)s).": "Wystąpił błąd (%(errorDetail)s).",
+ "Login": "Logowanie",
+ "Low Priority": "Niski priorytet",
+ "Unable to fetch notification target list": "Nie można pobrać listy docelowej dla powiadomień",
+ "Appear Offline": "Ustaw status niedostępny",
+ "Set Password": "Ustaw hasło",
+ "Enable audible notifications in web client": "Włącz dźwiękowe powiadomienia w kliencie internetowym",
+ "Permalink": "Odnośnik bezpośredni",
+ "Off": "Wyłącz",
+ "Riot does not know how to join a room on this network": "Riot nie wie, jak dołączyć do pokoju w tej sieci",
+ "Mentions only": "Tylko, gdy wymienieni",
+ "Failed to remove tag %(tagName)s from room": "Nie udało się usunąć tagu %(tagName)s z pokoju",
+ "You can now return to your account after signing out, and sign in on other devices.": "Teraz możesz powrócić do swojego konta na innych urządzeniach po wylogowaniu i ponownym zalogowaniu się.",
+ "Enable desktop notifications": "Włącz powiadomienia",
+ "Enable email notifications": "Włącz powiadomienia e-mailowe",
+ "Event Type": "Typ wydarzenia",
+ "No rooms to show": "Brak pokoi do wyświetlenia",
+ "Download this file": "Pobierz plik",
+ "Pin Message": "Przypnij Wiadomość",
+ "Failed to change settings": "Nie udało się zmienić ustawień",
+ "View Community": "Pokaż społeczność",
+ "%(count)s Members|one": "%(count)s Członek",
+ "Event sent!": "Wydarzenie wysłane!",
+ "View Source": "Pokaż źródło",
+ "Event Content": "Zawartość wydarzenia",
+ "Thank you!": "Dziękujemy!",
+ "Collapse panel": "Ukryj 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!": "Z Twoją obecną przeglądarką, wygląd oraz wrażenia z używania aplikacji mogą być niepoprawne, a niektóre funkcje wcale nie działać. Kontynuuj jeśli chcesz spróbować, jednak trudno będzie pomóc w przypadku błędów, które mogą nastąpić!",
+ "Checking for an update...": "Sprawdzanie aktualizacji...",
+ "There are advanced notifications which are not shown here": "Masz zaawansowane powiadomienia, nie pokazane tutaj"
}
diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json
index 2a99cd191c3..d8b9d11040a 100644
--- a/src/i18n/strings/pt.json
+++ b/src/i18n/strings/pt.json
@@ -14,7 +14,6 @@
"Banned users": "Usuárias/os banidas/os",
"Bans user with given id": "Banir usuários com o identificador informado",
"Blacklisted": "Bloqueado",
- "Bug Report": "Repotar problemas de funcionamento",
"Bulk Options": "Opcões de Batelada",
"Can't load user settings": "Não é possível carregar configurações de usuário",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".",
@@ -68,7 +67,6 @@
"Forgot your password?": "Esqueceu sua senha?",
"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.": "Por segurança, deslogar irá remover qualquer chave de criptografia ponta-a-ponta deste navegador. Caso deseje descriptografar o histórico das suas conversas E2E em sessões Riot futuras, por favor exporte as chaves da sala para sua garantia.",
"For security, this session has been signed out. Please sign in again.": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente.",
- "Found a bug?": "Encontrou um problema de funcionamento do sistema?",
"Guests cannot join this room even if explicitly invited.": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os.",
"Hangup": "Desligar",
"Historical": "Histórico",
@@ -405,7 +403,6 @@
"olm version:": "versão do olm:",
"Operation failed": "A operação falhou",
"Remove %(threePid)s?": "Remover %(threePid)s?",
- "Report it": "Reportar",
"riot-web version:": "versão do riot-web:",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Mostrar os horários em formato de 12h (p.ex: 2:30pm)",
"Unmute": "Tirar do mudo",
@@ -632,7 +629,6 @@
"Do you want to load widget from URL:": "Deseja carregar o widget a partir do URL:",
"Edit": "Editar",
"Enable automatic language detection for syntax highlighting": "Ativar deteção automática da linguagem para o destaque da sintaxe",
- "Hide Apps": "Ocultar apps",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Ocultar mensagens de entrada/saída (não afeta convites/expulsões/proibições)",
"Integrations Error": "Erro de integrações",
"Publish this room to the public in %(domain)s's room directory?": "Publicar esta sala ao público no diretório de salas de %(domain)s's?",
@@ -642,7 +638,6 @@
"Press to start a chat with someone": "Clique para iniciar uma conversa com alguém",
"Revoke widget access": "Revogar o acesso do wiget",
"Sets the room topic": "Define o assunto da sala",
- "Show Apps": "Mostrar apps",
"The maximum permitted number of widgets have already been added to this room.": "O número máximo de widgets permitido já foi adicionado a esta sala.",
"To get started, please pick a username!": "Para começar, escolha um nome de utilizador!",
"Unable to create widget.": "Não foi possível criar o widget.",
@@ -715,5 +710,150 @@
"To configure the room, you must be a": "Para configurar esta sala, tens de ser um(a)",
"To ban users, you must be a": "Para banir utilizadores, tens de ser um(a)",
"To remove other users' messages, you must be a": "Para remover mensagens de outros utilizadores, tens de ser um(a)",
- "To send events of type , you must be a": "Para enviar eventos do tipo , tens de ser um(a)"
+ "To send events of type , you must be a": "Para enviar eventos do tipo , tens de ser um(a)",
+ "Fetching third party location failed": "Falha ao obter localização de terceiros",
+ "A new version of Riot is available.": "Uma nova versão do Riot está disponível.",
+ "I understand the risks and wish to continue": "Entendo os riscos e pretendo continuar",
+ "Couldn't load home page": "Não foi possível carregar a página inicial",
+ "Advanced notification settings": "Configurações avançadas de notificação",
+ "Uploading report": "A enviar o relatório",
+ "Sunday": "Domingo",
+ "Guests can join": "Convidados podem entrar",
+ "Messages sent by bot": "Mensagens enviadas por bots",
+ "Notification targets": "Alvos de notificação",
+ "Failed to set direct chat tag": "Falha ao definir conversa como pessoal",
+ "Today": "Hoje",
+ "Failed to get protocol list from Home Server": "Falha ao obter a lista de protocolos do servidor padrão",
+ "You are not receiving desktop notifications": "Não está a receber notificações de desktop",
+ "Friday": "Sexta-feira",
+ "Update": "Atualizar",
+ "What's New": "Novidades",
+ "Add an email address above to configure email notifications": "Insira um endereço de email no campo acima para configurar as notificações por email",
+ "Expand panel": "Expandir o painel",
+ "On": "Ativado",
+ "Filter room names": "Filtrar salas por título",
+ "Changelog": "Histórico de alterações",
+ "Waiting for response from server": "À espera de resposta do servidor",
+ "Uploaded on %(date)s by %(user)s": "Enviada em %(date)s por %(user)s",
+ "Send Custom Event": "Enviar evento personalizado",
+ "All notifications are currently disabled for all targets.": "Todas as notificações estão atualmente desativadas para todos os casos.",
+ "delete the alias.": "apagar o apelido da sala.",
+ "To return to your account in future you need to set a password": "Para voltar à sua conta no futuro, necessita de definir uma palavra-passe",
+ "Forget": "Esquecer",
+ "World readable": "Público",
+ "#example": "#exemplo",
+ "Hide panel": "Ocultar o painel",
+ "You cannot delete this image. (%(code)s)": "Não pode apagar esta imagem. (%(code)s)",
+ "Cancel Sending": "Cancelar o envio",
+ "Warning": "Aviso",
+ "This Room": "Esta sala",
+ "The Home Server may be too old to support third party networks": "O servidor pode ser muito antigo para suportar redes de terceiros",
+ "Resend": "Reenviar",
+ "Error saving email notification preferences": "Erro ao guardar as preferências de notificação por e-mail",
+ "Messages containing my display name": "Mensagens contendo o meu nome público",
+ "Messages in one-to-one chats": "Mensagens em conversas pessoais",
+ "Unavailable": "Indisponível",
+ "View Decrypted Source": "Ver a fonte desencriptada",
+ "Failed to update keywords": "Falha ao atualizar as palavras-chave",
+ "remove %(name)s from the directory.": "remover %(name)s da lista pública de salas.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Notificações sobre as seguintes palavras-chave seguem regras que não podem ser exibidas aqui:",
+ "Please set a password!": "Por favor, defina uma palavra-passe!",
+ "You have successfully set a password!": "Palavra-passe definida com sucesso!",
+ "An error occurred whilst saving your email notification preferences.": "Ocorreu um erro ao guardar as suas preferências de notificação por email.",
+ "Explore Room State": "Explorar estado da sala",
+ "Source URL": "URL fonte",
+ "Failed to add tag %(tagName)s to room": "Falha ao adicionar %(tagName)s à sala",
+ "Filter results": "Filtrar resultados",
+ "Members": "Membros",
+ "No update available.": "Nenhuma atualização disponível.",
+ "Noisy": "Barulhento",
+ "Files": "Ficheiros",
+ "Collecting app version information": "A recolher informação da versão da app",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Apagar o apelido %(alias)s da sala e remover %(name)s da lista pública?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Isto irá permitir-lhe voltar à sua conta depois de terminar sessão, assim como iniciar sessão noutros dispositivos.",
+ "Keywords": "Palavras-chave",
+ "Enable notifications for this account": "Ativar notificações para esta conta",
+ "Directory": "Diretório",
+ "Search for a room": "Pesquisar por uma sala",
+ "Messages containing keywords": "Mensagens contendo palavras-chave",
+ "Room not found": "Sala não encontrada",
+ "Tuesday": "Terça-feira",
+ "Enter keywords separated by a comma:": "Insira palavras-chave separadas por vírgula:",
+ "Search…": "Pesquisar…",
+ "Remove %(name)s from the directory?": "Remover %(name)s da lista pública de salas?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "O Riot usa muitas funcionalidades avançadas do navegador, algumas das quais não estão disponíveis ou ainda são experimentais no seu navegador atual.",
+ "Developer Tools": "Ferramentas de desenvolvedor",
+ "Enable desktop notifications": "Ativar notificações no desktop",
+ "Unnamed room": "Sala sem nome",
+ "Remove from Directory": "Remover da lista pública de salas",
+ "Saturday": "Sábado",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Lembre-se, pode sempre definir um endereço de e-mail nas definições de utilizador se mudar de ideias.",
+ "Direct Chat": "Conversa pessoal",
+ "The server may be unavailable or overloaded": "O servidor pode estar inacessível ou sobrecarregado",
+ "Reject": "Rejeitar",
+ "Failed to set Direct Message status of room": "Falha em definir a mensagem de status da sala",
+ "Monday": "Segunda-feira",
+ "All messages (noisy)": "Todas as mensagens (alto)",
+ "Enable them now": "Ativar agora",
+ "Messages containing my user name": "Mensagens contendo o meu nome de utilizador",
+ "Collecting logs": "A recolher logs",
+ "more": "mais",
+ "You must specify an event type!": "Tem que especificar um tipo de evento!",
+ "(HTTP status %(httpStatus)s)": "(Estado HTTP %(httpStatus)s)",
+ "Invite to this room": "Convidar para esta sala",
+ "State Key": "Chave de estado",
+ "Failed to get public room list": "Falha ao obter a lista de salas públicas",
+ "Send": "Enviar",
+ "Send logs": "Enviar relatórios de erro",
+ "All messages": "Todas as mensagens",
+ "Call invitation": "Convite para chamada",
+ "Downloading update...": "A transferir atualização...",
+ "You have successfully set a password and an email address!": "Palavra passe e endereço de e-mail definidos com sucesso!",
+ "Failed to send custom event.": "Falha ao enviar evento personalizado.",
+ "What's new?": "O que há de novo?",
+ "Notify me for anything else": "Notificar-me sobre qualquer outro evento",
+ "When I'm invited to a room": "Quando sou convidado para uma sala",
+ "Can't update user notification settings": "Não é possível atualizar as preferências de notificação",
+ "Notify for all other messages/rooms": "Notificar para todas as outras mensagens/salas",
+ "Unable to look up room ID from server": "Não foi possível obter a identificação da sala do servidor",
+ "Couldn't find a matching Matrix room": "Não foi possível encontrar uma sala correspondente no servidor Matrix",
+ "Bug report sent": "Relatório de erros enviado",
+ "All Rooms": "Todas as salas",
+ "You cannot delete this message. (%(code)s)": "Não pode apagar esta mensagem. (%(code)s)",
+ "Thursday": "Quinta-feira",
+ "Forward Message": "Encaminhar",
+ "Back": "Voltar",
+ "Unhide Preview": "Mostrar a pré-visualização novamente",
+ "Unable to join network": "Não foi possível juntar-se à rede",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Pode ter configurado num outro cliente sem ser o Riot. Não pode ajustá-las no Riot, mas ainda assim elas aplicam-se",
+ "Sorry, your browser is not able to run Riot.": "Desculpe, o seu navegador não é capaz de executar o Riot.",
+ "Messages in group chats": "Mensagens em salas",
+ "Yesterday": "Ontem",
+ "Error encountered (%(errorDetail)s).": "Erro encontrado (%(errorDetail)s).",
+ "Login": "Entrar",
+ "Low Priority": "Baixa prioridade",
+ "Unable to fetch notification target list": "Não foi possível obter a lista de alvos de notificação",
+ "Set Password": "Definir palavra-passe",
+ "Enable audible notifications in web client": "Ativar notificações de áudio no cliente web",
+ "Permalink": "Link permanente",
+ "Off": "Desativado",
+ "Riot does not know how to join a room on this network": "O Riot não sabe como entrar numa sala nesta rede",
+ "Mentions only": "Apenas menções",
+ "Failed to remove tag %(tagName)s from room": "Não foi possível remover a marcação %(tagName)s desta sala",
+ "Wednesday": "Quarta-feira",
+ "You can now return to your account after signing out, and sign in on other devices.": "Pode agora voltar à sua conta no fim de terminar sessão, e iniciar sessão noutros dispositivos.",
+ "Enable email notifications": "Ativar notificações por e-mail",
+ "Event Type": "Tipo de evento",
+ "No rooms to show": "Não existem salas a serem exibidas",
+ "Download this file": "Transferir este ficheiro",
+ "Failed to change settings": "Falha ao alterar as configurações",
+ "Event sent!": "Evento enviado!",
+ "View Source": "Ver a fonte",
+ "Event Content": "Conteúdo do evento",
+ "Thank you!": "Obrigado!",
+ "Quote": "Citar",
+ "Collapse panel": "Colapsar o painel",
+ "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!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e algumas das funcionalidades poderão não funcionar. Se quiser tentar de qualquer maneira pode continuar, mas está por sua conta com algum problema que possa encontrar!",
+ "Checking for an update...": "A procurar uma atualização...",
+ "There are advanced notifications which are not shown here": "Existem notificações avançadas que não são exibidas aqui"
}
diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json
index fc0899873a1..37a9a958a1c 100644
--- a/src/i18n/strings/pt_BR.json
+++ b/src/i18n/strings/pt_BR.json
@@ -14,7 +14,6 @@
"Banned users": "Usuárias/os banidas/os",
"Bans user with given id": "Banir usuários com o identificador informado",
"Blacklisted": "Bloqueado",
- "Bug Report": "Repotar problemas de funcionamento",
"Bulk Options": "Opcões de Batelada",
"Can't load user settings": "Não é possível carregar configurações de usuário",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".",
@@ -68,7 +67,6 @@
"Forgot your password?": "Esqueceu sua senha?",
"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.": "Por segurança, deslogar irá remover qualquer chave de criptografia ponta-a-ponta deste navegador. Caso deseje descriptografar o histórico das suas conversas E2E em sessões Riot futuras, por favor exporte as chaves da sala para sua garantia.",
"For security, this session has been signed out. Please sign in again.": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente.",
- "Found a bug?": "Encontrou um problema de funcionamento do sistema?",
"Guests cannot join this room even if explicitly invited.": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os.",
"Hangup": "Desligar",
"Historical": "Histórico",
@@ -407,7 +405,6 @@
"olm version:": "versão do olm:",
"Operation failed": "A operação falhou",
"Remove %(threePid)s?": "Remover %(threePid)s?",
- "Report it": "Reportar",
"riot-web version:": "versão do riot-web:",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Mostrar os horários em formato de 12h (p.ex: 2:30pm)",
"Unmute": "Tirar do mudo",
@@ -732,8 +729,6 @@
"Mention": "Mencionar",
"Invite": "Convidar",
"User Options": "Opções de usuária/o",
- "Hide Apps": "Ocultar Apps",
- "Show Apps": "Mostrar Apps",
"Send an encrypted reply…": "Enviar uma resposta criptografada…",
"Send a reply (unencrypted)…": "Enviar uma resposta (não criptografada)…",
"Send an encrypted message…": "Enviar mensagem criptografada…",
@@ -928,7 +923,6 @@
"Leave Community": "Deixar a comunidade",
"Leave %(groupName)s?": "Quer sair da comunidade %(groupName)s?",
"Leave": "Sair",
- "Unable to leave room": "Não foi possível sair da sala",
"Community Settings": "Configurações da comunidade",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Estas salas são exibidas para as/os integrantes da comunidade na página da comunidade. Integrantes da comunidade podem entrar nas salas ao clicar nas mesmas.",
"Featured Rooms:": "Salas em destaque:",
@@ -943,8 +937,6 @@
"This Home server does not support communities": "Este servidor de base não permite comunidades",
"Failed to load %(groupId)s": "Não foi possível carregar a comunidade %(groupId)s",
"This room is not public. You will not be able to rejoin without an invite.": "Esta sala não é pública. Você não poderá voltar sem ser convidada/o.",
- "Cryptography data migrated": "Dados de criptografia migrados",
- "A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Uma migração única de dados criptografados foi realizada. A criptografia ponta-a-ponta não vai funcionar se você voltar para uma versão anterior do Riot. Se você necessitar usar criptografia ponta-a-ponta em uma versão anterior, primeiro faça logout do Riot. Para manter o histórico de mensagens, exporte e reimporte suas chaves.",
"Old cryptography data detected": "Dados de criptografia antigos foram detectados",
"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.": "Dados de uma versão anterior do Riot foram detectados. Isso fará com que a criptografia ponta-a-ponta não funcione na versão anterior. Mensagens criptografadas ponta-a-ponta que foram trocadas recentemente usando a versão antiga do Riot talvez não possam ser decriptografadas nesta versão. Isso também pode fazer com que mensagens trocadas com esta versão falhem. Se você tiver problemas desta natureza, faça logout e entre novamente. Para manter o histórico de mensagens, exporte e reimporte suas chaves de criptografia.",
"Your Communities": "Suas comunidades",
@@ -994,5 +986,154 @@
"Key request sent.": "Requisição de chave enviada.",
"Re-request encryption keys from your other devices.": "Requisitar novamente chaves de encriptação de seus outros dispositivos.",
"%(user)s is a %(userRole)s": "%(user)s é %(userRole)s",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "Mudanças feitas para sua comunidade podem não chegar aos outros usuários por até 30 minutos."
+ "Fetching third party location failed": "Falha ao acessar localização de terceiros",
+ "A new version of Riot is available.": "Uma nova versão do Riot está disponível.",
+ "I understand the risks and wish to continue": "Entendo os riscos e desejo continuar",
+ "Couldn't load home page": "Não foi possível carregar a página inicial",
+ "Send Account Data": "Enviar Dados da Conta",
+ "Advanced notification settings": "Configurações avançadas de notificação",
+ "Uploading report": "Enviando o relatório",
+ "Sunday": "Domingo",
+ "Notification targets": "Alvos de notificação",
+ "Today": "Hoje",
+ "Failed to get protocol list from Home Server": "Falha em acessar a lista de protocolos do servidor padrão",
+ "You are not receiving desktop notifications": "Você não está recebendo notificações desktop",
+ "Friday": "Sexta",
+ "Update": "Atualizar",
+ "What's New": "Novidades",
+ "Add an email address above to configure email notifications": "Insira um endereço de email no campo acima para configurar suas notificações por email",
+ "Expand panel": "Expandir o painel",
+ "On": "Ativado",
+ "%(count)s Members|other": "%(count)s Membros",
+ "Filter room names": "Filtrar salas por título",
+ "Changelog": "Histórico de alterações",
+ "Waiting for response from server": "Esperando por resposta do servidor",
+ "Uploaded on %(date)s by %(user)s": "Enviada em %(date)s por %(user)s",
+ "Send Custom Event": "Enviar Evento Customizado",
+ "All notifications are currently disabled for all targets.": "Todas as notificações estão atualmente desabilitadas para todos os casos.",
+ "delete the alias.": "apagar o apelido da sala.",
+ "To return to your account in future you need to set a password": "Para poder, futuramente, retornar à sua conta, você precisa definir uma senha",
+ "Forget": "Esquecer",
+ "#example": "#exemplo",
+ "Hide panel": "Ocultar o painel",
+ "You cannot delete this image. (%(code)s)": "Você não pode apagar esta imagem. (%(code)s)",
+ "Cancel Sending": "Cancelar o envio",
+ "This Room": "Esta sala",
+ "The Home Server may be too old to support third party networks": "O servidor pode ser muito antigo para suportar redes de terceiros",
+ "Resend": "Reenviar",
+ "Error saving email notification preferences": "Erro ao salvar as preferências de notificação por email",
+ "Messages containing my display name": "Mensagens contendo meu nome público",
+ "Messages in one-to-one chats": "Mensagens em conversas pessoais",
+ "Unavailable": "Indisponível",
+ "View Decrypted Source": "Ver a fonte descriptografada",
+ "Failed to update keywords": "Falha ao alterar as palavras-chave",
+ "remove %(name)s from the directory.": "remover %(name)s da lista pública de salas.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Notificações sobre as seguintes palavras-chave seguem regras que não podem ser exibidas aqui:",
+ "Safari and Opera work too.": "Safari e Opera Funciona bem.",
+ "Please set a password!": "Por favor, defina uma senha!",
+ "You have successfully set a password!": "Você definiu sua senha com sucesso!",
+ "An error occurred whilst saving your email notification preferences.": "Um erro ocorreu enquanto o sistema estava salvando suas preferências de notificação por email.",
+ "Explore Room State": "Explorar Estado da Sala",
+ "Source URL": "URL fonte",
+ "Messages sent by bot": "Mensagens enviadas por bots",
+ "Filter results": "Filtrar resultados",
+ "Members": "Membros",
+ "No update available.": "Não há atualizações disponíveis.",
+ "Noisy": "Barulhento",
+ "Files": "Arquivos",
+ "Collecting app version information": "Coletando informação sobre a versão do app",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Apagar o apelido %(alias)s da sala e remover %(name)s da lista pública?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Isso permitirá que você possa retornar à sua conta após fazer logout, e também fazer login em outros dispositivos.",
+ "Keywords": "Palavras-chave",
+ "Enable notifications for this account": "Ativar notificações para esta conta",
+ "Directory": "Diretório",
+ "Invite to this community": "Convidar para essa comunidade",
+ "Search for a room": "Procurar por uma sala",
+ "Messages containing keywords": "Mensagens contendo palavras-chave",
+ "Room not found": "Sala não encontrada",
+ "Tuesday": "Terça",
+ "Enter keywords separated by a comma:": "Coloque cada palavras-chave separada por vírgula:",
+ "Search…": "Buscar…",
+ "You have successfully set a password and an email address!": "Você definiu uma senha e um endereço de e-mail com sucesso!",
+ "Remove %(name)s from the directory?": "Remover %(name)s da lista pública de salas?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "O Riot usa muitas funcionalidades avançadas do navegador, algumas das quais não estão disponíveis ou ainda são experimentais no seu navegador atual.",
+ "Developer Tools": "Ferramentas do desenvolvedor",
+ "Enable desktop notifications": "Ativar notificações no desktop",
+ "Explore Account Data": "Explorar Dados da Conta",
+ "Remove from Directory": "Remover da lista pública de salas",
+ "Away": "Ausente",
+ "Saturday": "Sábado",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Lembre-se: você pode sempre definir um endereço de e-mail nas configurações de usuário, se mudar de ideia.",
+ "Direct Chat": "Conversa pessoal",
+ "The server may be unavailable or overloaded": "O servidor pode estar inacessível ou sobrecarregado",
+ "Reject": "Rejeitar",
+ "Failed to set Direct Message status of room": "Falha em definir a mensagem de status da sala",
+ "Monday": "Segunda",
+ "All messages (noisy)": "Todas as mensagens (alto)",
+ "Enable them now": "Habilitar agora",
+ "Messages containing my user name": "Mensagens contendo meu nome de usuário",
+ "Toolbox": "Ferramentas",
+ "Collecting logs": "Coletando logs",
+ "more": "ver mais",
+ "Bug report sent": "Relatório do bug enviado",
+ "You must specify an event type!": "Você precisa especificar um tipo do evento!",
+ "(HTTP status %(httpStatus)s)": "(Status HTTP %(httpStatus)s)",
+ "Invite to this room": "Convidar para esta sala",
+ "Please install Chrome or Firefox for the best experience.": "Por favor Instale Chrome Ou Firefox para uma melhor Experiencia.",
+ "Failed to get public room list": "Falha ao acessar a lista pública de salas",
+ "Send logs": "Enviar relatórios de erro",
+ "All messages": "Todas as mensagens",
+ "Call invitation": "Convite para chamada",
+ "Downloading update...": "Baixando atualização...",
+ "State Key": "Chave do Estado",
+ "Failed to send custom event.": "Falha ao enviar evento personalizado.",
+ "What's new?": "O que há de novidades?",
+ "Notify me for anything else": "Notificar-me sobre qualquer outro evento",
+ "When I'm invited to a room": "Quando sou convidada(o) a uma sala",
+ "Can't update user notification settings": "Não é possível atualizar as preferências de notificação",
+ "Notify for all other messages/rooms": "Notificar para todas as outras mensagens e salas",
+ "Unable to look up room ID from server": "Não foi possível buscar identificação da sala no servidor",
+ "Couldn't find a matching Matrix room": "Não foi possível encontrar uma sala correspondente no servidor Matrix",
+ "All Rooms": "Todas as salas",
+ "You cannot delete this message. (%(code)s)": "Você não pode apagar esta mensagem. (%(code)s)",
+ "Thursday": "Quinta",
+ "Forward Message": "Encaminhar",
+ "Back": "Voltar",
+ "Reply": "Responder",
+ "Show message in desktop notification": "Mostrar mensagens na notificação",
+ "Unhide Preview": "Mostrar a pré-visualização",
+ "Unable to join network": "Não foi possível conectar na rede",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Você pode te-las configurado em outro cliente além do Riot. Você não pode ajustá-las no Riot, mas ainda assim elas se aplicam aqui",
+ "Sorry, your browser is not able to run Riot.": "Perdão. O seu navegador não é capaz de rodar o Riot.",
+ "Messages in group chats": "Mensagens em salas",
+ "Yesterday": "Ontem",
+ "Error encountered (%(errorDetail)s).": "Erro encontrado (%(errorDetail)s).",
+ "Login": "Fazer login",
+ "Low Priority": "Baixa prioridade",
+ "Unable to fetch notification target list": "Não foi possível obter a lista de alvos de notificação",
+ "Appear Offline": "Aparecer Desconectado",
+ "Set Password": "Definir senha",
+ "Enable audible notifications in web client": "Ativar notificações de áudio no cliente web",
+ "Permalink": "Link permanente",
+ "Off": "Desativado",
+ "Riot does not know how to join a room on this network": "O sistema não sabe como entrar na sala desta rede",
+ "Mentions only": "Apenas menções",
+ "Wednesday": "Quarta",
+ "You can now return to your account after signing out, and sign in on other devices.": "Você pode retornar agora para a sua conta depois de fazer logout, e então fazer login em outros dispositivos.",
+ "Enable email notifications": "Ativar notificações por email",
+ "Event Type": "Tipo do Evento",
+ "Download this file": "Baixar este arquivo",
+ "Pin Message": "Fixar Mensagem",
+ "Failed to change settings": "Falhou ao mudar as preferências",
+ "View Community": "Ver a comunidade",
+ "%(count)s Members|one": "%(count)s Membros",
+ "Event sent!": "Evento enviado!",
+ "View Source": "Ver a fonte",
+ "Event Content": "Conteúdo do Evento",
+ "Thank you!": "Obrigado!",
+ "Quote": "Citar",
+ "Collapse panel": "Colapsar o painel",
+ "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!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e algumas das funcionalidades poderão não funcionar. Se você quiser tentar de qualquer maneira, pode continuar, mas aí vai ter que se virar sozinho(a) com os problemas que porventura encontrar!",
+ "Checking for an update...": "Verificando se há atualizações...",
+ "There are advanced notifications which are not shown here": "Existem opções avançadas que não são exibidas aqui"
}
diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json
index d732be55da0..be047da0051 100644
--- a/src/i18n/strings/ru.json
+++ b/src/i18n/strings/ru.json
@@ -13,7 +13,6 @@
"Banned users": "Заблокированные пользователи",
"Bans user with given id": "Блокирует пользователя с заданным ID",
"Blacklisted": "В черном списке",
- "Bug Report": "Отчет об ошибке",
"Bulk Options": "Групповые параметры",
"Can't load user settings": "Невозможно загрузить пользовательские настройки",
"Changes to who can read history will only apply to future messages in this room": "Изменения того, кто может прочитать историю, будут применяться только к будущим сообщениям в этой комнате",
@@ -61,7 +60,6 @@
"Forget room": "Забыть комнату",
"Forgot your password?": "Забыли пароль?",
"For security, this session has been signed out. Please sign in again.": "Для обеспечения безопасности ваша сессия была завершена. Пожалуйста, войдите снова.",
- "Found a bug?": "Нашли ошибку?",
"Hangup": "Закончить",
"Historical": "Архив",
"Homeserver is": "Домашний сервер это",
@@ -314,7 +312,6 @@
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s удалил свое отображаемое имя (%(oldDisplayName)s).",
"%(senderName)s removed their profile picture.": "%(senderName)s удалил свое изображение профиля.",
"%(senderName)s requested a VoIP conference.": "%(senderName)s хочет начать VoIP-конференцию.",
- "Report it": "Сообщить об этом",
"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.": "Сброс пароля на данный момент сбрасывает ключи шифрования на всех устройствах, делая зашифрованную историю чатов нечитаемой. Чтобы избежать этого, экспортируйте ключи комнат и импортируйте их после сброса пароля. В будущем это будет исправлено.",
"Riot does not have permission to send you notifications - please check your browser settings": "У Riot нет разрешений на отправку уведомлений - проверьте настройки браузера",
"Riot was not given permission to send notifications - please try again": "Riot не получил разрешение на отправку уведомлений, пожалуйста, попробуйте снова",
@@ -654,7 +651,6 @@
"Do you want to load widget from URL:": "Загрузить виджет из URL-адреса:",
"Edit": "Редактировать",
"Enable automatic language detection for syntax highlighting": "Включить автоматическое определение языка для подсветки синтаксиса",
- "Hide Apps": "Скрыть приложения",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Скрыть сообщения о входе/выходе (не применяется к приглашениям/выкидываниям/банам)",
"Integrations Error": "Ошибка интеграции",
"AM": "AM",
@@ -662,7 +658,6 @@
"NOTE: Apps are not end-to-end encrypted": "ПРИМЕЧАНИЕ: приложения не защищены сквозным шифрованием",
"Revoke widget access": "Отозвать доступ к виджетам",
"Sets the room topic": "Задать тему комнаты",
- "Show Apps": "Показать приложения",
"The maximum permitted number of widgets have already been added to this room.": "Максимально допустимое количество виджетов уже добавлено в эту комнату.",
"To get started, please pick a username!": "Чтобы начать, выберите имя пользователя!",
"Unable to create widget.": "Не удалось создать виджет.",
@@ -719,7 +714,6 @@
"Description": "Описание",
"Name or matrix ID": "Имя или matrix ID",
"Unable to accept invite": "Невозможно принять приглашение",
- "Unable to leave room": "Невозможно покинуть комнату",
"Leave": "Покинуть",
"Failed to invite the following users to %(groupId)s:": "Не удалось пригласить следующих пользователей в %(groupId)s:",
"Failed to remove '%(roomName)s' from %(groupId)s": "Не удалось удалить '%(roomName)s' из %(groupId)s",
@@ -992,7 +986,6 @@
"%(user)s is a %(userRole)s": "%(user)s является %(userRole)s",
"Your key share request has been sent - please check your other devices for key share requests.": "Ваш запрос на передачу ключей отправлен - пожалуйста, проверьте другие ваши устройства на запросы передачи ключей.",
"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.": "Запросы передачи ключей автоматически отправляются на другие устройства. Если вы отклонили или отменили запрос на передачу ключей на других устройствах, нажмите здесь, чтобы запросить ключи для этого сеанса повторно.",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "Изменения, сделанные в вашем сообществе, могут не отображаться для других пользователей в течение 30 минут.",
"Code": "Код",
"Debug Logs Submission": "Отправка журналов отладки",
"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 contian messages.": "Если вы отправили ошибку через GitHub, журналы отладки могут помочь нам выявить проблему. Журналы отладки содержат данные об использовании приложения, включая ваше имя пользователя, идентификаторы или псевдонимы комнат или групп, которые вы посетили, а также имена других пользователей. Они не содержат сообщений.",
@@ -1004,9 +997,163 @@
"Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Изменения имени и аватара, внесенные в ваше сообщество, могут не отображаться другим пользователям в течение 30 минут.",
"Join this community": "Присоединиться к сообществу",
"Leave this community": "Покинуть это сообщество",
- "here": "здесь",
- "to add some!": "для добавления!",
- "Click": "Нажмите",
"Who can join this community?": "Кто может присоединиться к этому сообществу?",
- "Everyone": "Все"
+ "Everyone": "Все",
+ "Fetching third party location failed": "Не удалось извлечь местоположение третьей стороны",
+ "A new version of Riot is available.": "Доступна новая версия Riot.",
+ "I understand the risks and wish to continue": "Я понимаю риски и желаю продолжить",
+ "Couldn't load home page": "Не удалось загрузить домашнюю страницу",
+ "Send Account Data": "Отправить данные аккаунта",
+ "All notifications are currently disabled for all targets.": "Все оповещения для всех устройств отключены.",
+ "Uploading report": "Отправка отчета",
+ "Sunday": "Воскресенье",
+ "Notification targets": "Цели уведомления",
+ "Today": "Сегодня",
+ "Files": "Файлы",
+ "You are not receiving desktop notifications": "Вы не получаете уведомления на рабочем столе",
+ "Friday": "Пятница",
+ "Update": "Обновление",
+ "What's New": "Что нового",
+ "Add an email address above to configure email notifications": "Добавьте email адрес для оповещений",
+ "Expand panel": "Развернуть панель",
+ "On": "Включить",
+ "%(count)s Members|other": "%(count)s членов",
+ "Filter room names": "Фильтр по названию комнат",
+ "Changelog": "История изменений",
+ "Waiting for response from server": "Ожидание ответа от сервера",
+ "Uploaded on %(date)s by %(user)s": "Отправлено %(date)s для %(user)s",
+ "Send Custom Event": "Отправить индивидуальное мероприятие",
+ "Advanced notification settings": "Дополнительные параметры уведомлений",
+ "Failed to send logs: ": "Не удалось отправить журналы: ",
+ "delete the alias.": "удалить псевдоним.",
+ "To return to your account in future you need to set a password": "Чтобы вернуться к учетной записи в будущем, необходимо задать пароль",
+ "Forget": "Забыть",
+ "#example": "#пример",
+ "Hide panel": "Скрыть панель",
+ "You cannot delete this image. (%(code)s)": "Это изображение нельзя удалить. (%(code)s)",
+ "Cancel Sending": "Отменить отправку",
+ "This Room": "Эта комната",
+ "The Home Server may be too old to support third party networks": "Домашний сервер может быть слишком старым для поддержки сетей сторонних производителей",
+ "Noisy": "Со звуком",
+ "Room not found": "Комната не найдена",
+ "Messages containing my display name": "Сообщения, содержащие мое имя",
+ "Messages in one-to-one chats": "Сообщения в индивидуальных чатах",
+ "Unavailable": "Недоступен",
+ "Error saving email notification preferences": "Ошибка при сохранении настроек уведомлений по email",
+ "View Decrypted Source": "Просмотр расшифрованного источника",
+ "Failed to update keywords": "Не удалось обновить ключевые слова",
+ "Notes:": "Заметки:",
+ "remove %(name)s from the directory.": "удалить %(name)s из каталога.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Уведомления по следующим ключевым словам соответствуют правилам, которые нельзя отобразить здесь:",
+ "Safari and Opera work too.": "Safari и Opera работают тоже.",
+ "Please set a password!": "Пожалуйста, установите пароль!",
+ "You have successfully set a password!": "Вы успешно установили пароль!",
+ "An error occurred whilst saving your email notification preferences.": "Возникла ошибка при сохранении настроек оповещения по email.",
+ "Explore Room State": "Просмотр статуса комнаты",
+ "Source URL": "Исходный URL-адрес",
+ "Messages sent by bot": "Сообщения, отправленные ботом",
+ "Filter results": "Фильтрация результатов",
+ "Members": "Участники",
+ "No update available.": "Нет доступных обновлений.",
+ "Resend": "Переотправить",
+ "Failed to get protocol list from Home Server": "Не удалось получить список протоколов с домашнего сервера",
+ "Collecting app version information": "Сбор информации о версии приложения",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Удалить псевдоним комнаты %(alias)s и удалить %(name)s из каталога?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Это позволит вам вернуться к учетной записи после выхода из системы и войти на других устройствах.",
+ "Keywords": "Ключевые слова",
+ "Enable notifications for this account": "Включить уведомления для этой учетной записи",
+ "Directory": "Каталог",
+ "Invite to this community": "Пригласить в это сообщество",
+ "Search for a room": "Поиск комнаты",
+ "Messages containing keywords": "Сообщения, содержащие определенные ключевые слова",
+ "View Source": "Просмотр источника",
+ "Tuesday": "Вторник",
+ "Enter keywords separated by a comma:": "Введите ключевые слова, разделенные запятой:",
+ "Search…": "Поиск.…",
+ "You have successfully set a password and an email address!": "Вы успешно установили пароль и адрес email!",
+ "Remove %(name)s from the directory?": "Удалить %(name)s из каталога?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot использует многие передовые возможности браузера, некоторые из которых недоступны или являются экспериментальным в вашем текущем браузере.",
+ "Developer Tools": "Инструменты разработчика",
+ "Preparing to send logs": "Подготовка к отправке журналов",
+ "Enable desktop notifications": "Включить оповещения на рабочем столе",
+ "Explore Account Data": "Просмотр данных аккаунта",
+ "All messages (noisy)": "Все сообщения (со звуком)",
+ "Away": "Нет на месте",
+ "Saturday": "Суббота",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Помните, что вы всегда сможете задать адрес email в настройках пользователя, если передумаете.",
+ "Direct Chat": "Прямой чат",
+ "The server may be unavailable or overloaded": "Сервер, вероятно, недоступен или перегружен",
+ "Reject": "Отклонить",
+ "Failed to set Direct Message status of room": "Не удалось установить статус прямого сообщения в комнате",
+ "Monday": "Понедельник",
+ "Remove from Directory": "Удалить из каталога",
+ "Enable them now": "Включить сейчас",
+ "Messages containing my user name": "Сообщение, содержащие мое имя пользователя",
+ "Toolbox": "Панель инструментов",
+ "Collecting logs": "Сбор журналов",
+ "more": "больше",
+ "GitHub issue link:": "Ссылка на проблему в GitHub:",
+ "Bug report sent": "Отчет об ошибке отправлен",
+ "You must specify an event type!": "Необходимо указать тип мероприятия!",
+ "(HTTP status %(httpStatus)s)": "(статус HTTP %(httpStatus)s)",
+ "Invite to this room": "Пригласить в комнату",
+ "Please install Chrome or Firefox for the best experience.": "Лучший опыт вы получите, установив Chrome или Firefox.",
+ "Failed to get public room list": "Не удалось получить список общедоступных комнат",
+ "Send logs": "Отправка журналов",
+ "All messages": "Все сообщения",
+ "Call invitation": "Пригласительный звонок",
+ "Downloading update...": "Загрузка обновления...",
+ "State Key": "Ключ состояния",
+ "Failed to send custom event.": "Не удалось отправить индивидуальное мероприятие.",
+ "What's new?": "Что нового?",
+ "Notify me for anything else": "Уведомлять во всех остальных случаях",
+ "When I'm invited to a room": "Когда меня приглашают в комнату",
+ "Click here to create a GitHub issue.": "Нажмите здесь для создания запроса о проблеме на GitHub.",
+ "Can't update user notification settings": "Не удается обновить пользовательские настройки оповещения",
+ "Notify for all other messages/rooms": "Уведомлять обо всех других сообщениях/комнатах",
+ "Unable to look up room ID from server": "Не удалось найти ID комнаты на сервере",
+ "Couldn't find a matching Matrix room": "Не удалось найти подходящую комнату Matrix",
+ "All Rooms": "Все комнаты",
+ "You cannot delete this message. (%(code)s)": "Это сообщение нельзя удалить. (%(code)s)",
+ "Thursday": "Четверг",
+ "Forward Message": "Переслать сообщение",
+ "Logs sent": "Журналы отправлены",
+ "Back": "Назад",
+ "Reply": "Ответить",
+ "Show message in desktop notification": "Показывать сообщение в уведомлении на рабочем столе",
+ "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.": "Журналы отладки содержат данные об использовании приложения, включая ваше имя пользователя, идентификаторы или псевдонимы комнат или групп, которые вы посетили, а также имена других пользователей. Они не содержат сообщений.",
+ "Unhide Preview": "Показать предварительный просмотр",
+ "Unable to join network": "Не удается подключиться к сети",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Возможно вы настроили их не в Riot, а в другом Matrix-клиенте. Настроить их в Riot не удастся, но они будут в нем применяться",
+ "Sorry, your browser is not able to run Riot.": "К сожалению, ваш браузер не способен запустить Riot.",
+ "Messages in group chats": "Сообщения в групповых чатах",
+ "Yesterday": "Вчера",
+ "Error encountered (%(errorDetail)s).": "Обнаружена ошибка (%(errorDetail)s).",
+ "Login": "Войти",
+ "Low Priority": "Низкий приоритет",
+ "Unable to fetch notification target list": "Не удалось получить список целей уведомления",
+ "Appear Offline": "Отображать как не в сети",
+ "Set Password": "Задать пароль",
+ "Enable audible notifications in web client": "Включить звуковые уведомления в веб-клиенте",
+ "Permalink": "Постоянная ссылка",
+ "Off": "Выключить",
+ "Riot does not know how to join a room on this network": "Riot не знает, как присоединиться к комнате, принадлежащей к этой сети",
+ "Mentions only": "Только при упоминаниях",
+ "Wednesday": "Среда",
+ "You can now return to your account after signing out, and sign in on other devices.": "Теперь вы сможете вернуться к своей учетной записи после выхода из системы и войти на других устройствах.",
+ "Enable email notifications": "Включить уведомления по email",
+ "Event Type": "Тип мероприятия",
+ "Download this file": "Скачать этот файл",
+ "Pin Message": "Закрепить сообщение",
+ "Failed to change settings": "Не удалось изменить настройки",
+ "View Community": "Просмотр сообщества",
+ "%(count)s Members|one": "%(count)s член",
+ "Event sent!": "Мероприятие отправлено!",
+ "Event Content": "Содержание мероприятия",
+ "Thank you!": "Спасибо!",
+ "Quote": "Цитата",
+ "Collapse 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!": "В текущем браузере внешний вид приложения может быть полностью неверным, а некоторые или все функции могут не работать. Если вы хотите попробовать в любом случае, то можете продолжить, но с теми проблемами, с которыми вы можете столкнуться вам придется разбираться самостоятельно!",
+ "Checking for an update...": "Проверка обновлений...",
+ "There are advanced notifications which are not shown here": "Существуют дополнительные уведомления, которые не показаны здесь"
}
diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json
index 72ba11b6d49..fb625652ba2 100644
--- a/src/i18n/strings/sk.json
+++ b/src/i18n/strings/sk.json
@@ -263,8 +263,6 @@
"Hangup": "Zavesiť",
"Voice call": "Audio hovor",
"Video call": "Video hovor",
- "Hide Apps": "Skryť aplikácie",
- "Show Apps": "Zobraziť aplikácie",
"Upload file": "Nahrať súbor",
"Show Text Formatting Toolbar": "Zobraziť lištu formátovania textu",
"You do not have permission to post to this room": "Nemáte udelené právo posielať do tejto miestnosti",
@@ -673,7 +671,6 @@
"Leave Community": "Opustiť komunitu",
"Leave %(groupName)s?": "Opustiť komunitu %(groupName)s?",
"Leave": "Opustiť",
- "Unable to leave room": "Nie je možné opustiť miestnosť",
"Community Settings": "Nastavenia komunity",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Tieto miestnosti sú zobrazené všetkým členom na stránke komunity. Členovia komunity môžu vstúpiť do miestnosti kliknutím.",
"Add rooms to this community": "Pridať miestnosti do tejto komunity",
@@ -773,9 +770,6 @@
"Device ID:": "ID zariadenia:",
"Device key:": "Kľúč zariadenia:",
"Ignored Users": "Ignorovaní používatelia",
- "Bug Report": "Hlásenie chyby",
- "Found a bug?": "Našli ste chybu?",
- "Report it": "Ohláste ju",
"Analytics": "Analytické údaje",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot zbiera anonymné analytické údaje, čo nám umožňuje aplikáciu ďalej zlepšovať.",
"Labs": "Experimenty",
@@ -1002,5 +996,162 @@
"Debug Logs Submission": "Odoslanie ladiacich záznamov",
"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 contian messages.": "Ak ste nám poslali hlásenie o chybe cez Github, ladiace záznamy nám môžu pomôcť lepšie identifikovať chybu. Ladiace záznamy obsahujú údaje o používaní aplikácii, vrátane vašeho používateľského mena, názvy a aliasy miestností a komunít, ku ktorým ste sa pripojili a mená ostatných používateľov. Tieto záznamy neobsahujú samotný obsah vašich správ.",
"Submit debug logs": "Odoslať ladiace záznamy",
- "Opens the Developer Tools dialog": "Otvorí dialóg nástroje pre vývojárov"
+ "Opens the Developer Tools dialog": "Otvorí dialóg nástroje pre vývojárov",
+ "Fetching third party location failed": "Nepodarilo sa získať umiestnenie tretej strany",
+ "A new version of Riot is available.": "Dostupná je nová verzia Riot.",
+ "Couldn't load home page": "Nie je možné načítať domovskú stránku",
+ "Send Account Data": "Odoslať Údaje Účtu",
+ "All notifications are currently disabled for all targets.": "Momentálne sú zakázané všetky oznámenia pre všetky ciele.",
+ "Uploading report": "Prebieha odovzdanie hlásenia",
+ "Sunday": "Nedeľa",
+ "Notification targets": "Ciele oznámení",
+ "Today": "Dnes",
+ "Files": "Súbory",
+ "You are not receiving desktop notifications": "Nedostávate oznámenia na pracovnej ploche",
+ "Friday": "Piatok",
+ "Update": "Aktualizovať",
+ "Unable to fetch notification target list": "Nie je možné získať zoznam cieľov oznámení",
+ "Add an email address above to configure email notifications": "Ak si chcete nastaviť oznamovanie emailom, pridajte si emailovú adresu vyššie",
+ "Expand panel": "Rozbaliť panel",
+ "On": "Povolené",
+ "%(count)s Members|other": "%(count)s Členov",
+ "Filter room names": "Filtrovať názvy miestností",
+ "Changelog": "Zoznam zmien",
+ "Waiting for response from server": "Čakanie na odpoveď zo servera",
+ "Uploaded on %(date)s by %(user)s": "Nahral používateľ %(user)s dňa %(date)s",
+ "Send Custom Event": "Odoslať vlastnú udalosť",
+ "Advanced notification settings": "Pokročilé nastavenia oznámení",
+ "Failed to send logs: ": "Nepodarilo sa odoslať záznamy: ",
+ "delete the alias.": "vymazať alias.",
+ "To return to your account in future you need to set a password": "Aby ste sa v budúcnosti mohli vrátiť k vašemu účtu mali by ste si teraz nastaviť heslo",
+ "Forget": "Zabudnuť",
+ "Hide panel": "Skryť panel",
+ "You cannot delete this image. (%(code)s)": "Nemôžete vymazať tento obrázok. (%(code)s)",
+ "Cancel Sending": "Zrušiť odosielanie",
+ "This Room": "V tejto miestnosti",
+ "The Home Server may be too old to support third party networks": "Domovský server môže byť natoľko zastaralý, že nepodporuje siete tretíh strán",
+ "Resend": "Poslať znovu",
+ "Room not found": "Miestnosť nenájdená",
+ "Downloading update...": "Sťahovanie aktualizácie...",
+ "Messages in one-to-one chats": "Správy v priamych konverzáciách",
+ "Unavailable": "Nedostupné",
+ "View Decrypted Source": "Zobraziť dešifrovaný zdroj",
+ "Failed to update keywords": "Nepodarilo sa aktualizovať kľúčové slová",
+ "Notes:": "Poznámky:",
+ "remove %(name)s from the directory.": "odstrániť %(name)s z adresára.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Oznámenia nasledujúcich kľúčových slov sa riadia pravidlami, ktoré nie je možné zobraziť na tomto mieste:",
+ "Safari and Opera work too.": "Správne fungujú aj Safari a Opera.",
+ "Please set a password!": "Prosím, nastavte si heslo!",
+ "You have successfully set a password!": "Ǔspešne ste si nastavili heslo!",
+ "Explore Room State": "Preskúmať Stav Miestnosti",
+ "Source URL": "Pôvodná URL",
+ "Messages sent by bot": "Správy odosielané robotmi",
+ "Filter results": "Filtrovať výsledky",
+ "Members": "Členovia",
+ "No update available.": "K dispozícii nie je žiadna aktualizácia.",
+ "Noisy": "Hlučné",
+ "Failed to get protocol list from Home Server": "Nepodarilo sa získať zoznam protokolov z domovského servera",
+ "Collecting app version information": "Získavajú sa informácie o verzii aplikácii",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Vymazať alias %(alias)s a odstrániť miestnosť %(name)s z adresára?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Toto vám v budúcnosti umožní vrátiť sa k vašemu účtu aj po odhlásení, alebo tiež prihlásiť sa na iných zariadeniach.",
+ "Keywords": "Kľúčové slová",
+ "Enable notifications for this account": "Povoliť oznámenia pre tento účet",
+ "Directory": "Adresár",
+ "Invite to this community": "Pozvať do tejto komunity",
+ "Failed to get public room list": "Nepodarilo sa získať zoznam verejných miestností",
+ "Search…": "Hľadať…",
+ "Messages containing keywords": "Správy obsahujúce kľúčové slová",
+ "Error saving email notification preferences": "Chyba pri ukladaní nastavení oznamovania emailom",
+ "Tuesday": "Utorok",
+ "Enter keywords separated by a comma:": "Zadajte kľúčové slová oddelené čiarkou:",
+ "Forward Message": "Preposlať správu",
+ "Remove %(name)s from the directory?": "Odstrániť miestnosť %(name)s z adresára?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot sa spolieha na mnohé pokročilé vlastnosti prehliadača internetu, a niektoré z nich sú vo vašom prehliadači experimentálne alebo nie sú k dispozícii vôbec.",
+ "Event sent!": "Udalosť odoslaná!",
+ "Preparing to send logs": "príprava odoslania záznamov",
+ "Enable desktop notifications": "Povoliť oznámenia na pracovnej ploche",
+ "Explore Account Data": "Preskúmať Údaje účtu",
+ "All messages (noisy)": "Všetky správy (hlučné)",
+ "Away": "Preč",
+ "Saturday": "Sobota",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Všimnite si, Emailovú adresu môžete pridať aj neskôr v časti nastavenia, ak zmeníte svoj názor.",
+ "Direct Chat": "Priama konverzácia",
+ "The server may be unavailable or overloaded": "Server môže byť nedostupný alebo preťažený",
+ "Reject": "Odmietnuť",
+ "Failed to set Direct Message status of room": "Nepodarilo sa nastaviť stav miestnosti priama konverzácia",
+ "Monday": "Pondelok",
+ "Remove from Directory": "Odstrániť z adresára",
+ "Enable them now": "Povolte si ich teraz",
+ "Messages containing my user name": "Správy obsahujúce moje používateľské meno",
+ "Toolbox": "Nástroje",
+ "Collecting logs": "Získavajú sa záznamy",
+ "more": "viac",
+ "GitHub issue link:": "Odkaz hlásenia na Github:",
+ "Search for a room": "Vyhľadať miestnosť",
+ "You must specify an event type!": "Musíte nastaviť typ udalosti!",
+ "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)",
+ "All Rooms": "Vo všetkych miestnostiach",
+ "State Key": "State Key",
+ "Please install Chrome or Firefox for the best experience.": "Aby ste s používania mali čo možno najlepší dojem, nainštalujte si Chrome alebo Firefox.",
+ "Wednesday": "Streda",
+ "Quote": "Citácia",
+ "Send logs": "Zahrnúť záznamy",
+ "All messages": "Všetky správy",
+ "Call invitation": "Audio / Video hovory",
+ "Messages containing my display name": "Správy obsahujúce moje zobrazované meno",
+ "You have successfully set a password and an email address!": "Úspešne si si nastavili heslo aj emailovú adresu!",
+ "Failed to send custom event.": "Odoslanie vlastnej udalosti zlyhalo.",
+ "What's new?": "Čo je nové?",
+ "Notify me for anything else": "Oznamovať mi všetko ostatné",
+ "When I'm invited to a room": "Pozvania vstúpiť do miestnosti",
+ "Click here to create a GitHub issue.": "Kliknutím sem nám pošlete hlásenie o chybe cez Github.",
+ "Can't update user notification settings": "Nie je možné aktualizovať používateľské nastavenia oznamovania",
+ "Notify for all other messages/rooms": "oznamovať všetky ostatné správy / miestnosti",
+ "Unable to look up room ID from server": "Nie je možné vyhľadať ID miestnosti na servery",
+ "Couldn't find a matching Matrix room": "Nie je možné nájsť zodpovedajúcu Matrix miestnosť",
+ "Bug report sent": "Hlásenie chyby odoslané",
+ "Invite to this room": "Pozvať do tejto miestnosti",
+ "You cannot delete this message. (%(code)s)": "Nemôžete vymazať túto správu. (%(code)s)",
+ "Thursday": "Štvrtok",
+ "I understand the risks and wish to continue": "Rozumiem rizikám a želám si pokračovať",
+ "Logs sent": "Záznamy boli odoslané",
+ "Back": "Naspäť",
+ "Reply": "Odpovedať",
+ "Show message in desktop notification": "Zobraziť text správy v oznámení na pracovnej ploche",
+ "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.": "Ladiace záznamy obsahujú údaje o používaní aplikácii, vrátane vašeho používateľského mena, názvy a aliasy miestností a komunít, ku ktorým ste sa pripojili a mená ostatných používateľov. Tieto záznamy neobsahujú samotný obsah vašich správ.",
+ "Unhide Preview": "Zobraziť náhľad",
+ "Unable to join network": "Nie je možné sa pripojiť k sieti",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Tieto nastavenia oznámení sa použijú aj napriek tomu, že ich nemôžete meniť cez Riot. Pravdepodobne ste si ich nastavili v inej aplikácii",
+ "Sorry, your browser is not able to run Riot.": "Prepáčte, vo vašom prehliadači nie je možné spustiť Riot.",
+ "Messages in group chats": "Správy v skupinových konverzáciách",
+ "Yesterday": "Včera",
+ "Error encountered (%(errorDetail)s).": "Vyskytla sa chyba (%(errorDetail)s).",
+ "Event Type": "Typ Udalosti",
+ "Low Priority": "Nízka priorita",
+ "What's New": "Čo Je Nové",
+ "Set Password": "Nastaviť Heslo",
+ "Appear Offline": "Zdá sa byť nedostupný",
+ "An error occurred whilst saving your email notification preferences.": "Počas ukladania vašich nastavení oznamovania emailom sa vyskytla chyba.",
+ "Enable audible notifications in web client": "Povoliť zvukové oznámenia vo webovom klientovi",
+ "Permalink": "Trvalý odkaz",
+ "Off": "Zakázané",
+ "Riot does not know how to join a room on this network": "Riot nedokáže vstúpiť do miestnosti na tejto sieti",
+ "Mentions only": "Len zmienky",
+ "You can now return to your account after signing out, and sign in on other devices.": "Odteraz sa budete k svojmu účtu vedieť vrátiť aj po odhlásení, alebo tiež prihlásiť na iných zariadeniach.",
+ "Enable email notifications": "Povoliť oznamovanie emailom",
+ "Login": "Prihlásiť",
+ "Download this file": "Stiahnuť tento súbor",
+ "Pin Message": "Pripnúť správu",
+ "Failed to change settings": "Nepodarilo sa zmeniť nastavenia",
+ "View Community": "Zobraziť komunitu",
+ "%(count)s Members|one": "%(count)s Člen",
+ "Developer Tools": "Vývojárske Nástroje",
+ "View Source": "Zobraziť zdroj",
+ "Event Content": "Obsah Udalosti",
+ "Thank you!": "Ďakujeme!",
+ "#example": "#príklad",
+ "Collapse panel": "Zbaliť 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!": "Vo vašom súčasnom prehliadači nemusí Riot vizerať ani fungovať správne a niektoré alebo všetky vlastnosti môžu chýbať. Ak to chcete vyskúšať, môžete pokračovať, no pri riešení problémov s tým spojených si budete musieť poradiť na vlastnú päsť!",
+ "Checking for an update...": "Kontrola dostupnosti aktualizácie...",
+ "There are advanced notifications which are not shown here": "Niektoré pokročilé oznámenia nemôžu byť zobrazené"
}
diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json
index 3d8e6553ede..dc26c7c283c 100644
--- a/src/i18n/strings/sq.json
+++ b/src/i18n/strings/sq.json
@@ -116,5 +116,190 @@
"Unrecognised room alias:": "Emri i dhomës të panjohur:",
"Ignored user": "Përdoruesë të shpërfillur",
"You are now ignoring %(userId)s": "Tash %(userId)s shpërfillet prej teje",
- "Unignored user": "Përdorues jo më i shpërfillur"
+ "Unignored user": "Përdorues jo më i shpërfillur",
+ "Fetching third party location failed": "Dështoi prurja e vendndodhjes së palës së tretë",
+ "A new version of Riot is available.": "Ka gati një version të ri Riot-it.",
+ "Couldn't load home page": "S’u ngarkua dot faqja hyrëse",
+ "Send Account Data": "Dërgo të Dhëna Llogarie",
+ "All notifications are currently disabled for all targets.": "Krejt njoftimet hëpërhë janë çaktivizuar për krejt objektivat.",
+ "Uploading report": "Po ngarkohet raporti",
+ "Sunday": "E diel",
+ "Guests can join": "Vizitorët mund të marrin pjesë",
+ "Notification targets": "Objektiva njoftimesh",
+ "Today": "Sot",
+ "Files": "Kartela",
+ "You are not receiving desktop notifications": "Nuk po merrni njoftime për desktop",
+ "Friday": "E premte",
+ "Update": "Përditësoje",
+ "Notifications": "Njoftime",
+ "Unable to fetch notification target list": "S’arrihet të sillet listë objektivash njoftimi",
+ "Add an email address above to configure email notifications": "Shtoni më sipër një adresë email që të formësoni njoftime me email",
+ "Expand panel": "Zgjerojeni panelin",
+ "On": "On",
+ "%(count)s Members|other": "%(count)s Anëtarë",
+ "Filter room names": "Filtroni emra dhomash",
+ "Changelog": "Regjistër ndryshimesh",
+ "Reject": "Hidheni tej",
+ "Waiting for response from server": "Po pritet për përgjigje shërbyesi",
+ "Failed to change password. Is your password correct?": "S’u arrit të ndryshohet fjalëkalimi. A është i saktë fjalëkalimi juaj?",
+ "Uploaded on %(date)s by %(user)s": "Ngarkuar më %(date)s nga %(user)s",
+ "OK": "OK",
+ "Send Custom Event": "Dërgoni Akt Vetjak",
+ "Advanced notification settings": "Rregullime të mëtejshme për njoftimet",
+ "Failed to send logs: ": "S’u arrit të dërgohen regjistra: ",
+ "delete the alias.": "fshije aliasin.",
+ "To return to your account in future you need to set a password": "Që të riktheheni te llogaria juaj në të ardhmen, lypset të caktoni një fjalëkalim",
+ "Forget": "Harroje",
+ "World readable": "E lexueshme nga bota",
+ "Mute": "Pa Zë",
+ "Hide panel": "Fshihe panelin",
+ "You cannot delete this image. (%(code)s)": "S’mund ta fshini këtë figurë. (%(code)s)",
+ "Cancel Sending": "Anuloje Dërgimin",
+ "Warning": "Sinjalizim",
+ "This Room": "Këtë Dhomë",
+ "The Home Server may be too old to support third party networks": "Shërbyesi Home mund të jetë shumë i vjetër për të mbuluar rrjete nga palë të treta",
+ "Resend": "Ridërgoje",
+ "Room not found": "Dhoma s’u gjet",
+ "Downloading update...": "Po shkarkohet përditësim…",
+ "Messages in one-to-one chats": "Mesazhe në fjalosje tek për tek",
+ "Unavailable": "S’kapet",
+ "View Decrypted Source": "Shihni Burim të Shfshehtëzuar",
+ "Failed to update keywords": "S’u arrit të përditësohen fjalëkyçe",
+ "Notes:": "Shënime:",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Njoftimet e shkaktuara nga fjalëkyçet vijuese ndjekin rregulla që s’mund të shfaqen këtu:",
+ "Safari and Opera work too.": "Safari dhe Opera bëjnë, po ashtu.",
+ "Please set a password!": "Ju lutemi, caktoni një fjalëkalim!",
+ "powered by Matrix": "bazuar në Matrix",
+ "You have successfully set a password!": "Caktuat me sukses një fjalëkalim!",
+ "Favourite": "E parapëlqyer",
+ "All Rooms": "Krejt Dhomat",
+ "Explore Room State": "Eksploroni Gjendje Dhome",
+ "Source URL": "URL-ja e Burimit",
+ "Messages sent by bot": "Mesazhe të dërguar nga bot",
+ "Cancel": "Anuloje",
+ "Filter results": "Filtroni përfundimet",
+ "Members": "Anëtarë",
+ "No update available.": "S’ka përditësim gati.",
+ "Noisy": "I zhurmshëm",
+ "Failed to get protocol list from Home Server": "S’u arrit të merrej listë protokollesh nga Shërbyesi Home",
+ "Collecting app version information": "Po grumbullohen të dhëna versioni aplikacioni",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Të fshihet aliasi i dhomës %(alias)s dhe të hiqet %(name)s nga drejtoria?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Kjo do t’ju lejojë të riktheheni te llogaria juaj pasi të keni bërë daljen, dhe të hyni që nga pajisje të tjera.",
+ "Keywords": "Fjalëkyçe",
+ "Unpin Message": "Shfiksojeni Mesazhin",
+ "Enable notifications for this account": "Aktivizo njoftime për këtë llogari",
+ "Remove": "Hiqe",
+ "Directory": "Drejtori",
+ "Invite to this community": "Ftojeni te kjo bashkësi",
+ "Search for a room": "Kërkoni për një dhomë",
+ "Search…": "Kërkoni…",
+ "Messages containing keywords": "Mesazhe që përmbajnë fjalëkyçe",
+ "Error saving email notification preferences": "Gabim në ruajtje parapëlqimesh për njoftime me email",
+ "Tuesday": "E martë",
+ "Enter keywords separated by a comma:": "Jepni fjalëkyçe ndarë me presje:",
+ "Forward Message": "Përcille Mesazhin",
+ "You have successfully set a password and an email address!": "Keni caktuar me sukses një fjalëkalim dhe një adresë email!",
+ "Remove %(name)s from the directory?": "Të hiqet %(name)s prej drejtorisë?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot-i përdor mjaft veçori të përparuara të shfletuesve, disa prej të cilave s’janë gati ose janë eksperimentale në shfletuesin tuaj të tanishëm.",
+ "Event sent!": "Akti u dërgua!",
+ "Preparing to send logs": "Po përgatitet për dërgim regjistrash",
+ "Unnamed room": "Dhomë e paemërtuar",
+ "Dismiss": "Mos e merr parasysh",
+ "Explore Account Data": "Eksploroni të Dhëna Llogarie",
+ "All messages (noisy)": "Tërë Mesazhet (e zhurmshme)",
+ "Away": "Larguar",
+ "Saturday": "E shtunë",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Mos harroni, mundeni përherë të caktoni një adresë email te rregullimet e përdoruesit, nëse ndërroni mendje.",
+ "Direct Chat": "Fjalosje e Drejtpërdrejtë",
+ "The server may be unavailable or overloaded": "Shërbyesi mund të jetë i pakapshëm ose i mbingarkuar",
+ "Online": "Në linjë",
+ "Failed to set Direct Message status of room": "S’u arrit të caktohej gjendje Mesazhesh të Drejtpërdrejtë në dhomë",
+ "Monday": "E hënë",
+ "Download this file": "Shkarkoje këtë kartelë",
+ "Remove from Directory": "Hiqe prej Drejtorie",
+ "Enable them now": "Aktivizoji tani",
+ "Messages containing my user name": "Mesazhe që përmbajnë emrin tim",
+ "Toolbox": "Grup mjetesh",
+ "Collecting logs": "Po grumbullohen regjistra",
+ "more": "më tepër",
+ "GitHub issue link:": "Lidhje çështjeje GitHub:",
+ "Failed to get public room list": "S’u të merrej listë dhomash publike",
+ "Search": "Kërkim",
+ "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.": "Regjistrat e diagnostikimeve përmbajnë të dhëna përdorimi të aplikacioneve, përfshi emrin tuaj të përdoruesit, ID ose aliase të dhomave apo grupeve që keni vizituar dhe emrat e përdoruesve të përdoruesve të tjerë. Nuk përmbajnë mesazhe.",
+ "(HTTP status %(httpStatus)s)": "(Gjendje HTTP %(httpStatus)s)",
+ "Failed to forget room %(errCode)s": "S’u arrit të harrohej dhoma %(errCode)s",
+ "Submit debug logs": "Parashtro regjistra diagnostikimi",
+ "Please install Chrome or Firefox for the best experience.": "Ju lutemi, për funksionimin më të mirë, instaloni Chrome ose Firefox.",
+ "Wednesday": "E mërkurë",
+ "Quote": "Citim",
+ "Error": "Gabim",
+ "Send logs": "Dërgo regjistra",
+ "All messages": "Krejt mesazhet",
+ "unknown error code": "kod gabimi të panjohur",
+ "Call invitation": "Ftesë për thirrje",
+ "Thank you!": "Faleminderit!",
+ "Messages containing my display name": "Mesazhe që përmbajnë emrin tim të ekranit",
+ "State Key": "Kyç Gjendjeje",
+ "Failed to send custom event.": "S’u arrit të dërgohet akt vetjak.",
+ "What's new?": "Ç’ka të re?",
+ "Notify me for anything else": "Njoftomë për gjithçka tjetër",
+ "When I'm invited to a room": "Kur ftohem në një dhomë",
+ "Close": "Mbylle",
+ "Can't update user notification settings": "S’përditësohen dot rregullime njoftimi të përdoruesit",
+ "Notify for all other messages/rooms": "Njoftim për krejt mesazhet/dhomat e tjera",
+ "Unable to look up room ID from server": "S’arrihet të kërkohet ID dhome nga shërbyesi",
+ "Click here to create a GitHub issue.": "Klikoni këtu që të hapni një çështje në GitHub.",
+ "Couldn't find a matching Matrix room": "S’u gjet dot një dhomë Matrix me përputhje",
+ "Invite to this room": "Ftoje te kjo dhomë",
+ "You cannot delete this message. (%(code)s)": "S’mund ta fshini këtë mesazh. (%(code)s)",
+ "Thursday": "E enjte",
+ "I understand the risks and wish to continue": "I kuptoj rreziqet dhe dua të vazhdoj",
+ "Logs sent": "Regjistrat u dërguan",
+ "Back": "Mbrapsht",
+ "Reply": "Përgjigjuni",
+ "Show message in desktop notification": "Shfaq mesazh në njoftim për desktop",
+ "You must specify an event type!": "Duhet të përcaktoni një lloj akti!",
+ "Unhide Preview": "Shfshihe Paraparjen",
+ "Unable to join network": "S’arrihet të hyhet në rrjet",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Mund t’i keni formësuar në një tjetër klient nga Riot-i. S’mund t’i sintonizoni në Riot, por ata janë ende të vlefshëm",
+ "Sorry, your browser is not able to run Riot.": "Na ndjeni, shfletuesi juaj nuk është në gjendje të xhirojë Riot-in.",
+ "Messages in group chats": "Mesazhe në fjalosje në grup",
+ "Yesterday": "Dje",
+ "Error encountered (%(errorDetail)s).": "U has gabim (%(errorDetail)s).",
+ "Event Type": "Lloj Akti",
+ "Low Priority": "Përparësi e Ulët",
+ "What's New": "Ç’ka të Re",
+ "Set Password": "Caktoni Fjalëkalim",
+ "Appear Offline": "Shfaqju Si Jo Në Linjë",
+ "An error occurred whilst saving your email notification preferences.": "Ndodhi një gabim teksa ruheshin parapëlqimet tuaja për njoftime me email.",
+ "Enable audible notifications in web client": "Aktivizoni njoftime audio te klienti web",
+ "Permalink": "Permalidhje",
+ "Register": "Regjistrohuni",
+ "Off": "Off",
+ "Edit": "Përpunoni",
+ "Riot does not know how to join a room on this network": "Riot-i nuk di si të hyjë në një dhomë në këtë rrjet",
+ "Mentions only": "Vetëm @përmendje",
+ "remove %(name)s from the directory.": "hiqe %(name)s prej drejtorie.",
+ "You can now return to your account after signing out, and sign in on other devices.": "Mund të ktheheni te llogaria juaj, pasi të keni bërë daljen, dhe të bëni hyrjen nga pajisje të tjera.",
+ "Continue": "Vazhdo",
+ "Enable desktop notifications": "Aktivizo njoftime në desktop",
+ "Enable email notifications": "Aktivizo njoftime me email",
+ "Login": "Hyrje",
+ "No rooms to show": "S’ka dhoma për shfaqje",
+ "Add rooms to this community": "Shtoni dhoma te kjo bashkësi",
+ "Pin Message": "Fiksojeni Mesazhin",
+ "Failed to change settings": "S’u arrit të ndryshoheshin rregullimet",
+ "Leave": "Dilni",
+ "View Community": "Shihni Bashkësinë",
+ "%(count)s Members|one": "%(count)s Anëtar",
+ "Developer Tools": "Mjete Zhvilluesi",
+ "View Source": "Shihini Burimin",
+ "Custom Server Options": "Mundësi Vetjake Shërbyesi",
+ "Event Content": "Lëndë Akti",
+ "Rooms": "Dhoma",
+ "#example": "#shembull",
+ "Collapse panel": "Tkurre panelin",
+ "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!": "Me shfletuesin tuaj të tanishëm, pamja dhe ndjesitë nga aplikacioni mund të jenë plotësisht të pasakta, dhe disa nga ose krejt veçoritë të mos funksionojnë. Nëse doni ta provoni sido qoftë, mund të vazhdoni, por mos u ankoni për çfarëdo problemesh që mund të hasni!",
+ "Checking for an update...": "Po kontrollohet për një përditësim…",
+ "There are advanced notifications which are not shown here": "Ka njoftime të thelluara që nuk shfaqen këtu"
}
diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json
index a6d8ab85401..8d218f55952 100644
--- a/src/i18n/strings/sr.json
+++ b/src/i18n/strings/sr.json
@@ -304,8 +304,6 @@
"Hangup": "Спусти слушалицу",
"Voice call": "Гласовни позив",
"Video call": "Видео позив",
- "Hide Apps": "Сакриј апликације",
- "Show Apps": "Прикажи апликације",
"Upload file": "Отпреми датотеку",
"Show Text Formatting Toolbar": "Прикажи алатницу за форматирање текста",
"Send an encrypted reply…": "Пошаљи шифровани одговор…",
@@ -744,7 +742,6 @@
"Leave Community": "Напусти заједницу",
"Leave %(groupName)s?": "Напустити %(groupName)s?",
"Leave": "Напусти",
- "Unable to leave room": "Не могу да напустим собу",
"Community Settings": "Подешавања заједнице",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Ове собе су приказане члановима заједнице на страници заједнице. Чланови заједнице могу приступити собама кликом на њих.",
"Add rooms to this community": "Додај собе у ову заједницу",
@@ -766,8 +763,6 @@
"Failed to leave room": "Нисам успео да напустим собу",
"Signed Out": "Одјављен",
"For security, this session has been signed out. Please sign in again.": "Зарад безбедности, одјављени сте из ове сесије. Пријавите се поново.",
- "Cryptography data migrated": "Криптографски подаци су пренесени",
- "A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Једноструко преношење криптографских података је обављено. Шифровање с краја на крај неће радити ако се вратите на старије издање Riot-а. Ако вам треба шифровање с краја на крај на старијем издању, прво се одјавите из Riot-а. Да бисте задржали историјат порука, извезите па поново увезите ваше кључеве.",
"Old cryptography data detected": "Нађени су стари криптографски подаци",
"The platform you're on": "Платформа коју користите",
"The version of Riot.im": "Riot.im издање",
@@ -855,9 +850,6 @@
"Device ID:": "ИБ уређаја:",
"Device key:": "Кључ уређаја:",
"Ignored Users": "Занемарени корисници",
- "Bug Report": "Извештај о грешци",
- "Found a bug?": "Нашли сте грешку?",
- "Report it": "Пријавите је",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot прикупља анонимне податке о коришћењу да бисмо побољшали апликацију.",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Приватност је веома важна нама те не сакупљамо било какве податке личне природе у нашој аналитици.",
"Learn more about how we use analytics.": "Сазнајте више о нашем начину употребе аналитике.",
@@ -994,5 +986,154 @@
"Key request sent.": "Захтев за дељење кључа послат.",
"Re-request encryption keys from your other devices.": "Поново затражи кључеве за шифровање са осталих ваших уређаја.",
"%(user)s is a %(userRole)s": "Корисник %(user)s је у улози %(userRole)s",
- "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.": "Да бисте поставили филтер, повуците аватар заједнице на површ филтрирања скроз на леву страну екрана. Можете кликнути на аватар у површи филтрирања било када да бисте видели само собе и особе везане за ту заједницу."
+ "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.": "Да бисте поставили филтер, повуците аватар заједнице на површ филтрирања скроз на леву страну екрана. Можете кликнути на аватар у површи филтрирања било када да бисте видели само собе и особе везане за ту заједницу.",
+ "Fetching third party location failed": "Добављање локације треће стране није успело",
+ "A new version of Riot is available.": "Ново издање RIot-а је доступно.",
+ "Couldn't load home page": "Нисам могао да учитам почетну страну",
+ "Send Account Data": "Пошаљи податке налога",
+ "All notifications are currently disabled for all targets.": "Сва обавештења су тренутно онемогућена за све циљеве.",
+ "Uploading report": "Отпремам извештај",
+ "Sunday": "Недеља",
+ "Notification targets": "Циљеви обавештења",
+ "Today": "Данас",
+ "Files": "Датотеке",
+ "You are not receiving desktop notifications": "Не примате стона обавештења",
+ "Friday": "Петак",
+ "Update": "Ажурирај",
+ "Unable to fetch notification target list": "Не могу да досегнем списак циљева за обавештења",
+ "Add an email address above to configure email notifications": "Додајте мејл адресу изнад да бисте подесили мејл обавештења",
+ "Expand panel": "Прошири површ",
+ "On": "Укључено",
+ "%(count)s Members|other": "%(count)s чланова",
+ "Filter room names": "Филтрирај називе соба",
+ "Changelog": "Записник о изменама",
+ "Waiting for response from server": "Чекам на одговор са сервера",
+ "Uploaded on %(date)s by %(user)s": "Отпремљено датума %(date)s од корисника %(user)s",
+ "Send Custom Event": "Пошаљи прилагођени догађај",
+ "Off": "Искључено",
+ "Advanced notification settings": "Напредна подешавања обавештења",
+ "delete the alias.": "обриши алијас.",
+ "To return to your account in future you need to set a password": "Да бисте се вратили на ваш налог у будућности, морате поставити лозинку",
+ "Forget": "Заборави",
+ "Hide panel": "Сакриј површ",
+ "You cannot delete this image. (%(code)s)": "Не можете обрисати ову слику. (%(code)s)",
+ "Cancel Sending": "Откажи слање",
+ "This Room": "Ова соба",
+ "The Home Server may be too old to support third party networks": "Кућни сервер је можда сувише застарео да би подржао мреже трећих страна",
+ "Room not found": "Соба није пронађена",
+ "Downloading update...": "Преузимам ажурирање...",
+ "Messages in one-to-one chats": "Поруке у један-на-један ћаскањима",
+ "Unavailable": "Недоступан",
+ "View Decrypted Source": "Погледај дешифровани извор",
+ "Failed to update keywords": "Нисам успео да ажурирам кључне речи",
+ "remove %(name)s from the directory.": "уклони %(name)s из фасцикле.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Обавештења за следеће кључне речи прате правила која не могу бити приказана овде:",
+ "Safari and Opera work too.": "Сафари и Опера такође раде.",
+ "Please set a password!": "Поставите лозинку!",
+ "You have successfully set a password!": "Успешно сте поставили лозинку!",
+ "Explore Room State": "Истражи стање собе",
+ "Source URL": "Адреса извора",
+ "Messages sent by bot": "Поруке послате од бота",
+ "Filter results": "Филтрирај резултате",
+ "Members": "Чланови",
+ "No update available.": "Нема нових ажурирања.",
+ "Noisy": "Бучно",
+ "Failed to get protocol list from Home Server": "Нисам успео да добијем списак протокола од кућног сервера",
+ "Collecting app version information": "Прикупљам податке о издању апликације",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Обрисати алијас собе %(alias)s и уклонити %(name)s из фасцикле?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Ово ће вам омогућити да се вратите у ваш налог након што се одјавите и пријавите, на другим уређајима.",
+ "Keywords": "Кључне речи",
+ "Enable notifications for this account": "Омогући обавештења за овај налог",
+ "Directory": "Фасцикла",
+ "Invite to this community": "Позови у ову заједницу",
+ "Failed to get public room list": "Нисам успео да добавим списак јавних соба",
+ "Search…": "Претрага…",
+ "Messages containing keywords": "Поруке које садрже кључне речи",
+ "Error saving email notification preferences": "Грешка при чувању поставки мејл обавештења",
+ "Tuesday": "Уторак",
+ "Enter keywords separated by a comma:": "Унесите кључне речи одвојене зарезима:",
+ "Forward Message": "Проследи поруку",
+ "Remove %(name)s from the directory?": "Уклонити %(name)s из фасцикле?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot користи напредне могућности прегледача од којих неке нису доступне или су у пробној фази, у вашем прегледачу.",
+ "Event sent!": "Догађај је послат!",
+ "Explore Account Data": "Истражи податке налога",
+ "All messages (noisy)": "Све поруке (гласно)",
+ "Away": "Одустан",
+ "Saturday": "Субота",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Запамтите, увек можете поставити мејл адресу у корисничким подешавањима, уколико се предомислите.",
+ "Direct Chat": "Директно ћаскање",
+ "The server may be unavailable or overloaded": "Сервер је можда недоступан или преоптерећен",
+ "Reject": "Одбаци",
+ "Failed to set Direct Message status of room": "Нисам успео да подесим стање директне поруке собе",
+ "Monday": "Понедељак",
+ "Remove from Directory": "Уклони из фасцикле",
+ "Enable them now": "Омогућите их сада",
+ "Messages containing my user name": "Поруке које садрже моје корисничко име",
+ "Toolbox": "Алатница",
+ "Collecting logs": "Прикупљам записнике",
+ "more": "више",
+ "Search for a room": "Потражи собу",
+ "You must specify an event type!": "Морате навести врсту догађаја!",
+ "(HTTP status %(httpStatus)s)": "(HTTP стање %(httpStatus)s)",
+ "All Rooms": "Све собе",
+ "State Key": "Кључ стања",
+ "Please install Chrome or Firefox for the best experience.": "Инсталирајте Хром (Chrome) или Фајерфокс (Firefox) за најбољи угођај.",
+ "Wednesday": "Среда",
+ "Send logs": "Пошаљи записнике",
+ "All messages": "Све поруке",
+ "Call invitation": "Позивница за позив",
+ "Messages containing my display name": "Поруке које садрже моје приказно име",
+ "You have successfully set a password and an email address!": "Успешно сте поставили лозинку и мејл адресу!",
+ "Failed to send custom event.": "Нисам успео да пошаљем прилагођени догађај.",
+ "What's new?": "Шта је ново?",
+ "Notify me for anything else": "Обавести ме за било шта друго",
+ "When I'm invited to a room": "Када сам позван у собу",
+ "Can't update user notification settings": "Не могу да ажурирам корисничка подешавања обавештења",
+ "Notify for all other messages/rooms": "Обавести за све друге поруке и собе",
+ "Unable to look up room ID from server": "Не могу да погледам ИБ собе на серверу",
+ "Couldn't find a matching Matrix room": "Не могу да нађем одговарајућу Матрикс собу",
+ "Bug report sent": "Извештај о грешци послат",
+ "Invite to this room": "Позови у ову собу",
+ "You cannot delete this message. (%(code)s)": "Не можете обрисати ову поруку. (%(code)s)",
+ "Thursday": "Четвртак",
+ "I understand the risks and wish to continue": "Разумем опасност и желим да наставим",
+ "Back": "Назад",
+ "Reply": "Одговори",
+ "Show message in desktop notification": "Прикажи поруку у стоном обавештењу",
+ "Unhide Preview": "Откриј преглед",
+ "Unable to join network": "Не могу да приступим мрежи",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Можда сте их подесили у неком другом клијенту а не Riot-у. Не можете их преправљати у Riot-у али се и даље примењују",
+ "Sorry, your browser is not able to run Riot.": "Нажалост, ваш прегледач не може да покреће Riot.",
+ "Messages in group chats": "Поруке у групним ћаскањима",
+ "Yesterday": "Јуче",
+ "Error encountered (%(errorDetail)s).": "Догодила се грешка (%(errorDetail)s).",
+ "Event Type": "Врста догађаја",
+ "Low Priority": "Најмања важност",
+ "What's New": "Шта је ново",
+ "Set Password": "Постави лозинку",
+ "Appear Offline": "Прикажи себе као ван мреже",
+ "An error occurred whilst saving your email notification preferences.": "Догодила се грешка при чувању ваших поставки мејл обавештења.",
+ "Enable audible notifications in web client": "Омогући звучна обавештења у веб клијенту",
+ "Permalink": "Трајна веза",
+ "Resend": "Поново пошаљи",
+ "Riot does not know how to join a room on this network": "Riot не зна како да приступи соби на овој мрежи",
+ "Mentions only": "Само спомињања",
+ "You can now return to your account after signing out, and sign in on other devices.": "Можете се вратити у ваш налог након што се одјавите и пријавите поново, на другим уређајима.",
+ "Enable desktop notifications": "Омогући стона обавештења",
+ "Enable email notifications": "Омогући мејл обавештења",
+ "Login": "Пријава",
+ "Download this file": "Преузми ову датотеку",
+ "Pin Message": "Закачи поруку",
+ "Failed to change settings": "Нисам успео да променим подешавања",
+ "View Community": "Погледај заједницу",
+ "%(count)s Members|one": "%(count)s члан",
+ "Developer Tools": "Програмерске алатке",
+ "View Source": "Погледај извор",
+ "Event Content": "Садржај догађаја",
+ "Thank you!": "Хвала вам!",
+ "#example": "#пример",
+ "Collapse 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!": "Са вашим тренутним прегледачем изглед и угођај ове апликације може бити скроз неправилан и неке могућности можда неће радити. Уколико желите да ипак пробате, можете наставити али ћете бити без подршке за било које проблеме на које налетите!",
+ "Checking for an update...": "Проверавам ажурирања...",
+ "There are advanced notifications which are not shown here": "Постоје напредна обавештења која нису приказана овде"
}
diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json
index 8c0c722bddd..cd502e5bb71 100644
--- a/src/i18n/strings/sv.json
+++ b/src/i18n/strings/sv.json
@@ -37,7 +37,6 @@
"Autoplay GIFs and videos": "Spela automatiskt upp GIFar och videor",
"Are you sure you want to reject the invitation?": "Vill du avvisa inbjudan?",
"Bulk Options": "Volymhandlingar",
- "Bug Report": "Buggrapport",
"Blacklisted": "Svartlistad",
"%(senderName)s banned %(targetName)s.": "%(senderName)s bannade %(targetName)s.",
"Banned users": "Bannade användare",
@@ -178,7 +177,6 @@
"Forgot your password?": "Glömt lösenord?",
"For security, this session has been signed out. Please sign in again.": "Av säkerhetsskäl har den här sessionen loggats ut. Vänligen logga in igen.",
"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.": "Av säkerhetsskäl kommer alla krypteringsnycklar att raderas från den här webbläsaren om du loggar ut. Om du vill läsa din krypterade meddelandehistorik från framtida Riot-sessioner, exportera nycklarna till förvar.",
- "Found a bug?": "Hittade du en bugg?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s från %(fromPowerLevel)s till %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Gäståtkomst är inte aktiverat på den här hemservern.",
"Guests cannot join this room even if explicitly invited.": "Gäster kan inte gå med i det här rummet fastän de är uttryckligen inbjudna.",
@@ -301,7 +299,6 @@
"Remove": "Ta bort",
"Remove %(threePid)s?": "Ta bort %(threePid)s?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s begärde en VoIP-konferens.",
- "Report it": "Rapportera det",
"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.": "Om du återställer ditt lösenord kommer alla krypteringsnycklar på alla enheter att återställas, vilket gör krypterad meddelandehistorik oläsbar om du inte först exporterar dina rumsnycklar och sedan importerar dem igen. I framtiden kommer det här att förbättras.",
"Results from DuckDuckGo": "Resultat från DuckDuckGo",
"Return to login screen": "TIllbaka till login-skärmen",
@@ -366,14 +363,12 @@
"Do you want to load widget from URL:": "Vill du ladda widgeten från URL:",
"Edit": "Editera",
"Enable automatic language detection for syntax highlighting": "Aktivera automatisk språkdetektering för syntaxmarkering",
- "Hide Apps": "Dölj Appar",
"Integrations Error": "Integrationsfel",
"Publish this room to the public in %(domain)s's room directory?": "Publicera rummet i den offentliga rumskatalogen på %(domain)s?",
"AM": "a.m.",
"PM": "p.m.",
"NOTE: Apps are not end-to-end encrypted": "OBS: Apparna är inte end-to-end-krypterade",
"Revoke widget access": "Upphäv widget-åtkomst",
- "Show Apps": "Visa appar",
"Submit": "Lämna",
"Tagged as: ": "Taggad som: ",
"The default role for new room members is": "Standardrollen för nya medlemmar är",
@@ -433,5 +428,145 @@
"You need to be logged in.": "Du måste vara inloggad.",
"You need to be able to invite users to do that.": "Du måste kunna bjuda in användare för att göra det.",
"You are not in this room.": "Du är inte i det här rummet.",
- "You do not have permission to do that in this room.": "Du har inte behörighet att göra det i det här rummet."
+ "You do not have permission to do that in this room.": "Du har inte behörighet att göra det i det här rummet.",
+ "Fetching third party location failed": "Det gick inte att hämta platsdata från tredje part",
+ "A new version of Riot is available.": "En ny version av Riot är tillgänglig.",
+ "Couldn't load home page": "Kunde inte ladda startsidan",
+ "All notifications are currently disabled for all targets.": "Alla aviseringar är för tillfället avstängda för alla mål.",
+ "Uploading report": "Laddar upp rapport",
+ "Sunday": "söndag",
+ "Messages sent by bot": "Meddelanden från bottar",
+ "Notification targets": "Aviseringsmål",
+ "Failed to set direct chat tag": "Det gick inte att markera rummet som direkt chatt",
+ "Today": "idag",
+ "Failed to get protocol list from Home Server": "Det gick inte att hämta protokollistan från hemservern",
+ "You are not receiving desktop notifications": "Du får inte skrivbordsaviseringar",
+ "Friday": "fredag",
+ "Update": "Uppdatera",
+ "What's New": "Vad är nytt",
+ "Add an email address above to configure email notifications": "Lägg till en epostadress här för att konfigurera epostaviseringar",
+ "Expand panel": "Öppna panel",
+ "On": "På",
+ "%(count)s Members|other": "%(count)s 1 Medlemmar",
+ "Filter room names": "Filtrera rumsnamn",
+ "Changelog": "Ändringslogg",
+ "Waiting for response from server": "Väntar på svar från servern",
+ "Leave": "Lämna",
+ "Uploaded on %(date)s by %(user)s": "%(user)s laddade upp %(date)s",
+ "Advanced notification settings": "Avancerade aviseringsinställingar",
+ "delete the alias.": "radera adressen.",
+ "To return to your account in future you need to set a password": "För att återgå till ditt konto i framtiden måste du välja ett lösenord",
+ "Forget": "Glöm bort",
+ "#example": "#exempel",
+ "Hide panel": "Göm panel",
+ "You cannot delete this image. (%(code)s)": "Du kan inte radera den här bilden. (%(code)s)",
+ "Cancel Sending": "Avbryt sändning",
+ "Warning": "Varning",
+ "This Room": "Det här rummet",
+ "The Home Server may be too old to support third party networks": "Hemservern kan vara för gammal för stöda tredje parters nätverk",
+ "Noisy": "Högljudd",
+ "Room not found": "Rummet hittades inte",
+ "Messages containing my display name": "Meddelanden som innehåller mitt namn",
+ "Messages in one-to-one chats": "Meddelanden i privata chattar",
+ "Unavailable": "Inte tillgänglig",
+ "View Decrypted Source": "Visa dekrypterad källa",
+ "Failed to update keywords": "Det gick inte att uppdatera nyckelorden",
+ "remove %(name)s from the directory.": "ta bort %(name)s från katalogen.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Aviseringar för följande nyckelord följer regler som inte kan visas här:",
+ "Please set a password!": "Vänligen välj ett lösenord!",
+ "You have successfully set a password!": "Du har valt ett nytt lösenord!",
+ "An error occurred whilst saving your email notification preferences.": "Ett fel uppstod då epostaviseringsinställningarna sparades.",
+ "Explore Room State": "Utforska rumläget",
+ "Source URL": "Käll-URL",
+ "Failed to add tag %(tagName)s to room": "Det gick inte att lägga till \"%(tagName)s\" till rummet",
+ "Filter results": "Filtrera resultaten",
+ "Members": "Medlemmar",
+ "No update available.": "Ingen uppdatering tillgänglig.",
+ "Resend": "Sänd igen",
+ "Files": "Filer",
+ "Collecting app version information": "Samlar in appversionsinformation",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Radera rumsadressen %(alias)s och ta bort %(name)s från katalogen?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Detta kommer tillåta dig att återgå till ditt konto efter att ha loggat ut, och logga in på andra enheter.",
+ "Keywords": "Nyckelord",
+ "Enable notifications for this account": "Sätt på aviseringar för det här kontot",
+ "Directory": "Katalog",
+ "Failed to get public room list": "Det gick inte att hämta listan över offentliga rum",
+ "Messages containing keywords": "Meddelanden som innehåller nyckelord",
+ "Error saving email notification preferences": "Ett fel uppstod då epostaviseringsinställningarna sparades",
+ "Tuesday": "tisdag",
+ "Enter keywords separated by a comma:": "Skriv in nyckelord, separerade med kommatecken:",
+ "Search…": "Sök…",
+ "Remove %(name)s from the directory?": "Ta bort %(name)s från katalogen?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot använder flera avancerade webbläsaregenskaper, av vilka alla inte stöds eller är experimentella i din nuvarande webbläsare.",
+ "Enable desktop notifications": "Sätt på skrivbordsaviseringar",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Kom ihåg att du alltid kan välja en e-postadress i dina användarinställningar om du ändrar dig.",
+ "All messages (noisy)": "Alla meddelanden (högljudd)",
+ "Away": "Borta",
+ "Saturday": "lördag",
+ "I understand the risks and wish to continue": "Jag förstår riskerna och vill fortsätta",
+ "Direct Chat": "Direkt-chatt",
+ "The server may be unavailable or overloaded": "Servern kan vara överbelastad eller inte tillgänglig",
+ "Reject": "Avvisa",
+ "Failed to set Direct Message status of room": "Det gick inte att sätta Direkt meddelande-status på rummet",
+ "Monday": "måndag",
+ "Remove from Directory": "Ta bort från katalogen",
+ "Enable them now": "Sätt på nu",
+ "Messages containing my user name": "Meddelanden som innehåller mitt användarnamn",
+ "Collecting logs": "Samlar in loggar",
+ "more": "mera",
+ "Bug report sent": "Buggraporten skickades",
+ "(HTTP status %(httpStatus)s)": "(HTTP-status %(httpStatus)s)",
+ "All Rooms": "Alla rum",
+ "Wednesday": "onsdag",
+ "You cannot delete this message. (%(code)s)": "Du kan inte radera det här meddelandet. (%(code)s)",
+ "Send": "Sänd",
+ "Send logs": "Sänd loggar",
+ "All messages": "Alla meddelanden",
+ "Call invitation": "Inbjudan till samtal",
+ "Downloading update...": "Laddar ned uppdatering...",
+ "You have successfully set a password and an email address!": "Du har framgångsrikt valt ett lösenord och en e-postadress!",
+ "What's new?": "Vad är nytt?",
+ "Notify me for anything else": "Avisera för allt annat",
+ "When I'm invited to a room": "När jag bjuds in till ett rum",
+ "Can't update user notification settings": "Kan inte uppdatera aviseringsinställningarna",
+ "Notify for all other messages/rooms": "Avisera för alla andra meddelanden/rum",
+ "Unable to look up room ID from server": "Det gick inte att hämta rums-ID:t från servern",
+ "Couldn't find a matching Matrix room": "Kunde inte hitta ett matchande Matrix-rum",
+ "Invite to this room": "Bjud in i rummet",
+ "Search for a room": "Sök efter rum",
+ "Thursday": "torsdag",
+ "Forward Message": "Vidarebefordra meddelande",
+ "Back": "Tillbaka",
+ "Reply": "Svara",
+ "Show message in desktop notification": "Visa meddelande i skrivbordsavisering",
+ "Unhide Preview": "Visa förhandsvisning",
+ "Unable to join network": "Det gick inte att ansluta till nätverket",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du kan ha konfigurerat dem i en annan klient än Riot. Du kan inte ändra dem i Riot men de tillämpas ändå",
+ "Sorry, your browser is not able to run Riot.": "Beklagar, din webbläsare kan inte köra Riot.",
+ "Messages in group chats": "Meddelanden i gruppchattar",
+ "Yesterday": "igår",
+ "Error encountered (%(errorDetail)s).": "Fel påträffat (%(errorDetail)s).",
+ "Low Priority": "Låg prioritet",
+ "Unable to fetch notification target list": "Det gick inte att hämta aviseringsmållistan",
+ "Appear Offline": "Visa som utloggad",
+ "Set Password": "Välj lösenord",
+ "Enable audible notifications in web client": "Sätt på högljudda aviseringar i webbklienten",
+ "Permalink": "Permanent länk",
+ "Off": "Av",
+ "Riot does not know how to join a room on this network": "Riot kan inte gå med i ett rum på det här nätverket",
+ "Mentions only": "Endast omnämnande",
+ "Failed to remove tag %(tagName)s from room": "Det gick inte att radera taggen %(tagName)s från rummet",
+ "You can now return to your account after signing out, and sign in on other devices.": "Du kan nu återgå till ditt konto efter att ha loggat ut och logga in på andra enheter.",
+ "Enable email notifications": "Sätt på epostaviseringar",
+ "Login": "Logga in",
+ "Download this file": "Ladda ner filen",
+ "Failed to change settings": "Det gick inte att spara inställningarna",
+ "%(count)s Members|one": "%(count)s 1 Medlem",
+ "View Source": "Visa källa",
+ "Thank you!": "Tack!",
+ "Quote": "Citera",
+ "Collapse panel": "Kollapsa 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!": "Med din nuvarande webbläsare kan appens utseende vara helt fel, och vissa eller alla egenskaper kommer nödvändigtvis inte att fungera. Om du ändå vill försöka så kan du fortsätta, men gör det på egen risk!",
+ "Checking for an update...": "Letar efter uppdateringar...",
+ "There are advanced notifications which are not shown here": "Det finns avancerade aviseringar som inte visas här"
}
diff --git a/src/i18n/strings/ta.json b/src/i18n/strings/ta.json
new file mode 100644
index 00000000000..202e5326f04
--- /dev/null
+++ b/src/i18n/strings/ta.json
@@ -0,0 +1,150 @@
+{
+ "A new version of Riot is available.": "Riot-ன் புதிய பதிப்பு உள்ளது.",
+ "Add an email address above to configure email notifications": "மின்னஞ்சல் மூலம் அறிவிப்புகளை பெற உங்கள் மின்னஞ்சல் முகவரியை மேலே இணைக்கவும்",
+ "Advanced notification settings": "மேம்பட்ட அறிவிப்பிற்கான அமைப்புகள்",
+ "All messages": "அனைத்து செய்திகள்",
+ "All messages (noisy)": "அனைத்து செய்திகள் (உரக்க)",
+ "All Rooms": "அனைத்து அறைகள்",
+ "All notifications are currently disabled for all targets.": "அனைத்து இலக்குகளுக்கான அனைத்து அறிவுப்புகளும் தற்போது முடக்கி வைக்கப்பட்டுள்ளது.",
+ "An error occurred whilst saving your email notification preferences.": "உங்கள் மின்னஞ்சல் அறிவிப்பு விருப்பங்களை சேமிப்பதில் ஏதோ பிழை ஏற்பட்டுள்ளது.",
+ "Cancel": "ரத்து",
+ "Cancel Sending": "அனுப்புதலை ரத்து செய்",
+ "Changelog": "மாற்றப்பதிவு",
+ "Close": "மூடு",
+ "Collapse panel": "பலகத்தை மாற்று",
+ "Collecting app version information": "செயலியின் பதிப்பு தகவல்கள் சேகரிக்கப்படுகிறது",
+ "Collecting logs": "பதிவுகள் சேகரிக்கப்படுகிறது",
+ "Call invitation": "அழைப்பிற்கான விண்ணப்பம்",
+ "Can't update user notification settings": "பயனர் அறிவிப்பு அமைப்புகளை மாற்ற முடியவில்லை",
+ "Couldn't find a matching Matrix room": "பொருத்தமான Matrix அறை கிடைக்கவில்லை",
+ "Custom Server Options": "விருப்பிற்கேற்ற வழங்கி இடப்புகள்",
+ "delete the alias.": "மாற்றை அழி.",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "அறை மாற்று %(alias)s -ஐ அழித்து, %(name)s -ஐ அடைவிலிருந்து நீக்க வேண்டுமா?",
+ "Direct Chat": "நேரடி அரட்டை",
+ "Directory": "அடைவு",
+ "Dismiss": "நீக்கு",
+ "Download this file": "இந்த கோப்பைத் தரவிறக்கு",
+ "Enable audible notifications in web client": "இணைய வாங்கியில் ஒலி அறிவிப்புகளை ஏதுவாக்கு",
+ "Enable desktop notifications": "திரை அறிவிப்புகளை ஏதுவாக்கு",
+ "Enable email notifications": "மின்னஞ்சல் அறிவிப்புகளை ஏதுவாக்கு",
+ "Enable notifications for this account": "இந்த கணக்கிற்கான அறிவிப்புகளை ஏதுவாக்கு",
+ "Enable them now": "இப்போது அவற்றை ஏதுவாக்கு",
+ "Error": "கோளாறு",
+ "Expand panel": "பலகத்தை விரிவாக்கு",
+ "Failed to add tag %(tagName)s to room": "%(tagName)s எனும் குறிச்சொல்லை அறையில் சேர்ப்பதில் தோல்வி",
+ "Failed to change settings": "அமைப்புகள் மாற்றத்தில் தோல்வி",
+ "Failed to forget room %(errCode)s": "அறையை மறப்பதில் தோல்வி %(errCode)s",
+ "Failed to update keywords": "முக்கிய வார்த்தைகளை புதுப்பித்தலில் தோல்வி",
+ "Failed to get public room list": "பொது அறைப் பட்டியலை பெறுவதில் தோல்வி",
+ "Favourite": "விருப்பமான",
+ "Files": "கோப்புகள்",
+ "Filter room names": "அறை பெயர்களை வடிகட்டு",
+ "Forget": "மற",
+ "Guests can join": "விருந்தினர்கள் சேரலாம்",
+ "Hide panel": "பலகத்தை மறை",
+ "Invite to this room": "இந்த அறைக்கு அழை",
+ "Keywords": "முக்கிய வார்த்தைகள்",
+ "Leave": "வெளியேறு",
+ "Login": "உள்நுழை",
+ "Low Priority": "குறைந்த முன்னுரிமை",
+ "Members": "உறுப்பினர்கள்",
+ "Mentions only": "குறிப்பிடுகள் மட்டும்",
+ "#example": "#உதாரணமாக",
+ "Enter keywords separated by a comma:": "ஒரு comma மூலம் முக்கிய வார்த்தைகளை உள்ளிடவும்:",
+ "Error saving email notification preferences": "மின்னஞ்சல் அறிவிப்பு விருப்பங்களை சேமிப்பதில் கோளாறு",
+ "Failed to get protocol list from Home Server": "முகப்பு சேவையகத்திலிருந்து நெறிமுறை பட்டியலைப் பெறுவதில் தோல்வி",
+ "Failed to remove tag %(tagName)s from room": "அறையில் இருந்து குறிச்சொல் %(tagName)s களை அகற்றுவது தோல்வியடைந்தது",
+ "Failed to set direct chat tag": "நேரடி அரட்டை குறியை அமைப்பதில் தோல்வி",
+ "Failed to set Direct Message status of room": "அறையின் நேரடி செய்தி நிலையை அமைக்க தவறிவிட்டது",
+ "Fetching third party location failed": "மூன்றாம் இடத்தில் உள்ள இடம் தோல்வி",
+ "Forward Message": "முன்னோடி செய்தி",
+ "(HTTP status %(httpStatus)s)": "(HTTP நிலைகள் %(httpStatus)s)",
+ "I understand the risks and wish to continue": "நான் அபாயங்களைப் புரிந்துகொண்டு தொடர விரும்புகிறேன்",
+ "Messages containing my display name": "என் காட்சி பெயர் கொண்ட செய்திகள்",
+ "more": "அதிகம்",
+ "Mute": "முடக்கு",
+ "No rooms to show": "காண்பிக்க எந்த அறையும் இல்லை",
+ "Messages containing keywords": "முக்கிய கொண்ட செய்திகள்",
+ "Messages containing my user name": "என் பயனர் பெயர் கொண்ட செய்திகள்",
+ "Messages in group chats": "குழு அரட்டைகளில் உள்ள செய்திகள்",
+ "Messages in one-to-one chats": "ஒரு-க்கு-ஒரு அரட்டைகளில் உள்ள செய்திகள்",
+ "Messages sent by bot": "bot மூலம் அனுப்பிய செய்திகள்",
+ "Noisy": "சத்தம்",
+ "Notification targets": "அறிவிப்பு இலக்குகள்",
+ "Notifications": "அறிவிப்புகள்",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "பின்வரும் முக்கிய வார்த்தைகளில் அறிவிப்புகள் இங்கே காட்டப்பட முடியாத விதிகள் பின்பற்றப்படுகின்றன:",
+ "Notify for all other messages/rooms": "மற்ற எல்லா செய்திகளுக்கும் அறைகளுக்கும் தெரிவிக்கவும்",
+ "Notify me for anything else": "வேறு எதையும் எனக்கு தெரிவி",
+ "Off": "அமை",
+ "On": "மீது",
+ "Operation failed": "செயல்பாடு தோல்வியுற்றது",
+ "Permalink": "நிரந்தரத் தொடுப்பு",
+ "powered by Matrix": "Matrix-ஆல் ஆனது",
+ "Quote": "மேற்கோள்",
+ "Reject": "நிராகரி",
+ "Remove %(name)s from the directory?": "அடைவிலிருந்து %(name)s-ஐ நீக்கலாமா?",
+ "Remove": "நீக்கு",
+ "remove %(name)s from the directory.": "அடைவிலிருந்து %(name)s-ஐ நீக்கு.",
+ "Remove from Directory": "அடைவிலிருந்து நீக்கு",
+ "Resend": "மீண்டும் அனுப்பு",
+ "Room not found": "அறை காணவில்லை",
+ "Search": "தேடு",
+ "Search…": "தேடு…",
+ "Search for a room": "அறையைத் தேடு",
+ "Send": "அனுப்பு",
+ "Send logs": "பதிவுகளை அனுப்பு",
+ "Source URL": "மூல முகவரி",
+ "This Room": "இந்த அறை",
+ "Unable to join network": "முனையங்களில் சேர இயலவில்லை",
+ "Unavailable": "இல்லை",
+ "unknown error code": "தெரியாத பிழை குறி",
+ "Unnamed room": "பெயரிடப்படாத அறை",
+ "Update": "புதுப்பி",
+ "Uploaded on %(date)s by %(user)s": "%(date)s அன்று %(user)s ஆல் பதிவேற்றப்பட்டது",
+ "Uploading report": "அறிக்கை பதிவேற்றப்படுகிறது",
+ "Riot does not know how to join a room on this network": "இந்த வலையமைப்பில் உள்ள அறையில் எப்படி சேர்வதென்று Riotற்க்கு தெரியவில்லை",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot பல மேம்பட்ட உலாவி வசதிகளைப் பயன்படுத்துகிறது, அதில் சிலவற்றைக் காணவில்லை அல்லது உங்கள் உலாவியில் பரிசோதனைக்காக உள்ளது.",
+ "There are advanced notifications which are not shown here": "இங்கு காண்பிக்கப்படாத மேம்பட்ட அறிவிப்புகள் உள்ளது",
+ "The server may be unavailable or overloaded": "வழங்கி அளவுமீறிய சுமையில் உள்ளது அல்லது செயல்பாட்டில் இல்லை",
+ "Unable to fetch notification target list": "அறிவிப்பு பட்டியலை பெற முடியவில்லை",
+ "Unable to look up room ID from server": "வழங்கியிலிருந்து அறை ID யை காண முடியவில்லை",
+ "Unhide Preview": "முன்னோட்டத்தைக் காண்பி",
+ "View Decrypted Source": "மறையீடு நீக்கப்பட்ட மூலத்தைக் காண்பி",
+ "View Source": "மூலத்தைக் காட்டு",
+ "What's New": "புதிதாக வந்தவை",
+ "What's new?": "புதிதாக என்ன?",
+ "Waiting for response from server": "வழங்கியின் பதிலுக்காக காத்திருக்கிறது",
+ "When I'm invited to a room": "நான் அறைக்கு அழைக்கப்பட்ட போது",
+ "World readable": "உலகமே படிக்கும்படி",
+ "You cannot delete this image. (%(code)s)": "இந்த படத்தை நீங்கள் அழிக்க முடியாது. (%(code)s)",
+ "You cannot delete this message. (%(code)s)": "இந்த செய்தியை நீங்கள் அழிக்க முடியாது. (%(code)s)",
+ "You are not receiving desktop notifications": "திரை அறிவிப்புகளை நீங்கள் பெறவில்லை",
+ "Bug report sent": "வழு அறிக்கை அனுப்பப்பட்டது",
+ "OK": "சரி",
+ "Show message in desktop notification": "திரை அறிவிப்புகளில் செய்தியை காண்பிக்கவும்",
+ "Sunday": "ஞாயிறு",
+ "Monday": "திங்கள்",
+ "Tuesday": "செவ்வாய்",
+ "Wednesday": "புதன்",
+ "Thursday": "வியாழன்",
+ "Friday": "வெள்ளி",
+ "Saturday": "சனி",
+ "Today": "இன்று",
+ "Yesterday": "நேற்று",
+ "No update available.": "எந்த புதுப்பிப்பும் இல்லை.",
+ "Warning": "எச்சரிக்கை",
+ "Thank you!": "உங்களுக்கு நன்றி",
+ "Back": "பின்",
+ "Event sent!": "நிகழ்வு அனுப்பப்பட்டது",
+ "Event Type": "நிகழ்வு வகை",
+ "Event Content": "நிகழ்வு உள்ளடக்கம்",
+ "Edit": "தொகு",
+ "You have successfully set a password!": "நீங்கள் வெற்றிகரமாக கடவுச்சொல்லை அமைத்துவிட்டீர்கள்",
+ "You have successfully set a password and an email address!": "நீங்கள் வெற்றிகரமாக கடவுச்சொல் மற்றும் மின்னஞ்சல் முகவரியை அமைத்துவிட்டீர்கள்",
+ "Continue": "தொடரவும்",
+ "Please set a password!": "தயவு செய்து கடவுச்சொல்லை அமைக்கவும்",
+ "Couldn't load home page": "முதற்பக்கத்தை நிரலேற்ற முடியவில்லை",
+ "Register": "பதிவு செய்",
+ "Rooms": "அறைகள்",
+ "Add rooms to this community": "அறைகளை இந்த சமூகத்தில் சேர்க்கவும்"
+}
diff --git a/src/i18n/strings/te.json b/src/i18n/strings/te.json
index ec45eefadf4..b6102a5eb5b 100644
--- a/src/i18n/strings/te.json
+++ b/src/i18n/strings/te.json
@@ -44,7 +44,6 @@
"Banned users": "నిషేధించిన వినియోగదారులు",
"Bans user with given id": "ఇచ్చిన ఐడి తో వినియోగదారుని నిషేధించారు",
"Blacklisted": "నిరోధిత జాబితాలోని",
- "Bug Report": "బగ్ నివేదిక",
"Bulk Options": "సమూహ ఐచ్ఛికాలు",
"Call Timeout": "కాల్ గడువు ముగిసింది",
"Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "గృహనిర్వాహకులకు కనెక్ట్ చేయలేరు - దయచేసి మీ కనెక్టివిటీని తనిఖీ చేయండి, మీ 1 హోమరుసు యొక్క ఎస్ఎస్ఎల్ సర్టిఫికేట్ 2 ని విశ్వసనీయపరుచుకొని, బ్రౌజర్ పొడిగింపు అభ్యర్థనలను నిరోధించబడదని నిర్ధారించుకోండి.",
@@ -170,7 +169,6 @@
"riot-web version:": "రయట్-వెబ్ సంస్కరణ:",
"Riot was not given permission to send notifications - please try again": "రయట్ కు ప్రకటనలను పంపడానికి అనుమతి లేదు - దయచేసి మళ్ళీ ప్రయత్నించండి",
"Unable to restore session": "సెషన్ను పునరుద్ధరించడానికి సాధ్యపడలేదు",
- "Report it": "దానిని నివేదించండి",
"Remove": "తొలగించు",
"Room directory": "గది వివరము",
"Create new room": "క్రొత్త గది సృష్టించండి",
@@ -182,5 +180,100 @@
"Notifications": "ప్రకటనలు",
"Operation failed": "కార్యం విఫలమైంది",
"Search": "శోధన",
- "Settings": "అమరికలు"
+ "Settings": "అమరికలు",
+ "Fetching third party location failed": "మూడవ పార్టీ స్థానాన్ని పొందడం విఫలమైంది",
+ "A new version of Riot is available.": "కొత్త రిమోట్ వివరణము అందుబాటులో ఉంది.",
+ "Couldn't load home page": "హోమ్ పేజీని లోడ్ చేయలేకపోయాము",
+ "Advanced notification settings": "ఆధునిక తాఖీదు అమరిక",
+ "Sunday": "ఆదివారం",
+ "Guests can join": "అతిథులు చేరవచ్చు",
+ "Messages sent by bot": "బాట్ పంపిన సందేశాలు",
+ "Notification targets": "తాఖీదు లక్ష్యాలు",
+ "Failed to set direct chat tag": "ప్రత్యక్ష మాటామంతి బొందు సెట్ చేయడంలో విఫలమైంది",
+ "Today": "ఈ రోజు",
+ "Failed to get protocol list from Home Server": "హోమ్ సర్వర్ నుండి ప్రోటోకాల్ జాబితాను పొందడం విఫలమైంది",
+ "Friday": "శుక్రువారం",
+ "Add an email address above to configure email notifications": "ఇమెయిల్ ప్రకటనలను రూపశిల్పం చేయడానికి ఎగువ ఇమెయిల్ చిరునామాను జోడించండి",
+ "Expand panel": "ప్యానెల్ను విస్తరింపజేయండి",
+ "On": "వేయుము",
+ "Filter room names": "గది పేర్లను ఫిల్టర్ చేయండి",
+ "Changelog": "మార్పు వివరణ",
+ "Leave": "వదిలి",
+ "All notifications are currently disabled for all targets.": "ప్రస్తుతానికి అన్ని చోట్లనుంచి అన్ని ప్రకటనలు ఆగి వున్నాయి.",
+ "delete the alias.": "అలియాస్ తొలగించండి.",
+ "Forget": "మర్చిపో",
+ "Hide panel": "ప్యానెల్ను దాచు",
+ "Source URL": "మూల URL",
+ "Warning": "హెచ్చరిక",
+ "Noisy": "శబ్దం",
+ "Room not found": "గది కనుగొనబడలేదు",
+ "Messages containing my display name": "నా ప్రదర్శన పేరును కలిగి ఉన్న సందేశాలు",
+ "Messages in one-to-one chats": "సందేశాలు నుండి ఒకరికి ఒకటి మాటామంతి",
+ "Failed to update keywords": "కీలక పదాలను నవీకరించడంలో విఫలమైంది",
+ "remove %(name)s from the directory.": "వివరము నుండి %(name)s ను తొలిగించు.",
+ "Please set a password!": "దయచేసి మీ రహస్యపదాన్నీ అమర్చండి!",
+ "Cancel Sending": "పంపడాన్ని ఆపేయండి",
+ "Failed to add tag %(tagName)s to room": "%(tagName)s ను బొందు జోడించడంలో విఫలమైంది",
+ "Members": "సభ్యులు",
+ "No update available.": "ఏ నవీకరణ అందుబాటులో లేదు.",
+ "Resend": "మళ్ళి పంపుము",
+ "Files": "దస్ర్తాలు",
+ "Collecting app version information": "అనువర్తన సంస్కరణ సమాచారాన్ని సేకరించడం",
+ "Forward Message": "సందేశాన్ని మునుముందుకు చేయండి",
+ "Enable notifications for this account": "ఈ ఖాతా కోసం తాఖీదు ప్రారంభించండి",
+ "Directory": "వివరం",
+ "Search for a room": "గది కోసం శోధించండి",
+ "Messages containing keywords": "కీలక పదాలనుకలిగి ఉన్న సందేశం",
+ "Error saving email notification preferences": "ఇమెయిల్ ప్రకటనలను ప్రాధాన్యతలను దాచు చేయడంలో లోపం",
+ "Tuesday": "మంగళవారం",
+ "Enter keywords separated by a comma:": "కామాతో వేరు చేయబడిన కీలక పదాలను నమోదు చేయండి:",
+ "I understand the risks and wish to continue": "నేను నష్టాలను అర్థం చేసుకుంటాను మరియు కొనసాగించాలని కోరుకుంటున్నాను",
+ "Remove %(name)s from the directory?": "వివరము నుండి %(name)s తొలిగించు?",
+ "Remove from Directory": "`వివరము నుండి తొలిగించు",
+ "Direct Chat": "ప్రత్యక్ష మాటామంతి",
+ "Reject": "తిరస్కరించు",
+ "Failed to set Direct Message status of room": "గది యొక్క ప్రత్యక్ష సందేశ స్థితి సెట్ చేయడంలో విఫలమైంది",
+ "Monday": "సోమవారం",
+ "All messages (noisy)": "అన్ని సందేశాలు (గట్టిగ)",
+ "Enable them now": "ఇప్పుడే వాటిని ప్రారంభించండి",
+ "Messages containing my user name": "నా వినియోగదారు పేరు కలిగి ఉన్న సందేశాలు",
+ "Collecting logs": "నమోదు సేకరించడం",
+ "more": "మరింత",
+ "Failed to get public room list": "ప్రజా గది జాబితాను పొందడం విఫలమైంది",
+ "(HTTP status %(httpStatus)s)": "(HTTP స్థితి %(httpStatus)s)",
+ "All Rooms": "అన్ని గదులు",
+ "Wednesday": "బుధవారం",
+ "Send": "పంపండి",
+ "Send logs": "నమోదును పంపు",
+ "All messages": "అన్ని సందేశాలు",
+ "Call invitation": "మాట్లాడడానికి ఆహ్వానం",
+ "Downloading update...": "నవీకరణను దిగుమతి చేస్తోంది...",
+ "Keywords": "ముఖ్యపదాలు",
+ "Can't update user notification settings": "వినియోగదారు ప్రకటన ప్రాదాన్యాలు నవీకరించదడానేకి రాదు",
+ "Notify for all other messages/rooms": "అన్ని ఇతర సందేశాలు / గదులు కోసం తెలియజేయండి",
+ "Couldn't find a matching Matrix room": "సరిపోలిక మ్యాట్రిక్స్ గదిని కనుగొనలేకపోయాము",
+ "Invite to this room": "ఈ గదికి ఆహ్వానించండి",
+ "Thursday": "గురువారం",
+ "Search…": "శోధన…",
+ "Sorry, your browser is not able to run Riot.": "క్షమించండి, మీ బ్రౌజర్ రియట్ని అమలు చేయలేరు.",
+ "Messages in group chats": "సమూహ మాటామంతిలో సందేశాలు",
+ "Yesterday": "నిన్న",
+ "Error encountered (%(errorDetail)s).": "లోపం సంభవించింది (%(errorDetail)s).",
+ "Low Priority": "తక్కువ ప్రాధాన్యత",
+ "Set Password": "రహస్యపదాన్నీ అమర్చండి",
+ "An error occurred whilst saving your email notification preferences.": "మీ ఇమెయిల్ ప్రకటన ప్రాధాన్యాలు బద్రపరిచేతప్పుడు ఎదో తప్పు జరిగింది.",
+ "Enable audible notifications in web client": "వెబ్ బంట్రౌతు వినిపించే నోటిఫికేషన్లను ప్రారంభించండి",
+ "Off": "ఆపు",
+ "Mentions only": "మాత్రమే ప్రస్తావిస్తుంది",
+ "Failed to remove tag %(tagName)s from room": "గది నుండి బొందు %(tagName)s తొలగించడంలో విఫలమైంది",
+ "Enable desktop notifications": "రంగస్థల తాఖీదు ప్రారంభించండి",
+ "Enable email notifications": "ఇమెయిల్ ప్రకటనలను ప్రారంభించండి",
+ "Login": "ప్రవేశ ద్వారం",
+ "No rooms to show": "చూపించడానికి గదులు లేవు",
+ "Download this file": "ఈ దస్త్రం దిగుమతి చేయండి",
+ "Failed to change settings": "అమరిక మార్చడం విఫలమైంది",
+ "#example": "#ఉదాహరణ",
+ "Collapse panel": "ప్యానెల్ కుదించు",
+ "Checking for an update...": "నవీకరణ కోసం చూస్తోంది...",
+ "Saturday": "శనివారం"
}
diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json
index 540902c8f17..17ba4d461f0 100644
--- a/src/i18n/strings/th.json
+++ b/src/i18n/strings/th.json
@@ -6,7 +6,6 @@
"Camera": "กล้อง",
"Advanced": "ขึ้นสูง",
"Ban": "แบน",
- "Bug Report": "รายงานจุดบกพร่อง",
"Change Password": "เปลี่ยนรหัสผ่าน",
"Create Room": "สรัางห้อง",
"Delete": "ลบ",
@@ -23,7 +22,6 @@
"Emoji": "อีโมจิ",
"Enable encryption": "เปิดใช้งานการเข้ารหัส",
"Error": "ข้อผิดพลาด",
- "Found a bug?": "พบจุดบกพร่อง?",
"%(displayName)s is typing": "%(displayName)s กำลังพิมพ์",
"Kick": "เตะ",
"Low priority": "ความสำคัญต่ำ",
@@ -49,7 +47,6 @@
"Settings": "การตั้งค่า",
"unknown error code": "รหัสข้อผิดพลาดที่ไม่รู้จัก",
"olm version:": "เวอร์ชัน olm:",
- "Report it": "รายงานเลย",
"Remove": "ลบ",
"Custom Server Options": "กำหนดเซิร์ฟเวอร์เอง",
"Favourite": "รายการโปรด",
@@ -435,5 +432,137 @@
"Error decrypting image": "เกิดข้อผิดพลาดในการถอดรหัสรูป",
"Image '%(Body)s' cannot be displayed.": "ไม่สามารถแสดงรูป '%(Body)s' ได้",
"This image cannot be displayed.": "ไม่สามารถแสดงรูปนี้ได้",
- "Error decrypting video": "เกิดข้อผิดพลาดในการถอดรหัสวิดิโอ"
+ "Error decrypting video": "เกิดข้อผิดพลาดในการถอดรหัสวิดิโอ",
+ "Fetching third party location failed": "การเรียกข้อมูลตำแหน่งจากบุคคลที่สามล้มเหลว",
+ "A new version of Riot is available.": "มี Riot เวอร์ชั่นใหม่",
+ "I understand the risks and wish to continue": "ฉันเข้าใจความเสี่ยงและต้องการดำเนินการต่อ",
+ "Advanced notification settings": "ตั้งค่าการแจ้งเตือนขั้นสูง",
+ "Uploading report": "กำลังอัปโหลดรายงาน",
+ "Sunday": "วันอาทิตย์",
+ "Guests can join": "แขกเข้าร่วมได้",
+ "Failed to add tag %(tagName)s to room": "การเพิ่มแท็ก %(tagName)s ของห้องนี้ล้มเหลว",
+ "Notification targets": "เป้าหมายการแจ้งเตือน",
+ "Failed to set direct chat tag": "การติดแท็กแชทตรงล้มเหลว",
+ "Today": "วันนี้",
+ "Files": "ไฟล์",
+ "You are not receiving desktop notifications": "การแจ้งเตือนบนเดสก์ทอปถูกปิดอยู่",
+ "Friday": "วันศุกร์",
+ "Update": "อัปเดต",
+ "What's New": "มีอะไรใหม่",
+ "Add an email address above to configure email notifications": "เพิ่มที่อยู่อีเมลข้างบนเพื่อตั้งค่าการแจ้งเตือนทางอีเมล",
+ "Expand panel": "ขยายหน้าต่าง",
+ "On": "เปิด",
+ "Filter room names": "กรองชื่อห้อง",
+ "Changelog": "บันทึกการเปลี่ยนแปลง",
+ "Waiting for response from server": "กำลังรอการตอบสนองจากเซิร์ฟเวอร์",
+ "Leave": "ออกจากห้อง",
+ "Uploaded on %(date)s by %(user)s": "อัปโหลดเมื่อ %(date)s โดย %(user)s",
+ "All notifications are currently disabled for all targets.": "การแจ้งเตือนทั้งหมดถูกปิดใช้งานสำหรับทุกอุปกรณ์",
+ "delete the alias.": "ลบนามแฝง",
+ "To return to your account in future you need to set a password": "คุณต้องตั้งรหัสผ่านเพื่อจะกลับมาที่บัญชีนี้ในอนาคต",
+ "Forget": "ลืม",
+ "World readable": "ทุกคนอ่านได้",
+ "Hide panel": "ซ่อนหน้าต่าง",
+ "You cannot delete this image. (%(code)s)": "คุณไม่สามารถลบรูปนี้ได้ (%(code)s)",
+ "Cancel Sending": "ยกเลิกการส่ง",
+ "Warning": "คำเตือน",
+ "This Room": "ห้องนี้",
+ "The Home Server may be too old to support third party networks": "เซิร์ฟเวอร์บ้านอาจเก่าเกินกว่าจะรองรับเครือข่ายของบุคคลที่สาม",
+ "Resend": "ส่งใหม่",
+ "Room not found": "ไม่พบห้อง",
+ "Messages containing my display name": "ข้อความที่มีชื่อของฉัน",
+ "Messages in one-to-one chats": "ข้อความในแชทตัวต่อตัว",
+ "Unavailable": "ไม่มี",
+ "Error saving email notification preferences": "การบันทึกการตั้งค่าการแจ้งเตือนทางอีเมลผิดพลาด",
+ "View Decrypted Source": "ดูซอร์สที่ถอดรหัสแล้ว",
+ "Send": "ส่ง",
+ "remove %(name)s from the directory.": "ถอด %(name)s ออกจากไดเรกทอรี",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "การแจ้งเตือนจากคีย์เวิร์ดเหล่านี้ เป็นไปตามกฏที่ไม่สามารถแสดงที่นี่ได้:",
+ "Please set a password!": "กรุณาตั้งรหัสผ่าน!",
+ "You have successfully set a password!": "การตั้งรหัสผ่านเสร็จสมบูรณ์!",
+ "An error occurred whilst saving your email notification preferences.": "เกิดข้อผิดพลาดระหว่างบันทึกการตั้งค่าการแจ้งเตือนทางอีเมล",
+ "Source URL": "URL ต้นฉบับ",
+ "Messages sent by bot": "ข้อความจากบอท",
+ "Members": "สมาชิก",
+ "No update available.": "ไม่มีอัปเดตที่ใหม่กว่า",
+ "Noisy": "เสียงดัง",
+ "Failed to get protocol list from Home Server": "การขอรายชื่อโปรโตคอลจากเซิร์ฟเวอร์บ้านล้มเหลว",
+ "Collecting app version information": "กำลังรวบรวมข้อมูลเวอร์ชันแอป",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "ลบนามแฝง %(alias)s ของห้องและถอด %(name)s ออกจากไดเรกทอรี?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "เพื่อคุณจะได้กลับมายังบัญชีเดิมของคุณได้ หลังจากออกจากระบบ แล้วกลับเข้าสู่ระบบในอุปกรณ์อื่น ๆ",
+ "Enable notifications for this account": "เปิดใช้งานการแจ้งเตือนสำหรับบัญชีนี้",
+ "Directory": "ไดเรกทอรี",
+ "Search for a room": "ค้นหาห้อง",
+ "Messages containing keywords": "ข้อความที่มีคีย์เวิร์ด",
+ "View Source": "ดูซอร์ส",
+ "Tuesday": "วันอังคาร",
+ "Enter keywords separated by a comma:": "กรอกคีย์เวิร์ดทั้งหมด คั่นด้วยเครื่องหมายจุลภาค:",
+ "Search…": "ค้นหา…",
+ "Remove %(name)s from the directory?": "ถอด %(name)s ออกจากไดเรกทอรี?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot ใช้คุณสมบัติขั้นสูงในเบราว์เซอร์หลายประการ คุณสมบัติบางอย่างอาจยังไม่พร้อมใช้งานหรืออยู่ในขั้นทดลองในเบราว์เซอร์ปัจจุบันของคุณ",
+ "Unnamed room": "ห้องที่ไม่มีชื่อ",
+ "All messages (noisy)": "ทุกข้อความ (เสียงดัง)",
+ "Saturday": "วันเสาร์",
+ "Remember, you can always set an email address in user settings if you change your mind.": "อย่าลืม คุณสามารถตั้งที่อยู่อีเมลในการตั้งค่าผู้ใช้ได้ทุกเมื่อหากคุณเปลี่ยนใจ",
+ "Direct Chat": "แชทโดยตรง",
+ "The server may be unavailable or overloaded": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งานหรือทำงานหนักเกินไป",
+ "Reject": "ปฏิเสธ",
+ "Failed to set Direct Message status of room": "การตั้งสถานะข้อความตรงของห้องล้มเหลว",
+ "Monday": "วันจันทร์",
+ "Remove from Directory": "ถอดออกจากไดเรกทอรี",
+ "Enable them now": "เปิดใช้งานเดี๋ยวนี้",
+ "Messages containing my user name": "ข้อความที่มีชื่อผู้ใช้ของฉัน",
+ "Collecting logs": "กำลังรวบรวมล็อก",
+ "more": "เพิ่มเติม",
+ "Failed to get public room list": "การขอรายชื่อห้องสาธารณะล้มเหลว",
+ "(HTTP status %(httpStatus)s)": "(สถานะ HTTP %(httpStatus)s)",
+ "All Rooms": "ทุกห้อง",
+ "Wednesday": "วันพุธ",
+ "Failed to update keywords": "การอัปเดตคีย์เวิร์ดล้มเหลว",
+ "Send logs": "ส่งล็อก",
+ "All messages": "ทุกข้อความ",
+ "Call invitation": "คำเชิญเข้าร่วมการโทร",
+ "Downloading update...": "กำลังดาวน์โหลดอัปเดต...",
+ "You have successfully set a password and an email address!": "ตั้งรหัสผ่านและที่อยู่อีเมลสำเร็จแล้ว!",
+ "What's new?": "มีอะไรใหม่?",
+ "Notify me for anything else": "แจ้งเตือนสำหรับอย่างอื่นทั้งหมด",
+ "When I'm invited to a room": "เมื่อฉันได้รับคำเชิญเข้าห้อง",
+ "Keywords": "คีย์เวิร์ด",
+ "Can't update user notification settings": "ไม่สามารถอัปเดตการตั้งค่าการแจ้งเตือนของผู้ใช้",
+ "Notify for all other messages/rooms": "แจ้งเตือนจากห้อง/ข้อความอื่น ๆ ทั้งหมด",
+ "Unable to look up room ID from server": "ไม่สามารถหา ID ห้องจากเซิร์ฟเวอร์ได้",
+ "Couldn't find a matching Matrix room": "ไม่พบห้อง Matrix ที่ตรงกับคำค้นหา",
+ "Invite to this room": "เชิญเข้าห้องนี้",
+ "You cannot delete this message. (%(code)s)": "คุณไม่สามารถลบข้อความนี้ได้ (%(code)s)",
+ "Thursday": "วันพฤหัสบดี",
+ "Forward Message": "ส่งต่อข้อความ",
+ "Unhide Preview": "แสดงตัวอย่าง",
+ "Unable to join network": "ไม่สามารถเข้าร่วมเครือข่ายได้",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "คุณอาจมีการตั้งค่าจากไคลเอนต์อื่นนอกจาก Riot การตั้งต่าเหล่านั้นยังถูกใช้งานอยู่แต่คุณจะปรับแต่งจากใน Riot ไม่ได้",
+ "Sorry, your browser is not able to run Riot.": "ขออภัย เบราว์เซอร์ของคุณไม่สามารถ run Riot ได้",
+ "Messages in group chats": "ข้อความในแชทกลุ่ม",
+ "Yesterday": "เมื่อวานนี้",
+ "Error encountered (%(errorDetail)s).": "เกิดข้อผิดพลาด (%(errorDetail)s)",
+ "Low Priority": "ความสำคัญต่ำ",
+ "Riot does not know how to join a room on this network": "Riot ไม่รู้วิธีเข้าร่วมห้องในเครือข่ายนี้",
+ "Set Password": "ตั้งรหัสผ่าน",
+ "Enable audible notifications in web client": "เปิดใช้งานเสียงแจ้งเตือนบนเว็บไคลเอนต์",
+ "Permalink": "ลิงก์ถาวร",
+ "Off": "ปิด",
+ "#example": "#example",
+ "Mentions only": "เมื่อถูกกล่าวถึงเท่านั้น",
+ "Failed to remove tag %(tagName)s from room": "การลบแท็ก %(tagName)s จากห้องล้มเหลว",
+ "You can now return to your account after signing out, and sign in on other devices.": "คุณสามารถกลับไปยังบัญชีของคุณหลังจากออกจากระบบ แล้วกลับเขาสู่ระบบบนอุปกรณ์อื่น ๆ",
+ "Enable desktop notifications": "เปิดใช้งานการแจ้งเตือนบนเดสก์ทอป",
+ "Enable email notifications": "เปิดใช้งานการแจ้งเตือนทางอีเมล",
+ "Login": "เข้าสู่ระบบ",
+ "No rooms to show": "ไม่มีห้องที่จะแสดง",
+ "Download this file": "ดาวน์โหลดไฟล์นี้",
+ "Failed to change settings": "การแก้ไขการตั้งค่าล้มเหลว",
+ "Unable to fetch notification target list": "ไม่สามารถรับรายชื่ออุปกรณ์แจ้งเตือน",
+ "Quote": "อ้างอิง",
+ "Collapse 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!": "การแสดงผลของโปรแกรมอาจผิดพลาด ฟังก์ชันบางอย่างหรือทั้งหมดอาจไม่ทำงานในเบราว์เซอร์ปัจจุบันของคุณ หากคุณต้องการลองดำเนินการต่อ คุณต้องรับมือกับปัญหาที่อาจจะเกิดขึ้นด้วยตัวคุณเอง!",
+ "Checking for an update...": "กำลังตรวจหาอัปเดต...",
+ "There are advanced notifications which are not shown here": "มีการแจ้งเตือนขั้นสูงที่ไม่ได้แสดงที่นี่"
}
diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json
index 922bdc33a15..d890ed634ed 100644
--- a/src/i18n/strings/tr.json
+++ b/src/i18n/strings/tr.json
@@ -48,7 +48,6 @@
"Banned users": "Yasaklanan(Banlanan) Kullanıcılar",
"Bans user with given id": "Yasaklanan(Banlanan) Kullanıcılar , ID'leri ile birlikte",
"Blacklisted": "Kara listeye alınanlar",
- "Bug Report": "Hata Raporu",
"Bulk Options": "Toplu Seçenekler",
"Call Timeout": "Arama Zaman Aşımı",
"Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Ana Sunucu'ya bağlanılamıyor - lütfen bağlantınızı kontrol edin , Ana Sunucu SSL sertifikanızın güvenilir olduğundan ve bir tarayıcı uzantısının istekleri engellemiyor olduğundan emin olun.",
@@ -178,7 +177,6 @@
"Forgot your password?": "Şifrenizi mi unuttunuz ?",
"For security, this session has been signed out. Please sign in again.": "Güvenlik için , bu oturuma çıkış yapıldı . Lütfen tekrar oturum açın.",
"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.": "Güvenlik için , çıkış yaparsanız bu tarayıcıdan tüm uçtan uca şifreleme anahtarları silinecek . Konuşma geçmişinizi çözebilmek isterseniz gelecekteki Riot oturumlarında , lütfen Oda Anahtarlarını güvenlik amaçlı Dışa Aktarın.",
- "Found a bug?": "Hata buldunuz mu ?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s %(fromPowerLevel)s den %(toPowerLevel)s ' ye",
"Guest access is disabled on this Home Server.": "Misafir erişimi bu Ana Sunucu için devre dışı.",
"Guests cannot join this room even if explicitly invited.": "Misafirler açıkca davet edilseler bile bu odaya katılamazlar.",
@@ -301,7 +299,6 @@
"Remove": "Kaldır",
"Remove %(threePid)s?": "%(threePid)s 'i kaldır ?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s bir VoIP konferansı talep etti.",
- "Report it": "Bunu rapor et",
"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.": "Şifrenizi sıfırlamak , eğer Oda Anahtarlarınızı dışa aktarmaz ve daha sonra içe aktarmaz iseniz , şu anda tüm cihazlarda uçtan uca şifreleme anahtarlarını sıfırlayarak şifreli sohbetleri okunamaz hale getirecek . Gelecekte bu iyileştirilecek.",
"Results from DuckDuckGo": "DuckDuckGo Sonuçları",
"Return to login screen": "Giriş ekranına dön",
@@ -641,5 +638,130 @@
"Ignore request": "İsteği yoksay",
"You added a new device '%(displayName)s', which is requesting encryption keys.": "Şifreleme anahtarları isteyen , '%(displayName)s' isminde yeni bir cihaz eklediniz .",
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Tanımlanmamış cihazınız '%(displayName)s' , şifreleme anahtarlarını istiyor.",
- "Encryption key request": "Şifreleme anahtarı isteği"
+ "Encryption key request": "Şifreleme anahtarı isteği",
+ "Fetching third party location failed": "Üçüncü parti konumunu çekemedi",
+ "A new version of Riot is available.": "Riot'un yeni bir versiyonu mevcuttur.",
+ "All notifications are currently disabled for all targets.": "Tüm bildirimler şu anda tüm hedefler için devre dışı bırakılmıştır.",
+ "Uploading report": "Rapor yükleniyor",
+ "Sunday": "Pazar",
+ "Guests can join": "Misafirler katılabilirler",
+ "Messages sent by bot": "Bot tarafından gönderilen mesajlar",
+ "Notification targets": "Bildirim hedefleri",
+ "Failed to set direct chat tag": "Direkt sohbet etiketi ayarlanamadı",
+ "Today": "Bugün",
+ "Failed to get protocol list from Home Server": "Ana Sunucu'dan protokol listesi alınamadı",
+ "You are not receiving desktop notifications": "Masaüstü bildirimleri almıyorsunuz",
+ "Friday": "Cuma",
+ "Update": "Güncelleştirme",
+ "What's New": "Yenilikler",
+ "Add an email address above to configure email notifications": "E-posta bildirimlerini yapılandırmak için yukarıya bir e-posta adresi ekleyin",
+ "Expand panel": "Genişletme paneli",
+ "On": "Açık",
+ "Filter room names": "Oda isimlerini filtrele",
+ "Changelog": "Değişiklikler",
+ "Waiting for response from server": "Sunucudan yanıt bekleniyor",
+ "Leave": "Ayrıl",
+ "Advanced notification settings": "Gelişmiş bildirim ayarları",
+ "delete the alias.": "Tüm rumuzları sil.",
+ "Forget": "Unut",
+ "World readable": "Okunabilir dünya",
+ "#example": "örnek",
+ "Hide panel": "Paneli gizle",
+ "You cannot delete this image. (%(code)s)": "Bu resmi silemezsiniz. (%(code)s)",
+ "Cancel Sending": "Göndermeyi İptal Et",
+ "This Room": "Bu Oda",
+ "The Home Server may be too old to support third party networks": "Ana Sunucu 3. parti ağları desteklemek için çok eski olabilir",
+ "Noisy": "Gürültülü",
+ "Room not found": "Oda bulunamadı",
+ "Messages in one-to-one chats": "Bire bir sohbetlerdeki mesajlar",
+ "Unavailable": "Kullanım dışı",
+ "View Decrypted Source": "Şifresi Çözülmüş(Decrypted) Kaynağı Görüntüle",
+ "Failed to update keywords": "Anahtar kelimeler güncellenemedi",
+ "remove %(name)s from the directory.": "%(name)s'i dizinden kaldır.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Aşağıdaki anahtar kelimeleri ile ilgili bildirimler burada gösterilemeyen kuralları takip eder:",
+ "Please set a password!": "Lütfen bir şifre ayarlayın !",
+ "You have successfully set a password!": "Başarıyla bir şifre ayarladınız!",
+ "Source URL": "Kaynak URL",
+ "Failed to add tag %(tagName)s to room": "%(tagName)s etiketi odaya eklenemedi",
+ "Members": "Üyeler",
+ "Resend": "Yeniden Gönder",
+ "Files": "Dosyalar",
+ "Collecting app version information": "Uygulama sürümü bilgileri toplanıyor",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "%(alias)s oda rumuzu silinsin ve %(name)s dizinden kaldırılsın mı ?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Bu oturumunuzu kapattıktan sonra hesabınıza dönmenizi ve diğer cihazlarda oturum açmanızı sağlar.",
+ "Keywords": "Anahtar kelimeler",
+ "Enable notifications for this account": "Bu hesap için bildirimleri etkinleştir",
+ "Directory": "Dizin",
+ "Failed to get public room list": "Genel odalar listesi alınamadı",
+ "Messages containing keywords": " anahtar kelimeleri içeren mesajlar",
+ "Error saving email notification preferences": "E-posta bildirim tercihlerini kaydetme hatası",
+ "Tuesday": "Salı",
+ "Enter keywords separated by a comma:": "Anahtar kelimeleri virgül ile ayırarak girin:",
+ "I understand the risks and wish to continue": "Riskleri anlıyorum ve devam etmek istiyorum",
+ "Remove %(name)s from the directory?": "%(name)s'i dizinden kaldırılsın mı ?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot geçerli tarayıcınızda mevcut olmayan veya denemelik olan birçok gelişmiş tarayıcı özelliği kullanıyor.",
+ "Enable desktop notifications": "Masaüstü bildirimlerini etkinleştir",
+ "Unnamed room": "İsimsiz oda",
+ "All messages (noisy)": "Tüm mesajlar (uzun)",
+ "Saturday": "Cumartesi",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Unutmayın , fikrinizi değiştirirseniz her zaman bir şifre ve e-posta adresi ayarlayabilirsiniz.",
+ "Direct Chat": "Doğrudan Sohbet",
+ "The server may be unavailable or overloaded": "Sunucu kullanılamıyor veya aşırı yüklenmiş olabilir",
+ "Reject": "Reddet",
+ "Failed to set Direct Message status of room": "Odanın Direkt Mesaj durumu ayarlanamadı",
+ "Monday": "Pazartesi",
+ "Remove from Directory": "Dizinden Kaldır",
+ "Enable them now": "Onları şimdi etkinleştir",
+ "Forward Message": "Mesajı İlet",
+ "Messages containing my user name": "Kullanıcı ismimi içeren mesajlar",
+ "Collecting logs": "Kayıtlar toplanıyor",
+ "more": "Daha",
+ "Search for a room": "Oda ara",
+ "(HTTP status %(httpStatus)s)": "(HTTP durumu %(httpStatus)s)",
+ "All Rooms": "Tüm Odalar",
+ "Wednesday": "Çarşamba",
+ "Quote": "Alıntı",
+ "Send": "Gönder",
+ "Send logs": "Kayıtları gönder",
+ "All messages": "Tüm mesajlar",
+ "Call invitation": "Arama davetiyesi",
+ "Messages containing my display name": "İsmimi içeren mesajlar",
+ "You have successfully set a password and an email address!": "Başarıyla bir şifre ve e-posta adresi ayarladın !",
+ "What's new?": "Yeni olan ne ?",
+ "Notify me for anything else": "Başka herhangi bir şey için bana bildirim yap",
+ "When I'm invited to a room": "Bir odaya davet edildiğimde",
+ "Can't update user notification settings": "Kullanıcı bildirim ayarları güncellenemiyor",
+ "Notify for all other messages/rooms": "Diğer tüm mesajlar / odalar için bildirim yapın",
+ "Unable to look up room ID from server": "Sunucudan oda ID'si aranamadı",
+ "Couldn't find a matching Matrix room": "Eşleşen bir Matrix odası bulunamadı",
+ "Invite to this room": "Bu odaya davet et",
+ "You cannot delete this message. (%(code)s)": "Bu mesajı silemezsiniz (%(code)s)",
+ "Thursday": "Perşembe",
+ "Search…": "Arama…",
+ "Unhide Preview": "Önizlemeyi Göster",
+ "Unable to join network": "Ağa bağlanılamıyor",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Onları Riot dışında bir istemciden yapılandırmış olabilirsiniz . Onları Riot içersinide ayarlayamazsınız ama hala geçerlidirler",
+ "Sorry, your browser is not able to run Riot.": "Üzgünüz , tarayıcınız Riot'u çalıştıramıyor .",
+ "Uploaded on %(date)s by %(user)s": "%(user)s tarafında %(date)s e yüklendi",
+ "Messages in group chats": "Grup sohbetlerindeki mesajlar",
+ "Yesterday": "Dün",
+ "Low Priority": "Düşük Öncelikli",
+ "Unable to fetch notification target list": "Bildirim hedef listesi çekilemedi",
+ "An error occurred whilst saving your email notification preferences.": "E-posta bildirim tercihlerinizi kaydetme işlemi sırasında bir hata oluştu.",
+ "Enable audible notifications in web client": "Web istemcisinde sesli bildirimleri etkinleştir",
+ "Permalink": "Kalıcı Bağlantı(permalink)",
+ "Off": "Kapalı",
+ "Riot does not know how to join a room on this network": "Riot bu ağdaki bir odaya nasıl gireceğini bilmiyor",
+ "Mentions only": "Sadece Mention'lar",
+ "Failed to remove tag %(tagName)s from room": "Odadan %(tagName)s etiketi kaldırılamadı",
+ "You can now return to your account after signing out, and sign in on other devices.": "Şimdi oturumunuzu iptal ettikten sonra başka cihazda oturum açarak hesabınıza dönebilirsiniz.",
+ "Enable email notifications": "E-posta bildirimlerini etkinleştir",
+ "Login": "Oturum aç",
+ "No rooms to show": "Gösterilecek oda yok",
+ "Download this file": "Bu dosyayı indir",
+ "Failed to change settings": "Ayarlar değiştirilemedi",
+ "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"
}
diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json
index 2ff04fec657..25a70e05220 100644
--- a/src/i18n/strings/uk.json
+++ b/src/i18n/strings/uk.json
@@ -73,7 +73,6 @@
"Banned users": "Заблоковані користувачі",
"Bans user with given id": "Блокує користувача з заданим ID",
"Blacklisted": "В чорному списку",
- "Bug Report": "Звіт про помилку",
"Bulk Options": "Групові параметри",
"Call Timeout": "Час очікування виклика",
"Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Не вдається підключитись до домашнього серверу - перевірте підключення, переконайтесь, що ваш SSL-сертифікат домашнього сервера є довіреним і що розширення браузера не блокує запити.",
@@ -96,5 +95,166 @@
"Rooms": "Кімнати",
"Add rooms to this community": "Добавити кімнати в це суспільство",
"This email address is already in use": "Ця адреса елект. почти вже використовується",
- "This phone number is already in use": "Цей телефонний номер вже використовується"
+ "This phone number is already in use": "Цей телефонний номер вже використовується",
+ "Fetching third party location failed": "Не вдалось отримати стороннє місцеперебування",
+ "Messages in one-to-one chats": "Повідомлення у чатах \"сам на сам\"",
+ "A new version of Riot is available.": "Доступне оновлення для Riot.",
+ "Couldn't load home page": "Не вдалось завантажити домівку",
+ "Send Account Data": "Відправити данні аккаунта",
+ "Advanced notification settings": "Додаткові налаштування сповіщень",
+ "Uploading report": "Завантаження звіту",
+ "Sunday": "Неділя",
+ "Guests can join": "Гості можуть приєднуватися",
+ "Failed to add tag %(tagName)s to room": "Не вдалось додати до кімнати мітку %(tagName)s",
+ "Notification targets": "Цілі сповіщень",
+ "Failed to set direct chat tag": "Не вдалося встановити мітку прямого чату",
+ "Today": "Сьогодні",
+ "Failed to get protocol list from Home Server": "Не вдалось отримати перелік протоколів з Домашнього серверу",
+ "You are not receiving desktop notifications": "Ви не отримуєте сповіщення на стільниці",
+ "Friday": "П'ятниця",
+ "Update": "Оновити",
+ "What's New": "Що нового",
+ "Add an email address above to configure email notifications": "Додайте вище адресу е-пошти щоб налаштувати сповіщення е-поштою",
+ "Expand panel": "Розгорнути панель",
+ "On": "Увімкнено",
+ "Filter room names": "Відфільтрувати назви кімнат",
+ "Changelog": "Журнал змін",
+ "Waiting for response from server": "Очікується відповідь від сервера",
+ "Leave": "Вийти",
+ "Send Custom Event": "Відправити приватний захід",
+ "All notifications are currently disabled for all targets.": "Сповіщення для усіх цілей на даний момент вимкнені.",
+ "Failed to send logs: ": "Не вдалося відправити журнали: ",
+ "delete the alias.": "видалити псевдонім.",
+ "To return to your account in future you need to set a password": "Щоб мати змогу використовувати вашу обліковку у майбутньому, зазначте пароль",
+ "Forget": "Забути",
+ "World readable": "Відкрито для світу",
+ "#example": "#зразок",
+ "Hide panel": "Сховати панель",
+ "You cannot delete this image. (%(code)s)": "Ви не можете видалити це зображення. (%(code)s)",
+ "Cancel Sending": "Скасувати надсилання",
+ "Warning": "Попередження",
+ "This Room": "Ця кімната",
+ "The Home Server may be too old to support third party networks": "Домашній сервер може бути застарим для підтримки сторонніх мереж",
+ "Noisy": "Шумний",
+ "Error saving email notification preferences": "Помилка при збереженні параметрів сповіщень е-поштою",
+ "Messages containing my display name": "Повідомлення, вміщає моє ім'я",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Пам'ятайте, що ви завжди можете встановити адресу е-пошти у налаштуваннях, якщо передумаєте.",
+ "Unavailable": "Нема в наявності",
+ "View Decrypted Source": "Переглянути розшифроване джерело",
+ "Failed to update keywords": "Не вдалось оновити ключові слова",
+ "remove %(name)s from the directory.": "прибрати %(name)s з каталогу.",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Сповіщення з наступних ключових слів дотримуються правил, що не можуть бути показані тут:",
+ "Safari and Opera work too.": "Safari та Opera працюють теж.",
+ "Please set a password!": "Встановіть пароль, будь ласка!",
+ "You have successfully set a password!": "Пароль успішно встановлено!",
+ "An error occurred whilst saving your email notification preferences.": "Під час збереження налаштувань сповіщень е-поштою трапилася помилка.",
+ "Explore Room State": "Перегляд статуса кімнати",
+ "Source URL": "Джерельне посилання",
+ "Messages sent by bot": "Повідомлення, надіслані ботом",
+ "Filter results": "Фільтр результатів",
+ "Members": "Члени",
+ "No update available.": "Оновлення відсутні.",
+ "Resend": "Перенадіслати",
+ "Files": "Файли",
+ "Collecting app version information": "Збір інформації про версію застосунка",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Видалити псевдонім %(alias)s та прибрати з каталогу %(name)s?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Це дозволить вам повернутися до своєї обліковки після виходу з неї, та заходити з інших пристроїв.",
+ "Keywords": "Ключові слова",
+ "Enable notifications for this account": "Увімкнути сповіщення для цієї обліковки",
+ "Directory": "Каталог",
+ "Invite to this community": "Запросити в це суспільство",
+ "Failed to get public room list": "Не вдалось отримати перелік прилюдних кімнат",
+ "Messages containing keywords": "Повідомлення, що містять ключові слова",
+ "When I'm invited to a room": "Коли мене запрошено до кімнати",
+ "Tuesday": "Вівторок",
+ "Enter keywords separated by a comma:": "Введіть ключові слова через кому:",
+ "Forward Message": "Переслати повідомлення",
+ "You have successfully set a password and an email address!": "Пароль та адресу е-пошти успішно встановлено!",
+ "Remove %(name)s from the directory?": "Прибрати %(name)s з каталогу?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot використовує багато новітніх функцій, деякі з яких не доступні або є експериментальними у вашому оглядачі.",
+ "Developer Tools": "Інструменти розробника",
+ "Preparing to send logs": "Підготовка до відправки журланлу",
+ "Unnamed room": "Неназвана кімната",
+ "Explore Account Data": "Продивитись данні аккаунта",
+ "All messages (noisy)": "Усі повідомлення (гучно)",
+ "Away": "Нема на місці",
+ "Saturday": "Субота",
+ "I understand the risks and wish to continue": "Я ознайомлений з ризиками і хочу продовжити",
+ "Direct Chat": "Прямий чат",
+ "The server may be unavailable or overloaded": "Сервер може бути недосяжним або перевантаженим",
+ "Room not found": "Кімнату не знайдено",
+ "Reject": "Відмовитись",
+ "Failed to set Direct Message status of room": "Не вдалось встановити статус прямого спілкування в кімнаті",
+ "Monday": "Понеділок",
+ "Remove from Directory": "Прибрати з каталогу",
+ "Enable them now": "Увімкнути їх зараз",
+ "Messages containing my user name": "Повідомлення, що містять моє ім'я користувача",
+ "Toolbox": "Панель інструментів",
+ "Collecting logs": "Збір журналів",
+ "more": "докладніше",
+ "Bug report sent": "Звіт про помилки відправлений",
+ "You must specify an event type!": "Необхідно вказати тип захода!",
+ "(HTTP status %(httpStatus)s)": "(статус HTTP %(httpStatus)s)",
+ "All Rooms": "Усі кімнати",
+ "Please install Chrome or Firefox for the best experience.": "Краще встановіть Chrome або Firefox.",
+ "Wednesday": "Середа",
+ "You cannot delete this message. (%(code)s)": "Ви не можете видалити це повідомлення. (%(code)s)",
+ "Quote": "Цитувати",
+ "Send": "Надіслати",
+ "Send logs": "Надіслати журнали",
+ "All messages": "Усі повідомлення",
+ "Call invitation": "Запрошення до виклику",
+ "Downloading update...": "Звантаженя оновлення…",
+ "State Key": "Ключ стану",
+ "Failed to send custom event.": "Не вдалося відправити приватний захід.",
+ "What's new?": "Що нового?",
+ "Notify me for anything else": "Сповіщати мене про будь-що інше",
+ "View Source": "Переглянути джерело",
+ "Click here to create a GitHub issue.": "Нажміть тут для створення запитання по проблемі на GitHub.",
+ "Can't update user notification settings": "Неможливо оновити налаштування користувацьких сповіщень",
+ "Notify for all other messages/rooms": "Сповіщати щодо всіх повідомлень/кімнат",
+ "Unable to look up room ID from server": "Неможливо знайти ID кімнати на сервері",
+ "Couldn't find a matching Matrix room": "Неможливо знайти відповідну кімнату",
+ "Invite to this room": "Запросити до цієї кімнати",
+ "Search for a room": "Пошук кімнати",
+ "Thursday": "Четвер",
+ "Search…": "Пошук…",
+ "Logs sent": "Журнали відправленні",
+ "Back": "Назад",
+ "Reply": "Відповісти",
+ "Show message in desktop notification": "Показати повідомлення в сповіщення на робочому столі",
+ "Unable to join network": "Неможливо приєднатись до мережі",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Можливо, ви налаштували їх не у Riot, а у іншому застосунку. Ви не можете регулювати їх у Riot, але вони все ще мають силу",
+ "Sorry, your browser is not able to run Riot.": "Вибачте, ваш оглядач не спроможний запустити Riot.",
+ "Uploaded on %(date)s by %(user)s": "Завантажено %(date)s користувачем %(user)s",
+ "Messages in group chats": "Повідомлення у групових чатах",
+ "Yesterday": "Вчора",
+ "Error encountered (%(errorDetail)s).": "Трапилась помилка (%(errorDetail)s).",
+ "Login": "Зайти",
+ "Low Priority": "Неважливі",
+ "Unable to fetch notification target list": "Неможливо отримати перелік цілей сповіщення",
+ "Appear Offline": "Відображати як не в мережі",
+ "Set Password": "Задати пароль",
+ "Enable audible notifications in web client": "Увімкнути звукові сповіщення у мережевому застосунку",
+ "Permalink": "Постійне посилання",
+ "Off": "Вимкнено",
+ "Riot does not know how to join a room on this network": "Riot не знає як приєднатись до кімнати у цій мережі",
+ "Mentions only": "Тільки згадки",
+ "Failed to remove tag %(tagName)s from room": "Не вдалося прибрати з кімнати мітку %(tagName)s",
+ "You can now return to your account after signing out, and sign in on other devices.": "Тепер ви можете повернутися до своєї обліковки після виходу з неї, та зайти з інших пристроїв.",
+ "Enable desktop notifications": "Увімкнути сповіщення на стільниці",
+ "Enable email notifications": "Увімкнути сповіщення е-поштою",
+ "Event Type": "Тип західу",
+ "No rooms to show": "Кімнати відсутні",
+ "Download this file": "Звантажити цей файл",
+ "Pin Message": "Прикріпити повідомлення",
+ "Failed to change settings": "Не вдалось змінити налаштування",
+ "Event sent!": "Захід відправлено!",
+ "Unhide Preview": "Відкрити попередній перегляд",
+ "Event Content": "Зміст заходу",
+ "Thank you!": "Дякую!",
+ "Collapse 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!": "У вашому оглядачі вигляд застосунку може бути повністю іншим, а деякі або навіть усі функції можуть не працювати. Якщо ви наполягаєте, то можете продовжити користування, але ви маєте впоратись з усіма можливими проблемами власноруч!",
+ "Checking for an update...": "Перевірка оновлень…",
+ "There are advanced notifications which are not shown here": "Є додаткові сповіщення, що не показуються тут"
}
diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json
index c7e67319ef4..89709bf97fe 100644
--- a/src/i18n/strings/zh_Hans.json
+++ b/src/i18n/strings/zh_Hans.json
@@ -65,7 +65,6 @@
"Forgot your password?": "忘记密码?",
"For security, this session has been signed out. Please sign in again.": "出于安全考虑,此会话已被注销。请重新登录。.",
"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.": "出于安全考虑,用户注销时会清除浏览器里的端到端加密密钥。如果你想要下次登录 Riot 时能解密过去的聊天记录,请导出你的聊天室密钥。",
- "Found a bug?": "发现漏洞?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 从 %(fromPowerLevel)s 变为 %(toPowerLevel)s",
"Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主动邀请。.",
"Hangup": "挂断",
@@ -82,7 +81,6 @@
"Invalid address format": "地址格式错误",
"Invalid Email Address": "邮箱地址格式错误",
"Invalid file%(extra)s": "非法文件%(extra)s",
- "Report it": "报告",
"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.": "重设密码会导致所有设备上的端到端加密密钥被重置,使得加密的聊天记录不可读,除非你事先导出密钥,修改密码后再导入。此问题将来会得到改善。.",
"Return to login screen": "返回登录页面",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot 未被允许向你推送消息 - 请检查浏览器设置",
@@ -184,7 +182,6 @@
"Are you sure you want to upload the following files?": "你确定要上传这些文件吗?",
"Bans user with given id": "封禁指定 ID 的用户",
"Blacklisted": "已列入黑名单",
- "Bug Report": "反馈漏洞",
"Bulk Options": "批量操作",
"Call Timeout": "通话超时",
"Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "无法连接主服务器 - 请检查网络连接,确保你的主服务器 SSL 证书被信任,且没有浏览器插件拦截请求。",
@@ -294,7 +291,6 @@
"Could not connect to the integration server": "无法连接集成服务器",
"Curve25519 identity key": "Curve25519 认证密钥",
"Edit": "编辑",
- "Hide Apps": "隐藏应用",
"Joins room with given alias": "以指定的别名加入聊天室",
"Labs": "实验室",
"%(targetName)s left the room.": "%(targetName)s 离开了聊天室。",
@@ -467,7 +463,6 @@
"%(senderName)s removed their profile picture.": "%(senderName)s 移除了他们的头像。",
"%(senderName)s requested a VoIP conference.": "%(senderName)s 请求一个 VoIP 会议。",
"Seen by %(userName)s at %(dateTime)s": "在 %(dateTime)s 被 %(userName)s 看到",
- "Show Apps": "显示应用",
"Tagged as: ": "标记为:",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "验证码将发送到+%(msisdn)s,请输入接收到的验证码",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s 接受了 %(displayName)s 的邀请。",
@@ -727,7 +722,6 @@
"You have entered an invalid address.": "你输入了一个无效地址。",
"Advanced options": "高级选项",
"Leave": "离开",
- "Unable to leave room": "无法离开聊天室",
"Description": "描述",
"Warning": "警告",
"Light theme": "浅色主题",
@@ -803,5 +797,162 @@
"Failed to set direct chat tag": "无法设定私聊标签",
"Failed to remove tag %(tagName)s from room": "移除聊天室标签 %(tagName)s 失败",
"Failed to add tag %(tagName)s to room": "无法为聊天室新增标签 %(tagName)s",
- "Submit debug logs": "提交调试日志"
+ "Submit debug logs": "提交调试日志",
+ "Fetching third party location failed": "获取第三方位置失败",
+ "A new version of Riot is available.": "Riot 有更新可用。",
+ "Couldn't load home page": "不能加载首页",
+ "Send Account Data": "发送账户数据",
+ "All notifications are currently disabled for all targets.": "当前所有目标的通知均已禁用。",
+ "Uploading report": "上传报告",
+ "Sunday": "星期日",
+ "Notification targets": "通知目标",
+ "Today": "今天",
+ "Failed to get protocol list from Home Server": "无法从主服务器取得协议列表",
+ "You are not receiving desktop notifications": "您将不会收到桌面通知",
+ "Friday": "星期五",
+ "Update": "更新",
+ "What's New": "新鲜事",
+ "Add an email address above to configure email notifications": "请在上方输入电子邮件地址以接收邮件通知",
+ "Expand panel": "展开面板",
+ "On": "打开",
+ "%(count)s Members|other": "%(count)s 位成员",
+ "Filter room names": "过滤聊天室名称",
+ "Changelog": "变更日志",
+ "Waiting for response from server": "正在等待服务器响应",
+ "Send Custom Event": "发送自定义事件",
+ "Advanced notification settings": "通知高级设置",
+ "Failed to send logs: ": "无法发送日志: ",
+ "delete the alias.": "删除别名。",
+ "To return to your account in future you need to set a password": "要在未来回到您的账号,您需要 设置密码",
+ "Forget": "忘记",
+ "#example": "#例子",
+ "Hide panel": "隐藏面板",
+ "You cannot delete this image. (%(code)s)": "您不能删除这个图片。(%(code)s)",
+ "Cancel Sending": "取消发送",
+ "This Room": "此聊天室",
+ "The Home Server may be too old to support third party networks": "主服务器可能太老旧无法支持第三方网络",
+ "Noisy": "吵闹",
+ "Error saving email notification preferences": "保存电子邮件通知的首选项时出错",
+ "Messages containing my display name": "消息中含有我的显示名称",
+ "Messages in one-to-one chats": "一对一聊天种的消息",
+ "Unavailable": "无法获得",
+ "View Decrypted Source": "查看解密的来源",
+ "Failed to update keywords": "无法更新关键字",
+ "Notes:": "记录:",
+ "remove %(name)s from the directory.": "从目录中移除 %(name)s。",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "以下关键字依照规则将不会在此显示:",
+ "Safari and Opera work too.": "Safari 和 Opera 也能工作。",
+ "Please set a password!": "请设置密码!",
+ "You have successfully set a password!": "您已成功设置密码!",
+ "An error occurred whilst saving your email notification preferences.": "保存邮件通知首选项设定时出现错误。",
+ "Explore Room State": "探索聊天室状态",
+ "Source URL": "源网址",
+ "Messages sent by bot": "由机器人发出的消息",
+ "Filter results": "过滤结果",
+ "Members": "成员",
+ "No update available.": "没有可用更新。",
+ "Resend": "重新发送",
+ "Files": "文件",
+ "Collecting app version information": "正在收集应用版本信息",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "确定要删除聊天室别名 %(alias)s 并将 %(name)s 从列表中删除吗?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "这让您可以在注销后回到您的账号,并在其他设备上登录。",
+ "Keywords": "关键字",
+ "Enable notifications for this account": "为本账号启用通知",
+ "Directory": "聊天室目录",
+ "Invite to this community": "邀请加入此社区",
+ "Failed to get public room list": "无法取得公开的聊天室列表",
+ "Messages containing keywords": "消息包含 关键字",
+ "Room not found": "找不到聊天室",
+ "Tuesday": "星期二",
+ "Enter keywords separated by a comma:": "输入以逗号间隔的关键字:",
+ "Forward Message": "转发消息",
+ "You have successfully set a password and an email address!": "您已经成功设置了密码和电子邮件地址!",
+ "Remove %(name)s from the directory?": "从目录中移除 %(name)s 吗?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot 使用了许多先进的浏览器功能,有些在你目前所用的浏览器上无法使用或仅为实验性的功能。",
+ "Developer Tools": "开发者工具",
+ "Preparing to send logs": "准备发送日志",
+ "Enable desktop notifications": "启用桌面通知",
+ "Remember, you can always set an email address in user settings if you change your mind.": "请记住,如果您改变想法,您永远可以在用户设置中设置电子邮件。",
+ "Explore Account Data": "探索账户数据",
+ "All messages (noisy)": "全部消息(高亮)",
+ "Away": "离开",
+ "Saturday": "星期六",
+ "I understand the risks and wish to continue": "我了解这些风险并愿意继续",
+ "Direct Chat": "私聊",
+ "The server may be unavailable or overloaded": "服务器可能无法使用或超过负载",
+ "Reject": "拒绝",
+ "Failed to set Direct Message status of room": "无法设置聊天室的私聊状态",
+ "Monday": "星期一",
+ "Remove from Directory": "从目录中移除",
+ "Enable them now": "现在启用",
+ "Messages containing my user name": "消息中包含我的用户名",
+ "Toolbox": "工具箱",
+ "Collecting logs": "正在收集日志",
+ "more": "更多",
+ "GitHub issue link:": "Github issue 链接:",
+ "Bug report sent": "发送DEBUG报告",
+ "You must specify an event type!": "你必须制定一个事件类型!",
+ "(HTTP status %(httpStatus)s)": "(HTTP 状态 %(httpStatus)s)",
+ "All Rooms": "全部聊天室",
+ "Please install Chrome or Firefox for the best experience.": "请安装 Chrome 或 Firefox 以获得最佳体验。",
+ "Wednesday": "星期三",
+ "You cannot delete this message. (%(code)s)": "您不能删除此消息。(%(code)s)",
+ "Quote": "引述",
+ "Send logs": "发送日志",
+ "All messages": "全部消息",
+ "Call invitation": "语音邀请",
+ "Downloading update...": "正在下载更新…",
+ "State Key": "状态密钥",
+ "Failed to send custom event.": "发送自定义事件失败。",
+ "What's new?": "有什么新闻?",
+ "Notify me for anything else": "所有消息都通知我",
+ "When I'm invited to a room": "当我被邀请进入聊天室",
+ "Click here to create a GitHub issue.": "点击这里 创建一个 GitHub issue.",
+ "Can't update user notification settings": "不能更新用户通知设置",
+ "Notify for all other messages/rooms": "为所有其他消息/聊天室显示通知",
+ "Unable to look up room ID from server": "无法在服务器上找到聊天室 ID",
+ "Couldn't find a matching Matrix room": "未找到符合的 Matrix 聊天室",
+ "Invite to this room": "邀请别人加入此聊天室",
+ "Search for a room": "搜索聊天室",
+ "Thursday": "星期四",
+ "Search…": "搜索…",
+ "Logs sent": "记录已发送",
+ "Back": "返回",
+ "Reply": "回复",
+ "Show message in desktop notification": "在桌面通知中显示信息",
+ "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.": "调试日志包含使用数据(包括您的用户名,您访问过的聊天室 / 小组的 ID 或别名以及其他用户的用户名)。它们不包含聊天信息。",
+ "Unhide Preview": "取消隐藏预览",
+ "Unable to join network": "无法加入网络",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "您也许不曾在其他 Riot 之外的客户端设置它们。在 Riot 下你无法调整他们但仍然可用",
+ "Sorry, your browser is not able to run Riot.": "抱歉,您的浏览器 无法 运行 Riot.",
+ "Uploaded on %(date)s by %(user)s": "由 %(user)s 在 %(date)s 上传",
+ "Messages in group chats": "群组聊天中的消息",
+ "Yesterday": "昨天",
+ "Error encountered (%(errorDetail)s).": "遇到错误 (%(errorDetail)s)。",
+ "Login": "登录",
+ "Low Priority": "低优先级",
+ "Unable to fetch notification target list": "无法获取通知目标列表",
+ "Appear Offline": "似乎离线了",
+ "Set Password": "设置密码",
+ "Enable audible notifications in web client": "在网页客户端启用音频通知",
+ "Permalink": "永久链接",
+ "Off": "关闭",
+ "Riot does not know how to join a room on this network": "Riot 不知道如何在此网络中加入聊天室",
+ "Mentions only": "只限提及",
+ "You can now return to your account after signing out, and sign in on other devices.": "您可以在注销后回到您的账号,并在其他设备上登录。",
+ "Enable email notifications": "启用电子邮件通知",
+ "Event Type": "事件类型",
+ "Download this file": "下载该文件",
+ "Pin Message": "置顶消息",
+ "Failed to change settings": "变更设置失败",
+ "View Community": "查看社区",
+ "%(count)s Members|one": "%(count)s 位成员",
+ "Event sent!": "事件已发出!",
+ "View Source": "查看源码",
+ "Event Content": "事件内容",
+ "Thank you!": "谢谢!",
+ "Collapse 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!": "您目前的浏览器,应用程序的外观和感觉完全不正确,有些或全部功能可能无法使用。如果您仍想继续尝试,可以继续,但请自行负担其后果!",
+ "Checking for an update...": "正在检查更新…",
+ "There are advanced notifications which are not shown here": "更多的通知并没有在此显示出来"
}
diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json
index 0be62a27e5d..a404604ec25 100644
--- a/src/i18n/strings/zh_Hant.json
+++ b/src/i18n/strings/zh_Hant.json
@@ -12,7 +12,6 @@
"Ban": "封鎖",
"Banned users": "被封鎖的用戶",
"Blacklisted": "已列入黑名單",
- "Bug Report": "臭蟲回報",
"Call Timeout": "通話超時",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "當瀏覽器網址列裡有 HTTPS URL 時,不能使用 HTTP 連線到家伺服器。請採用 HTTPS 或者允許不安全的指令稿。",
"Can't load user settings": "無法載入使用者設定",
@@ -102,7 +101,6 @@
"Forgot your password?": "忘記密碼?",
"For security, this session has been signed out. Please sign in again.": "因為安全因素,此工作階段已被登出。請重新登入。",
"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.": "因為安全因素,登出將會從此瀏覽器刪除任何端到端加密的金鑰。若您想要在未來的 Riot 工作階段中解密您的對話紀錄,請將您的聊天室金鑰匯出並好好存放。",
- "Found a bug?": "發現漏洞?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 從 %(fromPowerLevel)s 變為 %(toPowerLevel)s",
"Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主動邀請。.",
"Hangup": "掛斷",
@@ -127,7 +125,6 @@
"Leave room": "離開聊天室",
"Login as guest": "以游客的身份登錄",
"New password": "新密碼",
- "Report it": "報告",
"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.": "重設密碼目前會把所有裝置上的端到端加密金鑰重設,讓已加密的聊天歷史不可讀,除非您先匯出您的聊天室金鑰並在稍後重新匯入。這會在未來改進。",
"Return to login screen": "返回到登入畫面",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot 未被允許向你推送通知 ── 請檢查您的瀏覽器設定",
@@ -653,7 +650,6 @@
"Do you want to load widget from URL:": "您想要載入小工具的 URL:",
"Edit": "編輯",
"Enable automatic language detection for syntax highlighting": "啟用語法突顯的自動語言偵測",
- "Hide Apps": "隱藏應用程式",
"Hide join/leave messages (invites/kicks/bans unaffected)": "隱藏加入/離開訊息(邀請/踢出/封鎖不受影響)",
"Integrations Error": "整合錯誤",
"Publish this room to the public in %(domain)s's room directory?": "將這個聊天室公開到 %(domain)s 的聊天室目錄中?",
@@ -662,7 +658,6 @@
"NOTE: Apps are not end-to-end encrypted": "注意:應用程式並未端到端加密",
"Revoke widget access": "撤銷小工具存取",
"Sets the room topic": "設定聊天室主題",
- "Show Apps": "顯示應用程式",
"The maximum permitted number of widgets have already been added to this room.": "這個聊天室已經有可加入的最大量的小工具了。",
"To get started, please pick a username!": "要開始,請先取一個使用者名稱!",
"Unable to create widget.": "無法建立小工具。",
@@ -923,7 +918,6 @@
"Leave Community": "離開社群",
"Leave %(groupName)s?": "離開 %(groupName)s?",
"Leave": "離開",
- "Unable to leave room": "無法離開聊天室",
"Community Settings": "社群設定",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "這些聊天室在社群頁面上顯示給社群成員。社群成員可以透過點按它們來加入聊天室。",
"%(inviter)s has invited you to join this community": "%(inviter)s 已經邀請您加入此社群",
@@ -992,7 +986,6 @@
"Key request sent.": "金鑰請求已傳送。",
"Re-request encryption keys from your other devices.": "從您的其他裝置重新請求加密金鑰。",
"%(user)s is a %(userRole)s": "%(user)s 是 %(userRole)s",
- "Changes made to your community might not be seen by other users for up to 30 minutes.": "其他使用者在最多 30 分鐘內可能不會慨到您對社群所做的變更。",
"Code": "代碼",
"Debug Logs Submission": "除錯訊息傳送",
"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 contian messages.": "如果您透過 GitHub 來回報錯誤,除錯訊息可以用來追蹤問題。除錯訊息包含應用程式的使用資料,包括您的使用者名稱、您所造訪的房間/群組的 ID 或別名、其他使用者的使用者名稱等,其中不包含訊息本身。",
@@ -1007,13 +1000,166 @@
"Stickerpack": "貼圖包",
"Sticker Messages": "貼圖訊息",
"You don't currently have any stickerpacks enabled": "您目前未啟用任何貼圖包",
- "Click": "點按",
- "here": "這裡",
- "to add some!": "來新增一些!",
"Add a stickerpack": "新增貼圖包",
"Hide Stickers": "隱藏貼圖",
"Show Stickers": "顯示貼圖",
- "Manage sticker packs": "管理貼圖包",
"Who can join this community?": "誰可以加入此社群?",
- "Everyone": "每個人"
+ "Everyone": "每個人",
+ "Fetching third party location failed": "抓取第三方位置失敗",
+ "A new version of Riot is available.": "Riot 釋出了新版本。",
+ "I understand the risks and wish to continue": "我了解這些風險並願意繼續",
+ "Couldn't load home page": "無法載入首頁",
+ "Send Account Data": "傳送帳號資料",
+ "Advanced notification settings": "進階通知設定",
+ "Uploading report": "上傳報告",
+ "Sunday": "星期日",
+ "Notification targets": "通知目標",
+ "Today": "今天",
+ "Failed to get protocol list from Home Server": "無法從主機伺服器取得協定清單",
+ "You are not receiving desktop notifications": "你將不會收到桌面通知",
+ "Friday": "星期五",
+ "Update": "更新",
+ "Unable to fetch notification target list": "無法抓取通知的目標清單",
+ "Add an email address above to configure email notifications": "在上面新增電子郵件以設定電子郵件通知",
+ "Expand panel": "展開面板",
+ "On": "開啟",
+ "%(count)s Members|other": "%(count)s 個成員",
+ "Filter room names": "過濾聊天室名稱",
+ "Changelog": "變更記錄",
+ "Waiting for response from server": "正在等待來自伺服器的回應",
+ "Uploaded on %(date)s by %(user)s": "由 %(user)s 在 %(date)s 上傳",
+ "Send Custom Event": "傳送自訂事件",
+ "All notifications are currently disabled for all targets.": "目前所有的通知功能已停用。",
+ "Failed to send logs: ": "無法傳送除錯訊息: ",
+ "delete the alias.": "刪除別名。",
+ "To return to your account in future you need to set a password": "未來若需回來使用您的帳號,您需要 設定密碼",
+ "Forget": "忘記",
+ "Hide panel": "隱藏面板",
+ "You cannot delete this image. (%(code)s)": "你不能刪除這個圖片。(%(code)s)",
+ "Cancel Sending": "取消傳送",
+ "This Room": "這個聊天室",
+ "The Home Server may be too old to support third party networks": "主機伺服器可能太老舊無法支援第三方網路",
+ "Resend": "重新傳送",
+ "Room not found": "找不到聊天室",
+ "Messages containing my display name": "訊息中有包含我的顯示名稱",
+ "Messages in one-to-one chats": "在一對一聊天中的訊息",
+ "Unavailable": "無法取得",
+ "Error saving email notification preferences": "儲存電子郵件通知偏好設定時出錯",
+ "View Decrypted Source": "檢視解密的來源",
+ "Failed to update keywords": "無法更新關鍵字",
+ "Notes:": "備註:",
+ "remove %(name)s from the directory.": "自目錄中移除 %(name)s。",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "以下關鍵字依照規則其通知將不會顯示在此:",
+ "Safari and Opera work too.": "Safari 與 Opera 也可以運作。",
+ "Please set a password!": "請設定密碼!",
+ "You have successfully set a password!": "您已經成功設定密碼!",
+ "An error occurred whilst saving your email notification preferences.": "在儲存你的電子郵件通知偏好時發生錯誤。",
+ "Explore Room State": "探索聊天室狀態",
+ "Source URL": "來源網址",
+ "Messages sent by bot": "由機器人送出的訊息",
+ "Filter results": "過濾結果",
+ "Members": "成員",
+ "No update available.": "沒有可用的更新。",
+ "Noisy": "吵鬧",
+ "Files": "檔案",
+ "Collecting app version information": "收集應用程式版本資訊",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "刪除聊天室別名 %(alias)s 並從目錄移除 %(name)s?",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "這讓您可以在登入後回到您帳號,並在其他裝置上登入。",
+ "Enable notifications for this account": "本帳號啟用通知",
+ "Directory": "目錄",
+ "Invite to this community": "邀請至此社群",
+ "Search for a room": "搜尋聊天室",
+ "Messages containing keywords": "訊息包含 關鍵字",
+ "When I'm invited to a room": "當我被邀請加入聊天室",
+ "Tuesday": "星期二",
+ "Enter keywords separated by a comma:": "輸入以逗號隔開的關鍵字:",
+ "Forward Message": "轉寄訊息",
+ "You have successfully set a password and an email address!": "您已經成功設定密碼與電子郵件地址!",
+ "Remove %(name)s from the directory?": "自目錄中移除 %(name)s?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot 使用了許多先進的瀏覽器功能,有些在你目前所用的瀏覽器上無法使用或僅為實驗中的功能。",
+ "Developer Tools": "開發者工具",
+ "Preparing to send logs": "準備傳送除錯訊息",
+ "Enable desktop notifications": "啟用桌面通知",
+ "Explore Account Data": "探索帳號資料",
+ "All messages (noisy)": "所有訊息(吵鬧)",
+ "Away": "離開",
+ "Saturday": "星期六",
+ "Remember, you can always set an email address in user settings if you change your mind.": "記住,如果您改變心意了,您永遠可以在使用者設定中設定電子郵件地址。",
+ "Direct Chat": "私人聊天",
+ "The server may be unavailable or overloaded": "伺服器可能無法使用或是超過負載",
+ "Reject": "拒絕",
+ "Failed to set Direct Message status of room": "無法設定聊天室的私人訊息狀態",
+ "Monday": "星期一",
+ "Remove from Directory": "自目錄中移除",
+ "Enable them now": "現在啟用",
+ "Messages containing my user name": "訊息中有我的使用者名稱",
+ "Toolbox": "工具箱",
+ "Collecting logs": "收集記錄",
+ "more": "更多",
+ "GitHub issue link:": "GitHub 問題回報連結:",
+ "Bug report sent": "已傳送臭蟲回報",
+ "You must specify an event type!": "您必須指定事件類型!",
+ "(HTTP status %(httpStatus)s)": "(HTTP 狀態 %(httpStatus)s)",
+ "All Rooms": "所有的聊天室",
+ "What's New": "新鮮事",
+ "Please install Chrome or Firefox for the best experience.": "請安裝 Chrome 或 Firefox 以取得最佳體驗。",
+ "Failed to get public room list": "無法取得公開的聊天室清單",
+ "Send logs": "傳送記錄",
+ "All messages": "所有訊息",
+ "Call invitation": "通話邀請",
+ "Downloading update...": "正在下䵧更新...",
+ "State Key": "狀態金鑰",
+ "Failed to send custom event.": "傳送自訂式件失敗。",
+ "What's new?": "有什麼新聞?",
+ "Notify me for anything else": "所有消息都通知我",
+ "View Source": "檢視來源",
+ "Keywords": "關鍵字",
+ "Click here to create a GitHub issue.": "點選這裡來建立 GitHub 問題回報。",
+ "Can't update user notification settings": "無法更新使用者的通知設定",
+ "Notify for all other messages/rooms": "通知其他所有的訊息/聊天室",
+ "Unable to look up room ID from server": "無法從伺服器找到聊天室 ID",
+ "Couldn't find a matching Matrix room": "不能找到符合 Matrix 的聊天室",
+ "Invite to this room": "邀請加入這個聊天室",
+ "You cannot delete this message. (%(code)s)": "你不能刪除這個訊息。(%(code)s)",
+ "Thursday": "星期四",
+ "Search…": "搜尋…",
+ "Logs sent": "除錯訊息已經傳送",
+ "Back": "返回",
+ "Reply": "回覆",
+ "Show message in desktop notification": "在桌面通知中顯示訊息",
+ "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.": "除錯訊息包含應用程式的使用資料,包括您的使用者名稱、您所造訪的房間/群組的 ID 或別名、其他使用者的使用者名稱等,其中不包含訊息本身。",
+ "Unhide Preview": "取消隱藏預覽",
+ "Unable to join network": "無法加入網路",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "你也許不曾在其它 Riot 之外的客戶端設定它們。在 Riot 底下你無法調整它們但其仍然可用",
+ "Sorry, your browser is not able to run Riot.": "可惜,您的瀏覽器 無法 執行 Riot.",
+ "Messages in group chats": "在群組聊天中的訊息",
+ "Yesterday": "昨天",
+ "Error encountered (%(errorDetail)s).": "遇到錯誤 (%(errorDetail)s)。",
+ "Login": "登入",
+ "Low Priority": "低優先度",
+ "Riot does not know how to join a room on this network": "Riot 不知道如何在此網路中加入聊天室",
+ "Appear Offline": "顯示為離線",
+ "Set Password": "設定密碼",
+ "Enable audible notifications in web client": "在網頁客戶端啟用音訊通知",
+ "Permalink": "永久連結",
+ "Off": "關閉",
+ "#example": "#範例",
+ "Mentions only": "僅提及",
+ "Wednesday": "星期三",
+ "You can now return to your account after signing out, and sign in on other devices.": "您可以在登出後回到您的帳號,並在其他裝置上登入。",
+ "Enable email notifications": "啟用電子郵件通知",
+ "Event Type": "事件類型",
+ "Download this file": "下載這個檔案",
+ "Pin Message": "釘選訊息",
+ "Failed to change settings": "變更設定失敗",
+ "View Community": "檢視社群",
+ "%(count)s Members|one": "%(count)s 個成員",
+ "Event sent!": "事件已傳送!",
+ "Event Content": "事件內容",
+ "Thank you!": "感謝您!",
+ "Quote": "引用",
+ "Collapse 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!": "您目前的瀏覽器,其應用程式的外觀和感覺可能完全不正確,有些或全部功能可以無法使用。如果您仍想要繼續嘗試,可以繼續,但必須自行承擔後果!",
+ "Checking for an update...": "正在檢查更新...",
+ "There are advanced notifications which are not shown here": "有些進階的通知並未在此顯示"
}
diff --git a/src/notifications/ContentRules.js b/src/notifications/ContentRules.js
new file mode 100644
index 00000000000..25a7bac96e7
--- /dev/null
+++ b/src/notifications/ContentRules.js
@@ -0,0 +1,125 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var PushRuleVectorState = require('./PushRuleVectorState');
+
+module.exports = {
+ /**
+ * Extract the keyword rules from a list of rules, and parse them
+ * into a form which is useful for Vector's UI.
+ *
+ * Returns an object containing:
+ * rules: the primary list of keyword rules
+ * vectorState: a PushRuleVectorState indicating whether those rules are
+ * OFF/ON/LOUD
+ * externalRules: a list of other keyword rules, with states other than
+ * vectorState
+ */
+ parseContentRules: function(rulesets) {
+ // first categorise the keyword rules in terms of their actions
+ var contentRules = this._categoriseContentRules(rulesets);
+
+ // Decide which content rules to display in Vector UI.
+ // Vector displays a single global rule for a list of keywords
+ // whereas Matrix has a push rule per keyword.
+ // Vector can set the unique rule in ON, LOUD or OFF state.
+ // Matrix has enabled/disabled plus a combination of (highlight, sound) tweaks.
+
+ // The code below determines which set of user's content push rules can be
+ // displayed by the vector UI.
+ // Push rules that does not fit, ie defined by another Matrix client, ends
+ // in externalRules.
+ // There is priority in the determination of which set will be the displayed one.
+ // The set with rules that have LOUD tweaks is the first choice. Then, the ones
+ // with ON tweaks (no tweaks).
+
+ if (contentRules.loud.length) {
+ return {
+ vectorState: PushRuleVectorState.LOUD,
+ rules: contentRules.loud,
+ externalRules: [].concat(contentRules.loud_but_disabled, contentRules.on, contentRules.on_but_disabled, contentRules.other),
+ };
+ }
+ else if (contentRules.loud_but_disabled.length) {
+ return {
+ vectorState: PushRuleVectorState.OFF,
+ rules: contentRules.loud_but_disabled,
+ externalRules: [].concat(contentRules.on, contentRules.on_but_disabled, contentRules.other),
+ };
+ }
+ else if (contentRules.on.length) {
+ return {
+ vectorState: PushRuleVectorState.ON,
+ rules: contentRules.on,
+ externalRules: [].concat(contentRules.on_but_disabled, contentRules.other),
+ };
+ }
+ else if (contentRules.on_but_disabled.length) {
+ return {
+ vectorState: PushRuleVectorState.OFF,
+ rules: contentRules.on_but_disabled,
+ externalRules: contentRules.other,
+ }
+ } else {
+ return {
+ vectorState: PushRuleVectorState.ON,
+ rules: [],
+ externalRules: contentRules.other,
+ }
+ }
+ },
+
+ _categoriseContentRules: function(rulesets) {
+ var contentRules = {on: [], on_but_disabled:[], loud: [], loud_but_disabled: [], other: []};
+ for (var kind in rulesets.global) {
+ for (var i = 0; i < Object.keys(rulesets.global[kind]).length; ++i) {
+ var r = rulesets.global[kind][i];
+
+ // check it's not a default rule
+ if (r.rule_id[0] === '.' || kind !== 'content') {
+ continue;
+ }
+
+ r.kind = kind; // is this needed? not sure
+
+ switch (PushRuleVectorState.contentRuleVectorStateKind(r)) {
+ case PushRuleVectorState.ON:
+ if (r.enabled) {
+ contentRules.on.push(r);
+ }
+ else {
+ contentRules.on_but_disabled.push(r);
+ }
+ break;
+ case PushRuleVectorState.LOUD:
+ if (r.enabled) {
+ contentRules.loud.push(r);
+ }
+ else {
+ contentRules.loud_but_disabled.push(r);
+ }
+ break;
+ default:
+ contentRules.other.push(r);
+ break;
+ }
+ }
+ }
+ return contentRules;
+ },
+};
diff --git a/src/notifications/NotificationUtils.js b/src/notifications/NotificationUtils.js
new file mode 100644
index 00000000000..c8aeb468547
--- /dev/null
+++ b/src/notifications/NotificationUtils.js
@@ -0,0 +1,89 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+module.exports = {
+ // Encodes a dictionary of {
+ // "notify": true/false,
+ // "sound": string or undefined,
+ // "highlight: true/false,
+ // }
+ // to a list of push actions.
+ encodeActions: function(action) {
+ var notify = action.notify;
+ var sound = action.sound;
+ var highlight = action.highlight;
+ if (notify) {
+ var actions = ["notify"];
+ if (sound) {
+ actions.push({"set_tweak": "sound", "value": sound});
+ }
+ if (highlight) {
+ actions.push({"set_tweak": "highlight"});
+ } else {
+ actions.push({"set_tweak": "highlight", "value": false});
+ }
+ return actions;
+ } else {
+ return ["dont_notify"];
+ }
+ },
+
+ // Decode a list of actions to a dictionary of {
+ // "notify": true/false,
+ // "sound": string or undefined,
+ // "highlight: true/false,
+ // }
+ // If the actions couldn't be decoded then returns null.
+ decodeActions: function(actions) {
+ var notify = false;
+ var sound = null;
+ var highlight = false;
+
+ for (var i = 0; i < actions.length; ++i) {
+ var action = actions[i];
+ if (action === "notify") {
+ notify = true;
+ } else if (action === "dont_notify") {
+ notify = false;
+ } else if (typeof action === 'object') {
+ if (action.set_tweak === "sound") {
+ sound = action.value
+ } else if (action.set_tweak === "highlight") {
+ highlight = action.value;
+ } else {
+ // We don't understand this kind of tweak, so give up.
+ return null;
+ }
+ } else {
+ // We don't understand this kind of action, so give up.
+ return null;
+ }
+ }
+
+ if (highlight === undefined) {
+ // If a highlight tweak is missing a value then it defaults to true.
+ highlight = true;
+ }
+
+ var result = {notify: notify, highlight: highlight};
+ if (sound !== null) {
+ result.sound = sound;
+ }
+ return result;
+ },
+};
diff --git a/src/notifications/PushRuleVectorState.js b/src/notifications/PushRuleVectorState.js
new file mode 100644
index 00000000000..c838aa20ede
--- /dev/null
+++ b/src/notifications/PushRuleVectorState.js
@@ -0,0 +1,94 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var StandardActions = require('./StandardActions');
+var NotificationUtils = require('./NotificationUtils');
+
+var states = {
+ /** The push rule is disabled */
+ OFF: "off",
+
+ /** The user will receive push notification for this rule */
+ ON: "on",
+
+ /** The user will receive push notification for this rule with sound and
+ highlight if this is legitimate */
+ LOUD: "loud",
+};
+
+
+module.exports = {
+ /**
+ * Enum for state of a push rule as defined by the Vector UI.
+ * @readonly
+ * @enum {string}
+ */
+ states: states,
+
+ /**
+ * Convert a PushRuleVectorState to a list of actions
+ *
+ * @return [object] list of push-rule actions
+ */
+ actionsFor: function(pushRuleVectorState) {
+ if (pushRuleVectorState === this.ON) {
+ return StandardActions.ACTION_NOTIFY;
+ }
+ else if (pushRuleVectorState === this.LOUD) {
+ return StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND;
+ }
+ },
+
+ /**
+ * Convert a pushrule's actions to a PushRuleVectorState.
+ *
+ * Determines whether a content rule is in the PushRuleVectorState.ON
+ * category or in PushRuleVectorState.LOUD, regardless of its enabled
+ * state. Returns null if it does not match these categories.
+ */
+ contentRuleVectorStateKind: function(rule) {
+ var decoded = NotificationUtils.decodeActions(rule.actions);
+
+ if (!decoded) {
+ return null;
+ }
+
+ // Count tweaks to determine if it is a ON or LOUD rule
+ var tweaks = 0;
+ if (decoded.sound) {
+ tweaks++;
+ }
+ if (decoded.highlight) {
+ tweaks++;
+ }
+ var stateKind = null;
+ switch (tweaks) {
+ case 0:
+ stateKind = this.ON;
+ break;
+ case 2:
+ stateKind = this.LOUD;
+ break;
+ }
+ return stateKind;
+ },
+};
+
+for (var k in states) {
+ module.exports[k] = states[k];
+};
diff --git a/src/notifications/StandardActions.js b/src/notifications/StandardActions.js
new file mode 100644
index 00000000000..22a8f1db40b
--- /dev/null
+++ b/src/notifications/StandardActions.js
@@ -0,0 +1,30 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var NotificationUtils = require('./NotificationUtils');
+
+var encodeActions = NotificationUtils.encodeActions;
+
+module.exports = {
+ ACTION_NOTIFY: encodeActions({notify: true}),
+ ACTION_NOTIFY_DEFAULT_SOUND: encodeActions({notify: true, sound: "default"}),
+ ACTION_NOTIFY_RING_SOUND: encodeActions({notify: true, sound: "ring"}),
+ ACTION_HIGHLIGHT_DEFAULT_SOUND: encodeActions({notify: true, sound: "default", highlight: true}),
+ ACTION_DONT_NOTIFY: encodeActions({notify: false}),
+ ACTION_DISABLED: null,
+};
diff --git a/src/notifications/VectorPushRulesDefinitions.js b/src/notifications/VectorPushRulesDefinitions.js
new file mode 100644
index 00000000000..47e5d56f460
--- /dev/null
+++ b/src/notifications/VectorPushRulesDefinitions.js
@@ -0,0 +1,146 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import { _td } from '../languageHandler';
+
+var StandardActions = require('./StandardActions');
+var PushRuleVectorState = require('./PushRuleVectorState');
+
+class VectorPushRuleDefinition {
+ constructor(opts) {
+ this.kind = opts.kind;
+ this.description = opts.description;
+ this.vectorStateToActions = opts.vectorStateToActions;
+ }
+
+ // Translate the rule actions and its enabled value into vector state
+ ruleToVectorState(rule) {
+ var enabled = false;
+ var actions = null;
+ if (rule) {
+ enabled = rule.enabled;
+ actions = rule.actions;
+ }
+
+ for (var stateKey in PushRuleVectorState.states) {
+ var state = PushRuleVectorState.states[stateKey];
+ var vectorStateToActions = this.vectorStateToActions[state];
+
+ if (!vectorStateToActions) {
+ // No defined actions means that this vector state expects a disabled (or absent) rule
+ if (!enabled) {
+ return state;
+ }
+ } else {
+ // The actions must match to the ones expected by vector state
+ if (enabled && JSON.stringify(rule.actions) === JSON.stringify(vectorStateToActions)) {
+ return state;
+ }
+ }
+ }
+
+ console.error("Cannot translate rule actions into Vector rule state. Rule: " +
+ JSON.stringify(rule));
+ return undefined;
+ }
+};
+
+/**
+ * The descriptions of rules managed by the Vector UI.
+ */
+module.exports = {
+ // Messages containing user's display name
+ ".m.rule.contains_display_name": new VectorPushRuleDefinition({
+ kind: "override",
+ description: _td("Messages containing my display name"), // passed through _t() translation in src/components/views/settings/Notifications.js
+ vectorStateToActions: { // The actions for each vector state, or null to disable the rule.
+ on: StandardActions.ACTION_NOTIFY,
+ loud: StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND,
+ off: StandardActions.ACTION_DISABLED
+ }
+ }),
+
+ // Messages containing user's username (localpart/MXID)
+ ".m.rule.contains_user_name": new VectorPushRuleDefinition({
+ kind: "override",
+ description: _td("Messages containing my user name"), // passed through _t() translation in src/components/views/settings/Notifications.js
+ vectorStateToActions: { // The actions for each vector state, or null to disable the rule.
+ on: StandardActions.ACTION_NOTIFY,
+ loud: StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND,
+ off: StandardActions.ACTION_DISABLED
+ }
+ }),
+
+ // Messages just sent to the user in a 1:1 room
+ ".m.rule.room_one_to_one": new VectorPushRuleDefinition({
+ kind: "underride",
+ description: _td("Messages in one-to-one chats"), // passed through _t() translation in src/components/views/settings/Notifications.js
+ vectorStateToActions: {
+ on: StandardActions.ACTION_NOTIFY,
+ loud: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
+ off: StandardActions.ACTION_DONT_NOTIFY
+ }
+ }),
+
+ // Messages just sent to a group chat room
+ // 1:1 room messages are catched by the .m.rule.room_one_to_one rule if any defined
+ // By opposition, all other room messages are from group chat rooms.
+ ".m.rule.message": new VectorPushRuleDefinition({
+ kind: "underride",
+ description: _td("Messages in group chats"), // passed through _t() translation in src/components/views/settings/Notifications.js
+ vectorStateToActions: {
+ on: StandardActions.ACTION_NOTIFY,
+ loud: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
+ off: StandardActions.ACTION_DONT_NOTIFY
+ }
+ }),
+
+ // Invitation for the user
+ ".m.rule.invite_for_me": new VectorPushRuleDefinition({
+ kind: "underride",
+ description: _td("When I'm invited to a room"), // passed through _t() translation in src/components/views/settings/Notifications.js
+ vectorStateToActions: {
+ on: StandardActions.ACTION_NOTIFY,
+ loud: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
+ off: StandardActions.ACTION_DISABLED
+ }
+ }),
+
+ // Incoming call
+ ".m.rule.call": new VectorPushRuleDefinition({
+ kind: "underride",
+ description: _td("Call invitation"), // passed through _t() translation in src/components/views/settings/Notifications.js
+ vectorStateToActions: {
+ on: StandardActions.ACTION_NOTIFY,
+ loud: StandardActions.ACTION_NOTIFY_RING_SOUND,
+ off: StandardActions.ACTION_DISABLED
+ }
+ }),
+
+ // Notifications from bots
+ ".m.rule.suppress_notices": new VectorPushRuleDefinition({
+ kind: "override",
+ description: _td("Messages sent by bot"), // passed through _t() translation in src/components/views/settings/Notifications.js
+ vectorStateToActions: {
+ // .m.rule.suppress_notices is a "negative" rule, we have to invert its enabled value for vector UI
+ on: StandardActions.ACTION_DISABLED,
+ loud: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
+ off: StandardActions.ACTION_DONT_NOTIFY,
+ }
+ }),
+};
diff --git a/src/notifications/index.js b/src/notifications/index.js
new file mode 100644
index 00000000000..8ed77e9d41e
--- /dev/null
+++ b/src/notifications/index.js
@@ -0,0 +1,24 @@
+/*
+Copyright 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+module.exports = {
+ NotificationUtils: require('./NotificationUtils'),
+ PushRuleVectorState: require('./PushRuleVectorState'),
+ VectorPushRulesDefinitions: require('./VectorPushRulesDefinitions'),
+ ContentRules: require('./ContentRules'),
+};
diff --git a/src/rageshake/rageshake.js b/src/rageshake/rageshake.js
new file mode 100644
index 00000000000..11e19a709e8
--- /dev/null
+++ b/src/rageshake/rageshake.js
@@ -0,0 +1,474 @@
+/*
+Copyright 2017 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.
+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 Promise from 'bluebird';
+
+// This module contains all the code needed to log the console, persist it to
+// disk and submit bug reports. Rationale is as follows:
+// - Monkey-patching the console is preferable to having a log library because
+// we can catch logs by other libraries more easily, without having to all
+// depend on the same log framework / pass the logger around.
+// - We use IndexedDB to persists logs because it has generous disk space
+// limits compared to local storage. IndexedDB does not work in incognito
+// mode, in which case this module will not be able to write logs to disk.
+// However, the logs will still be stored in-memory, so can still be
+// submitted in a bug report should the user wish to: we can also store more
+// logs in-memory than in local storage, which does work in incognito mode.
+// We also need to handle the case where there are 2+ tabs. Each JS runtime
+// generates a random string which serves as the "ID" for that tab/session.
+// These IDs are stored along with the log lines.
+// - Bug reports are sent as a POST over HTTPS: it purposefully does not use
+// Matrix as bug reports may be made when Matrix is not responsive (which may
+// be the cause of the bug). We send the most recent N MB of UTF-8 log data,
+// starting with the most recent, which we know because the "ID"s are
+// actually timestamps. We then purge the remaining logs. We also do this
+// purge on startup to prevent logs from accumulating.
+
+// the frequency with which we flush to indexeddb
+const FLUSH_RATE_MS = 30 * 1000;
+
+// the length of log data we keep in indexeddb (and include in the reports)
+const MAX_LOG_SIZE = 1024 * 1024 * 1; // 1 MB
+
+// A class which monkey-patches the global console and stores log lines.
+class ConsoleLogger {
+ constructor() {
+ this.logs = "";
+ }
+
+ monkeyPatch(consoleObj) {
+ // Monkey-patch console logging
+ const consoleFunctionsToLevels = {
+ log: "I",
+ info: "I",
+ warn: "W",
+ error: "E",
+ };
+ Object.keys(consoleFunctionsToLevels).forEach((fnName) => {
+ const level = consoleFunctionsToLevels[fnName];
+ let originalFn = consoleObj[fnName].bind(consoleObj);
+ consoleObj[fnName] = (...args) => {
+ this.log(level, ...args);
+ originalFn(...args);
+ }
+ });
+ }
+
+ log(level, ...args) {
+ // We don't know what locale the user may be running so use ISO strings
+ const ts = new Date().toISOString();
+ // Some browsers support string formatting which we're not doing here
+ // so the lines are a little more ugly but easy to implement / quick to
+ // run.
+ // Example line:
+ // 2017-01-18T11:23:53.214Z W Failed to set badge count
+ const line = `${ts} ${level} ${args.join(' ')}\n`;
+ // Using + really is the quickest way in JS
+ // http://jsperf.com/concat-vs-plus-vs-join
+ this.logs += line;
+ }
+
+ /**
+ * Retrieve log lines to flush to disk.
+ * @param {boolean} keepLogs True to not delete logs after flushing.
+ * @return {string} \n delimited log lines to flush.
+ */
+ flush(keepLogs) {
+ // The ConsoleLogger doesn't care how these end up on disk, it just
+ // flushes them to the caller.
+ if (keepLogs) {
+ return this.logs;
+ }
+ const logsToFlush = this.logs;
+ this.logs = "";
+ return logsToFlush;
+ }
+}
+
+// A class which stores log lines in an IndexedDB instance.
+class IndexedDBLogStore {
+ constructor(indexedDB, logger) {
+ this.indexedDB = indexedDB;
+ this.logger = logger;
+ this.id = "instance-" + Math.random() + Date.now();
+ this.index = 0;
+ this.db = null;
+ this.flushPromise = null;
+ // set if flush() is called whilst one is ongoing
+ this.flushAgainPromise = null;
+ }
+
+ /**
+ * @return {Promise} Resolves when the store is ready.
+ */
+ connect() {
+ let req = this.indexedDB.open("logs");
+ return new Promise((resolve, reject) => {
+ req.onsuccess = (event) => {
+ this.db = event.target.result;
+ // Periodically flush logs to local storage / indexeddb
+ setInterval(this.flush.bind(this), FLUSH_RATE_MS);
+ resolve();
+ };
+
+ req.onerror = (event) => {
+ const err = (
+ "Failed to open log database: " + event.target.errorCode
+ );
+ console.error(err);
+ reject(new Error(err));
+ };
+
+ // First time: Setup the object store
+ req.onupgradeneeded = (event) => {
+ const db = event.target.result;
+ const logObjStore = db.createObjectStore("logs", {
+ keyPath: ["id", "index"]
+ });
+ // Keys in the database look like: [ "instance-148938490", 0 ]
+ // Later on we need to query everything based on an instance id.
+ // In order to do this, we need to set up indexes "id".
+ logObjStore.createIndex("id", "id", { unique: false });
+
+ logObjStore.add(
+ this._generateLogEntry(
+ new Date() + " ::: Log database was created."
+ )
+ );
+
+ const lastModifiedStore = db.createObjectStore("logslastmod", {
+ keyPath: "id",
+ });
+ lastModifiedStore.add(this._generateLastModifiedTime());
+ }
+ });
+ }
+
+ /**
+ * Flush logs to disk.
+ *
+ * There are guards to protect against race conditions in order to ensure
+ * that all previous flushes have completed before the most recent flush.
+ * Consider without guards:
+ * - A calls flush() periodically.
+ * - B calls flush() and wants to send logs immediately afterwards.
+ * - If B doesn't wait for A's flush to complete, B will be missing the
+ * contents of A's flush.
+ * To protect against this, we set 'flushPromise' when a flush is ongoing.
+ * Subsequent calls to flush() during this period will chain another flush,
+ * then keep returning that same chained flush.
+ *
+ * This guarantees that we will always eventually do a flush when flush() is
+ * called.
+ *
+ * @return {Promise} Resolved when the logs have been flushed.
+ */
+ flush() {
+ // check if a flush() operation is ongoing
+ if (this.flushPromise && this.flushPromise.isPending()) {
+ if (this.flushAgainPromise && this.flushAgainPromise.isPending()) {
+ // this is the 3rd+ time we've called flush() : return the same
+ // promise.
+ return this.flushAgainPromise;
+ }
+ // queue up a flush to occur immediately after the pending one
+ // completes.
+ this.flushAgainPromise = this.flushPromise.then(() => {
+ return this.flush();
+ });
+ return this.flushAgainPromise;
+ }
+ // there is no flush promise or there was but it has finished, so do
+ // a brand new one, destroying the chain which may have been built up.
+ this.flushPromise = new Promise((resolve, reject) => {
+ if (!this.db) {
+ // not connected yet or user rejected access for us to r/w to
+ // the db.
+ reject(new Error("No connected database"));
+ return;
+ }
+ const lines = this.logger.flush();
+ if (lines.length === 0) {
+ resolve();
+ return;
+ }
+ let txn = this.db.transaction(["logs", "logslastmod"], "readwrite");
+ let objStore = txn.objectStore("logs");
+ txn.oncomplete = (event) => {
+ resolve();
+ };
+ txn.onerror = (event) => {
+ console.error(
+ "Failed to flush logs : ", event
+ );
+ reject(
+ new Error("Failed to write logs: " + event.target.errorCode)
+ );
+ }
+ objStore.add(this._generateLogEntry(lines));
+ let lastModStore = txn.objectStore("logslastmod");
+ lastModStore.put(this._generateLastModifiedTime());
+ });
+ return this.flushPromise;
+ }
+
+ /**
+ * Consume the most recent logs and return them. Older logs which are not
+ * returned are deleted at the same time, so this can be called at startup
+ * to do house-keeping to keep the logs from growing too large.
+ *
+ * @return {Promise