diff --git a/.eslintignore.errorfiles b/.eslintignore.errorfiles index f501f373cd..42818244b3 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 beee1ebe89..33b7fb9e80 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 9ca8a293cd..77338b4874 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 0000000000..e81c228430 --- /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 0000000000..9770010324 --- /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 0000000000..52ac95b569 --- /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 0000000000..13be73f9a9 --- /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 0000000000..f3f032c975 --- /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 0000000000..a0191b92cf --- /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 0000000000..2be193525e --- /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 0000000000..58e090645f --- /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 0000000000..02e5a948e9 --- /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 0000000000..cdac1bcc8a --- /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 0000000000..96ed5878ac --- /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 0000000000..7f6199c451 --- /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 0000000000..156b1709fe --- /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 0000000000..6d140721c8 --- /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 0000000000..a899808d57 --- /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 0000000000..b4dff612ed --- /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 0000000000..9cd3e7284c --- /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 0000000000..ca7431eac2 --- /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 0000000000..a2863460ad --- /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 0000000000..b8e1190375 --- /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 0000000000..6f08fd47b2 --- /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 0000000000..ab1d4feac3 --- /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 0000000000..d76c81668c --- /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 0000000000..4830814e4f --- /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 0000000000..a4c7dcf58a --- /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 0000000000..84b8306a74 --- /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 0000000000..ee2d9c190f --- /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 0000000000..85e8080c88 --- /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 0000000000..598f8ac249 --- /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 0000000000..759b92bd68 --- /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 0000000000..e00d446eda --- /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 0000000000..460a5f94b1 --- /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 0000000000..0f358a588e --- /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 0000000000..6fc211743d --- /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 0000000000..b859d6bf4d --- /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 0000000000..500e12ee49 --- /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 0000000000..888f147d21 --- /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 0000000000..8918373ecf --- /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 0000000000..b4dd353370 --- /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 0000000000..d6c961c0ec --- /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 0000000000..3d47f17592 --- /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 0000000000..588f10c9cb --- /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 0000000000..f7d8a3d001 --- /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 0000000000..28a8b7c9d7 --- /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 0000000000..3457e50b92 --- /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 0000000000..9850379597 --- /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 0000000000..edf455049b --- /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 0000000000..9871a7e881 --- /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 0000000000..0ecfb17c83 --- /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 0000000000..94a92b23ce --- /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 0000000000..69dd1703ee --- /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 0000000000..9fbb39aa17 --- /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 0000000000..8ed0698a72 --- /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 0000000000..612b6209c6 --- /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 0000000000..02ecb5d84a --- /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 0000000000..a3fee232d0 --- /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 0000000000..0af555b5aa --- /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 0000000000..474a123455 --- /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 0000000000..094e0b9b1b --- /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 0000000000..aea5737918 --- /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 0000000000..e97401a160 --- /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 0000000000..c496e67515 --- /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 0000000000..be69b15f37 --- /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 0000000000..3ea4aa07d6 --- /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 0000000000..fb41ebaa9e --- /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 0000000000..0c909b7cf7 --- /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 0000000000..183b5cd251 --- /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 0000000000..894ce19827 --- /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 0000000000..f676d24bef --- /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 0000000000..cf722e5ae8 --- /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 0000000000..6cbce68745 --- /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 0000000000..bf483feda3 --- /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 0000000000..a88c20863d --- /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 0000000000..3e6bbe5aa4 --- /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 0000000000..fcf397fd2d --- /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 0000000000..e21189c59e --- /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 0000000000..9adce42eef --- /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 0000000000..060709b82e --- /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 0000000000..be7565b3c5 --- /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 0000000000..9036e12bf0 --- /dev/null +++ b/res/css/views/messages/_UnknownBody.scss @@ -0,0 +1,16 @@ +/* +Copyright 2015, 2016 OpenMarket Ltd +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_UnknownBody { + white-space: pre-wrap; +} diff --git a/res/css/views/rooms/_AppsDrawer.scss b/res/css/views/rooms/_AppsDrawer.scss new file mode 100644 index 0000000000..0cf3e7b9cb --- /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 0000000000..732ada088b --- /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 0000000000..031894afde --- /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 0000000000..4bb81a2e53 --- /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 0000000000..4495b142e6 --- /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 0000000000..5888820e0d --- /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 0000000000..5d47275efe --- /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 0000000000..83fc70aefb --- /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 0000000000..2e8f07b7ef --- /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 0000000000..ca790ef8f0 --- /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 0000000000..663d5bdf6e --- /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 0000000000..682c849cee --- /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 0000000000..86fd79d473 --- /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 0000000000..1076a0563a --- /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 0000000000..9c1349adbc --- /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 0000000000..581016d5ba --- /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 0000000000..331eb582ea --- /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 0000000000..4013af4c7c --- /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 0000000000..ccd3afe26c --- /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 0000000000..9988425b8f --- /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 0000000000..079ea16c68 --- /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 0000000000..37a663123d --- /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 0000000000..669ca13545 --- /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 0000000000..1ee56d9532 --- /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 0000000000..e4856531d9 --- /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 0000000000..93ee0e20fe --- /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 0000000000..4c88e44952 --- /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 0000000000..deb89a837c --- /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 0000000000..64eac25d01 --- /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 0000000000..feb60f4763 --- /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 0000000000..4b8b1cfbcb 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 0000000000..5238c09eda 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 0000000000..ba853c049e --- /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 0000000000..75b52484ea --- /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 0000000000..fd79d43bea 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 0000000000..9bc800958a 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 0000000000..c90da48ff3 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 0000000000..db433349b7 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 0000000000..1a7679e394 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 0000000000..59b6d16b06 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 0000000000..ee0f855895 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 0000000000..de1ea60d54 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 0000000000..637d03f63c 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 0000000000..7ea7459304 --- /dev/null +++ b/res/img/admin.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="16px" height="17px" viewBox="-1 -1 15 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: sketchtool 3.4.4 (395) - http://www.bohemiancoding.com/sketch --> + <title>icons_owner</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="02_19-Room-contextual-menu-hover" sketch:type="MSArtboardGroup" transform="translate(-1000.000000, -128.000000)"> + <g id="people_open" sketch:type="MSLayerGroup" transform="translate(966.000000, 59.000000)"> + <g id="icons_owner" transform="translate(35.000000, 70.000000)" sketch:type="MSShapeGroup"> + <path d="M0.441894529,1.80537109 C2.59277353,3.03442388 4.25305977,2.17675781 5.9832796,0.805371094 C8.01666135,2.17675787 9.50756797,3.12670903 11.6293941,1.80537109 C11.6293941,7.01538067 11.9379879,12.2253912 5.9832796,12.2253906 C0.0285712975,12.2253901 0.441894531,7.01538067 0.441894529,1.80537109 Z" id="Path-2-Copy" stroke="#FFFFFF" fill="#F6A623"></path> + <polygon id="Star-1" fill="#FFFFFF" points="6 8.8 3.88397309 9.91246118 4.28809827 7.55623059 2.57619654 5.88753882 4.94198655 5.54376941 6 3.4 7.05801345 5.54376941 9.42380346 5.88753882 7.71190173 7.55623059 8.11602691 9.91246118 "></polygon> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/attach.png b/res/img/attach.png new file mode 100644 index 0000000000..1bcb70045d 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 0000000000..c5e168944c --- /dev/null +++ b/res/img/avatar-error.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="25px" height="25px" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>5EF602F6-A36C-41EE-BAEC-50801DFD5492</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="1:1-chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Chat-People-2c-Invite-modal-ERROR" transform="translate(-611.000000, -358.000000)"> + <g id="avatar_error" transform="translate(611.000000, 358.000000)"> + <circle id="Oval-2" fill="#FF0064" cx="12.5" cy="12.5" r="12.5"></circle> + <path d="M11.2470703,15.0292969 C11.2470703,14.5901671 11.2733559,14.2082536 11.3259277,13.8835449 C11.3784996,13.5588363 11.4650873,13.2619642 11.5856934,12.9929199 C11.7062994,12.7238756 11.8624665,12.4687512 12.0541992,12.2275391 C12.2459319,11.9863269 12.4809556,11.7296563 12.7592773,11.4575195 C12.9695649,11.2534169 13.1659333,11.0601409 13.3483887,10.8776855 C13.530844,10.6952302 13.6916497,10.508139 13.8308105,10.3164062 C13.9699714,10.1246735 14.0797522,9.920574 14.1601562,9.70410156 C14.2405603,9.48762913 14.2807617,9.2464206 14.2807617,8.98046875 C14.2807617,8.39908563 14.1369643,7.9553238 13.8493652,7.64916992 C13.5617661,7.34301605 13.1396512,7.18994141 12.5830078,7.18994141 C12.3603504,7.18994141 12.1438813,7.22086558 11.9335938,7.28271484 C11.7233062,7.34456411 11.5346688,7.44352146 11.3676758,7.57958984 C11.2006828,7.71565823 11.0661626,7.88883358 10.9641113,8.09912109 C10.86206,8.3094086 10.8110352,8.5629868 10.8110352,8.85986328 L8.55664062,8.85986328 C8.56282555,8.27848017 8.66951394,7.76668515 8.87670898,7.32446289 C9.08390403,6.88224063 9.36840639,6.51115059 9.73022461,6.21118164 C10.0920428,5.91121269 10.515704,5.68546625 11.0012207,5.53393555 C11.4867375,5.38240484 12.0139946,5.30664062 12.5830078,5.30664062 C13.2076854,5.30664062 13.7643205,5.38704347 14.2529297,5.54785156 C14.7415389,5.70865966 15.1559228,5.94368335 15.4960938,6.25292969 C15.8362647,6.56217603 16.0944815,6.9394509 16.270752,7.38476562 C16.4470224,7.83008035 16.5351562,8.33414432 16.5351562,8.89697266 C16.5351562,9.30517782 16.4702155,9.68554511 16.340332,10.0380859 C16.2104486,10.3906268 16.0372732,10.7215154 15.8208008,11.0307617 C15.6043283,11.3400081 15.356935,11.6368801 15.0786133,11.9213867 C14.8002916,12.2058933 14.5126968,12.4873033 14.2158203,12.765625 C13.8756493,13.0748713 13.6483567,13.413491 13.5339355,13.7814941 C13.4195144,14.1494973 13.3592123,14.5654274 13.3530273,15.0292969 L11.2470703,15.0292969 Z M11.0893555,17.9145508 C11.0893555,17.7413728 11.1171872,17.5805671 11.1728516,17.4321289 C11.2285159,17.2836907 11.310465,17.1538092 11.4187012,17.0424805 C11.5269374,16.9311518 11.6599113,16.8445641 11.817627,16.7827148 C11.9753426,16.7208656 12.156249,16.6899414 12.3603516,16.6899414 C12.5644541,16.6899414 12.7453605,16.7208656 12.9030762,16.7827148 C13.0607918,16.8445641 13.1937657,16.9311518 13.302002,17.0424805 C13.4102382,17.1538092 13.4937334,17.2836907 13.5524902,17.4321289 C13.611247,17.5805671 13.640625,17.7413728 13.640625,17.9145508 C13.640625,18.2547218 13.529298,18.5392241 13.3066406,18.7680664 C13.0839833,18.9969087 12.7685567,19.1113281 12.3603516,19.1113281 C11.9521464,19.1113281 11.6382661,18.9969087 11.4187012,18.7680664 C11.1991363,18.5392241 11.0893555,18.2547218 11.0893555,17.9145508 L11.0893555,17.9145508 Z" id="?" fill="#FFFFFF"></path> + </g> + </g> + </g> +</svg> diff --git a/res/img/button-md-false.png b/res/img/button-md-false.png new file mode 100644 index 0000000000..6debbccc93 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 0000000000..6414933d96 --- /dev/null +++ b/res/img/button-md-false.svg @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="23px" height="15px" viewBox="0 0 23 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>D335F9E8-C813-47D7-B1BE-C8DEF2C8214F</title> + <desc>Created with sketchtool.</desc> + <defs> + <text id="text-1" font-family="markdown" font-size="14" font-weight="normal" fill="#DDDDDD"> + <tspan x="829.125" y="759"></tspan> + </text> + <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-2"> + <feOffset dx="1" dy="1" in="SourceAlpha" result="shadowOffsetInner1"></feOffset> + <feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite> + <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0526494565 0" type="matrix" in="shadowInnerInner1"></feColorMatrix> + </filter> + <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-3"> + <feOffset dx="1" dy="1" in="SourceAlpha" result="shadowOffsetInner1"></feOffset> + <feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite> + <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0526494565 0" type="matrix" in="shadowInnerInner1"></feColorMatrix> + </filter> + </defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" fill-opacity="1"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off-BUTTONS-ON" transform="translate(-829.000000, -745.000000)" fill="#DDDDDD"> + <g id="button_md_off"> + <use filter="url(#filter-2)" xlink:href="#text-1"></use> + <use filter="url(#filter-3)" xlink:href="#text-1"></use> + </g> + </g> + </g> +</svg> \ 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 0000000000..497f5385d1 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 0000000000..1184e6b351 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 0000000000..2e39c55e1e 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 0000000000..2acc4f675c --- /dev/null +++ b/res/img/button-md-true.svg @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="23px" height="15px" viewBox="0 0 23 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>2A63B135-4281-4FBB-A88C-012AE22E9594</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" font-size="14" font-family="markdown" font-weight="normal"> + <g id="02_x-Chat-text-input-markdown-panel-MD_on" transform="translate(-829.000000, -745.000000)" fill="#4A4A4A"> + <text id="button_markdown_on"> + <tspan x="829.125" y="759"></tspan> + </text> + </g> + </g> +</svg> \ 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 0000000000..ad9067f385 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 0000000000..d615867dc4 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 0000000000..161e740e90 --- /dev/null +++ b/res/img/button-text-bold-o-n.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>01F3F9B2-8F38-4BAF-A345-AECAC3D88E79</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off-BUTTONS-ON" transform="translate(-294.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_bold_ON"> + <rect id="Rectangle-108" fill="#4A4A4A" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M10.9882812,3.92523872 L13.4321289,3.92523872 C14.5457412,3.92523872 15.3540828,4.0836844 15.8571777,4.40058051 C16.3602727,4.71747663 16.6118164,5.22145922 16.6118164,5.9125434 C16.6118164,6.38162127 16.5017101,6.76654581 16.2814941,7.06732856 C16.0612782,7.36811131 15.7685565,7.54893633 15.4033203,7.60980903 L15.4033203,7.66351997 C15.9010442,7.77452312 16.2600087,7.98220334 16.4802246,8.28656684 C16.7004406,8.59093034 16.8105469,8.99554869 16.8105469,9.50043403 C16.8105469,10.2165834 16.5518418,10.7751716 16.0344238,11.1762153 C15.5170059,11.5772589 14.8142948,11.7777778 13.9262695,11.7777778 L10.9882812,11.7777778 L10.9882812,3.92523872 Z M12.6533203,7.035102 L13.6201172,7.035102 C14.0712913,7.035102 14.3980296,6.96527848 14.6003418,6.82562934 C14.802654,6.6859802 14.9038086,6.45502548 14.9038086,6.13275825 C14.9038086,5.83197549 14.7937023,5.61623872 14.5734863,5.48554145 C14.3532704,5.35484418 14.005048,5.28949653 13.5288086,5.28949653 L12.6533203,5.28949653 L12.6533203,7.035102 Z M12.6533203,8.35639106 L12.6533203,10.4027778 L13.7382812,10.4027778 C14.1966169,10.4027778 14.5349924,10.3150508 14.753418,10.1395942 C14.9718435,9.96413758 15.0810547,9.69558558 15.0810547,9.33393012 C15.0810547,8.68223415 14.6155646,8.35639106 13.6845703,8.35639106 L12.6533203,8.35639106 Z" id="B" fill="#FFFFFF"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..0fd0baa07e --- /dev/null +++ b/res/img/button-text-bold.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>9BC64A5B-F157-43FF-BCC4-02D30CDF520B</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off" transform="translate(-294.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_bold"> + <rect id="Rectangle-108" fill-opacity="0.1" fill="#000000" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M10.9882812,3.92523872 L13.4321289,3.92523872 C14.5457412,3.92523872 15.3540828,4.0836844 15.8571777,4.40058051 C16.3602727,4.71747663 16.6118164,5.22145922 16.6118164,5.9125434 C16.6118164,6.38162127 16.5017101,6.76654581 16.2814941,7.06732856 C16.0612782,7.36811131 15.7685565,7.54893633 15.4033203,7.60980903 L15.4033203,7.66351997 C15.9010442,7.77452312 16.2600087,7.98220334 16.4802246,8.28656684 C16.7004406,8.59093034 16.8105469,8.99554869 16.8105469,9.50043403 C16.8105469,10.2165834 16.5518418,10.7751716 16.0344238,11.1762153 C15.5170059,11.5772589 14.8142948,11.7777778 13.9262695,11.7777778 L10.9882812,11.7777778 L10.9882812,3.92523872 Z M12.6533203,7.035102 L13.6201172,7.035102 C14.0712913,7.035102 14.3980296,6.96527848 14.6003418,6.82562934 C14.802654,6.6859802 14.9038086,6.45502548 14.9038086,6.13275825 C14.9038086,5.83197549 14.7937023,5.61623872 14.5734863,5.48554145 C14.3532704,5.35484418 14.005048,5.28949653 13.5288086,5.28949653 L12.6533203,5.28949653 L12.6533203,7.035102 Z M12.6533203,8.35639106 L12.6533203,10.4027778 L13.7382812,10.4027778 C14.1966169,10.4027778 14.5349924,10.3150508 14.753418,10.1395942 C14.9718435,9.96413758 15.0810547,9.69558558 15.0810547,9.33393012 C15.0810547,8.68223415 14.6155646,8.35639106 13.6845703,8.35639106 L12.6533203,8.35639106 Z" id="B" fill="#4A4A4A"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..d4a40e889c --- /dev/null +++ b/res/img/button-text-bullet-o-n.svg @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>654917CF-20A4-49B6-B0A1-9875D7B733C8</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off-BUTTONS-ON" transform="translate(-422.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_bullet_ON" transform="translate(128.000000, 0.000000)"> + <rect id="Rectangle-108" fill="#4A4A4A" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M5.57421875,5.39496528 C5.57421875,4.79339977 5.71874855,4.33344343 6.0078125,4.01508247 C6.29687645,3.6967215 6.71288791,3.5375434 7.25585938,3.5375434 C7.7910183,3.5375434 8.20507666,3.69769805 8.49804688,4.01801215 C8.79101709,4.33832625 8.9375,4.79730604 8.9375,5.39496528 C8.9375,5.98871825 8.79004054,6.44769803 8.49511719,6.7719184 C8.20019384,7.09613877 7.78711203,7.25824653 7.25585938,7.25824653 C6.71679418,7.25824653 6.30175927,7.09613877 6.01074219,6.7719184 C5.71972511,6.44769803 5.57421875,5.98871825 5.57421875,5.39496528 L5.57421875,5.39496528 Z" id="•" fill="#FFFFFF"></path> + <path d="M11.5,5.5 L19.5,5.5" id="Line" stroke="#FFFFFF" stroke-linecap="round"></path> + <path d="M11.5,8.5 L19.5,8.5" id="Line-Copy" stroke="#FFFFFF" stroke-linecap="round"></path> + <path d="M11.5,11.5 L19.5,11.5" id="Line-Copy-3" stroke="#FFFFFF" stroke-linecap="round"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..ae3e640d8e --- /dev/null +++ b/res/img/button-text-bullet.svg @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>B7D94619-44BC-4184-A60A-DBC5BB54E5F9</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off" transform="translate(-422.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_bullet" transform="translate(128.000000, 0.000000)"> + <rect id="Rectangle-108" fill-opacity="0.1" fill="#000000" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M5.57421875,5.39496528 C5.57421875,4.79339977 5.71874855,4.33344343 6.0078125,4.01508247 C6.29687645,3.6967215 6.71288791,3.5375434 7.25585938,3.5375434 C7.7910183,3.5375434 8.20507666,3.69769805 8.49804688,4.01801215 C8.79101709,4.33832625 8.9375,4.79730604 8.9375,5.39496528 C8.9375,5.98871825 8.79004054,6.44769803 8.49511719,6.7719184 C8.20019384,7.09613877 7.78711203,7.25824653 7.25585938,7.25824653 C6.71679418,7.25824653 6.30175927,7.09613877 6.01074219,6.7719184 C5.71972511,6.44769803 5.57421875,5.98871825 5.57421875,5.39496528 L5.57421875,5.39496528 Z" id="•" fill="#4A4A4A"></path> + <path d="M11.5,5.5 L19.5,5.5" id="Line" stroke="#4A4A4A" stroke-linecap="round"></path> + <path d="M11.5,8.5 L19.5,8.5" id="Line-Copy" stroke="#4A4A4A" stroke-linecap="round"></path> + <path d="M11.5,11.5 L19.5,11.5" id="Line-Copy-3" stroke="#4A4A4A" stroke-linecap="round"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..8d1439c97b --- /dev/null +++ b/res/img/button-text-code-o-n.svg @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>B76754AB-42E6-48D2-9443-80CBC0DE02ED</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off-BUTTONS-ON" transform="translate(-422.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_code_ON" transform="translate(128.000000, 0.000000)"> + <rect id="Rectangle-108" fill="#4A4A4A" x="0" y="0" width="28" height="16" rx="8"></rect> + <polygon id="/" fill="#FFFFFF" points="15.9262695 4.14746094 12.9990234 12 12.1074219 12 15.034668 4.14746094"></polygon> + <g id="Group-5" opacity="0.5" transform="translate(17.000000, 5.000000)" stroke="#FFFFFF" stroke-linecap="round"> + <path d="M0.5,0.5 L2.97487373,2.97487373" id="Line"></path> + <path d="M0.5,3.02512627 L2.97487373,5.5" id="Line-Copy-4" transform="translate(1.737437, 4.262563) scale(1, -1) translate(-1.737437, -4.262563) "></path> + </g> + <g id="Group-5-Copy" opacity="0.5" transform="translate(9.500000, 8.000000) scale(-1, 1) translate(-9.500000, -8.000000) translate(8.000000, 5.000000)" stroke="#FFFFFF" stroke-linecap="round"> + <path d="M0.5,0.5 L2.97487373,2.97487373" id="Line"></path> + <path d="M0.5,3.02512627 L2.97487373,5.5" id="Line-Copy-4" transform="translate(1.737437, 4.262563) scale(1, -1) translate(-1.737437, -4.262563) "></path> + </g> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..24026cb709 --- /dev/null +++ b/res/img/button-text-code.svg @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>4CAFF494-61AE-4916-AFE8-D1E62F7CF0DE</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_on" transform="translate(-422.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_code" transform="translate(128.000000, 0.000000)"> + <rect id="Rectangle-108" fill-opacity="0.1" fill="#000000" x="0" y="0" width="28" height="16" rx="8"></rect> + <polygon id="/" fill-opacity="0.7" fill="#000000" points="15.9262695 4.14746094 12.9990234 12 12.1074219 12 15.034668 4.14746094"></polygon> + <g id="Group-5" opacity="0.5" transform="translate(17.000000, 5.000000)" stroke="#4A4A4A" stroke-linecap="round"> + <path d="M0.5,0.5 L2.97487373,2.97487373" id="Line"></path> + <path d="M0.5,3.02512627 L2.97487373,5.5" id="Line-Copy-4" transform="translate(1.737437, 4.262563) scale(1, -1) translate(-1.737437, -4.262563) "></path> + </g> + <g id="Group-5-Copy" opacity="0.5" transform="translate(9.500000, 8.000000) scale(-1, 1) translate(-9.500000, -8.000000) translate(8.000000, 5.000000)" stroke="#4A4A4A" stroke-linecap="round"> + <path d="M0.5,0.5 L2.97487373,2.97487373" id="Line"></path> + <path d="M0.5,3.02512627 L2.97487373,5.5" id="Line-Copy-4" transform="translate(1.737437, 4.262563) scale(1, -1) translate(-1.737437, -4.262563) "></path> + </g> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..d697010d40 --- /dev/null +++ b/res/img/button-text-formatting.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 24 18" style="enable-background:new 0 0 24 18;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#F6F6F6;} + .st1{enable-background:new ;} + .st2{fill:#4A4A4A;} +</style> +<path id="Rectangle-111" class="st0" d="M9,0h6c5,0,9,4,9,9l0,0c0,5-4,9-9,9H9c-5,0-9-4-9-9l0,0C0,4,4,0,9,0z"/> +<g class="st1"> + <path class="st2" d="M11.3,13l-0.6-2H7.6L7,13H5l3-8.6h2.2l3,8.6H11.3z M10.3,9.4c-0.6-1.8-0.9-2.9-1-3.1S9.2,5.9,9.1,5.7 + C9,6.2,8.6,7.5,8,9.4H10.3z"/> +</g> +<g class="st1"> + <path class="st2" d="M15.8,6.5c0.4,0,0.7,0.1,1,0.3s0.5,0.5,0.7,0.8h0.1l0.4-1h0.7L17.3,13h-0.8l0.2-1.2h0 + c-0.7,0.9-1.4,1.3-2.2,1.3c-0.5,0-1-0.2-1.3-0.6s-0.5-0.9-0.5-1.6c0-0.8,0.1-1.6,0.4-2.3s0.7-1.2,1.1-1.6S15.2,6.5,15.8,6.5z + M14.7,12.3c0.4,0,0.8-0.2,1.1-0.5s0.7-0.8,0.9-1.4s0.4-1.2,0.4-1.7c0-0.4-0.1-0.7-0.3-1s-0.5-0.4-0.9-0.4c-0.4,0-0.8,0.2-1.1,0.5 + S14.2,8.6,14,9.2s-0.3,1.2-0.3,1.8c0,0.4,0.1,0.8,0.3,1S14.4,12.3,14.7,12.3z"/> +</g> +</svg> 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 0000000000..15fe588596 --- /dev/null +++ b/res/img/button-text-italic-o-n.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>116426C2-0B55-480E-92B3-57D4B3ABAB90</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off-BUTTONS-ON" transform="translate(-326.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_italic_ON" transform="translate(32.000000, 0.000000)"> + <rect id="Rectangle-108" fill="#4A4A4A" x="0" y="0" width="28" height="16" rx="8"></rect> + <polygon id="I" fill="#FFFFFF" points="12.4619141 11.7777778 14.1323242 3.92523872 15.034668 3.92523872 13.3642578 11.7777778"></polygon> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..b5722e827b --- /dev/null +++ b/res/img/button-text-italic.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>9FBC844D-96CF-4DCB-B545-FCD23727218B</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off" transform="translate(-326.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_italic" transform="translate(32.000000, 0.000000)"> + <rect id="Rectangle-108" fill-opacity="0.1" fill="#000000" x="0" y="0" width="28" height="16" rx="8"></rect> + <polygon id="I" fill="#4A4A4A" points="12.4619141 11.7777778 14.1323242 3.92523872 15.034668 3.92523872 13.3642578 11.7777778"></polygon> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..869a2c2cc2 --- /dev/null +++ b/res/img/button-text-numbullet-o-n.svg @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>294F929B-31AA-4D0C-98B3-9CA96764060D</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off-BUTTONS-ON" transform="translate(-454.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_numbullet_ON" transform="translate(160.000000, 0.000000)"> + <rect id="Rectangle-108" fill="#4A4A4A" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M8.3046875,8.77777778 L7.09765625,8.77777778 L7.09765625,5.47309028 L7.109375,4.93012153 L7.12890625,4.33637153 C6.92838441,4.53689336 6.78906289,4.66840247 6.7109375,4.73090278 L6.0546875,5.25824653 L5.47265625,4.53168403 L7.3125,3.06684028 L8.3046875,3.06684028 L8.3046875,8.77777778 Z" id="1" fill="#FFFFFF"></path> + <path d="M11.5,5.5 L19.5,5.5" id="Line" stroke="#FFFFFF" stroke-linecap="round"></path> + <path d="M11.5,8.5 L19.5,8.5" id="Line-Copy" stroke="#FFFFFF" stroke-linecap="round"></path> + <path d="M11.5,11.5 L19.5,11.5" id="Line-Copy-3" stroke="#FFFFFF" stroke-linecap="round"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..8e5b8b87b6 --- /dev/null +++ b/res/img/button-text-numbullet.svg @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>F0F58459-A13A-48C5-9332-ABFB96726F05</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off" transform="translate(-454.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_numbullet" transform="translate(160.000000, 0.000000)"> + <rect id="Rectangle-108" fill-opacity="0.1" fill="#000000" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M8.3046875,8.77777778 L7.09765625,8.77777778 L7.09765625,5.47309028 L7.109375,4.93012153 L7.12890625,4.33637153 C6.92838441,4.53689336 6.78906289,4.66840247 6.7109375,4.73090278 L6.0546875,5.25824653 L5.47265625,4.53168403 L7.3125,3.06684028 L8.3046875,3.06684028 L8.3046875,8.77777778 Z" id="1" fill="#4A4A4A"></path> + <path d="M11.5,5.5 L19.5,5.5" id="Line" stroke="#4A4A4A" stroke-linecap="round"></path> + <path d="M11.5,8.5 L19.5,8.5" id="Line-Copy" stroke="#4A4A4A" stroke-linecap="round"></path> + <path d="M11.5,11.5 L19.5,11.5" id="Line-Copy-3" stroke="#4A4A4A" stroke-linecap="round"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..f8a86125c9 --- /dev/null +++ b/res/img/button-text-quote-o-n.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>3B24B8C7-64BE-4B3E-A748-94DB72E1210F</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off-BUTTONS-ON" transform="translate(-390.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_quote_ON" transform="translate(96.000000, 0.000000)"> + <rect id="Rectangle-108" fill="#4A4A4A" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M13.6762695,4.58734809 C13.2019833,4.85981039 12.8185236,5.09442718 12.5258789,5.29120551 C12.2332342,5.48798384 11.9355484,5.74782825 11.6328125,6.07074653 C11.350259,6.37348242 11.1333015,6.69135033 10.9819336,7.02435981 C10.8305656,7.35736929 10.7246097,7.7862387 10.6640625,8.3109809 L11.390625,8.3109809 C12.0162792,8.3109809 12.5082176,8.46486934 12.8664551,8.77265082 C13.2246925,9.08043231 13.4038086,9.53200657 13.4038086,10.1273872 C13.4038086,10.5512174 13.2448746,10.9472909 12.927002,11.3156196 C12.6091293,11.6839482 12.1726916,11.8681098 11.6176758,11.8681098 C10.7498329,11.8681098 10.1292336,11.5830378 9.75585938,11.0128852 C9.38248511,10.4427326 9.19580078,9.69347252 9.19580078,8.76508247 C9.19580078,8.10915471 9.33707541,7.51126029 9.61962891,6.97138129 C9.9021824,6.43150229 10.2452779,5.9496549 10.6489258,5.52582465 C11.0626648,5.09190321 11.5016253,4.72358007 11.9658203,4.42084418 C12.4300153,4.1181083 12.8185206,3.87087769 13.1313477,3.67914497 L13.6762695,4.58734809 Z M19.2768555,4.58734809 C18.8025692,4.85981039 18.4191095,5.09442718 18.1264648,5.29120551 C17.8338202,5.48798384 17.5361343,5.74782825 17.2333984,6.07074653 C16.9407537,6.38357361 16.7212735,6.70396429 16.5749512,7.03192817 C16.4286288,7.35989205 16.3251956,7.7862387 16.2646484,8.3109809 L16.9912109,8.3109809 C17.6168651,8.3109809 18.1088035,8.46486934 18.467041,8.77265082 C18.8252785,9.08043231 19.0043945,9.53200657 19.0043945,10.1273872 C19.0043945,10.5512174 18.8454606,10.9472909 18.5275879,11.3156196 C18.2097152,11.6839482 17.7732775,11.8681098 17.2182617,11.8681098 C16.3504188,11.8681098 15.7298196,11.5830378 15.3564453,11.0128852 C14.983071,10.4427326 14.7963867,9.69347252 14.7963867,8.76508247 C14.7963867,8.10915471 14.9376613,7.51126029 15.2202148,6.97138129 C15.5027683,6.43150229 15.8458639,5.9496549 16.2495117,5.52582465 C16.6632508,5.09190321 17.1022112,4.72358007 17.5664062,4.42084418 C18.0306013,4.1181083 18.4191065,3.87087769 18.7319336,3.67914497 L19.2768555,4.58734809 Z" id="“" fill="#FFFFFF"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..d70c261f5d --- /dev/null +++ b/res/img/button-text-quote.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>BFC0418B-9081-4789-A231-B75953157748</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off" transform="translate(-390.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_quote" transform="translate(96.000000, 0.000000)"> + <rect id="Rectangle-108" fill-opacity="0.1" fill="#000000" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M13.6762695,4.58734809 C13.2019833,4.85981039 12.8185236,5.09442718 12.5258789,5.29120551 C12.2332342,5.48798384 11.9355484,5.74782825 11.6328125,6.07074653 C11.350259,6.37348242 11.1333015,6.69135033 10.9819336,7.02435981 C10.8305656,7.35736929 10.7246097,7.7862387 10.6640625,8.3109809 L11.390625,8.3109809 C12.0162792,8.3109809 12.5082176,8.46486934 12.8664551,8.77265082 C13.2246925,9.08043231 13.4038086,9.53200657 13.4038086,10.1273872 C13.4038086,10.5512174 13.2448746,10.9472909 12.927002,11.3156196 C12.6091293,11.6839482 12.1726916,11.8681098 11.6176758,11.8681098 C10.7498329,11.8681098 10.1292336,11.5830378 9.75585938,11.0128852 C9.38248511,10.4427326 9.19580078,9.69347252 9.19580078,8.76508247 C9.19580078,8.10915471 9.33707541,7.51126029 9.61962891,6.97138129 C9.9021824,6.43150229 10.2452779,5.9496549 10.6489258,5.52582465 C11.0626648,5.09190321 11.5016253,4.72358007 11.9658203,4.42084418 C12.4300153,4.1181083 12.8185206,3.87087769 13.1313477,3.67914497 L13.6762695,4.58734809 Z M19.2768555,4.58734809 C18.8025692,4.85981039 18.4191095,5.09442718 18.1264648,5.29120551 C17.8338202,5.48798384 17.5361343,5.74782825 17.2333984,6.07074653 C16.9407537,6.38357361 16.7212735,6.70396429 16.5749512,7.03192817 C16.4286288,7.35989205 16.3251956,7.7862387 16.2646484,8.3109809 L16.9912109,8.3109809 C17.6168651,8.3109809 18.1088035,8.46486934 18.467041,8.77265082 C18.8252785,9.08043231 19.0043945,9.53200657 19.0043945,10.1273872 C19.0043945,10.5512174 18.8454606,10.9472909 18.5275879,11.3156196 C18.2097152,11.6839482 17.7732775,11.8681098 17.2182617,11.8681098 C16.3504188,11.8681098 15.7298196,11.5830378 15.3564453,11.0128852 C14.983071,10.4427326 14.7963867,9.69347252 14.7963867,8.76508247 C14.7963867,8.10915471 14.9376613,7.51126029 15.2202148,6.97138129 C15.5027683,6.43150229 15.8458639,5.9496549 16.2495117,5.52582465 C16.6632508,5.09190321 17.1022112,4.72358007 17.5664062,4.42084418 C18.0306013,4.1181083 18.4191065,3.87087769 18.7319336,3.67914497 L19.2768555,4.58734809 Z" id="“" fill="#4A4A4A"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..2914fcabe6 --- /dev/null +++ b/res/img/button-text-strike-o-n.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>69B11088-0F3A-4E14-BD9F-4FEF4115E99B</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off-BUTTONS-ON" transform="translate(-358.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_strike_ON" transform="translate(64.000000, 0.000000)"> + <rect id="Rectangle-108" fill="#4A4A4A" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M16.5107422,9.68842231 C16.5107422,10.3795065 16.2600937,10.9184008 15.7587891,11.3051215 C15.2574845,11.6918422 14.5771527,11.8851997 13.7177734,11.8851997 C12.7867792,11.8851997 12.0706405,11.7652464 11.5693359,11.5253364 L11.5693359,10.644477 C11.8916032,10.7805454 12.2425111,10.8879662 12.6220703,10.9667426 C13.0016295,11.0455191 13.3776023,11.0849067 13.75,11.0849067 C14.358727,11.0849067 14.8170558,10.9694293 15.125,10.7384711 C15.4329442,10.507513 15.5869141,10.1861457 15.5869141,9.77435981 C15.5869141,9.50222303 15.5323085,9.27932487 15.4230957,9.10565864 C15.3138829,8.9319924 15.1312676,8.77175638 14.8752441,8.62494575 C14.6192207,8.47813512 14.2298203,8.31163288 13.7070312,8.12543403 C12.9765588,7.86403949 12.4546728,7.55430952 12.1413574,7.19623481 C11.8280421,6.8381601 11.6713867,6.37087962 11.6713867,5.79437934 C11.6713867,5.18923309 11.8987607,4.70762983 12.3535156,4.34955512 C12.8082705,3.99148041 13.409827,3.81244575 14.1582031,3.81244575 C14.938806,3.81244575 15.656735,3.95567348 16.3120117,4.24213325 L16.0273438,5.03705512 C15.3792285,4.76491834 14.7490265,4.628852 14.1367188,4.628852 C13.6533179,4.628852 13.2755547,4.7326921 13.003418,4.94037543 C12.7312812,5.14805876 12.5952148,5.43630458 12.5952148,5.80512153 C12.5952148,6.07725831 12.6453446,6.30015647 12.7456055,6.4738227 C12.8458664,6.64748893 13.0150541,6.80682979 13.2531738,6.95185004 C13.4912935,7.0968703 13.8556291,7.25710633 14.3461914,7.43256293 C15.1697632,7.72618419 15.736408,8.04128521 16.0461426,8.37787543 C16.3558772,8.71446566 16.5107422,9.15131025 16.5107422,9.68842231 L16.5107422,9.68842231 Z" id="S-" fill="#FFFFFF"></path> + <path d="M9.5,8.5 L18.7195444,7.5" id="Line" stroke="#FFFFFF" stroke-linecap="round" opacity="0.5" transform="translate(14.109772, 8.000000) scale(1, -1) translate(-14.109772, -8.000000) "></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..5f262dc350 --- /dev/null +++ b/res/img/button-text-strike.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>A34F2223-34C6-46AE-AA47-38EC8984E9B3</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off" transform="translate(-358.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_strike" transform="translate(64.000000, 0.000000)"> + <rect id="Rectangle-108" fill-opacity="0.1" fill="#000000" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M16.5107422,9.68842231 C16.5107422,10.3795065 16.2600937,10.9184008 15.7587891,11.3051215 C15.2574845,11.6918422 14.5771527,11.8851997 13.7177734,11.8851997 C12.7867792,11.8851997 12.0706405,11.7652464 11.5693359,11.5253364 L11.5693359,10.644477 C11.8916032,10.7805454 12.2425111,10.8879662 12.6220703,10.9667426 C13.0016295,11.0455191 13.3776023,11.0849067 13.75,11.0849067 C14.358727,11.0849067 14.8170558,10.9694293 15.125,10.7384711 C15.4329442,10.507513 15.5869141,10.1861457 15.5869141,9.77435981 C15.5869141,9.50222303 15.5323085,9.27932487 15.4230957,9.10565864 C15.3138829,8.9319924 15.1312676,8.77175638 14.8752441,8.62494575 C14.6192207,8.47813512 14.2298203,8.31163288 13.7070312,8.12543403 C12.9765588,7.86403949 12.4546728,7.55430952 12.1413574,7.19623481 C11.8280421,6.8381601 11.6713867,6.37087962 11.6713867,5.79437934 C11.6713867,5.18923309 11.8987607,4.70762983 12.3535156,4.34955512 C12.8082705,3.99148041 13.409827,3.81244575 14.1582031,3.81244575 C14.938806,3.81244575 15.656735,3.95567348 16.3120117,4.24213325 L16.0273438,5.03705512 C15.3792285,4.76491834 14.7490265,4.628852 14.1367188,4.628852 C13.6533179,4.628852 13.2755547,4.7326921 13.003418,4.94037543 C12.7312812,5.14805876 12.5952148,5.43630458 12.5952148,5.80512153 C12.5952148,6.07725831 12.6453446,6.30015647 12.7456055,6.4738227 C12.8458664,6.64748893 13.0150541,6.80682979 13.2531738,6.95185004 C13.4912935,7.0968703 13.8556291,7.25710633 14.3461914,7.43256293 C15.1697632,7.72618419 15.736408,8.04128521 16.0461426,8.37787543 C16.3558772,8.71446566 16.5107422,9.15131025 16.5107422,9.68842231 L16.5107422,9.68842231 Z" id="S-" fill="#4A4A4A"></path> + <path d="M9.5,8.5 L18.7195444,7.5" id="Line" stroke="#4A4A4A" stroke-linecap="round" opacity="0.5" transform="translate(14.109772, 8.000000) scale(1, -1) translate(-14.109772, -8.000000) "></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..870be3ce6a --- /dev/null +++ b/res/img/button-text-underline-o-n.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>FD84FF7C-43E4-4312-90AB-5A59AD018377</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_off-BUTTONS-ON" transform="translate(-390.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_underline_ON" transform="translate(96.000000, 0.000000)"> + <rect id="Rectangle-108" fill="#4A4A4A" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M17.0092773,4.14746094 L17.0092773,9.22851562 C17.0092773,10.1237024 16.738935,10.8273086 16.1982422,11.3393555 C15.6575494,11.8514023 14.9145555,12.1074219 13.9692383,12.1074219 C13.0239211,12.1074219 12.2925644,11.849612 11.7751465,11.3339844 C11.2577285,10.8183568 10.9990234,10.1093795 10.9990234,9.20703125 L10.9990234,4.14746094 L11.9121094,4.14746094 L11.9121094,9.27148438 C11.9121094,9.92676109 12.091144,10.4298485 12.4492188,10.7807617 C12.8072935,11.1316749 13.3336554,11.3071289 14.0283203,11.3071289 C14.6907585,11.3071289 15.2010073,11.1307798 15.559082,10.7780762 C15.9171567,10.4253726 16.0961914,9.91959965 16.0961914,9.26074219 L16.0961914,4.14746094 L17.0092773,4.14746094 Z" id="U" fill="#FFFFFF"></path> + <path d="M9.5,13.5 L18.7195444,13.5" id="Line" stroke="#4A4A4A" stroke-linecap="round" opacity="0.5" transform="translate(14.109772, 13.500000) scale(1, -1) translate(-14.109772, -13.500000) "></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..26f448539c --- /dev/null +++ b/res/img/button-text-underline.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="28px" height="16px" viewBox="0 0 28 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>13E7EE68-9B16-4A3D-8F9F-31E4BAB7E438</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="02_x-Chat-text-input-markdown-panel-MD_on" transform="translate(-390.000000, -745.000000)"> + <g id="format-buttons-A-Copy" transform="translate(294.000000, 745.000000)"> + <g id="button_text_underline" transform="translate(96.000000, 0.000000)"> + <rect id="Rectangle-108" fill-opacity="0.1" fill="#000000" x="0" y="0" width="28" height="16" rx="8"></rect> + <path d="M17.0092773,4.14746094 L17.0092773,9.22851562 C17.0092773,10.1237024 16.738935,10.8273086 16.1982422,11.3393555 C15.6575494,11.8514023 14.9145555,12.1074219 13.9692383,12.1074219 C13.0239211,12.1074219 12.2925644,11.849612 11.7751465,11.3339844 C11.2577285,10.8183568 10.9990234,10.1093795 10.9990234,9.20703125 L10.9990234,4.14746094 L11.9121094,4.14746094 L11.9121094,9.27148438 C11.9121094,9.92676109 12.091144,10.4298485 12.4492188,10.7807617 C12.8072935,11.1316749 13.3336554,11.3071289 14.0283203,11.3071289 C14.6907585,11.3071289 15.2010073,11.1307798 15.559082,10.7780762 C15.9171567,10.4253726 16.0961914,9.91959965 16.0961914,9.26074219 L16.0961914,4.14746094 L17.0092773,4.14746094 Z" id="U" fill-opacity="0.7" fill="#000000"></path> + <path d="M9.5,13.5 L18.7195444,13.5" id="Line" stroke="#4A4A4A" stroke-linecap="round" opacity="0.5" transform="translate(14.109772, 13.500000) scale(1, -1) translate(-14.109772, -13.500000) "></path> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/call.png b/res/img/call.png new file mode 100644 index 0000000000..a7805e0596 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 0000000000..f528f9a24e --- /dev/null +++ b/res/img/call.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="30px" height="22px" viewBox="-1 -1 30 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: bin/sketchtool 1.4 (305) - http://www.bohemiancoding.com/sketch --> + <title>icons_video</title> + <desc>Created with bin/sketchtool.</desc> + <defs></defs> + <g id="02-Chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="02_13-Chat-member-profile" sketch:type="MSArtboardGroup" transform="translate(-910.000000, -723.000000)" stroke="#76CFA6"> + <g id="icons_video" sketch:type="MSLayerGroup" transform="translate(910.000000, 722.000000)"> + <g id="Rectangle-20-+-Path-16" transform="translate(0.000000, 0.464286)" sketch:type="MSShapeGroup"> + <rect id="Rectangle-20" fill="#FFFFFF" x="0" y="0.535714286" width="20" height="20" rx="4"></rect> + <path d="M20.75,10.6964286 C20.75,14.0446429 24.188247,15.7371974 24.188247,15.7371974 C25.5057636,16.651593 26.5738219,16.0843085 26.5738219,14.4868066 L26.5738219,6.90605053 C26.5738219,5.30108314 25.4784055,4.70120148 24.188247,5.65565975 C24.188247,5.65565975 20.75,7.34821429 20.75,10.6964286 Z" id="Path-16"></path> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/camera.svg b/res/img/camera.svg new file mode 100644 index 0000000000..6519496f78 --- /dev/null +++ b/res/img/camera.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="17px" height="15px" viewBox="-1 -1 16 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>icon_camera</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="06a-Room-settings" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="06_4-Room-settings-admin" sketch:type="MSArtboardGroup" transform="translate(-248.000000, -71.000000)" fill="#454545"> + <path d="M255.5,76.25 C256.119795,76.25 256.649737,76.4700499 257.089844,76.9101562 C257.52995,77.3502626 257.75,77.8802052 257.75,78.5 C257.75,79.1197948 257.52995,79.6497374 257.089844,80.0898438 C256.649737,80.5299501 256.119795,80.75 255.5,80.75 C254.880205,80.75 254.350263,80.5299501 253.910156,80.0898438 C253.47005,79.6497374 253.25,79.1197948 253.25,78.5 C253.25,77.8802052 253.47005,77.3502626 253.910156,76.9101562 C254.350263,76.4700499 254.880205,76.25 255.5,76.25 L255.5,76.25 Z M261,73 C261.552086,73 262.023436,73.1953105 262.414062,73.5859375 C262.804689,73.9765645 263,74.4479139 263,75 L263,82 C263,82.5520861 262.804689,83.0234355 262.414062,83.4140625 C262.023436,83.8046895 261.552086,84 261,84 L250,84 C249.447914,84 248.976564,83.8046895 248.585938,83.4140625 C248.195311,83.0234355 248,82.5520861 248,82 L248,75 C248,74.4479139 248.195311,73.9765645 248.585938,73.5859375 C248.976564,73.1953105 249.447914,73 250,73 L251.75,73 L252.148438,71.9375 C252.247396,71.6822904 252.428384,71.4622405 252.691406,71.2773438 C252.954428,71.092447 253.223957,71 253.5,71 L257.5,71 C257.776043,71 258.045572,71.092447 258.308594,71.2773438 C258.571616,71.4622405 258.752604,71.6822904 258.851562,71.9375 L259.25,73 L261,73 Z M255.5,82 C256.463546,82 257.287757,81.6575555 257.972656,80.9726562 C258.657556,80.287757 259,79.4635465 259,78.5 C259,77.5364535 258.657556,76.712243 257.972656,76.0273438 C257.287757,75.3424445 256.463546,75 255.5,75 C254.536454,75 253.712243,75.3424445 253.027344,76.0273438 C252.342444,76.712243 252,77.5364535 252,78.5 C252,79.4635465 252.342444,80.287757 253.027344,80.9726562 C253.712243,81.6575555 254.536454,82 255.5,82 L255.5,82 Z" id="icon_camera" sketch:type="MSShapeGroup"></path> + </g> + </g> +</svg> diff --git a/res/img/camera_green.svg b/res/img/camera_green.svg new file mode 100644 index 0000000000..5aae5502cd --- /dev/null +++ b/res/img/camera_green.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="2048px" height="1792px" viewBox="0 0 2048 1792" enable-background="new 0 0 2048 1792" xml:space="preserve"> +<path fill="#76CFA6" d="M1024,672c79.333,0,147.166,28.167,203.5,84.5c56.333,56.334,84.5,124.167,84.5,203.5 + c0,79.334-28.167,147.167-84.5,203.5c-56.334,56.334-124.167,84.5-203.5,84.5c-79.334,0-147.167-28.166-203.5-84.5 + C764.166,1107.167,736,1039.334,736,960c0-79.333,28.166-147.166,84.5-203.5C876.833,700.167,944.666,672,1024,672z M1728,256 + c70.666,0,131,25,181,75s75,110.334,75,181v896c0,70.667-25,131-75,181s-110.334,75-181,75H320c-70.667,0-131-25-181-75 + s-75-110.333-75-181V512c0-70.666,25-131,75-181s110.333-75,181-75h224l51-136c12.666-32.666,35.833-60.833,69.5-84.5 + C698.166,11.834,732.666,0,768,0h512c35.333,0,69.833,11.834,103.5,35.5c33.666,23.667,56.833,51.834,69.5,84.5l51,136H1728z + M1024,1408c123.333,0,228.833-43.833,316.5-131.5c87.666-87.666,131.5-193.166,131.5-316.5c0-123.333-43.834-228.833-131.5-316.5 + C1252.833,555.834,1147.333,512,1024,512c-123.334,0-228.834,43.834-316.5,131.5C619.833,731.167,576,836.667,576,960 + c0,123.334,43.833,228.834,131.5,316.5C795.166,1364.167,900.666,1408,1024,1408z"/> +</svg> diff --git a/res/img/cancel-black.png b/res/img/cancel-black.png new file mode 100644 index 0000000000..87dcfd41a8 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 0000000000..a928c61b09 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 0000000000..a72a970b62 --- /dev/null +++ b/res/img/cancel-red.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.2 (15857) - http://www.bohemiancoding.com/sketch --> + <title>Slice 1</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <path d="M9.74464309,-3.02908503 L8.14106175,-3.02908503 L8.14106175,8.19448443 L-3.03028759,8.19448443 L-3.03028759,9.7978515 L8.14106175,9.7978515 L8.14106175,20.9685098 L9.74464309,20.9685098 L9.74464309,9.7978515 L20.9697124,9.7978515 L20.9697124,8.19448443 L9.74464309,8.19448443 L9.74464309,-3.02908503" id="Fill-108" opacity="0.9" fill="#ff0064" sketch:type="MSShapeGroup" transform="translate(8.969712, 8.969712) rotate(-315.000000) translate(-8.969712, -8.969712) "></path> + </g> +</svg> diff --git a/res/img/cancel-small.svg b/res/img/cancel-small.svg new file mode 100644 index 0000000000..e4c8cafc10 --- /dev/null +++ b/res/img/cancel-small.svg @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="14px" height="14px" viewBox="-1 -1 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>Line + Line</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="Line-+-Line" sketch:type="MSLayerGroup" transform="translate(2.000000, 2.000000)" stroke="#4A4A4A" stroke-width="2.82" stroke-linecap="square"> + <path d="M8,0 L0,8" id="Line" sketch:type="MSShapeGroup"></path> + <path d="M0,0 L8,8" id="Line" sketch:type="MSShapeGroup"></path> + </g> + </g> +</svg> \ 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 0000000000..65e14c2fbc --- /dev/null +++ b/res/img/cancel-white.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.2 (15857) - http://www.bohemiancoding.com/sketch --> + <title>Slice 1</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <path d="M9.74464309,-3.02908503 L8.14106175,-3.02908503 L8.14106175,8.19448443 L-3.03028759,8.19448443 L-3.03028759,9.7978515 L8.14106175,9.7978515 L8.14106175,20.9685098 L9.74464309,20.9685098 L9.74464309,9.7978515 L20.9697124,9.7978515 L20.9697124,8.19448443 L9.74464309,8.19448443 L9.74464309,-3.02908503" id="Fill-108" opacity="0.9" fill="#ffffff" sketch:type="MSShapeGroup" transform="translate(8.969712, 8.969712) rotate(-315.000000) translate(-8.969712, -8.969712) "></path> + </g> +</svg> \ No newline at end of file diff --git a/res/img/cancel.png b/res/img/cancel.png new file mode 100644 index 0000000000..2bda8ff5bf 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 0000000000..e32060025e --- /dev/null +++ b/res/img/cancel.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.2 (15857) - http://www.bohemiancoding.com/sketch --> + <title>Slice 1</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <path d="M9.74464309,-3.02908503 L8.14106175,-3.02908503 L8.14106175,8.19448443 L-3.03028759,8.19448443 L-3.03028759,9.7978515 L8.14106175,9.7978515 L8.14106175,20.9685098 L9.74464309,20.9685098 L9.74464309,9.7978515 L20.9697124,9.7978515 L20.9697124,8.19448443 L9.74464309,8.19448443 L9.74464309,-3.02908503" id="Fill-108" opacity="0.9" fill="#454545" sketch:type="MSShapeGroup" transform="translate(8.969712, 8.969712) rotate(-315.000000) translate(-8.969712, -8.969712) "></path> + </g> +</svg> \ 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 0000000000..2e3d759be2 --- /dev/null +++ b/res/img/cancel_green.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.2 (15857) - http://www.bohemiancoding.com/sketch --> + <title>Slice 1</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <path d="M9.74464309,-3.02908503 L8.14106175,-3.02908503 L8.14106175,8.19448443 L-3.03028759,8.19448443 L-3.03028759,9.7978515 L8.14106175,9.7978515 L8.14106175,20.9685098 L9.74464309,20.9685098 L9.74464309,9.7978515 L20.9697124,9.7978515 L20.9697124,8.19448443 L9.74464309,8.19448443 L9.74464309,-3.02908503" id="Fill-108" opacity="0.9" fill="#76CFA6" sketch:type="MSShapeGroup" transform="translate(8.969712, 8.969712) rotate(-315.000000) translate(-8.969712, -8.969712) "></path> + </g> +</svg> \ 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 0000000000..efb0065de9 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 0000000000..18a4684e47 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 0000000000..81236f91bc 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 0000000000..d8752ed9fe 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 0000000000..b7307a11c7 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 0000000000..2450542b63 --- /dev/null +++ b/res/img/create-big.svg @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="26px" height="26px" viewBox="-1 -1 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: sketchtool 3.4 (381) - http://www.bohemiancoding.com/sketch --> + <title>icons_create_room</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="01-Sign-up" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="01_2-Sign-up-2" sketch:type="MSArtboardGroup" transform="translate(-14.000000, -653.000000)"> + <g id="Left-panel" sketch:type="MSLayerGroup" transform="translate(-4.000000, 0.000000)"> + <g id="right_bottom" transform="translate(0.000000, 626.000000)" sketch:type="MSShapeGroup"> + <g id="Group-Copy-29" transform="translate(18.000000, 27.000000)"> + <g id="Group-Copy-15"> + <g id="icons_create_room"> + <g id="Oval-1-Copy-7-+-Group-Copy-5-Copy-Copy-Copy-Copy-Copy-Copy-Copy-Copy-Copy-Copy-Copy" fill="#454545"> + <circle id="Oval-1-Copy-7" cx="12" cy="12" r="12"></circle> + </g> + <path d="M7,12 L17,12" id="Line" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round"></path> + <path d="M12,7 L12,17" id="Line" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round"></path> + </g> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/create.png b/res/img/create.png new file mode 100644 index 0000000000..2d6107ac50 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 0000000000..8ff20a116d 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 0000000000..03cab69c4a 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 0000000000..5631a2ae3e --- /dev/null +++ b/res/img/directory-big.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="26px" height="26px" viewBox="-1 -2 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: sketchtool 3.4 (381) - http://www.bohemiancoding.com/sketch --> + <title>icons_directory</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="01-Sign-up" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="01_2-Sign-up-2" sketch:type="MSArtboardGroup" transform="translate(-14.000000, -689.000000)" fill="#454545"> + <g id="Left-panel" sketch:type="MSLayerGroup" transform="translate(-4.000000, 0.000000)"> + <g id="right_bottom" transform="translate(0.000000, 626.000000)" sketch:type="MSShapeGroup"> + <g id="Group-Copy-29" transform="translate(18.000000, 27.000000)"> + <g id="icons_directory" transform="translate(0.000000, 36.000000)"> + <path d="M8.74940618,2.46971496 C8.58491686,2.46971496 8.47565321,2.15795724 8.32719715,1.68349169 C8.11698337,1.01306413 7.80106888,0 6.69002375,0 L1.38182898,0 C0.63064133,0 0.0243467933,0.589073634 0.00118764846,1.35391924 L0,19.6264846 C0,20.3895487 0.620546318,21.0095012 1.38182898,21.0095012 L22.6187648,21.0095012 C23.3800475,21.0095012 24,20.3895487 24,19.6264846 L24,3.85213777 C24,3.08966746 23.3800475,2.46971496 22.6187648,2.46971496 L8.74940618,2.46971496 Z M23.1086698,19.5068597 C23.1086698,19.7757653 22.8889549,19.9946556 22.6187648,19.9946556 L1.38182898,19.9946556 C1.11163895,19.9946556 0.890736342,19.7757653 0.890736342,19.5068597 L0.89192399,6.49465558 L23.1086698,6.49465558 L23.1086698,19.5068597 L23.1086698,19.5068597 Z M23.1086698,5.60391924 L0.89192399,5.60391924 L0.89192399,1.36698337 C0.90023753,1.09976247 1.11579572,0.890736342 1.38182898,0.890736342 L6.69002375,0.890736342 C7.10273159,0.890736342 7.24643705,1.2131829 7.47624703,1.94893112 C7.66270784,2.54453682 7.91805226,3.36045131 8.74940618,3.36045131 L22.6187648,3.36045131 C22.8889549,3.36045131 23.1086698,3.5807601 23.1086698,3.85213777 L23.1086698,5.60391924 L23.1086698,5.60391924 Z" id="Fill-137"></path> + <path d="M23.1086698,19.5068597 C23.1086698,19.7757653 22.8889549,19.9946556 22.6187648,19.9946556 L1.38182898,19.9946556 C1.11163895,19.9946556 0.890736342,19.7757653 0.890736342,19.5068597 L0.89192399,6.49465558 L23.1086698,6.49465558 L23.1086698,19.5068597 L23.1086698,19.5068597 Z" id="Path-Copy-2" fill-opacity="0.1"></path> + <path d="M0.89192399,5.60391924 L0.89192399,1.36698337 C0.90023753,1.09976247 1.11579572,0.890736342 1.38182898,0.890736342 L6.69002375,0.890736342 C7.10273159,0.890736342 7.24643705,1.2131829 7.47624703,1.94893112 C7.66270784,2.54453682 7.91805226,3.36045131 8.74940618,3.36045131 L22.6187648,3.36045131 C22.8889549,3.36045131 23.1086698,3.5807601 23.1086698,3.85213777 L23.1086698,5.60391924 L0.89192399,5.60391924 Z" id="Path-Copy" fill-opacity="0.1"></path> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/download.png b/res/img/download.png new file mode 100644 index 0000000000..1999ebf7ab 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 0000000000..d0ea090d8a --- /dev/null +++ b/res/img/download.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="12px" height="14px" viewBox="-1 -1 12 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>Fill 75</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="02-Chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="02_x-Chat-MAX" sketch:type="MSArtboardGroup" transform="translate(-280.000000, -546.000000)" fill="#76CFA6"> + <g id="Group" sketch:type="MSLayerGroup" transform="translate(243.000000, 58.000000)"> + <g id="Group-Copy-13-+-Matrix-HQ-Copy-17-+-Bitmap" transform="translate(1.000000, 181.000000)" sketch:type="MSShapeGroup"> + <g id="Group-Copy-13"> + <path d="M45.3400426,312.526774 C45.4870048,312.526774 45.633967,312.470898 45.7464849,312.35838 C45.9699899,312.134109 45.9699899,311.771296 45.7464849,311.547026 L41.3659396,307.168011 C41.1424345,306.943741 40.7788562,306.944506 40.5545857,307.167246 L36.1686823,311.540137 C35.9444119,311.764408 35.9436465,312.127986 36.1671515,312.352256 C36.3906565,312.577292 36.7542349,312.577292 36.9785053,312.353787 L40.3915495,308.950694 L40.3930804,318.425929 C40.3930804,318.742816 40.6510296,319 40.9671515,319 C41.2848042,319 41.5412226,318.742816 41.5412226,318.425929 L41.5396917,308.965237 L44.9343656,312.35838 C45.0461182,312.470898 45.1930804,312.526774 45.3400426,312.526774 L45.3400426,312.526774 Z" id="Fill-75" transform="translate(40.957057, 313.000000) rotate(-180.000000) translate(-40.957057, -313.000000) "></path> + </g> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..0ab2c6efbe --- /dev/null +++ b/res/img/e2e-blocked.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="12px" height="12px" viewBox="0 0 12 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>2805649B-D39D-43EA-A357-659EF9B97BA4</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Typing-Indicator" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="typing-indicator" transform="translate(-301.000000, -328.000000)" fill="#BA6363"> + <path d="M307,340 C310.313708,340 313,337.313708 313,334 C313,330.686292 310.313708,328 307,328 C303.686292,328 301,330.686292 301,334 C301,337.313708 303.686292,340 307,340 Z M304,333 L310,333 L310,335 L304,335 L304,333 Z" id="blocked_icon"></path> + </g> + </g> +</svg> \ 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 0000000000..1467223638 --- /dev/null +++ b/res/img/e2e-unencrypted.svg @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="14px" height="12px" viewBox="0 0 14 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>16F5F38E-A6A3-472A-BC13-13F0F12876CF</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Typing-Indicator" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.200000003"> + <g id="typing-indicator" transform="translate(-301.000000, -141.000000)" fill="#000000"> + <g id="unencrypted_icon" transform="translate(301.000000, 141.000000)"> + <g id="Lock-Copy" transform="translate(0.000000, 4.000000)"> + <g id="Layer_1"> + <polygon id="Shape" points="1.33333333 0.666666667 0 0.666666667 0 8 5 8 10 8 10 0.666666667 8.66666667 0.666666667"></polygon> + </g> + </g> + <g id="Lock-Copy-2" transform="translate(6.000000, 0.000000)"> + <g id="Layer_1"> + <path d="M7.66666667,3.66666667 C7.66666667,1.63333333 6.03333333,0 4,0 C1.96666667,0 0.333333333,1.63333333 0.333333333,3.66666667 L0.333333333,4.66666667 L7.66666667,4.66666667 L7.66666667,3.66666667 Z M1.66666667,4.66666667 L1.66666667,3.66666667 C1.66666667,2.36666667 2.7,1.33333333 4,1.33333333 C5.3,1.33333333 6.33333333,2.36666667 6.33333333,3.66666667 L6.33333333,4.66666667 L4,4.66666667 L1.66666667,4.66666667 Z" id="Shape"></path> + </g> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..b65f50b2b6 --- /dev/null +++ b/res/img/e2e-verified.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="10px" height="12px" viewBox="0 0 10 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>48BF5D32-306C-4B20-88EB-24B1F743CAC9</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Typing-Indicator" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="typing-indicator" transform="translate(-301.000000, -172.000000)" fill="#76CFA6"> + <path d="M309.666667,175.666667 C309.666667,173.633333 308.033333,172 306,172 C303.966667,172 302.333333,173.633333 302.333333,175.666667 L302.333333,176.666667 L301,176.666667 L301,184 L306,184 L311,184 L311,176.666667 L309.666667,176.666667 L309.666667,175.666667 Z M306,176.666667 L303.666667,176.666667 L303.666667,175.666667 C303.666667,174.366667 304.7,173.333333 306,173.333333 C307.3,173.333333 308.333333,174.366667 308.333333,175.666667 L308.333333,176.666667 L306,176.666667 L306,176.666667 Z" id="verified_icon"></path> + </g> + </g> +</svg> \ 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 0000000000..8a55f199ba --- /dev/null +++ b/res/img/e2e-warning.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="15px" height="12px" viewBox="0 0 15 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>CCDDE6F6-B552-48FD-AD54-6939841CA2DD</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Typing-Indicator" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="typing-indicator" transform="translate(-299.000000, -294.000000)" fill="#E9BF37"> + <path d="M313.568455,304.982113 L306.898576,294.310305 C306.776309,294.117108 306.563606,294 306.334971,294 C306.106335,294 305.893632,294.117108 305.771366,294.310305 L299.101486,304.982113 C298.971497,305.189962 298.966004,305.452367 299.087182,305.665474 C299.20836,305.87858 299.436676,306.008036 299.681766,306.002604 L313.021525,306.002604 C313.260642,305.995965 313.477893,305.861783 313.590891,305.650946 C313.703889,305.440108 313.695328,305.184904 313.568455,304.982113 L313.568455,304.982113 Z M307.018633,304.00164 L305.684657,304.00164 L305.684657,302.667664 L307.018633,302.667664 L307.018633,304.00164 Z M307.018633,301.333689 L305.684657,301.333689 L305.684657,297.998749 L307.018633,297.998749 L307.018633,301.333689 Z" id="unverified_icon"></path> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/edit.png b/res/img/edit.png new file mode 100644 index 0000000000..6f373d3f3d 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 0000000000..9ba0060774 --- /dev/null +++ b/res/img/edit.svg @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="512px" height="512px" viewBox="0 0 512 512" xml:space="preserve"> + <g> + <rect fill="#000000" x="167.664" y="69.108" transform="matrix(-0.7071 -0.7071 0.7071 -0.7071 219.262 633.2606)" width="146.238" height="404.224"/> + <path fill="#000000" d="M502.05,64.887L447.116,9.952c-13.386-13.385-36.032-12.44-50.585,2.113l-51.609,51.61L448.328,167.08l51.609-51.608 + C514.486,100.918,515.434,78.271,502.05,64.887z"/> + <polygon fill="#000000" points="36.56,378.704 0,512 133.283,475.439"/> + </g> +</svg> diff --git a/res/img/edit_green.svg b/res/img/edit_green.svg new file mode 100644 index 0000000000..f7f4c7adcb --- /dev/null +++ b/res/img/edit_green.svg @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="512px" height="512px" viewBox="0 0 512 512" xml:space="preserve"> + <g> + <rect fill="#76CFA6" x="167.664" y="69.108" transform="matrix(-0.7071 -0.7071 0.7071 -0.7071 219.262 633.2606)" width="146.238" height="404.224"/> + <path fill="#76CFA6" d="M502.05,64.887L447.116,9.952c-13.386-13.385-36.032-12.44-50.585,2.113l-51.609,51.61L448.328,167.08l51.609-51.608 + C514.486,100.918,515.434,78.271,502.05,64.887z"/> + <polygon fill="#76CFA6" points="36.56,378.704 0,512 133.283,475.439"/> + </g> +</svg> diff --git a/res/img/ellipsis.svg b/res/img/ellipsis.svg new file mode 100644 index 0000000000..d60c844089 --- /dev/null +++ b/res/img/ellipsis.svg @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>icons_archive</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="ellipsis" sketch:type="MSLayerGroup"> + <g id="03-Input" sketch:type="MSShapeGroup"> + <g id="03_3-Input-filled"> + <g id="right_default"> + <g id="right_middle"> + <g id="Left-panel"> + <g id="icons_archive"> + <rect id="Rectangle-1" fill="#ECECEC" x="0" y="0" width="24" height="24"></rect> + <path d="M7.338,13.154 C7.842,13.154 8.164,12.776 8.164,12.272 C8.164,11.754 7.842,11.39 7.338,11.39 C6.848,11.39 6.512,11.754 6.512,12.272 C6.498,12.776 6.848,13.154 7.338,13.154 L7.338,13.154 L7.338,13.154 Z M12,13.154 C12.504,13.154 12.84,12.776 12.84,12.272 C12.826,11.754 12.504,11.39 12.014,11.39 C11.524,11.39 11.174,11.754 11.174,12.272 C11.16,12.776 11.51,13.154 12,13.154 L12,13.154 L12,13.154 Z M16.662,13.154 C17.18,13.154 17.502,12.776 17.502,12.272 C17.502,11.754 17.166,11.39 16.676,11.39 C16.186,11.39 15.836,11.754 15.836,12.272 C15.836,12.776 16.172,13.154 16.662,13.154 L16.662,13.154 L16.662,13.154 Z" id="Matrix-HQ-Copy-15" fill="#454545"></path> + </g> + </g> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/eol.svg b/res/img/eol.svg new file mode 100644 index 0000000000..02d1946cf4 --- /dev/null +++ b/res/img/eol.svg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="22px" height="16px" viewBox="-1 -1 22 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: sketchtool 3.4 (381) - http://www.bohemiancoding.com/sketch --> + <title>icon_eol</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="03-Input" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="03_2-Mentions-autocomplete" sketch:type="MSArtboardGroup" transform="translate(-772.000000, -670.000000)"> + <g id="icon_eol" sketch:type="MSLayerGroup" transform="translate(772.000000, 670.000000)"> + <path d="M0,7.5 L17,7.5" id="Path-118" stroke="#76CFA6" sketch:type="MSShapeGroup"></path> + <path d="M13,2 L18,7.38056399 L13,12.761128" id="Path-119" stroke="#76CFA6" sketch:type="MSShapeGroup"></path> + <path d="M19.5,0 L19.5,14" id="Path-120" stroke="#76CFA6" sketch:type="MSShapeGroup"></path> + </g> + </g> + </g> +</svg> diff --git a/res/img/f4c371.png b/res/img/f4c371.png new file mode 100644 index 0000000000..ad3b8f1616 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 0000000000..5904ea8284 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 0000000000..c2c2799f37 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 0000000000..af018efa6d 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 0000000000..3cf6cb494e 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 0000000000..83932267f8 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 0000000000..20aba851ea --- /dev/null +++ b/res/img/files.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="17px" height="22px" viewBox="0 0 17 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: bin/sketchtool 1.4 (305) - http://www.bohemiancoding.com/sketch --> + <title>icons_browse_files</title> + <desc>Created with bin/sketchtool.</desc> + <defs></defs> + <g id="02-Chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="02_13-Chat-member-profile" sketch:type="MSArtboardGroup" transform="translate(-1025.000000, -33.000000)"> + <g id="icons_browse_files" sketch:type="MSLayerGroup" transform="translate(1025.000000, 32.000000)"> + <g id="Rectangle-5-+-Rectangle-6-Copy" transform="translate(0.000000, 1.000000)" sketch:type="MSShapeGroup"> + <path d="M0,4.00955791 C0,1.79514022 1.78163126,0 3.99825563,0 L9.59161955,0 C9.59161955,0 16.3225806,6.49234232 16.3225806,6.49234232 L16.3225806,18.0063928 C16.3225806,20.2120012 14.5290874,22 12.3296282,22 L3.99295243,22 C1.7877057,22 0,20.1996477 0,17.9904421 L0,4.00955791 Z" id="Rectangle-5" stroke="#76CFA6"></path> + <path d="M15.6804916,7.49527496 L11.5273266,7.49527496 C10.3308881,7.49527496 9.3609831,6.52527676 9.3609831,5.3289315 L9.3609831,1.88544393 L15.6804916,7.49527496 Z" id="Rectangle-6-Copy" fill="#FFFFFF"></path> + <path d="M16.3225806,7.09677419 L11.4129801,7.09677419 C10.2050375,7.09677419 9.22580645,6.11744908 9.22580645,4.90960051 L9.22580645,0" id="Rectangle-6" stroke="#76CFA6"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..d5d59645fe 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 0000000000..05c7418aa4 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 0000000000..bc7cef0916 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 0000000000..d48facad47 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 0000000000..8fd27cd39e 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 0000000000..883835ffb3 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 0000000000..b1bb36b987 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 0000000000..ae68b12c44 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 0000000000..146e9c0a04 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 0000000000..8142adfc83 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 0000000000..cc5bf30daf 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 0000000000..e32414bd6a 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 0000000000..8d1e143791 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 0000000000..6ec178847e 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 0000000000..ba269c0453 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 0000000000..2bf3c746e7 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 0000000000..3e3ec3fc76 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 0000000000..694050ca46 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 0000000000..6de2cde85b 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 0000000000..742ba9231f 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 0000000000..17f9f67d26 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 0000000000..b01d3ff57b 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 0000000000..d0f82e8285 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 0000000000..21865ac720 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 0000000000..a7c6091434 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 0000000000..6d50a0f544 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 0000000000..310a25ea23 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 0000000000..bc4da8d9a6 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 0000000000..144b8d32db 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 0000000000..0897943760 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 0000000000..0278492592 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 0000000000..2b05a8fc7c 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 0000000000..1f031df071 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 0000000000..aafb0f1776 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 0000000000..3084016718 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 0000000000..ce9de9c9c7 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 0000000000..33620c3f31 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 0000000000..4bbf8b1169 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 0000000000..fd40fc8a78 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 0000000000..230aacd454 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 0000000000..c58ed4f7b2 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 0000000000..6c2441e3e0 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 0000000000..9fd87167df 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 0000000000..9741b9b11f 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 0000000000..6cca35967c 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 0000000000..13b993d15d 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 0000000000..bca5730fb5 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 0000000000..e086855c73 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 0000000000..65c0aba447 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 0000000000..b351c67a53 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 0000000000..e7a25c60b3 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 0000000000..f249bbaa46 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 0000000000..e02cacd3dd 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 0000000000..3ea21422f0 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 0000000000..3182f48bd2 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 0000000000..5462334638 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 0000000000..93e269166b 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 0000000000..243bb7390d 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 0000000000..fc74cc396c 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 0000000000..c3a0e9d102 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 0000000000..5c4a004fef 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 0000000000..1589d0cc40 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 0000000000..4c53dead1c 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 0000000000..3668de7919 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 0000000000..66ec709df7 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 0000000000..148be93c08 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 0000000000..7cb8441514 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 0000000000..aae73b6fcb 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 0000000000..7b420f02f4 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 0000000000..42f64bf360 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 0000000000..cecc683c9c 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 0000000000..6074fea09c 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 0000000000..45fdb66426 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 0000000000..d8fd75c638 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 0000000000..6d50a0f544 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 0000000000..3808a61f1d 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 0000000000..589be70063 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 0000000000..babe1e4cc6 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 0000000000..d34cddeca9 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 0000000000..98828a5906 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 0000000000..aec8969b28 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 0000000000..70b1a623de 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 0000000000..9aa58327e3 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 0000000000..cf1645c2b5 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 0000000000..ec374fb3c3 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 0000000000..46874b4d98 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 0000000000..81b7abdf0e 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 0000000000..7fd1015e8b 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 0000000000..101de51eab 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 0000000000..772c2cbe6d 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 0000000000..d5bd8c1e46 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 0000000000..8923085d5a 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 0000000000..20c268ce06 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 0000000000..86f56635ef 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 0000000000..907dc59624 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 0000000000..8d1e143791 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 0000000000..4cf8c3112c 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 0000000000..413ceb1586 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 0000000000..097abeb434 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 0000000000..23499bf63c 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 0000000000..80200657c6 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 0000000000..63f2220118 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 0000000000..0268826321 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 0000000000..c777acc490 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 0000000000..85fa9bfe72 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 0000000000..1675d8e7db 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 0000000000..f2c21f7260 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 0000000000..0b8e67506c 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 0000000000..5ee3e63c5c 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 0000000000..53b967be99 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 0000000000..a1437aba78 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 0000000000..0d462fa3ae 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 0000000000..8934db7eca 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 0000000000..6f92d52365 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 0000000000..866b3f15dc 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 0000000000..56b433c756 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 0000000000..e1ddd5f84c 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 0000000000..8b7c54bc0f 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 0000000000..227a3b3396 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 0000000000..bc6189bed1 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 0000000000..c92248b910 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 0000000000..ab1cb94943 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 0000000000..0b41c7a532 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 0000000000..7af5290d31 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 0000000000..e10a1255a0 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 0000000000..6ad67d4255 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 0000000000..865df57a42 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 0000000000..e83a2d08bc 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 0000000000..57034d367c 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 0000000000..6e7ad58254 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 0000000000..46c3b84a92 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 0000000000..79b505d490 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 0000000000..7740cdc0a0 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 0000000000..8f383e674e 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 0000000000..a0f36d89c4 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 0000000000..2884c4c0a9 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 0000000000..1f76cfc9bd 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 0000000000..06fc2ad166 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 0000000000..8e54c2b815 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 0000000000..97424d4ec2 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 0000000000..6d50a0f544 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 0000000000..28bfccc9e8 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 0000000000..e482a65924 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 0000000000..84e2e65e76 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 0000000000..38fec34796 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 0000000000..70a03c6b14 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 0000000000..1e1bbe6089 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 0000000000..3833d683e7 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 0000000000..63119096b0 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 0000000000..9cab441aec 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 0000000000..c144de17f7 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 0000000000..1221707042 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 0000000000..7963aa618a 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 0000000000..d5d4d4008d 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 0000000000..0f2ecb4389 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 0000000000..d0a5d24f55 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 0000000000..096cb1111f 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 0000000000..17f18ac519 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 0000000000..66be6563c6 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 0000000000..7ecfd317c7 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 0000000000..11126ade77 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 0000000000..d584fa8429 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 0000000000..c054042591 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 0000000000..73aee15b3f 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 0000000000..fd044933e4 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 0000000000..0897943760 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 0000000000..aafb0f1776 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 0000000000..744458e17e 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 0000000000..58c2afb228 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 0000000000..007c99eca5 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 0000000000..839368dd7b 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 0000000000..63a893367f 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 0000000000..3515d95d37 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 0000000000..58f70b8d18 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 0000000000..2f33f2574f 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 0000000000..c796f587c6 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 0000000000..0d98de0386 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 0000000000..87f4e2f492 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 0000000000..273869dfc6 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 0000000000..b74c396d92 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 0000000000..e34c62d598 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 0000000000..8efdb91252 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 0000000000..7a0cceec00 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 0000000000..49e290827c 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 0000000000..6cb2e1e70d 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 0000000000..a61c42c423 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 0000000000..bb091cc88c 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 0000000000..6d50a0f544 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 0000000000..4495d29eb0 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 0000000000..ebb0f28a7b 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 0000000000..64532ffa58 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 0000000000..64b3cfff04 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 0000000000..250de6f6f5 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 0000000000..5833c130eb 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 0000000000..ce5248f434 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 0000000000..d8711a83d6 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 0000000000..81880931f3 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 0000000000..6f00e57923 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 0000000000..055dde68bc 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 0000000000..9635983406 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 0000000000..aafb0f1776 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 0000000000..84c7021f0a 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 0000000000..c5ed199141 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 0000000000..1af1ca284f 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 0000000000..d0b1843561 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 0000000000..64e2970b9d 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 0000000000..b072dda835 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 0000000000..83933d4521 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 0000000000..c102721a86 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 0000000000..80de92e556 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 0000000000..dd52215c5d 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 0000000000..78f45b7c0b 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 0000000000..2182f4ff93 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 0000000000..3e3e19d4b3 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 0000000000..753bec22b0 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 0000000000..6d50a0f544 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 0000000000..8501ada655 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 0000000000..0c884c329e 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 0000000000..3c9026fa0f 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 0000000000..fd605749ea 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 0000000000..b4c834b1d6 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 0000000000..d18cb939a9 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 0000000000..21c4b98be7 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 0000000000..c828206e35 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 0000000000..f2a5bd22c8 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 0000000000..66d698334b 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 0000000000..7a127f51ae 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 0000000000..2353ba1b0a 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 0000000000..7949f65d8a 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 0000000000..687e305294 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 0000000000..0a21ad15c3 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 0000000000..c3a245b767 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 0000000000..21a347c6fc 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 0000000000..643b6ae0cf 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 0000000000..63a13c0e81 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 0000000000..da991a9344 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 0000000000..e75e17c9f0 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 0000000000..46f93cad1e 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 0000000000..8c849a733e 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 0000000000..6ea2122f9d 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 0000000000..bad3ba4d46 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 0000000000..d94359dcc4 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 0000000000..f8b80e5ba9 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 0000000000..8b9bbd8942 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 0000000000..328879361e 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 0000000000..7f0a52d3b2 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 0000000000..87adc3afaa 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 0000000000..742c9f7e71 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 0000000000..e333abb6fb --- /dev/null +++ b/res/img/fullscreen.svg @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="29px" height="22px" viewBox="-1 -1 29 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>Zoom</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="05-Voice-and-video" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="05_2-Video-call" sketch:type="MSArtboardGroup" transform="translate(-824.000000, -667.000000)"> + <g id="Zoom" sketch:type="MSLayerGroup" transform="translate(824.000000, 667.000000)"> + <rect id="Rectangle-20" stroke="#FFFFFF" sketch:type="MSShapeGroup" x="0" y="0" width="27" height="20" rx="4"></rect> + <rect id="Rectangle-20" stroke="#FFFFFF" sketch:type="MSShapeGroup" x="6" y="2" width="15" height="11" rx="4"></rect> + <g id="Line-+-Triangle-3" transform="translate(4.474874, 15.181981) rotate(-45.000000) translate(-4.474874, -15.181981) translate(0.974874, 13.181981)" sketch:type="MSShapeGroup"> + <path d="M6.53553391,2 L3,2" id="Line" stroke="#FFFFFF" stroke-linecap="square"></path> + <path d="M3.26960678,3.51960678 L0.269606781,2.01960678 L3.26960678,0.519606781 L3.26960678,3.51960678 Z" id="Triangle-3" fill="#FFFFFF"></path> + </g> + <g id="Line-+-Triangle-3-Copy" transform="translate(22.681981, 15.181981) scale(-1, 1) rotate(-45.000000) translate(-22.681981, -15.181981) translate(19.181981, 13.181981)" sketch:type="MSShapeGroup"> + <path d="M6.53553391,2 L3,2" id="Line" stroke="#FFFFFF" stroke-linecap="square"></path> + <path d="M3.375,0.5 L3.375,3.5 L0.375,2 L3.375,0.5 Z" id="Triangle-3" fill="#FFFFFF"></path> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/hangup.svg b/res/img/hangup.svg new file mode 100644 index 0000000000..be038d2b30 --- /dev/null +++ b/res/img/hangup.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="25px" height="26px" viewBox="-1 -1 25 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.3 (16618) - http://www.bohemiancoding.com/sketch --> + <title>Fill 72 + Path 98</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="05-Voice-and-video" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="05_2-Video-call" sketch:type="MSArtboardGroup" transform="translate(-910.000000, -719.000000)" stroke="#FF0064"> + <g id="Fill-72-+-Path-98" sketch:type="MSLayerGroup" transform="translate(910.000000, 719.000000)"> + <path d="M17.8404444,24 C15.8137778,24 10.8875556,21.408 6.75022222,15.8448889 C2.88088889,10.6413333 1,6.88222222 1,4.35244444 C1,2.36088889 2.37511111,1.41022222 3.11422222,0.9 L3.29644444,0.772888889 C4.11288889,0.188888889 5.38222222,0 5.86888889,0 C6.72222222,0 7.08177778,0.499555556 7.29955556,0.935111111 C7.48488889,1.30311111 9.01777778,4.59511111 9.17288889,5.00444444 C9.41111111,5.63377778 9.33288889,6.55111111 8.596,7.07822222 L8.46622222,7.16844444 C8.10044444,7.42222222 7.42,7.89333333 7.32577778,8.46622222 C7.28,8.74488889 7.37333333,9.03644444 7.61111111,9.35688889 C8.79777778,10.956 12.5862222,15.6506667 13.2693333,16.2884444 C13.8044444,16.7884444 14.4826667,16.8595556 14.9444444,16.4702222 C15.4222222,16.0675556 15.6342222,15.8297778 15.6364444,15.8271111 L15.6857778,15.7795556 C15.7257778,15.7457778 16.0991111,15.4497778 16.7093333,15.4497778 C17.1497778,15.4497778 17.5973333,15.6017778 18.04,15.9008889 C19.1884444,16.6768889 21.7808889,18.4106667 21.7808889,18.4106667 L21.8226667,18.4426667 C22.1542222,18.7266667 22.6333333,19.5453333 22.0751111,20.6106667 C21.496,21.7168889 19.6986667,24 17.8404444,24 L17.8404444,24 Z" id="Fill-72" sketch:type="MSShapeGroup"></path> + <path d="M19.8035085,4 L0,22.8035085" id="Path-98" sketch:type="MSShapeGroup"></path> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/hide.png b/res/img/hide.png new file mode 100644 index 0000000000..c5aaf0dd0d 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 0000000000..1289d5aafc --- /dev/null +++ b/res/img/icon-address-delete.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="11px" height="9px" viewBox="0 0 11 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>943783E9-DBD7-4D4E-BAC9-35437C17C2C4</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="1:1-chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round"> + <g id="Chat-People-2b-Invite-modal" transform="translate(-579.000000, -346.000000)" stroke="#FF0064"> + <g id="icon_context_delete-copy" transform="translate(580.000000, 346.000000)"> + <path d="M0.45,0.45 L8.55,8.55" id="Line"></path> + <path d="M0.45,0.45 L8.55,8.55" id="Line-Copy-2" transform="translate(4.500000, 4.500000) scale(-1, 1) translate(-4.500000, -4.500000) "></path> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon-call.svg b/res/img/icon-call.svg new file mode 100644 index 0000000000..0ca5c29e9d --- /dev/null +++ b/res/img/icon-call.svg @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="35" height="35" viewBox="0, 0, 35, 35"> + <g id="Symbols"> + <path d="M17.5,35 C27.165,35 35,27.165 35,17.5 C35,7.835 27.165,0 17.5,0 C7.835,0 0,7.835 0,17.5 C0,27.165 7.835,35 17.5,35 z" fill="#76CFA6" opacity="0.15" id="Oval-109"/> + <path d="M23,28 C21.195,28 16.807,25.624 13.122,20.524 C9.675,15.755 8,12.309 8,9.99 C8,8.164 9.225,7.293 9.883,6.825 L10.045,6.708 C10.773,6.173 11.903,6 12.337,6 C13.097,6 13.417,6.458 13.611,6.857 C13.776,7.195 15.141,10.212 15.28,10.587 C15.492,11.164 15.422,12.005 14.766,12.488 L14.65,12.571 C14.324,12.804 13.718,13.236 13.634,13.761 C13.594,14.016 13.677,14.283 13.889,14.577 C14.946,16.043 18.32,20.346 18.928,20.931 C19.405,21.389 20.009,21.455 20.42,21.098 C20.846,20.729 21.035,20.511 21.037,20.508 L21.081,20.465 C21.116,20.434 21.449,20.162 21.992,20.162 C22.385,20.162 22.783,20.302 23.178,20.576 C24.201,21.287 26.51,22.876 26.51,22.876 L26.547,22.906 C26.842,23.166 27.269,23.917 26.772,24.893 C26.256,25.907 24.655,28 23,28 L23,28 z" fill-opacity="0" stroke="#76CFA6" stroke-width="1" id="path-1"/> + </g> +</svg> diff --git a/res/img/icon-context-delete.svg b/res/img/icon-context-delete.svg new file mode 100644 index 0000000000..fba9fa117b --- /dev/null +++ b/res/img/icon-context-delete.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="15" height="15" viewBox="0, 0, 15, 15"> + <g id="Extra-icons"> + <g> + <path d="M3.45,3.45 L11.55,11.55" fill-opacity="0" stroke="#FF0064" stroke-width="1" stroke-linecap="round" id="Line"/> + <path d="M11.55,3.45 L3.45,11.55" fill-opacity="0" stroke="#FF0064" stroke-width="1" stroke-linecap="round" id="Line-Copy-2"/> + </g> + </g> +</svg> diff --git a/res/img/icon-context-fave-on.svg b/res/img/icon-context-fave-on.svg new file mode 100644 index 0000000000..2ae172d8eb --- /dev/null +++ b/res/img/icon-context-fave-on.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="13px" height="13px" viewBox="0 0 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>DAE17B64-40B5-478A-8E8D-97AD1A6E25C8</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Extra-icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Extra-icons-sheet" transform="translate(-93.000000, -313.000000)"> + <g id="icon_context_fave_on" transform="translate(92.000000, 312.000000)"> + <rect id="Rectangle" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="15" height="15"></rect> + <polygon id="Star-1" stroke="#4A4A4A" stroke-linejoin="round" fill="#4A4A4A" points="7.5 10.75 3.67939586 12.7586105 4.40906632 8.50430523 1.31813264 5.49138954 5.58969793 4.87069477 7.5 1 9.41030207 4.87069477 13.6818674 5.49138954 10.5909337 8.50430523 11.3206041 12.7586105"></polygon> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon-context-fave.svg b/res/img/icon-context-fave.svg new file mode 100644 index 0000000000..451e1849c8 --- /dev/null +++ b/res/img/icon-context-fave.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="13px" height="13px" viewBox="0 0 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>8A6E1837-F0F1-432E-A0DA-6F3741F71EBF</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Extra-icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.2"> + <g id="Extra-icons-sheet" transform="translate(-63.000000, -313.000000)"> + <g id="icon_context_fave" transform="translate(62.000000, 312.000000)"> + <rect id="Rectangle" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="15" height="15"></rect> + <polygon id="Star-1" stroke="#000000" stroke-linejoin="round" points="7.5 10.75 3.67939586 12.7586105 4.40906632 8.50430523 1.31813264 5.49138954 5.58969793 4.87069477 7.5 1 9.41030207 4.87069477 13.6818674 5.49138954 10.5909337 8.50430523 11.3206041 12.7586105"></polygon> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon-context-low-on.svg b/res/img/icon-context-low-on.svg new file mode 100644 index 0000000000..7578c6335c --- /dev/null +++ b/res/img/icon-context-low-on.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="13px" height="13px" viewBox="0 0 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>CD51482C-F2D4-4F63-AF9E-86513F9AF87F</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Extra-icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Extra-icons-sheet" transform="translate(-93.000000, -338.000000)"> + <g id="icon_context_low_on" transform="translate(92.000000, 337.000000)"> + <rect id="Rectangle-Copy" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="15" height="15"></rect> + <path d="M12.7604081,8 C13.2413214,8 13.3067421,8.25679316 12.9190465,8.57356358 L8.20351162,12.4264364 C7.81340686,12.7451752 7.18723719,12.7432068 6.79954156,12.4264364 L2.08400668,8.57356358 C1.69390193,8.25482476 1.76733588,8 2.24264506,8 L4.46666667,8 L4.46666667,3.00292933 C4.46666667,2.44902676 4.84616384,2 5.33587209,2 L9.66412791,2 C10.1441768,2 10.5333333,2.43788135 10.5333333,3.00292933 L10.5333333,8 L12.7604081,8 Z" id="Combined-Shape" stroke="#4A4A4A" stroke-linejoin="round" fill="#4A4A4A"></path> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon-context-low.svg b/res/img/icon-context-low.svg new file mode 100644 index 0000000000..663f3ca9eb --- /dev/null +++ b/res/img/icon-context-low.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="13px" height="13px" viewBox="0 0 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>B160345F-40D3-4BE6-A860-6D04BF223EF7</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Extra-icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Extra-icons-sheet" transform="translate(-63.000000, -338.000000)"> + <g id="icon_context_low" transform="translate(62.000000, 337.000000)"> + <rect id="Rectangle" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="15" height="15"></rect> + <path d="M12.7604081,8 C13.2413214,8 13.3067421,8.25679316 12.9190465,8.57356358 L8.20351162,12.4264364 C7.81340686,12.7451752 7.18723719,12.7432068 6.79954156,12.4264364 L2.08400668,8.57356358 C1.69390193,8.25482476 1.76733588,8 2.24264506,8 L4.46666667,8 L4.46666667,3.00292933 C4.46666667,2.44902676 4.84616384,2 5.33587209,2 L9.66412791,2 C10.1441768,2 10.5333333,2.43788135 10.5333333,3.00292933 L10.5333333,8 L12.7604081,8 Z" id="Combined-Shape" stroke="#000000" stroke-linejoin="round" opacity="0.2"></path> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon-context-mute-mentions.svg b/res/img/icon-context-mute-mentions.svg new file mode 100644 index 0000000000..3693b7a82a --- /dev/null +++ b/res/img/icon-context-mute-mentions.svg @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="16" height="12" viewBox="0, 0, 16, 12"> + <g id="Screens-revised" opacity="0.2"> + <g> + <path d="M7.142,0.009 C7.687,0.152 7.921,0.47 8,1 L8,11 C8,11.866 6.974,12.323 6.33,11.743 L3.288,9 L1,9 C0.448,9 0,8.552 0,8 L0,4 C0,3.448 0.448,3 1,3 L3.278,3 L6.332,0.256 C6.744,-0.016 6.487,0.101 7.142,0.009 z M7,1 L3.661,4 L1,4 L1,8 L3.672,8 L7,11 L7,1 z" fill="#000000" id="path-1"/> + <path d="M13,3.928 C13,4.757 12.328,5.428 11.5,5.428 C10.672,5.428 10,4.757 10,3.928 C10,3.1 10.672,2.428 11.5,2.428 C12.328,2.428 13,3.1 13,3.928 z" fill-opacity="0" stroke="#000000" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" id="path-3"/> + <path d="M14,9.5 C14,6.84 12.881,6 11.5,6 C10.119,6 9,6.884 9,9.5 L14,9.5 z" fill-opacity="0" stroke="#000000" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" id="path-5"/> + </g> + </g> +</svg> 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 0000000000..861f2975de --- /dev/null +++ b/res/img/icon-context-mute-off-copy.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="16" height="12" viewBox="0, 0, 16, 12"> + <g id="Screens-revised" opacity="0.2"> + <path d="M7.142,0.009 C7.687,0.152 7.921,0.47 8,1 L8,11 C8,11.866 6.974,12.323 6.33,11.743 L3.288,9 L1,9 C0.448,9 0,8.552 0,8 L0,4 C0,3.448 0.448,3 1,3 L3.278,3 L6.332,0.256 C6.744,-0.016 6.487,0.101 7.142,0.009 z M7,1 L3.661,4 L1,4 L1,8 L3.672,8 L7,11 L7,1 z" fill="#000000" id="path-1"/> + <path d="M9.878,7.667 C10.82,7.667 11.584,6.92 11.584,6 C11.584,5.08 10.82,4.333 9.878,4.333" fill-opacity="0" stroke="#000000" stroke-width="1" stroke-linecap="round" id="Oval-50"/> + <path d="M10.055,9.333 C11.939,9.333 13.466,7.841 13.466,6 C13.466,4.159 11.939,2.667 10.055,2.667" fill-opacity="0" stroke="#000000" stroke-width="1" stroke-linecap="round" id="Oval-50-Copy"/> + <path d="M10.055,11 C12.881,11 15.172,8.761 15.172,6 C15.172,3.239 12.881,1 10.055,1" fill-opacity="0" stroke="#000000" stroke-width="1" stroke-linecap="round" id="Oval-50-Copy-2"/> + </g> +</svg> diff --git a/res/img/icon-context-mute-off.svg b/res/img/icon-context-mute-off.svg new file mode 100644 index 0000000000..d801823b5d --- /dev/null +++ b/res/img/icon-context-mute-off.svg @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="16" height="12" viewBox="0, 0, 16, 12"> + <g id="Screens-revised" opacity="0.2"> + <path d="M7.142,0.009 C7.687,0.152 7.921,0.47 8,1 L8,11 C8,11.866 6.974,12.323 6.33,11.743 L3.288,9 L1,9 C0.448,9 0,8.552 0,8 L0,4 C0,3.448 0.448,3 1,3 L3.278,3 L6.332,0.256 C6.744,-0.016 6.487,0.101 7.142,0.009 z M7,1 L3.661,4 L1,4 L1,8 L3.672,8 L7,11 L7,1 z" fill="#000000" id="path-1"/> + <path d="M10,8 C11.105,8 12,7.105 12,6 C12,4.895 11.105,4 10,4" fill-opacity="0" stroke="#000000" stroke-width="1" stroke-linecap="round" id="Oval-50"/> + <path d="M10.207,10 C12.416,10 14.207,8.209 14.207,6 C14.207,3.791 12.416,2 10.207,2" fill-opacity="0" stroke="#000000" stroke-width="1" stroke-linecap="round" id="Oval-50-Copy"/> + </g> +</svg> diff --git a/res/img/icon-context-mute.svg b/res/img/icon-context-mute.svg new file mode 100644 index 0000000000..f53b868a76 --- /dev/null +++ b/res/img/icon-context-mute.svg @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="16" height="12" viewBox="0, 0, 16, 12"> + <g id="Screens-revised" opacity="0.2"> + <path d="M7.142,0.009 C7.687,0.152 7.921,0.47 8,1 L8,11 C8,11.866 6.974,12.323 6.33,11.743 L3.288,9 L1,9 C0.448,9 0,8.552 0,8 L0,4 C0,3.448 0.448,3 1,3 L3.278,3 L6.332,0.256 C6.744,-0.016 6.487,0.101 7.142,0.009 z M7,1 L3.661,4 L1,4 L1,8 L3.672,8 L7,11 L7,1 z" fill="#000000" id="path-1"/> + <path d="M12.55,4.45 L9.722,7.278" fill-opacity="0" stroke="#000000" stroke-width="1" stroke-linecap="round" id="Line-Copy-2"/> + <path d="M12.55,7.278 L9.722,4.45" fill-opacity="0" stroke="#000000" stroke-width="1" stroke-linecap="round" id="Line-Copy-5"/> + </g> +</svg> diff --git a/res/img/icon-delete-pink.svg b/res/img/icon-delete-pink.svg new file mode 100644 index 0000000000..aafa87f1b2 --- /dev/null +++ b/res/img/icon-delete-pink.svg @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="512px" height="533px" viewBox="0 -11.5 512 533" xml:space="preserve"> +<g> + <g> + <path fill="#FF0064" d="M142.423,517.05c-34.347,0-62.29-27.886-62.29-62.161V128.225c0-3.038,2.462-5.5,5.5-5.5h340.733 + c3.037,0,5.5,2.462,5.5,5.5v326.664c0,34.275-27.942,62.161-62.287,62.161H142.423z M43.042,91.133c-3.038,0-5.5-2.462-5.5-5.5 + V43.041c0-3.038,2.462-5.5,5.5-5.5h103.91L180.956-3.08c1.045-1.249,2.589-1.97,4.217-1.97h141.655 + c1.628,0,3.173,0.721,4.218,1.97l34.001,40.622h103.911c3.037,0,5.5,2.462,5.5,5.5v42.591c0,3.038-2.463,5.5-5.5,5.5H43.042z"/> + <path fill="#000000" d="M326.828,0.45l35.65,42.592h106.479v42.591H43.042V43.041h106.479L185.173,0.45H326.828 M426.366,128.225 + v326.664c0,31.168-25.553,56.661-56.787,56.661H142.423c-31.237,0-56.79-25.493-56.79-56.661V128.225H426.366 M326.828-10.55 + H185.173c-3.256,0-6.345,1.442-8.435,3.939l-32.354,38.651H43.042c-6.075,0-11,4.925-11,11v42.592c0,6.075,4.925,11,11,11h425.916 + c6.075,0,11-4.925,11-11V43.042c0-6.075-4.925-11-11-11H367.616L335.264-6.61C333.173-9.107,330.084-10.55,326.828-10.55 + L326.828-10.55z M426.366,117.225H85.633c-6.075,0-11,4.925-11,11v326.664c0,37.309,30.411,67.661,67.79,67.661h227.156 + c37.378,0,67.787-30.353,67.787-67.661V128.225C437.366,122.15,432.441,117.225,426.366,117.225L426.366,117.225z"/> + </g> +</g> +</svg> diff --git a/res/img/icon-email-user.svg b/res/img/icon-email-user.svg new file mode 100644 index 0000000000..2d41e06f98 --- /dev/null +++ b/res/img/icon-email-user.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="25px" height="25px" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>6F488856-F8EF-479C-9747-AB6E0945C7DE</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Create-group" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Chat-Group-5a-Invite-modal" transform="translate(-611.000000, -366.000000)"> + <g id="Group-6" transform="translate(604.000000, 364.000000)"> + <g id="icon_email_user" transform="translate(7.000000, 2.000000)"> + <circle id="Oval-2" fill="#D8D8D8" cx="12.5" cy="12.5" r="12.5"></circle> + <path d="M19.3007812,12.2265625 C19.3007812,12.9713579 19.1835949,13.6523407 18.9492188,14.2695312 C18.7148426,14.8867218 18.3854188,15.3671858 17.9609375,15.7109375 C17.5364562,16.0546892 17.0455757,16.2265625 16.4882812,16.2265625 C16.0768209,16.2265625 15.7200536,16.1171886 15.4179688,15.8984375 C15.1158839,15.6796864 14.9127609,15.3828144 14.8085938,15.0078125 L14.7148438,15.0078125 C14.4596341,15.4140645 14.1445331,15.718749 13.7695312,15.921875 C13.3945294,16.125001 12.9726586,16.2265625 12.5039062,16.2265625 C11.6549437,16.2265625 10.9869816,15.9531277 10.5,15.40625 C10.0130184,14.8593723 9.76953125,14.1197963 9.76953125,13.1875 C9.76953125,12.114578 10.0924447,11.2434929 10.7382812,10.5742188 C11.3841178,9.90494457 12.2512966,9.5703125 13.3398438,9.5703125 C13.7356791,9.5703125 14.1744768,9.6054684 14.65625,9.67578125 C15.1380232,9.7460941 15.5664044,9.84374937 15.9414062,9.96875 L15.7695312,13.6015625 L15.7695312,13.7890625 C15.7695312,14.6224 16.0403619,15.0390625 16.5820312,15.0390625 C16.9934916,15.0390625 17.3203113,14.7734402 17.5625,14.2421875 C17.8046887,13.7109348 17.9257812,13.0338583 17.9257812,12.2109375 C17.9257812,11.320308 17.7434914,10.5377638 17.3789062,9.86328125 C17.0143211,9.18879871 16.4960971,8.66927266 15.8242188,8.3046875 C15.1523404,7.94010234 14.3815148,7.7578125 13.5117188,7.7578125 C12.4023382,7.7578125 11.4375041,7.98697687 10.6171875,8.4453125 C9.7968709,8.90364813 9.17057508,9.55858949 8.73828125,10.4101562 C8.30598742,11.261723 8.08984375,12.2499944 8.08984375,13.375 C8.08984375,14.8854242 8.49348555,16.0468709 9.30078125,16.859375 C10.108077,17.6718791 11.2669195,18.078125 12.7773438,18.078125 C13.9283912,18.078125 15.1289,17.8437523 16.3789062,17.375 L16.3789062,18.65625 C15.2851508,19.1041689 14.0950585,19.328125 12.8085938,19.328125 C10.8815008,19.328125 9.37891164,18.8085989 8.30078125,17.7695312 C7.22265086,16.7304636 6.68359375,15.2812593 6.68359375,13.421875 C6.68359375,12.0624932 6.9752575,10.8528699 7.55859375,9.79296875 C8.14193,8.73306762 8.95051566,7.92187781 9.984375,7.359375 C11.0182343,6.79687219 12.1887955,6.515625 13.4960938,6.515625 C14.6263077,6.515625 15.6328081,6.74999766 16.515625,7.21875 C17.3984419,7.68750234 18.0833309,8.35546441 18.5703125,9.22265625 C19.0572941,10.0898481 19.3007812,11.0911402 19.3007812,12.2265625 L19.3007812,12.2265625 Z M11.2695312,13.21875 C11.2695312,14.4322977 11.746089,15.0390625 12.6992188,15.0390625 C13.7044321,15.0390625 14.2539058,14.2760493 14.3476562,12.75 L14.4414062,10.8828125 C14.1132796,10.7942704 13.7617206,10.75 13.3867188,10.75 C12.7200488,10.75 12.2005227,10.971352 11.828125,11.4140625 C11.4557273,11.856773 11.2695312,12.4583295 11.2695312,13.21875 L11.2695312,13.21875 Z" id="@" fill="#FFFFFF"></path> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon-invite-people.svg b/res/img/icon-invite-people.svg new file mode 100644 index 0000000000..f13a03ed70 --- /dev/null +++ b/res/img/icon-invite-people.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="35px" height="35px" viewBox="0 0 35 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>9BA71BF4-DC4F-42D2-B2D0-9EAE0F7F8D45</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Right-panel/Footer" transform="translate(-26.000000, -34.000000)"> + <g id="icon_invite_people" transform="translate(26.000000, 34.000000)"> + <path d="M17.5,35 C27.1649831,35 35,27.1649831 35,17.5 C35,7.83501688 27.1649831,0 17.5,0 C7.83501688,0 0,7.83501688 0,17.5 C0,27.1649831 7.83501688,35 17.5,35 Z" id="Oval" fill="#76CFA6"></path> + <g id="Group-5" transform="translate(8.000000, 9.000000)" stroke="#FFFFFF"> + <g id="Group-3" opacity="0.8" transform="translate(14.437500, 3.937500)" stroke-linecap="round"> + <path d="M0,3.28125 L6.5625,3.28125" id="Line"></path> + <path d="M3.28125,0 L3.28125,6.5625" id="Line"></path> + </g> + <g id="icons_people_svg"> + <path d="M13.78125,15.75 C13.78125,12.1256313 13.7812503,9.1875 7.21875,9.1875 C0.656249741,9.1875 0.65625,12.1256313 0.65625,15.75 C5.21807306,15.75 7.96856689,15.75 13.78125,15.75 Z" id="Oval-40" stroke-linecap="round" stroke-linejoin="round"></path> + <circle id="Oval" cx="7.21875" cy="3.609375" r="3.609375"></circle> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon-mx-user.svg b/res/img/icon-mx-user.svg new file mode 100644 index 0000000000..5780277f38 --- /dev/null +++ b/res/img/icon-mx-user.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 113 144" style="enable-background:new 0 0 113 144;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#7BC9A4;} + .st1{fill:#B47BB5;} +</style> +<path class="st0" d="M61.6,0H20.8c-0.1,0-0.2,0-0.3,0C9.2,0,0,9.2,0,20.6v102.9C0,134.8,9.2,144,20.6,144c11.3,0,20.6-9.2,20.6-20.6 + v-20.6h20.5c28.3,0,51.4-23.1,51.4-51.4S90,0,61.6,0"/> +<path class="st1" d="M37.4,8.8c6.5,9.3,4.3,22.1-5,28.7c-9.3,6.5-22.1,4.3-28.6-5.1c-6.5-9.3-4.3-22.1,5-28.7 + C18.1-2.8,30.9-0.5,37.4,8.8"/> +<path class="st1" d="M109.3,111.6c6.5,9.3,4.3,22.1-5,28.7c-9.3,6.5-22.1,4.3-28.6-5.1l-30.8-44c-6.5-9.3-4.3-22.1,5-28.7 + c9.3-6.5,22.1-4.3,28.6,5.1L109.3,111.6z"/> +</svg> diff --git a/res/img/icon-return.svg b/res/img/icon-return.svg new file mode 100644 index 0000000000..80da0f82aa --- /dev/null +++ b/res/img/icon-return.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="12px" height="11px" viewBox="0 0 12 11" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>B542A09B-DBBF-41D4-A5FD-D05EE1E6BBC4</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Create-group" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Chat-Directory-search-result-ID" transform="translate(-553.000000, -97.000000)" stroke="#4A4A4A"> + <g id="icon_return" transform="translate(554.000000, 97.000000)"> + <polyline id="Rectangle" points="7.5 0.5 10.5 0.5 10.5 6.5 0 6.5"></polyline> + <g id="Group" transform="translate(0.000000, 1.954545)" stroke-linecap="square"> + <path d="M0.227272727,4.40909091 L4.25946916,0.376894528" id="Line"></path> + <path d="M0.227272727,8.44128729 L4.25946916,4.40909091" id="Line-Copy-7" transform="translate(2.243371, 6.425189) scale(1, -1) translate(-2.243371, -6.425189) "></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..ce28d128aa --- /dev/null +++ b/res/img/icon-text-cancel.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="11px" height="9px" viewBox="0 0 11 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39 (31667) - http://www.bohemiancoding.com/sketch --> + <title>28D80248-63BA-4A5F-9216-4CFE72784BAC</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round"> + <g id="02_x-Chat-text-input-markdown-panel-MD_on" transform="translate(-915.000000, -749.000000)" stroke="#000000"> + <g id="icon_text_cancel" transform="translate(916.000000, 749.000000)"> + <path d="M0.45,0.45 L8.55,8.55" id="Line"></path> + <path d="M0.45,0.45 L8.55,8.55" id="Line-Copy-2" transform="translate(4.500000, 4.500000) scale(-1, 1) translate(-4.500000, -4.500000) "></path> + </g> + </g> + </g> +</svg> \ 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 0000000000..896b94ad13 --- /dev/null +++ b/res/img/icon_context_delete.svg @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> + <g transform="matrix(1,0,0,1,-0,-80)"> + <g id="icon_context_delete" transform="matrix(0.600982,0,0,0.600982,0,80)"> + <g transform="matrix(1.66394,0,0,1.66394,0,-133.116)"> + <path d="M7.508,86.728C8.739,85.523 9.979,84.326 11.196,83.109C11.277,83.034 11.364,82.99 11.472,82.968C11.512,82.964 11.549,82.962 11.589,82.964C11.668,82.973 11.743,82.994 11.811,83.036C11.994,83.148 12.086,83.371 12.036,83.579C12.017,83.657 11.98,83.724 11.93,83.787C10.749,85.064 9.524,86.299 8.285,87.52C9.489,88.752 10.686,89.991 11.904,91.209C11.958,91.267 12.001,91.331 12.026,91.408C12.042,91.458 12.05,91.51 12.05,91.562C12.05,91.82 11.846,92.041 11.589,92.061C11.454,92.071 11.33,92.025 11.225,91.942C9.948,90.762 8.713,89.536 7.492,88.297C6.261,89.501 5.021,90.698 3.804,91.916C3.745,91.97 3.681,92.013 3.605,92.038C3.555,92.054 3.502,92.062 3.45,92.062C3.192,92.062 2.972,91.858 2.952,91.602C2.941,91.466 2.987,91.342 3.07,91.238C4.251,89.96 5.476,88.726 6.715,87.505C5.511,86.273 4.314,85.034 3.096,83.816C3.042,83.757 2.999,83.693 2.974,83.617C2.908,83.413 2.983,83.184 3.156,83.058C3.221,83.01 3.294,82.984 3.372,82.968C3.412,82.964 3.449,82.962 3.489,82.964C3.598,82.977 3.689,83.014 3.775,83.082C5.052,84.263 6.287,85.488 7.508,86.728Z" style="fill:rgb(255,0,100);"/> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon_context_fave.svg b/res/img/icon_context_fave.svg new file mode 100644 index 0000000000..da7b14a1f4 --- /dev/null +++ b/res/img/icon_context_fave.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> + <g transform="matrix(1,0,0,1,-0,-40)"> + <g id="icon_context_fave" transform="matrix(0.600982,0,0,0.600982,0,40)"> + <g transform="matrix(1.66394,0,0,1.66394,1.66394,2.71716)"> + <rect x="0" y="0" width="13" height="13" style="fill:rgb(224,223,224);fill-opacity:0;fill-rule:nonzero;"/> + <path d="M6.572,-0.495C6.614,-0.486 6.625,-0.486 6.666,-0.472C6.793,-0.427 6.884,-0.337 6.948,-0.221L8.742,3.414L12.754,3.997L12.801,4.006C12.88,4.029 12.951,4.062 13.013,4.117C13.161,4.248 13.218,4.459 13.157,4.646C13.132,4.725 13.087,4.789 13.031,4.849L10.128,7.679L10.813,11.674L10.819,11.722C10.821,11.804 10.812,11.882 10.779,11.958C10.7,12.139 10.517,12.259 10.32,12.259C10.237,12.259 10.162,12.236 10.088,12.201L6.5,10.315L2.912,12.201L2.868,12.222C2.791,12.249 2.714,12.264 2.631,12.256C2.435,12.237 2.265,12.1 2.204,11.913C2.178,11.834 2.177,11.756 2.187,11.674L2.872,7.679L-0.031,4.849L-0.064,4.814C-0.114,4.749 -0.152,4.681 -0.17,4.599C-0.213,4.407 -0.135,4.202 0.024,4.087C0.092,4.038 0.166,4.012 0.246,3.997L4.258,3.414L6.052,-0.221L6.075,-0.264C6.099,-0.299 6.104,-0.309 6.134,-0.34C6.211,-0.423 6.316,-0.478 6.428,-0.495C6.477,-0.502 6.523,-0.499 6.572,-0.495ZM5.038,4.092C5.017,4.13 5.013,4.14 4.987,4.174C4.928,4.251 4.847,4.31 4.755,4.342C4.715,4.357 4.704,4.357 4.662,4.365L1.393,4.841L3.758,7.146L3.791,7.182C3.817,7.216 3.825,7.224 3.846,7.261C3.903,7.364 3.916,7.474 3.902,7.589L3.343,10.845L6.267,9.307L6.311,9.287C6.42,9.249 6.531,9.237 6.643,9.271C6.684,9.283 6.694,9.289 6.733,9.307L9.657,10.845L9.098,7.589L9.092,7.541C9.089,7.425 9.113,7.317 9.18,7.22C9.204,7.185 9.213,7.178 9.242,7.146L11.607,4.841L8.338,4.365L8.291,4.356C8.25,4.344 8.239,4.342 8.2,4.324C8.093,4.275 8.018,4.193 7.962,4.092L6.5,1.13C6.013,2.117 5.525,3.105 5.038,4.092Z" style="fill:rgb(205,205,205);fill-rule:nonzero;"/> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon_context_fave_on.svg b/res/img/icon_context_fave_on.svg new file mode 100644 index 0000000000..e22e92d36e --- /dev/null +++ b/res/img/icon_context_fave_on.svg @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> + <g transform="matrix(1,0,0,1,-20,-40)"> + <g id="icon_context_fave_on" transform="matrix(0.600982,0,0,0.600982,20,40)"> + <g transform="matrix(1.66394,0,0,1.66394,-14.9755,2.71716)"> + <g transform="matrix(1,0,0,1,10.0123,0)"> + <clipPath id="_clip1"> + <rect x="-1" y="-1" width="15" height="15"/> + </clipPath> + <g clip-path="url(#_clip1)"> + <g transform="matrix(0.575972,0,0,0.576771,2.73925,2.16505)"> + <rect x="-6" y="-6" width="25" height="25" style="fill:rgb(216,216,216);fill-opacity:0;fill-rule:nonzero;"/> + </g> + <clipPath id="_clip2"> + <path d="M6.5,9.75L2.679,11.759L3.409,7.504L0.318,4.491L4.59,3.871L6.5,0L8.41,3.871L12.682,4.491L9.591,7.504L10.321,11.759L6.5,9.75Z"/> + </clipPath> + <g clip-path="url(#_clip2)"> + <path d="M-0.682,-1L13.682,-1L13.682,12.759L-0.682,12.759L-0.682,-1Z" style="fill:rgb(74,74,74);fill-rule:nonzero;"/> + </g> + </g> + </g> + <g transform="matrix(1,0,0,1,10.0123,0)"> + <path d="M6.572,-0.495C6.614,-0.486 6.625,-0.486 6.666,-0.472C6.793,-0.427 6.884,-0.337 6.948,-0.221L8.742,3.414L12.754,3.997L12.801,4.006C12.88,4.029 12.951,4.062 13.013,4.117C13.161,4.248 13.218,4.459 13.157,4.646C13.132,4.725 13.087,4.789 13.031,4.849L10.128,7.679L10.813,11.674L10.819,11.722C10.821,11.804 10.812,11.882 10.779,11.958C10.7,12.139 10.517,12.259 10.32,12.259C10.237,12.259 10.162,12.236 10.088,12.201L6.5,10.315L2.912,12.201L2.868,12.222C2.791,12.249 2.714,12.264 2.631,12.256C2.435,12.237 2.265,12.1 2.204,11.913C2.178,11.834 2.177,11.756 2.187,11.674L2.872,7.679L-0.031,4.849L-0.064,4.814C-0.114,4.749 -0.152,4.681 -0.17,4.599C-0.213,4.407 -0.135,4.202 0.024,4.087C0.092,4.038 0.166,4.012 0.246,3.997L4.258,3.414L6.052,-0.221L6.075,-0.264C6.15,-0.372 6.25,-0.453 6.38,-0.485C6.422,-0.496 6.433,-0.495 6.476,-0.499C6.524,-0.499 6.524,-0.499 6.572,-0.495ZM5.038,4.092C5.017,4.13 5.013,4.14 4.987,4.174C4.928,4.251 4.847,4.31 4.755,4.342C4.715,4.357 4.704,4.357 4.662,4.365L1.393,4.841L3.758,7.146L3.791,7.182C3.861,7.273 3.906,7.375 3.909,7.492C3.91,7.536 3.907,7.546 3.902,7.589L3.343,10.845L6.267,9.307L6.311,9.287C6.42,9.249 6.531,9.237 6.643,9.271C6.684,9.283 6.694,9.289 6.733,9.307L9.657,10.845L9.098,7.589L9.092,7.541C9.091,7.498 9.089,7.487 9.095,7.444C9.109,7.328 9.163,7.231 9.242,7.146L11.607,4.841L8.338,4.365L8.291,4.356C8.18,4.323 8.084,4.267 8.013,4.174C7.987,4.14 7.983,4.13 7.962,4.092L6.5,1.13C6.013,2.117 5.525,3.105 5.038,4.092Z" style="fill:rgb(74,74,74);fill-rule:nonzero;"/> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon_context_low.svg b/res/img/icon_context_low.svg new file mode 100644 index 0000000000..ea579ef4c5 --- /dev/null +++ b/res/img/icon_context_low.svg @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> + <g transform="matrix(1,0,0,1,-0,-60)"> + <g id="icon_context_fave" transform="matrix(0.600982,0,0,0.600982,0,60)"> + <g transform="matrix(1.66394,0,0,1.66394,1.66394,1.96327)"> + <path d="M8.737,0.502C8.882,0.514 9.02,0.542 9.155,0.598C9.544,0.759 9.832,1.105 9.958,1.503C10.008,1.664 10.03,1.829 10.033,1.998L10.033,6.5C10.63,6.5 11.226,6.491 11.822,6.501C11.882,6.504 11.882,6.504 11.942,6.51C12.067,6.527 12.188,6.556 12.301,6.614C12.494,6.715 12.636,6.904 12.665,7.122C12.682,7.246 12.662,7.376 12.613,7.492C12.541,7.662 12.419,7.799 12.282,7.921C10.713,9.244 9.104,10.519 7.515,11.818C7.423,11.889 7.328,11.952 7.223,12.003C6.836,12.19 6.376,12.215 5.969,12.079C5.814,12.028 5.673,11.951 5.539,11.857C3.901,10.585 2.306,9.258 0.72,7.921C0.583,7.798 0.46,7.66 0.389,7.488C0.284,7.235 0.332,6.938 0.528,6.743C0.596,6.676 0.678,6.622 0.766,6.585C0.915,6.521 1.077,6.503 1.238,6.5L2.967,6.5L2.967,1.998C2.968,1.927 2.968,1.928 2.973,1.858C2.991,1.692 3.025,1.532 3.088,1.378C3.229,1.035 3.495,0.744 3.84,0.6C3.975,0.543 4.116,0.515 4.262,0.502C5.753,0.459 7.246,0.46 8.737,0.502ZM4.343,1.5C4.313,1.501 4.285,1.503 4.256,1.511C4.096,1.559 4.003,1.732 3.977,1.886C3.972,1.915 3.969,1.944 3.967,1.973C3.932,3.648 3.967,5.324 3.967,7C3.964,7.063 3.956,7.122 3.933,7.181C3.877,7.326 3.753,7.438 3.603,7.481C3.558,7.494 3.514,7.498 3.467,7.5L1.784,7.5C3.234,8.685 4.656,9.904 6.134,11.053C6.16,11.071 6.187,11.087 6.215,11.102C6.433,11.202 6.7,11.184 6.892,11.035L11.219,7.5L9.533,7.5L9.487,7.498C9.441,7.491 9.397,7.483 9.353,7.466C9.223,7.416 9.118,7.311 9.067,7.181C9.05,7.137 9.042,7.093 9.035,7.046C8.957,5.357 9.069,3.663 9.033,1.972C9.021,1.793 8.941,1.581 8.757,1.516C8.732,1.507 8.707,1.503 8.68,1.501C7.235,1.46 5.789,1.5 4.343,1.5Z" style="fill:rgb(206,206,206);fill-rule:nonzero;"/> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon_context_low_on.svg b/res/img/icon_context_low_on.svg new file mode 100644 index 0000000000..28300f9a74 --- /dev/null +++ b/res/img/icon_context_low_on.svg @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"> + <g transform="matrix(1,0,0,1,-20,-60)"> + <g id="icon_context_fave_on" transform="matrix(0.600982,0,0,0.600982,20,60)"> + <clipPath id="_clip1"> + <rect x="0" y="0" width="25" height="25"/> + </clipPath> + <g clip-path="url(#_clip1)"> + <g transform="matrix(1.66394,0,0,1.66394,1.68116,1.96327)"> + <clipPath id="_clip2"> + <rect x="-1" y="-1" width="15" height="15"/> + </clipPath> + <g clip-path="url(#_clip2)"> + <rect x="-6" y="-6" width="25" height="25" style="fill:rgb(74,74,74);fill-opacity:0;fill-rule:nonzero;"/> + <clipPath id="_clip3"> + <path d="M11.76,7C12.241,7 12.307,7.257 11.919,7.574L7.204,11.426C6.813,11.745 6.187,11.743 5.8,11.426L1.084,7.574C0.694,7.255 0.767,7 1.243,7L3.467,7L3.467,2.003C3.467,1.449 3.846,1 4.336,1L8.664,1C9.144,1 9.533,1.438 9.533,2.003L9.533,7L11.76,7Z"/> + </clipPath> + <g clip-path="url(#_clip3)"> + <rect x="-4.167" y="-4" width="21.338" height="20.665" style="fill:rgb(74,74,74);fill-rule:nonzero;"/> + </g> + </g> + </g> + <g transform="matrix(1.66394,0,0,1.66394,1.68116,1.96327)"> + <path d="M8.737,0.502C8.882,0.514 9.02,0.542 9.155,0.598C9.544,0.759 9.832,1.105 9.958,1.503C10.008,1.664 10.03,1.829 10.033,1.998L10.033,6.5C10.63,6.5 11.226,6.491 11.822,6.501C11.882,6.504 11.882,6.504 11.942,6.51C12.067,6.527 12.188,6.556 12.301,6.614C12.494,6.715 12.636,6.904 12.665,7.122C12.682,7.246 12.662,7.376 12.613,7.492C12.541,7.662 12.419,7.799 12.282,7.921C10.713,9.244 9.104,10.519 7.515,11.818C7.423,11.889 7.328,11.952 7.223,12.003C6.836,12.19 6.376,12.215 5.969,12.079C5.814,12.028 5.673,11.951 5.539,11.857C3.901,10.585 2.306,9.258 0.72,7.921C0.583,7.798 0.46,7.66 0.389,7.488C0.284,7.235 0.332,6.938 0.528,6.743C0.596,6.676 0.678,6.622 0.766,6.585C0.915,6.521 1.077,6.503 1.238,6.5L2.967,6.5L2.967,1.998C2.968,1.927 2.968,1.928 2.973,1.858C2.991,1.692 3.025,1.532 3.088,1.378C3.229,1.035 3.495,0.744 3.84,0.6C3.975,0.543 4.116,0.515 4.262,0.502C5.753,0.459 7.246,0.46 8.737,0.502ZM4.343,1.5C4.313,1.501 4.285,1.503 4.256,1.511C4.096,1.559 4.003,1.732 3.977,1.886C3.972,1.915 3.969,1.944 3.967,1.973C3.932,3.648 3.967,5.324 3.967,7C3.964,7.047 3.96,7.091 3.948,7.137C3.905,7.286 3.792,7.41 3.647,7.466C3.588,7.489 3.529,7.497 3.467,7.5L1.784,7.5C3.234,8.685 4.656,9.904 6.134,11.053C6.16,11.071 6.187,11.087 6.215,11.102C6.433,11.202 6.7,11.184 6.892,11.035L11.219,7.5L9.533,7.5L9.487,7.498C9.441,7.491 9.397,7.483 9.353,7.466C9.223,7.416 9.118,7.311 9.067,7.181C9.05,7.137 9.042,7.093 9.035,7.046C8.957,5.357 9.069,3.663 9.033,1.972C9.021,1.793 8.941,1.581 8.757,1.516C8.732,1.507 8.707,1.503 8.68,1.501C7.235,1.46 5.789,1.5 4.343,1.5Z" style="fill:rgb(74,74,74);fill-rule:nonzero;"/> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon_context_message.svg b/res/img/icon_context_message.svg new file mode 100644 index 0000000000..f2ceccfa78 --- /dev/null +++ b/res/img/icon_context_message.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="19px" height="19px" viewBox="0 0 19 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>ED5D3E59-2561-4AC1-9B43-82FBC51767FC</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon_context"> + <g> + <path d="M9.5,19 C14.7467051,19 19,14.7467051 19,9.5 C19,4.25329488 14.7467051,0 9.5,0 C4.25329488,0 0,4.25329488 0,9.5 C0,14.7467051 4.25329488,19 9.5,19 Z" id="Oval-69" fill="#ECECEC"></path> + <path d="M4.5,9.50063771 C4.5,9.13148623 4.59887838,8.85242947 4.7966381,8.66345907 C4.99439782,8.47448867 5.28224377,8.38000488 5.66018457,8.38000488 C6.0249414,8.38000488 6.3072941,8.47668596 6.50725115,8.67005103 C6.70720821,8.86341609 6.80718523,9.14027555 6.80718523,9.50063771 C6.80718523,9.84781589 6.70610956,10.1213794 6.50395517,10.3213365 C6.30180079,10.5212935 6.02054674,10.6212705 5.66018457,10.6212705 C5.29103309,10.6212705 5.00538444,10.5234908 4.80323006,10.3279284 C4.60107568,10.132366 4.5,9.85660521 4.5,9.50063771 L4.5,9.50063771 Z M8.3431114,9.50063771 C8.3431114,9.13148623 8.44198978,8.85242947 8.63974951,8.66345907 C8.83750923,8.47448867 9.12755247,8.38000488 9.50988794,8.38000488 C9.87464476,8.38000488 10.1569975,8.47668596 10.3569545,8.67005103 C10.5569116,8.86341609 10.6568886,9.14027555 10.6568886,9.50063771 C10.6568886,9.84781589 10.5558129,10.1213794 10.3536585,10.3213365 C10.1515042,10.5212935 9.8702501,10.6212705 9.50988794,10.6212705 C9.13634179,10.6212705 8.84849585,10.5234908 8.64634146,10.3279284 C8.44418708,10.132366 8.3431114,9.85660521 8.3431114,9.50063771 L8.3431114,9.50063771 Z M12.1928148,9.50063771 C12.1928148,9.13148623 12.2916931,8.85242947 12.4894529,8.66345907 C12.6872126,8.47448867 12.9750585,8.38000488 13.3529993,8.38000488 C13.7177562,8.38000488 14.0001089,8.47668596 14.2000659,8.67005103 C14.400023,8.86341609 14.5,9.14027555 14.5,9.50063771 C14.5,9.84781589 14.3989243,10.1213794 14.1967699,10.3213365 C13.9946156,10.5212935 13.7133615,10.6212705 13.3529993,10.6212705 C12.9838479,10.6212705 12.6981992,10.5234908 12.4960448,10.3279284 C12.2938904,10.132366 12.1928148,9.85660521 12.1928148,9.50063771 L12.1928148,9.50063771 Z" id="…" fill="#9B9B9B"></path> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon_context_message_dark.svg b/res/img/icon_context_message_dark.svg new file mode 100644 index 0000000000..b4336cc377 --- /dev/null +++ b/res/img/icon_context_message_dark.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="19px" height="19px" viewBox="0 0 19 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>ED5D3E59-2561-4AC1-9B43-82FBC51767FC</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon_context"> + <g> + <path d="M9.5,19 C14.7467051,19 19,14.7467051 19,9.5 C19,4.25329488 14.7467051,0 9.5,0 C4.25329488,0 0,4.25329488 0,9.5 C0,14.7467051 4.25329488,19 9.5,19 Z" id="Oval-69" fill="#000" opacity="0.2"></path> + <path d="M4.5,9.50063771 C4.5,9.13148623 4.59887838,8.85242947 4.7966381,8.66345907 C4.99439782,8.47448867 5.28224377,8.38000488 5.66018457,8.38000488 C6.0249414,8.38000488 6.3072941,8.47668596 6.50725115,8.67005103 C6.70720821,8.86341609 6.80718523,9.14027555 6.80718523,9.50063771 C6.80718523,9.84781589 6.70610956,10.1213794 6.50395517,10.3213365 C6.30180079,10.5212935 6.02054674,10.6212705 5.66018457,10.6212705 C5.29103309,10.6212705 5.00538444,10.5234908 4.80323006,10.3279284 C4.60107568,10.132366 4.5,9.85660521 4.5,9.50063771 L4.5,9.50063771 Z M8.3431114,9.50063771 C8.3431114,9.13148623 8.44198978,8.85242947 8.63974951,8.66345907 C8.83750923,8.47448867 9.12755247,8.38000488 9.50988794,8.38000488 C9.87464476,8.38000488 10.1569975,8.47668596 10.3569545,8.67005103 C10.5569116,8.86341609 10.6568886,9.14027555 10.6568886,9.50063771 C10.6568886,9.84781589 10.5558129,10.1213794 10.3536585,10.3213365 C10.1515042,10.5212935 9.8702501,10.6212705 9.50988794,10.6212705 C9.13634179,10.6212705 8.84849585,10.5234908 8.64634146,10.3279284 C8.44418708,10.132366 8.3431114,9.85660521 8.3431114,9.50063771 L8.3431114,9.50063771 Z M12.1928148,9.50063771 C12.1928148,9.13148623 12.2916931,8.85242947 12.4894529,8.66345907 C12.6872126,8.47448867 12.9750585,8.38000488 13.3529993,8.38000488 C13.7177562,8.38000488 14.0001089,8.47668596 14.2000659,8.67005103 C14.400023,8.86341609 14.5,9.14027555 14.5,9.50063771 C14.5,9.84781589 14.3989243,10.1213794 14.1967699,10.3213365 C13.9946156,10.5212935 13.7133615,10.6212705 13.3529993,10.6212705 C12.9838479,10.6212705 12.6981992,10.5234908 12.4960448,10.3279284 C12.2938904,10.132366 12.1928148,9.85660521 12.1928148,9.50063771 L12.1928148,9.50063771 Z" id="…" fill="#FFF" opacity="0.6"></path> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon_context_person.svg b/res/img/icon_context_person.svg new file mode 100644 index 0000000000..fff019d377 --- /dev/null +++ b/res/img/icon_context_person.svg @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="11.000464" + height="13" + viewBox="0 0 11.000464 13" + version="1.1" + id="svg4500" + inkscape:version="0.91 r13725" + sodipodi:docname="icon_context_person.svg"> + <metadata + id="metadata4520"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>81230A28-D944-4572-B5DB-C03CAA2B1FCA</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1013" + inkscape:window-height="777" + id="namedview4518" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="24.48" + inkscape:cx="4.9078557" + inkscape:cy="9.7756405" + inkscape:window-x="495" + inkscape:window-y="175" + inkscape:window-maximized="0" + inkscape:current-layer="icons_people_svg" /> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title + id="title4502">81230A28-D944-4572-B5DB-C03CAA2B1FCA</title> + <desc + id="desc4504">Created with sketchtool.</desc> + <defs + id="defs4506" /> + <g + style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1" + id="g4511" + transform="translate(-56.999768,-730.5)"> + <g + transform="translate(50,725)" + id="icons_people"> + <g + style="stroke:#00000f;stroke-opacity:0.94117647" + transform="translate(7,6)" + id="icons_people_svg"> + <path + style="stroke:#cecece;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" + inkscape:connector-curvature="0" + id="Oval-40" + d="m 10.5,12 c 0,-2.7614237 0,-5 -5,-5 -5.0000002,0 -5,2.2385763 -5,5 3.4756747,0 5.5712891,0 10,0 z" /> + <circle + r="2.75" + cy="2.75" + cx="5.5" + id="Oval" + style="stroke:#cecece;stroke-opacity:1" /> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon_context_person_on.svg b/res/img/icon_context_person_on.svg new file mode 100644 index 0000000000..362944332d --- /dev/null +++ b/res/img/icon_context_person_on.svg @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="11.000464" + height="13" + viewBox="0 0 11.000464 13" + version="1.1" + id="svg4500" + inkscape:version="0.91 r13725" + sodipodi:docname="icon_context_person_on.svg"> + <metadata + id="metadata4520"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>81230A28-D944-4572-B5DB-C03CAA2B1FCA</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1013" + inkscape:window-height="777" + id="namedview4518" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="24.48" + inkscape:cx="4.9078557" + inkscape:cy="9.7756405" + inkscape:window-x="495" + inkscape:window-y="175" + inkscape:window-maximized="0" + inkscape:current-layer="icons_people_svg" /> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title + id="title4502">81230A28-D944-4572-B5DB-C03CAA2B1FCA</title> + <desc + id="desc4504">Created with sketchtool.</desc> + <defs + id="defs4506" /> + <g + style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1" + id="g4511" + transform="translate(-56.999768,-730.5)"> + <g + transform="translate(50,725)" + id="icons_people"> + <g + style="stroke:#00000f;stroke-opacity:0.94117647" + transform="translate(7,6)" + id="icons_people_svg"> + <path + style="stroke:#4a4a4a;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;fill:#4a4a4a;fill-opacity:1" + inkscape:connector-curvature="0" + id="Oval-40" + d="m 10.5,12 c 0,-2.7614237 0,-5 -5,-5 -5.0000002,0 -5,2.2385763 -5,5 3.4756747,0 5.5712891,0 10,0 z" /> + <circle + r="2.75" + cy="2.75" + cx="5.5" + id="Oval" + style="stroke:#4a4a4a;stroke-opacity:1;fill:#4a4a4a;fill-opacity:1" /> + </g> + </g> + </g> +</svg> diff --git a/res/img/icon_copy_message.svg b/res/img/icon_copy_message.svg new file mode 100644 index 0000000000..8d8887bb22 --- /dev/null +++ b/res/img/icon_copy_message.svg @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="19px" + height="19px" + viewBox="0 0 19 19" + version="1.1" + id="svg3734" + sodipodi:docname="icon_copy_message.svg" + inkscape:version="0.92.1 r"> + <metadata + id="metadata3738"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>ED5D3E59-2561-4AC1-9B43-82FBC51767FC</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1596" + inkscape:window-height="846" + id="namedview3736" + showgrid="false" + inkscape:zoom="12.421053" + inkscape:cx="3.4935767" + inkscape:cy="2.469644" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Symbols" /> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title + id="title3722">ED5D3E59-2561-4AC1-9B43-82FBC51767FC</title> + <desc + id="desc3724">Created with sketchtool.</desc> + <defs + id="defs3726" /> + <g + id="Symbols" + stroke="none" + stroke-width="1" + fill="none" + fill-rule="evenodd"> + <path + d="M 9.5,19 C 14.746705,19 19,14.746705 19,9.5 19,4.2532949 14.746705,0 9.5,0 4.2532949,0 0,4.2532949 0,9.5 0,14.746705 4.2532949,19 9.5,19 Z" + id="Oval-69" + inkscape:connector-curvature="0" + style="fill:#ececec" /> + <g + id="g4632" + transform="translate(-2.3841858e-7,-1)"> + <rect + style="stroke:#9b9b9b;stroke-width:0.91585475;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + y="4.3017478" + x="4.6289611" + height="10.396504" + width="7.7420783" + id="rect3745-3" /> + <rect + style="fill:#ececec;fill-opacity:1;stroke:#9b9b9b;stroke-width:0.91585475;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + y="6.3017478" + x="6.6289611" + height="10.396504" + width="7.7420783" + id="rect3745" /> + </g> + </g> +</svg> diff --git a/res/img/icon_copy_message_dark.svg b/res/img/icon_copy_message_dark.svg new file mode 100644 index 0000000000..b81e617d8c --- /dev/null +++ b/res/img/icon_copy_message_dark.svg @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="19px" + height="19px" + viewBox="0 0 19 19" + version="1.1" + id="svg3734" + sodipodi:docname="icon_copy_message_dark.svg" + inkscape:version="0.92.1 r" + enable-background="new"> + <metadata + id="metadata3738"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>ED5D3E59-2561-4AC1-9B43-82FBC51767FC</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1596" + inkscape:window-height="846" + id="namedview3736" + showgrid="false" + inkscape:zoom="12.421053" + inkscape:cx="3.4935767" + inkscape:cy="2.469644" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg3734" /> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title + id="title3722">ED5D3E59-2561-4AC1-9B43-82FBC51767FC</title> + <desc + id="desc3724">Created with sketchtool.</desc> + <defs + id="defs3726" /> + <path + style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1" + inkscape:connector-curvature="0" + id="Oval-69" + d="M 9.5,19 C 14.746705,19 19,14.746705 19,9.5 19,4.2532949 14.746705,0 9.5,0 4.2532949,0 0,4.2532949 0,9.5 0,14.746705 4.2532949,19 9.5,19 Z" /> + <g + id="g4675" + style="stroke:#ffffff;stroke-opacity:1;opacity:0.6"> + <path + id="rect3745-3" + d="M 4.6289062 3.3007812 L 4.6289062 13.699219 L 6.6289062 13.699219 L 6.6289062 5.3007812 L 12.371094 5.3007812 L 12.371094 3.3007812 L 4.6289062 3.3007812 z " + style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.91585475;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <rect + id="rect3745-7" + width="7.7420783" + height="10.396504" + x="6.6289062" + y="5.3007812" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.91585475;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </g> +</svg> diff --git a/res/img/icon_person.svg b/res/img/icon_person.svg new file mode 100644 index 0000000000..4be70df0db --- /dev/null +++ b/res/img/icon_person.svg @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="11px" height="13px" viewBox="0 0 11 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>815EF7DE-169A-4322-AE2A-B65CBE91DCED</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Left-menu" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Left-menu-option-B" transform="translate(-33.000000, -223.000000)" fill="#FFFFFF" stroke="#76CFA6"> + <g id="Left-panel"> + <g id="Room-list" transform="translate(0.000000, 69.000000)"> + <g id="Group-3" transform="translate(16.000000, 144.000000)"> + <g id="icon_person" transform="translate(18.000000, 11.000000)"> + <g> + <path d="M5.34291667,5.8555 C5.51425,5.86608333 5.68525,5.88091667 5.85566667,5.90108333 C5.987,5.91666667 6.118,5.93533333 6.24825,5.95783333 C6.96516667,6.08175 7.69391667,6.32633333 8.23175,6.83591667 C8.32116667,6.92058333 8.40433333,7.01166667 8.48041667,7.1085 C8.59608333,7.25566667 8.69475,7.41583333 8.77633333,7.58425 C8.92233333,7.8855 9.0125,8.21083333 9.06841667,8.54008333 C9.13758333,8.9475 9.15758333,9.36266667 9.1635,9.77533333 C9.1685,10.1279167 9.167,10.4805833 9.16725,10.8331667 L8.33333344e-05,10.8331667 C0.000250000001,10.4805833 -0.00125,10.1279167 0.00375,9.77533333 C0.00916666667,9.39616667 0.0268333333,9.01533333 0.083,8.63991667 C0.134833333,8.29291667 0.221666667,7.94891667 0.369333333,7.62966667 C0.44775,7.46033333 0.543,7.29875 0.65525,7.14958333 C0.729,7.05166667 0.809833333,6.95925 0.897,6.87308333 C1.41916667,6.35725 2.13533333,6.10216667 2.84408333,5.97125 C2.97233333,5.94758333 3.10125,5.92775 3.23058333,5.91108333 C3.39841667,5.8895 3.56683333,5.87333333 3.73558333,5.86133333 C3.95191667,5.846 4.16858333,5.8385 4.38533333,5.83458333 C4.48475,5.8335 4.58408333,5.83316667 4.6835,5.8335 C4.9035,5.83583333 5.12333333,5.84183333 5.34291667,5.8555 Z" id="Fill-1" stroke-linejoin="round"></path> + <path d="M4.99558333,0.031 C5.28133333,0.0745833333 5.55966667,0.1645 5.81691667,0.29625 C6.32075,0.554333333 6.7375,0.971 6.9955,1.47483333 C7.11691667,1.712 7.20291667,1.967 7.24975,2.22916667 C7.30216667,2.52283333 7.30583333,2.82525 7.26083333,3.12008333 C7.2205,3.38416667 7.14066667,3.642 7.02475,3.88266667 C6.88325,4.17633333 6.68833333,4.44375 6.45233333,4.66866667 C6.21591667,4.89408333 5.93891667,5.07633333 5.638,5.20358333 C5.30525,5.34433333 4.94491667,5.4165 4.58366667,5.4165 C4.22233333,5.4165 3.86208333,5.34433333 3.52925,5.20358333 C3.22833333,5.07633333 2.95133333,4.89408333 2.71491667,4.66866667 C2.479,4.44375 2.284,4.17633333 2.1425,3.88266667 C2.02658333,3.642 1.94675,3.38416667 1.90641667,3.12008333 C1.86141667,2.82525 1.86508333,2.52291667 1.91758333,2.22925 C1.96433333,1.967 2.05033333,1.712 2.17175,1.47483333 C2.42975,0.971 2.8465,0.554333333 3.35033333,0.29625 C3.60758333,0.1645 3.88591667,0.0745833333 4.17166667,0.031 C4.28525,0.0136666667 4.39916667,0.005 4.51391667,0.000666666667 C4.58391667,-0.000166666667 4.58366667,-0.000166666667 4.65333333,0.000666666667 C4.76808333,0.005 4.882,0.0136666667 4.99558333,0.031 Z" id="Fill-2"></path> + </g> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/icons-apps-active.svg b/res/img/icons-apps-active.svg new file mode 100644 index 0000000000..ea222d0511 --- /dev/null +++ b/res/img/icons-apps-active.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="35px" + height="35px" viewBox="0 0 35 35" enable-background="new 0 0 35 35" xml:space="preserve"> +<g id="Layer_1"> + <path id="Oval-109-Copy" fill="#76CFA6" enable-background="new " d="M17.5,35C27.165,35,35,27.165,35,17.5S27.165,0,17.5,0 + S0,7.835,0,17.5S7.835,35,17.5,35z"/> + <g id="Icon"> + <g> + <path fill="none" stroke="#FFFFFF" d="M7.5,12.5h5v-5h-5V12.5z M15,27.5h5v-5h-5V27.5z M7.5,27.5h5v-5h-5V27.5z M7.5,20h5v-5h-5 + V20z M15,20h5v-5h-5V20z M22.5,7.5v5h5v-5H22.5z M15,12.5h5v-5h-5V12.5z M22.5,20h5v-5h-5V20z M22.5,27.5h5v-5h-5V27.5z"/> + </g> + </g> +</g> +<g id="Layer_2"> + <g id="Icon_1_" opacity="0.15"> + <g> + <path fill="none" stroke="#76CFA6" d="M7.5,12.5h5v-5h-5V12.5z M15,27.5h5v-5h-5V27.5z M7.5,27.5h5v-5h-5V27.5z M7.5,20h5v-5h-5 + V20z M15,20h5v-5h-5V20z M22.5,7.5v5h5v-5H22.5z M15,12.5h5v-5h-5V12.5z M22.5,20h5v-5h-5V20z M22.5,27.5h5v-5h-5V27.5z"/> + </g> + </g> +</g> +</svg> diff --git a/res/img/icons-apps.svg b/res/img/icons-apps.svg new file mode 100644 index 0000000000..affd8e6408 --- /dev/null +++ b/res/img/icons-apps.svg @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="35px" height="35px" viewBox="0 0 35 35" enable-background="new 0 0 35 35" xml:space="preserve"> +<path id="Oval-109-Copy" opacity="0.15" fill="#76CFA6" enable-background="new " d="M17.5,35C27.165,35,35,27.165,35,17.5 + S27.165,0,17.5,0S0,7.835,0,17.5S7.835,35,17.5,35z"/> +<g id="Icon"> + <g> + <path fill="none" stroke="#76CFA6" d="M7.5,12.5h5v-5h-5V12.5z M15,27.5h5v-5h-5V27.5z M7.5,27.5h5v-5h-5V27.5z M7.5,20h5v-5h-5 + V20z M15,20h5v-5h-5V20z M22.5,7.5v5h5v-5H22.5z M15,12.5h5v-5h-5V12.5z M22.5,20h5v-5h-5V20z M22.5,27.5h5v-5h-5V27.5z"/> + </g> +</g> +</svg> diff --git a/res/img/icons-close-button.svg b/res/img/icons-close-button.svg new file mode 100644 index 0000000000..f960d73a3c --- /dev/null +++ b/res/img/icons-close-button.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="35px" height="35px" viewBox="0 0 35 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>206C270A-EB00-48E4-8CC3-5D403C59177C</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="1:1-chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Chat-People-2-Invite-modal-(similar-to-chat-group-5)" transform="translate(-909.000000, -263.000000)"> + <g id="icons_close" transform="translate(909.000000, 263.000000)"> + <path d="M17.5,35 C27.1649831,35 35,27.1649831 35,17.5 C35,7.83501688 27.1649831,0 17.5,0 C7.83501688,0 0,7.83501688 0,17.5 C0,27.1649831 7.83501688,35 17.5,35 Z" id="Oval-1-Copy-7" fill="#76CFA6" opacity="0.15"></path> + <polyline id="icon_close" fill="#76CFA6" opacity="0.9" transform="translate(17.468897, 17.470577) rotate(-315.000000) translate(-17.468897, -17.470577) " points="18.2115394 5.97057742 16.674774 5.97057742 16.674774 16.7275762 5.9688975 16.7275762 5.9688975 18.2642903 16.674774 18.2642903 16.674774 28.9705774 18.2115394 28.9705774 18.2115394 18.2642903 28.9688975 18.2642903 28.9688975 16.7275762 18.2115394 16.7275762 18.2115394 5.97057742"></polyline> + </g> + </g> + </g> +</svg> diff --git a/res/img/icons-close.svg b/res/img/icons-close.svg new file mode 100644 index 0000000000..453b51082f --- /dev/null +++ b/res/img/icons-close.svg @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-11 13 24 24" xml:space="preserve"> +<style type="text/css"> + .st1{fill:none;stroke-width:2;stroke-linecap:round;} +</style> +<title>icons_create_room</title> +<desc>Created with sketchtool.</desc> +<g id="_x30_3-Input" sketch:type="MSPage"> + <g id="_x30_3_x5F_4-Uploading" transform="translate(-20.000000, -726.000000)" sketch:type="MSArtboardGroup"> + <g id="Room-list" sketch:type="MSLayerGroup"> + <g id="Room-list_x2F_Footer" transform="translate(0.000000, 708.000000)" sketch:type="MSShapeGroup"> + <g id="icons_create_room" transform="translate(20.000000, 18.000000)"> + <circle id="Oval-1-Copy-7" fill="#76CFA6" cx="1" cy="25" r="12"/> + <path id="Line" class="st1" stroke="#FFFFFF" d="M-2.5,28.5l7.1-7.1"/> + <path id="Line_1_" class="st1" stroke="#FFFFFF" d="M-2.5,21.5l7.1,7.1"/> + </g> + </g> + </g> + </g> +</g> +</svg> diff --git a/res/img/icons-create-room.svg b/res/img/icons-create-room.svg new file mode 100644 index 0000000000..252bd2df3b --- /dev/null +++ b/res/img/icons-create-room.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="25px" height="25px" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 3.8.3 (29802) - http://www.bohemiancoding.com/sketch --> + <title>0F9BCC43-B3A7-4C9F-8E34-1F38194362C2</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Room-list-Copy-3" transform="translate(-21.000000, -726.000000)"> + <g id="icons_create_room" transform="translate(21.000000, 726.000000)"> + <path d="M12.5,25 C19.4035594,25 25,19.4035594 25,12.5 C25,5.59644063 19.4035594,0 12.5,0 C5.59644063,0 0,5.59644063 0,12.5 C0,19.4035594 5.59644063,25 12.5,25 Z" id="Oval-1-Copy-7" fill="#76CFA6"></path> + <g id="Group-3" opacity="0.8" transform="translate(6.000000, 6.000000)" stroke="#FFFFFF" stroke-linecap="round"> + <path d="M0,6.5 L13,6.5" id="Line"></path> + <path d="M6.5,0 L6.5,13" id="Line"></path> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/icons-directory.svg b/res/img/icons-directory.svg new file mode 100644 index 0000000000..2688b84713 --- /dev/null +++ b/res/img/icons-directory.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="25px" height="25px" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> + <title>icons_directory</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Left-panel" transform="translate(-83.000000, -726.000000)"> + <g id="icons_directory"> + <g transform="translate(83.000000, 726.000000)"> + <path d="M12.5,25 C19.4035594,25 25,19.4035594 25,12.5 C25,5.59644063 19.4035594,0 12.5,0 C5.59644063,0 0,5.59644063 0,12.5 C0,19.4035594 5.59644063,25 12.5,25 Z" id="Oval-1-Copy-7" fill="#76CFA6"></path> + <g id="Lines" transform="translate(6.000000, 7.000000)" stroke="#FFFFFF" stroke-linecap="round"> + <path d="M4,5.5 L9,5.5" id="Line"></path> + <path d="M4,1.5 L13,1.5" id="Line-Copy-4"></path> + <path d="M0,1.5 L2,1.5" id="Line" opacity="0.6"></path> + <path d="M0,5.5 L2,5.5" id="Line" opacity="0.6"></path> + <path d="M4,9.5 L11,9.5" id="Line-Copy-6"></path> + <path d="M0,9.5 L2,9.5" id="Line-Copy-3" opacity="0.6"></path> + </g> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..97ba4228e3 --- /dev/null +++ b/res/img/icons-files.svg @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="25px" height="25px" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>7C98C075-AB4D-45A3-85F9-CCD46F84DA7F</title> + <desc>Created with sketchtool.</desc> + <defs> + <path d="M0,2.00276013 C0,0.896666251 0.889186576,0 1.99983124,0 L4.84793814,0 C4.84793814,0 9.25,4.54127763 9.25,4.54127763 L9.25,10.9954009 C9.25,12.1025104 8.36307111,13 7.24288777,13 L2.00711223,13 C0.898614756,13 0,12.1064574 0,10.9972399 L0,2.00276013 Z" id="path-1"></path> + <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="9.25" height="13" fill="white"> + <use xlink:href="#path-1"></use> + </mask> + <path d="M9.28225806,5 L5.82322134,5 C4.97217082,5 4.28225806,4.31002094 4.28225806,3.45903672 L4.28225806,0" id="path-3"></path> + <mask id="mask-4" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="5" height="5" fill="white"> + <use xlink:href="#path-3"></use> + </mask> + </defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Right-panel/Header" transform="translate(-66.000000, -23.000000)"> + <g id="icons_files" transform="translate(66.000000, 23.000000)"> + <g id="Group-5-Copy-2" fill="#76CFA6"> + <path d="M12.5,25 C19.4035594,25 25,19.4035594 25,12.5 C25,5.59644063 19.4035594,0 12.5,0 C5.59644063,0 0,5.59644063 0,12.5 C0,19.4035594 5.59644063,25 12.5,25 Z" id="Oval-1-Copy-7"></path> + </g> + <g id="Rectangle-5-+-Rectangle-6-Copy-2" transform="translate(8.000000, 6.000000)" stroke="#FFFFFF" stroke-width="2"> + <use id="Rectangle-5" mask="url(#mask-2)" opacity="0.8" xlink:href="#path-1"></use> + <use id="Rectangle-6" mask="url(#mask-4)" xlink:href="#path-3"></use> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..8f89ba83c4 --- /dev/null +++ b/res/img/icons-groups.svg @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 25 25" style="enable-background:new 0 0 25 25;" xml:space="preserve"> +<style type="text/css"> + .st4{fill:none;stroke-miterlimit:10;} +</style> +<g id="icons_people" transform="translate(50.000000, 725.000000)"> + <path id="Oval-1-Copy-7" fill="#76CFA6" d="M-37.5-700c6.9,0,12.5-5.6,12.5-12.5S-30.6-725-37.5-725S-50-719.4-50-712.5 + S-44.4-700-37.5-700z"/> + <g id="g4240_1_" transform="translate(6.945774,9.0366549)"> + <path id="path4242_1_" class="st4" stroke="#FFFFFF" d="M-38.8-714.1c0-3.2,0-5.7-5.7-5.7s-5.7,2.5-5.7,5.7C-46.2-714.1-43.8-714.1-38.8-714.1z"/> + <circle id="circle4244_1_" class="st4" stroke="#FFFFFF" cx="-44.5" cy="-724.7" r="3.2"/> + </g> + <g> + <path fill="#FFFFFF" d="M-45.8-708.7c0-2.5,0.3-4,4.5-4c0.3,0,0.6,0,0.8,0c-0.3-0.3-0.6-0.6-0.8-1c0,0,0,0-0.1,0 + c-5.5,0-5.5,2.7-5.5,5.5v0.5h2.7c0.1-0.3,0.1-0.7,0.2-1H-45.8z"/> + <path fill="#FFFFFF" d="M-43.6-717.4c0-1.3,1-2.3,2.3-2.3c0.6,0,1.1,0.2,1.5,0.5c0.3-0.2,0.6-0.3,1-0.5c-0.6-0.7-1.5-1.1-2.4-1.1 + c-1.8,0-3.3,1.5-3.3,3.3c0,1.8,1.4,3.2,3.2,3.3c-0.1-0.3-0.2-0.7-0.3-1C-42.8-715.3-43.6-716.2-43.6-717.4z"/> + <path fill="#FFFFFF" d="M-27.8-708.2c0-2.8,0-5.5-5.5-5.5c-0.2,0-0.3,0-0.5,0c-0.2,0.4-0.5,0.7-0.8,1c0.4,0,0.8-0.1,1.3-0.1 + c4.2,0,4.5,1.5,4.5,4h-2.4c0.1,0.3,0.2,0.7,0.2,1h3.1V-708.2z"/> + <path fill="#FFFFFF" d="M-33.3-719.7c1.3,0,2.3,1,2.3,2.3c0,1.3-1,2.3-2.3,2.3c0,0,0,0,0,0c0,0.3-0.1,0.7-0.3,1c0.1,0,0.2,0,0.3,0 + c1.8,0,3.3-1.5,3.3-3.3c0-1.8-1.5-3.3-3.3-3.3c-1,0-1.9,0.5-2.5,1.2c0.3,0.1,0.6,0.3,0.9,0.5C-34.6-719.4-34-719.7-33.3-719.7z"/> + </g> +</g> +</svg> diff --git a/res/img/icons-hide-apps.svg b/res/img/icons-hide-apps.svg new file mode 100644 index 0000000000..b622e97f71 --- /dev/null +++ b/res/img/icons-hide-apps.svg @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xml:space="preserve"> +<style type="text/css"> + .st1{opacity:0.85;} + .st2{fill:none;stroke:#FFFFFF;stroke-width:1;stroke-linecap:round;stroke-miterlimit:10;} + .st3{fill:#FFFFFF;} + .st4{fill:none;stroke:#FFFFFF;stroke-linejoin:round;stroke-miterlimit:10;} +</style> +<g id="Layer_1_1_"> + <path id="Oval-109-Copy" fill="#76CFA6" d="M17.5,35C27.2,35,35,27.2,35,17.5S27.2,0,17.5,0S0,7.8,0,17.5S7.8,35,17.5,35z"/> +</g> +<g id="frame" class="st1"> + <g id="Layer_3"> + <g> + <g> + <line class="st2" x1="17.5" y1="21" x2="17.5" y2="26"/> + <g> + <polygon class="st3" points="15.5,21.8 17.5,18.3 19.5,21.8 "/> + </g> + </g> + </g> + </g> + <rect x="6.7" y="6.7" class="st4" width="21.6" height="21.6"/> + <line class="st4" x1="6.7" y1="16.7" x2="28.2" y2="16.7"/> + <path class="st3" d="M13.3,13.3v-3.1c0-0.1-0.1-0.3-0.3-0.3H9.9c-0.1,0-0.3,0.1-0.3,0.3v3.1c0,0.1,0.1,0.3,0.3,0.3H13 + C13.2,13.5,13.3,13.4,13.3,13.3z"/> + <path class="st3" d="M19.3,13.3v-3.1c0-0.1-0.1-0.3-0.3-0.3h-3.1c-0.1,0-0.3,0.1-0.3,0.3v3.1c0,0.1,0.1,0.3,0.3,0.3H19 + C19.2,13.5,19.3,13.4,19.3,13.3z"/> + <path class="st3" d="M25.3,13.3v-3.1c0-0.1-0.1-0.3-0.3-0.3h-3.1c-0.1,0-0.3,0.1-0.3,0.3v3.1c0,0.1,0.1,0.3,0.3,0.3H25 + C25.2,13.5,25.3,13.4,25.3,13.3z"/> +</g> +</svg> diff --git a/res/img/icons-hide-stickers.svg b/res/img/icons-hide-stickers.svg new file mode 100644 index 0000000000..f28e8646e6 --- /dev/null +++ b/res/img/icons-hide-stickers.svg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve"> +<g id="Layer_1_1_" opacity="0.4"> + <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.43,250-250C500,111.429,388.571,0,250,0 + C111.429,0,0,111.429,0,250C0,388.57,111.429,500,250,500z"/> +</g> +<path fill="none" stroke="#FFFFFF" stroke-width="12" stroke-miterlimit="10" d="M250,430c-98.996,0-180-81.003-180-180 + c0-98.998,81.005-180,180-180c98.994,0,180,81.002,180,180C430,348.997,348.995,430,250,430z M322.8,229.2 + c17.686,0,31.201-13.519,31.201-31.2c0-17.683-13.519-31.2-31.201-31.2c-17.682,0-31.2,13.518-31.2,31.2S305.118,229.2,322.8,229.2z + M177.2,229.2c17.682,0,31.2-13.519,31.2-31.2c0-17.683-13.519-31.2-31.2-31.2c-17.683,0-31.201,13.518-31.201,31.2 + S159.518,229.2,177.2,229.2z M250,364.4c48.883,0,89.436-30.164,106.081-72.801H143.919C160.564,334.236,201.117,364.4,250,364.4z" + /> +</svg> diff --git a/res/img/icons-home.svg b/res/img/icons-home.svg new file mode 100644 index 0000000000..eb5484c883 --- /dev/null +++ b/res/img/icons-home.svg @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 25 25" style="enable-background:new 0 0 25 25;" xml:space="preserve"> +<style type="text/css"> + .st1{fill:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;} +</style> +<g id="Layer_1"> + <title>81230A28-D944-4572-B5DB-C03CAA2B1FCA</title> + <desc>Created with sketchtool.</desc> + <g id="Symbols"> + <g id="Left-nav-default" transform="translate(-50.000000, -725.000000)"> + <g id="Left-panel"> + <g> + <g id="icons_people" transform="translate(50.000000, 725.000000)"> + <path id="Oval-1-Copy-7" fill="#76cfa6" d="M12.5,25C19.4,25,25,19.4,25,12.5S19.4,0,12.5,0S0,5.6,0,12.5S5.6,25,12.5,25z"/> + </g> + </g> + </g> + </g> + </g> +</g> +<g id="Layer_2"> + <rect x="7.8" y="10.7" class="st1" stroke="#ffffff" width="9.4" height="7.4"/> + <polygon class="st1" stroke="#ffffff" points="12.5,6 6.2,10.7 18.8,10.7 "/> +</g> +</svg> diff --git a/res/img/icons-notifications.svg b/res/img/icons-notifications.svg new file mode 100644 index 0000000000..66a49d6c0c --- /dev/null +++ b/res/img/icons-notifications.svg @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="25px" height="25px" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>5E723325-BD0B-454D-BE25-638AF09A97AC</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Right-panel/Header" transform="translate(-100.000000, -23.000000)"> + <g id="icons_notifications" transform="translate(100.000000, 23.000000)"> + <path d="M12.5,25 C19.4035594,25 25,19.4035594 25,12.5 C25,5.59644063 19.4035594,0 12.5,0 C5.59644063,0 0,5.59644063 0,12.5 C0,19.4035594 5.59644063,25 12.5,25 Z" id="Oval-1-Copy-7" fill="#76CFA6"></path> + <g id="Group-8" opacity="0.8" transform="translate(7.000000, 4.000000)"> + <path d="M5.41666667,16.7222222 C6.38316498,16.7222222 7.16666667,15.9387205 7.16666667,14.9722222 C7.16666667,14.0057239 6.38316498,13.2222222 5.41666667,13.2222222 C4.45016835,13.2222222 3.66666667,14.0057239 3.66666667,14.9722222 C3.66666667,15.9387205 4.45016835,16.7222222 5.41666667,16.7222222 Z" id="Oval-49" stroke="#FFFFFF"></path> + <path d="M1,12.4488669 C1,12.4468729 10.0044225,12.4444444 10.0044225,12.4444444 C10.0024284,12.4444444 10,7.94444444 10,7.94444444 C10,5.46303559 7.98297457,3.44444444 5.5,3.44444444 C3.01859115,3.44444444 1,5.46146988 1,7.94444444 L1,12.4488669 Z M5.5,2.44444444 C8.53756612,2.44444444 11,4.91305916 11,7.94444444 L11,12.4488669 C11,12.9987092 10.555163,13.4444444 10.0044225,13.4444444 L0.995577499,13.4444444 C0.445735229,13.4444444 0,12.9996075 0,12.4488669 L0,7.94444444 C0,4.90687832 2.46861471,2.44444444 5.5,2.44444444 Z" id="Rectangle-15" fill="#FFFFFF"></path> + <path d="M4.27777778,1.83333333 L6.72222222,1.83333333" id="Line" stroke="#FFFFFF" stroke-linecap="round"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..8854506127 --- /dev/null +++ b/res/img/icons-people.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="25px" height="25px" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>81230A28-D944-4572-B5DB-C03CAA2B1FCA</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Left-nav-default" transform="translate(-50.000000, -725.000000)"> + <g id="Left-panel"> + <g> + <g id="icons_people" transform="translate(50.000000, 725.000000)"> + <path d="M12.5,25 C19.4035594,25 25,19.4035594 25,12.5 C25,5.59644063 19.4035594,0 12.5,0 C5.59644063,0 0,5.59644063 0,12.5 C0,19.4035594 5.59644063,25 12.5,25 Z" id="Oval-1-Copy-7" fill="#76CFA6"></path> + <g id="icons_people_svg" transform="translate(7.000000, 6.000000)" stroke="#FFFFFF"> + <path d="M10.5,12 C10.5,9.23857625 10.5000002,7 5.5,7 C0.499999803,7 0.5,9.23857625 0.5,12 C3.97567472,12 6.07128906,12 10.5,12 Z" id="Oval-40" stroke-linecap="round" stroke-linejoin="round"></path> + <circle id="Oval" cx="5.5" cy="2.75" r="2.75"></circle> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/icons-pin.svg b/res/img/icons-pin.svg new file mode 100644 index 0000000000..a6fbf13baa --- /dev/null +++ b/res/img/icons-pin.svg @@ -0,0 +1,7 @@ +<svg width="16px" height="16px" viewbox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <g transform="scale(0.03125)"> + <path id="svg_2" fill="none" stroke="#76cfa6" stroke-width="40" stroke-linecap="round" stroke-linejoin="round" d="m315.802,402.338c12.73,-33.537 13.503,-69.629 3.623,-102.697l93.245,-103.107l7.831,7.831c10.411,10.409 27.283,10.409 37.691,0c10.41,-10.408 10.41,-27.281 0.001,-37.69l-112.869,-112.867c-10.407,-10.409 -27.279,-10.41 -37.689,-0.001c-10.408,10.41 -10.409,27.283 0.001,37.693l7.833,7.833l-103.107,93.243c-33.069,-9.878 -69.163,-9.107 -102.697,3.626c-4.7,1.785 -8.001,5.646 -9.059,10.604c-1.175,5.473 0.627,11.402 4.697,15.472l184.42,184.421c4.069,4.07 10,5.871 15.472,4.695c4.959,-1.055 8.82,-4.357 10.607,-9.056z"/> + <polyline id="svg_3" fill="none" stroke="#76cfa6" stroke-width="40" stroke-linecap="round" stroke-linejoin="round" points=" 180.951,297.927 46,466 215.319,332.295 "/> + <!--<line id="svg_4" fill="none" stroke="#76cfa6" stroke-width="40" stroke-linecap="round" stroke-linejoin="round" y2="219.549" y1="138.166" x2="255.531" x1="336.915"/>--> + </g> +</svg> \ 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 0000000000..fc0ab750b6 --- /dev/null +++ b/res/img/icons-room-add.svg @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" + id="svg4196" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 25 25" + style="enable-background:new 0 0 25 25;" xml:space="preserve"> +<style type="text/css"> + .st1{opacity:0.7;} + .st2{fill:none;stroke-linecap:round;} +</style> +<g id="icons_people" transform="translate(50.000000, 725.000000)"> + <path id="Oval-1-Copy-7" fill="#76CFA6" d="M-37.5-700c6.9,0,12.5-5.6,12.5-12.5S-30.6-725-37.5-725S-50-719.4-50-712.5 + S-44.4-700-37.5-700z"/> + <g id="text3879" transform="matrix(1.0243293,0,0,0.97624855,-24.996028,0.15844144)"> + <g id="Group-3" transform="translate(14.4375,3.9375)" class="st1"> + <path id="Line" class="st2" stroke="#ffffff" d="M-23.2-733.8h4.6"/> + <path id="path3142" class="st2" stroke="#ffffff" d="M-20.9-736.2v4.8"/> + </g> + <path id="path3002" fill="#ffffff" d="M-11.4-731.3l-0.5,2.6h2.2v1h-2.4l-0.7,3.3h-1.1l0.7-3.3 + h-2.3l-0.6,3.3h-1.1l0.6-3.3h-2v-1h2.2l0.5-2.6H-18v-1h2.3l0.6-3.4h1.1l-0.6,3.4h2.4l0.7-3.4h1l-0.7,3.4h2v1H-11.4 M-15.3-728.7 + h2.3l0.5-2.6h-2.3L-15.3-728.7"/> + </g> +</g> +</svg> diff --git a/res/img/icons-room.svg b/res/img/icons-room.svg new file mode 100644 index 0000000000..d2abb21301 --- /dev/null +++ b/res/img/icons-room.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 25 25" style="enable-background:new 0 0 25 25;" xml:space="preserve"> +<g id="icons_people"> + <path id="Oval-1-Copy-7" fill="#76CFA6" d="M12.5,25C19.4,25,25,19.4,25,12.5S19.4,0,12.5,0S0,5.6,0,12.5S5.6,25,12.5,25z"/> + <g id="text3879" transform="scale(1.0243293,0.97624855)"> + <path id="path3002" fill="#ffffff" d="M15.3,11.1l-0.6,3.3h2.8v1.3h-3l-0.8,4.2h-1.3l0.8-4.2h-3l-0.8,4.2H8.1l0.8-4.2H6.3v-1.3h2.8 + l0.7-3.3H7.1V9.9H10l0.8-4.3h1.4l-0.8,4.3h3l0.8-4.3h1.3l-0.8,4.3h2.6v1.2H15.3 M10.4,14.5h3l0.6-3.3h-3L10.4,14.5"/> + </g> +</g> +</svg> diff --git a/res/img/icons-search-copy.svg b/res/img/icons-search-copy.svg new file mode 100644 index 0000000000..b026718b84 --- /dev/null +++ b/res/img/icons-search-copy.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="13" height="13" viewBox="0, 0, 13, 13"> + <g id="Symbols"> + <g> + <path d="M10.229,5.547 C10.229,8.133 8.133,10.229 5.547,10.229 C2.961,10.229 0.865,8.133 0.865,5.547 C0.865,2.961 2.961,0.865 5.547,0.865 C8.133,0.865 10.229,2.961 10.229,5.547 z" fill-opacity="0" stroke="#76CFA6" stroke-width="1" stroke-linecap="round" id="path-1" opacity="0.7"/> + <path d="M8.824,8.824 L12.135,12.135" fill-opacity="0" stroke="#76CFA6" stroke-width="1" stroke-linecap="round" id="Line" opacity="0.7"/> + </g> + </g> +</svg> diff --git a/res/img/icons-search.svg b/res/img/icons-search.svg new file mode 100644 index 0000000000..d85709e66c --- /dev/null +++ b/res/img/icons-search.svg @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="35" height="35" viewBox="0, 0, 35, 35"> + <g id="Symbols"> + <path d="M17.5,35 C27.165,35 35,27.165 35,17.5 C35,7.835 27.165,0 17.5,0 C7.835,0 0,7.835 0,17.5 C0,27.165 7.835,35 17.5,35 z" fill="#76CFA6" opacity="0.15" id="Oval-1-Copy-7"/> + <path d="M22.4,15.4 C22.4,19.266 19.266,22.4 15.4,22.4 C11.534,22.4 8.4,19.266 8.4,15.4 C8.4,11.534 11.534,8.4 15.4,8.4 C19.266,8.4 22.4,11.534 22.4,15.4 z" fill-opacity="0" stroke="#76CFA6" stroke-width="1" stroke-linecap="round" id="path-1" opacity="0.7"/> + <path d="M20.3,20.3 L25.25,25.25" fill-opacity="0" stroke="#76CFA6" stroke-width="1" stroke-linecap="round" id="Line" opacity="0.7"/> + </g> +</svg> diff --git a/res/img/icons-settings-room.svg b/res/img/icons-settings-room.svg new file mode 100644 index 0000000000..117d134c95 --- /dev/null +++ b/res/img/icons-settings-room.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="17px" height="17px" viewBox="0 0 17 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 3.8.3 (29802) - http://www.bohemiancoding.com/sketch --> + <title>69011392-CE9D-4404-A85C-A8548C5D850B</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Room-header/Vector-Design" transform="translate(-664.000000, -27.000000)"> + <g id="icons_settings_room" transform="translate(660.000000, 23.000000)"> + <path d="M19.2916667,13.5728624 C19.2916667,13.5393757 19.3017819,13.5102943 19.3113438,13.4971468 C19.3355672,13.4638396 19.3859829,13.4310694 19.4436252,13.4214623 L17.694545,13.6861316 L17.3974447,13.7310981 L17.2977123,14.0145482 C17.185604,14.3331717 17.0722755,14.597605 16.9592353,14.8067293 L16.8124355,15.0783089 L16.9894726,15.331219 C17.2195103,15.6598444 17.565037,16.1054769 18.0280062,16.6713281 C18.022664,16.6649493 18.0099284,16.6331101 18.0099284,16.5920681 C18.0099284,16.5496402 18.0279377,16.5036164 18.0528321,16.475956 C17.8694436,16.7228218 17.5714051,17.0479546 17.1334654,17.4798119 C16.7965085,17.8120888 16.5345801,18.0099284 16.5920681,18.0099284 C16.6214055,18.0099284 16.6291649,18.0126143 16.6155936,18.0038899 L15.3431476,17.005336 L15.0891758,16.8065755 L14.8033664,16.9559758 C14.5503526,17.088233 14.2889914,17.1973729 14.0189869,17.2835445 L13.7120738,17.3814955 L13.6744316,17.7014535 C13.5757258,18.5404536 13.4865723,19.1122657 13.4117593,19.4000077 C13.4220315,19.3588282 13.508382,19.2916667 13.5538737,19.2916667 L11.4461263,19.2916667 C11.4709448,19.2916667 11.5046771,19.3033697 11.5281137,19.3223422 C11.5674577,19.3541921 11.5985339,19.4122911 11.6028567,19.4684877 L11.3327968,17.6846531 L11.2864626,17.3801712 L10.9936883,17.2845714 C10.7078788,17.1912459 10.44734,17.0841355 10.2119332,16.9635612 L9.93214937,16.8202573 L9.68174016,17.0102842 L8.34303574,18.0261804 C8.34222864,18.0245539 8.3828551,18.0099284 8.40793186,18.0099284 C8.4560459,18.0099284 8.50260257,18.0304133 8.52412631,18.0519371 C7.73317304,17.3354714 7.2298153,16.8229617 7.00934352,16.5176931 C7.02916553,16.5459153 7.0375434,16.5734426 7.0375434,16.5920681 C7.0375434,16.6255549 7.02742813,16.6546363 7.01786631,16.6677838 C7.10938322,16.5396915 7.26666674,16.3346061 7.48982077,16.0525642 C7.72197376,15.7591487 7.89698984,15.5306554 8.01617299,15.3651233 L8.19916614,15.1109661 L8.05035851,14.8353965 C7.89620291,14.5499231 7.78028893,14.2700333 7.70189913,13.9956689 L7.61327161,13.6854726 L7.29411759,13.6383843 L5.55665014,13.3820367 C5.60547283,13.3895382 5.65427606,13.4185878 5.68200405,13.4549808 C5.69744497,13.475247 5.70833333,13.5072316 5.70833333,13.534885 L5.70833333,11.4271376 C5.70833333,11.4606243 5.69821806,11.4897057 5.68865624,11.5028532 C5.66733768,11.5321662 5.61852108,11.5655671 5.55412371,11.5772757 L7.3050617,11.3139278 L7.6170932,11.2669553 L7.70896845,10.9650795 C7.78753435,10.7069344 7.89777395,10.446882 8.04022371,10.1847745 L8.18820877,9.91248195 L8.0101898,9.65880492 C7.74852329,9.28593014 7.40215158,8.83920775 6.9702929,8.31710994 C6.97614867,8.32413164 6.99007161,8.35754672 6.99007161,8.40793186 C6.99007161,8.4608591 6.98258594,8.47998916 6.98661693,8.47416662 C7.12501718,8.28270528 7.42133693,7.95931063 7.86180475,7.52491822 C8.20132871,7.19007736 8.46567196,6.99007161 8.40793186,6.99007161 C8.37230936,6.99007161 8.35028571,6.98160098 8.34992978,6.98132719 L9.65863124,7.99604966 L9.91223703,8.19268603 L10.1966336,8.04402418 C10.4496474,7.91176698 10.7110086,7.80262714 10.9810131,7.71645547 L11.2879262,7.61850448 L11.3255684,7.29854649 C11.4242742,6.45954641 11.5134277,5.88773433 11.5882407,5.59999227 C11.5779685,5.64117182 11.491618,5.70833333 11.4461263,5.70833333 L13.5538737,5.70833333 C13.5290552,5.70833333 13.4953229,5.69663029 13.4718863,5.67765781 C13.4325423,5.64580789 13.4014661,5.58770895 13.3971433,5.53151231 L13.6672032,7.31534687 L13.7135374,7.61982882 L14.0063117,7.7154286 C14.2921212,7.80875413 14.55266,7.91586455 14.7880668,8.03643878 L15.0667962,8.17920261 L15.3169039,7.99074117 L16.6651027,6.97484491 C16.6763099,6.97052126 16.6241756,6.99007161 16.5920681,6.99007161 C16.5510262,6.99007161 16.519187,6.97733595 16.5093349,6.96912583 C17.2816391,7.68242394 17.786379,8.20245893 17.9875122,8.48739759 C17.9775221,8.4800961 17.9624566,8.43274744 17.9624566,8.40793186 C17.9624566,8.37444515 17.9725719,8.34536374 17.9821337,8.33221623 C17.8906168,8.46030849 17.7333333,8.66539387 17.5101792,8.94743577 C17.2780262,9.24085135 17.1030102,9.46934457 16.983827,9.63487672 L16.8039941,9.8846446 L16.9459858,10.1577054 C17.0973302,10.4487525 17.2157304,10.7317577 17.3016229,11.0066136 L17.3947182,11.3045187 L17.7032402,11.3517243 L19.4407076,11.6175663 C19.3945272,11.6104618 19.3457239,11.5814122 19.3179959,11.5450192 C19.302555,11.524753 19.2916667,11.4927684 19.2916667,11.465115 L19.2916667,13.5728624 L19.2916667,13.5728624 Z M20.2916667,13.5728624 L20.2916667,11.465115 C20.2916667,11.2728919 20.2301422,11.0921639 20.1134277,10.938976 C19.984426,10.7696613 19.8027031,10.6614929 19.5923589,10.6291323 L17.8544855,10.363228 L17.7788628,10.8574761 L18.2561028,10.7083386 C18.1521072,10.3755526 18.0109975,10.038266 17.8332026,9.69635271 L17.3895942,9.92702908 L17.7953614,10.2191814 C17.9040439,10.0682334 18.0708213,9.85049629 18.2943998,9.56791796 C18.5269772,9.27396595 18.6924986,9.05813902 18.7933685,8.91692118 C18.9017053,8.76798915 18.9624566,8.59332905 18.9624566,8.40793186 C18.9624566,8.20588738 18.9030846,8.01928953 18.7722844,7.86980369 C18.5498818,7.5500335 18.0102527,6.99405205 17.1684488,6.21750426 C16.9877567,6.06610236 16.7976798,5.99007161 16.5920681,5.99007161 C16.3700726,5.99007161 16.1660301,6.06658755 16.0106502,6.22196744 L14.7151056,7.19209303 L15.0160048,7.5914171 L15.2439427,7.14639542 C14.9603221,7.00112631 14.6512052,6.87404491 14.3167135,6.76482314 L14.1615126,7.24012587 L14.655822,7.16490487 L14.38998,5.41794306 C14.3772158,5.23404949 14.2733503,5.03986612 14.1010846,4.90041294 C13.9447263,4.7738372 13.755921,4.70833333 13.5538737,4.70833333 L11.4461263,4.70833333 C11.0335176,4.70833333 10.7193048,4.95272109 10.6192582,5.35290753 C10.5306614,5.69357671 10.4362592,6.2990532 10.3324178,7.18170524 L10.8289931,7.24012587 L10.676973,6.76379626 C10.3519948,6.86751269 10.0373707,6.99889418 9.73337941,7.15779874 L9.96500651,7.60091146 L10.2713818,7.20577326 L8.96116042,6.18987699 C8.79471492,6.06183733 8.60812404,5.99007161 8.40793186,5.99007161 C8.0716892,5.99007161 7.73789391,6.24262573 7.15962537,6.81291815 C6.6823007,7.28365902 6.35516387,7.64068653 6.17018122,7.89681636 C6.05452286,8.06370379 5.99007161,8.22841254 5.99007161,8.40793186 C5.99007161,8.61022748 6.06728965,8.79555076 6.20090455,8.95588864 C6.61604566,9.45778088 6.94693135,9.88453066 7.19163311,10.2332307 L7.60091146,9.9460178 L7.1615992,9.70726113 C6.98756879,10.0274771 6.85095757,10.3497395 6.75229457,10.6739179 L7.23063151,10.8194987 L7.15620132,10.3250696 L5.3902508,10.5909116 C5.17158962,10.6304328 5.00251236,10.7461172 4.87992015,10.9146815 C4.76908467,11.0670803 4.70833333,11.2417404 4.70833333,11.4271376 L4.70833333,13.534885 C4.70833333,13.7271081 4.76985777,13.9078361 4.88657233,14.061024 C5.01557399,14.2303387 5.19729689,14.3385071 5.40764111,14.3708677 L7.14815672,14.6276747 L7.22113715,14.1330295 L6.74037518,14.2703901 C6.83921427,14.6163269 6.98281014,14.9630584 7.17045312,15.3105454 L7.61040582,15.0729709 L7.20463865,14.7808186 C7.09595607,14.9317666 6.9291787,15.1495037 6.70560023,15.432082 C6.47302282,15.7260341 6.30750141,15.941861 6.20663153,16.0830788 C6.09829474,16.2320109 6.0375434,16.406671 6.0375434,16.5920681 C6.0375434,16.7752634 6.09022783,16.9483694 6.19438795,17.0971695 C6.47190158,17.4815122 7.01291273,18.0323599 7.83511625,18.7762583 C7.97779454,18.9198189 8.18258892,19.0099284 8.40793186,19.0099284 C8.62289672,19.0099284 8.82176089,18.9383373 8.97977316,18.7961262 L10.2862503,17.8068816 L9.98399523,17.4085829 L9.75605729,17.8536046 C10.0396779,17.9988737 10.3487948,18.1259551 10.6832865,18.2351769 L10.8384874,17.7598741 L10.344178,17.8350951 L10.61002,19.5820569 C10.6227842,19.7659505 10.7266497,19.9601339 10.8989154,20.0995871 C11.0552737,20.2261628 11.244079,20.2916667 11.4461263,20.2916667 L13.5538737,20.2916667 C13.9664824,20.2916667 14.2806952,20.0472789 14.3807418,19.6470925 C14.4693386,19.3064233 14.5637408,18.7009468 14.6675822,17.8182948 L14.1710069,17.7598741 L14.323027,18.2362037 C14.6480052,18.1324873 14.9626293,18.0011058 15.2666206,17.8422013 L15.0349935,17.3990885 L14.7268394,17.792841 L16.0370607,18.8182317 C16.2384937,18.9502769 16.4108203,19.0099284 16.5920681,19.0099284 C16.9280588,19.0099284 17.2611042,18.7583728 17.8356102,18.1918461 C18.3091333,17.7248997 18.6377162,17.3664456 18.8283746,17.1051729 C18.9349535,16.9906682 19.0099284,16.7990657 19.0099284,16.5920681 C19.0099284,16.3864565 18.9338976,16.1963796 18.7990954,16.034617 C18.3534697,15.4899313 18.021739,15.0620917 17.8087045,14.7577567 L17.3990885,15.0444878 L17.8389418,15.2822464 C17.9790857,15.0229801 18.112608,14.7114281 18.2410247,14.3464544 L17.7693685,14.1805013 L17.844192,14.674871 L19.6006482,14.409029 C19.8175769,14.3729308 19.9945828,14.2578769 20.1200798,14.0853185 C20.2309153,13.9329197 20.2916667,13.7582596 20.2916667,13.5728624 L20.2916667,13.5728624 Z" id="Path" fill="#76CFA6"></path> + <path d="M15.625,12.5 C15.625,11.6373655 15.3198273,10.900882 14.7094727,10.2905273 C14.099118,9.68017273 13.3626345,9.375 12.5,9.375 C11.6373655,9.375 10.900882,9.68017273 10.2905273,10.2905273 C9.68017273,10.900882 9.375,11.6373655 9.375,12.5 C9.375,13.3626345 9.68017273,14.099118 10.2905273,14.7094727 C10.900882,15.3198273 11.6373655,15.625 12.5,15.625 C13.3626345,15.625 14.099118,15.3198273 14.7094727,14.7094727 C15.3198273,14.099118 15.625,13.3626345 15.625,12.5 L15.625,12.5 Z" id="Path" stroke="#76CFA6"></path> + </g> + </g> + </g> +</svg> diff --git a/res/img/icons-settings.svg b/res/img/icons-settings.svg new file mode 100644 index 0000000000..3ca2b655f4 --- /dev/null +++ b/res/img/icons-settings.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="25px" height="25px" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 3.8.3 (29802) - http://www.bohemiancoding.com/sketch --> + <title>4D42A2A7-7430-4D4F-A0A2-E19278CF66E3</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Room-list-Copy-3" transform="translate(-165.000000, -726.000000)"> + <g id="icons_settings" transform="translate(165.000000, 726.000000)"> + <path d="M12.5,25 C19.4035594,25 25,19.4035594 25,12.5 C25,5.59644063 19.4035594,0 12.5,0 C5.59644063,0 0,5.59644063 0,12.5 C0,19.4035594 5.59644063,25 12.5,25 Z" id="Oval-1-Copy-7" fill="#76CFA6"></path> + <path d="M15.625,12.5 C15.625,11.6373655 15.3198273,10.900882 14.7094727,10.2905273 C14.099118,9.68017273 13.3626345,9.375 12.5,9.375 C11.6373655,9.375 10.900882,9.68017273 10.2905273,10.2905273 C9.68017273,10.900882 9.375,11.6373655 9.375,12.5 C9.375,13.3626345 9.68017273,14.099118 10.2905273,14.7094727 C10.900882,15.3198273 11.6373655,15.625 12.5,15.625 C13.3626345,15.625 14.099118,15.3198273 14.7094727,14.7094727 C15.3198273,14.099118 15.625,13.3626345 15.625,12.5 L15.625,12.5 Z M19.7916667,11.465115 L19.7916667,13.5728624 C19.7916667,13.6488177 19.7663486,13.721607 19.7157118,13.7912326 C19.665075,13.8608583 19.6017799,13.9020001 19.5258247,13.9146593 L17.7693685,14.1805013 C17.649106,14.5222999 17.5256806,14.8102925 17.3990885,15.0444878 C17.6206247,15.360968 17.9592534,15.7977041 18.4149848,16.3547092 C18.4782808,16.4306644 18.5099284,16.5097833 18.5099284,16.5920681 C18.5099284,16.674353 18.4814456,16.7471423 18.4244792,16.8104384 C18.2535799,17.0446337 17.9402692,17.3864272 17.4845378,17.835829 C17.0288063,18.2852308 16.7313194,18.5099284 16.5920681,18.5099284 C16.5161129,18.5099284 16.4338293,18.4814456 16.3452148,18.4244792 L15.0349935,17.3990885 C14.7564909,17.5446694 14.4684983,17.6649301 14.1710069,17.7598741 C14.0697333,18.6207002 13.9779554,19.2093445 13.8956706,19.5258247 C13.8513633,19.7030535 13.7374322,19.7916667 13.5538737,19.7916667 L11.4461263,19.7916667 C11.3575119,19.7916667 11.2799754,19.7647663 11.2135145,19.7109646 C11.1470537,19.657163 11.110659,19.5891208 11.1043294,19.5068359 L10.8384874,17.7598741 C10.5283368,17.6586005 10.243509,17.5415046 9.98399523,17.4085829 L8.6452908,18.4244792 C8.58199476,18.4814456 8.50287591,18.5099284 8.40793186,18.5099284 C8.31931741,18.5099284 8.24019855,18.4751161 8.17057292,18.4054905 C7.37304289,17.6839157 6.85085844,17.152237 6.60400391,16.8104384 C6.55969668,16.7471423 6.5375434,16.674353 6.5375434,16.5920681 C6.5375434,16.5161129 6.56286144,16.4433236 6.61349826,16.3736979 C6.70844231,16.2407762 6.86984478,16.0303201 7.0977105,15.7423231 C7.32557623,15.4543262 7.49647295,15.231211 7.61040582,15.0729709 C7.43950652,14.7564907 7.3097516,14.4431801 7.22113715,14.1330295 L5.4836697,13.8766819 C5.40138486,13.8640227 5.33492502,13.8244632 5.28428819,13.7580024 C5.23365137,13.6915416 5.20833333,13.6171698 5.20833333,13.534885 L5.20833333,11.4271376 C5.20833333,11.3511823 5.23365137,11.278393 5.28428819,11.2087674 C5.33492502,11.1391417 5.39505535,11.0979999 5.46468099,11.0853407 L7.23063151,10.8194987 C7.31924596,10.5283369 7.44267137,10.2371796 7.60091146,9.9460178 C7.34772732,9.5852304 7.00909862,9.14849432 6.58501519,8.63579644 C6.52171916,8.5598412 6.49007161,8.4838871 6.49007161,8.40793186 C6.49007161,8.34463582 6.5185544,8.27184648 6.57552083,8.18956163 C6.74009052,7.96169591 7.05181881,7.62148483 7.51071506,7.16891819 C7.96961131,6.71635154 8.26868058,6.49007161 8.40793186,6.49007161 C8.4902167,6.49007161 8.57250031,6.52171916 8.65478516,6.58501519 L9.96500651,7.60091146 C10.2435091,7.45533058 10.5315017,7.33506992 10.8289931,7.24012587 C10.9302667,6.3792998 11.0220446,5.79065552 11.1043294,5.47417535 C11.1486367,5.29694645 11.2625678,5.20833333 11.4461263,5.20833333 L13.5538737,5.20833333 C13.6424881,5.20833333 13.7200246,5.23523374 13.7864855,5.28903537 C13.8529463,5.342837 13.889341,5.41087922 13.8956706,5.49316406 L14.1615126,7.24012587 C14.4716632,7.34139952 14.756491,7.45849543 15.0160048,7.5914171 L16.3642036,6.57552083 C16.42117,6.5185544 16.4971241,6.49007161 16.5920681,6.49007161 C16.674353,6.49007161 16.7534718,6.52171916 16.8294271,6.58501519 C17.6459459,7.338238 18.1681304,7.87624622 18.3959961,8.19905599 C18.4403033,8.24969282 18.4624566,8.31931741 18.4624566,8.40793186 C18.4624566,8.4838871 18.4371386,8.55667645 18.3865017,8.62630208 C18.2915577,8.75922375 18.1301552,8.96967991 17.9022895,9.25767687 C17.6744238,9.54567382 17.503527,9.76878899 17.3895942,9.92702908 C17.5541639,10.2435093 17.6839188,10.5536552 17.7788628,10.8574761 L19.5163303,11.1233181 C19.5986151,11.1359773 19.665075,11.1755368 19.7157118,11.2419976 C19.7663486,11.3084584 19.7916667,11.3828302 19.7916667,11.465115 L19.7916667,11.465115 Z" id="icons_settings-copy" stroke="#FFFFFF" opacity="0.8"></path> + </g> + </g> + </g> +</svg> diff --git a/res/img/icons-show-apps.svg b/res/img/icons-show-apps.svg new file mode 100644 index 0000000000..3438157301 --- /dev/null +++ b/res/img/icons-show-apps.svg @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xml:space="preserve"> +<style type="text/css"> + .st0{opacity:0.15;} + .st2{fill:none;stroke-width:1;stroke-linecap:round;stroke-miterlimit:10;} + .st3{fill:none;stroke-linejoin:round;stroke-miterlimit:10;} +</style> +<g id="Layer_1_1_" class="st0"> + <path id="Oval-109-Copy" fill="#76CFA6" d="M17.5,35C27.2,35,35,27.2,35,17.5S27.2,0,17.5,0S0,7.8,0,17.5S7.8,35,17.5,35z"/> +</g> +<g id="frame"> + <g id="Layer_3"> + <g> + <g> + <line class="st2" stroke="#76CFA6" x1="17.5" y1="23.9" x2="17.5" y2="18.9"/> + <g> + <polygon fill="#76CFA6" points="19.5,23.1 17.5,26.6 15.5,23.1 "/> + </g> + </g> + </g> + </g> + <rect x="6.7" y="6.7" class="st3" stroke="#76CFA6" width="21.6" height="21.6"/> + <line class="st3" stroke="#76CFA6" x1="6.7" y1="16.7" x2="28.2" y2="16.7"/> + <path fill="#76CFA6" d="M13.3,13.3v-3.1c0-0.1-0.1-0.3-0.3-0.3H9.9c-0.1,0-0.3,0.1-0.3,0.3v3.1c0,0.1,0.1,0.3,0.3,0.3H13 + C13.2,13.5,13.3,13.4,13.3,13.3z"/> + <path fill="#76CFA6" d="M19.3,13.3v-3.1c0-0.1-0.1-0.3-0.3-0.3h-3.1c-0.1,0-0.3,0.1-0.3,0.3v3.1c0,0.1,0.1,0.3,0.3,0.3H19 + C19.2,13.5,19.3,13.4,19.3,13.3z"/> + <path fill="#76CFA6" d="M25.3,13.3v-3.1c0-0.1-0.1-0.3-0.3-0.3h-3.1c-0.1,0-0.3,0.1-0.3,0.3v3.1c0,0.1,0.1,0.3,0.3,0.3H25 + C25.2,13.5,25.3,13.4,25.3,13.3z"/> +</g> +</svg> diff --git a/res/img/icons-show-stickers.svg b/res/img/icons-show-stickers.svg new file mode 100644 index 0000000000..26779a3940 --- /dev/null +++ b/res/img/icons-show-stickers.svg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve"> +<g id="Layer_1_1_" opacity="0.15"> + <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.43,250-250C500,111.429,388.571,0,250,0 + C111.429,0,0,111.429,0,250C0,388.57,111.429,500,250,500z"/> +</g> +<path fill="none" stroke="#76CFA6" stroke-width="12" stroke-miterlimit="10" d="M249,430c-98.996,0-180-81.003-180-180 + c0-98.998,81.005-180,180-180c98.994,0,180,81.001,180,180C429,348.997,347.995,430,249,430z M321.8,229.2 + c17.685,0,31.201-13.518,31.201-31.2s-13.519-31.2-31.201-31.2c-17.682,0-31.2,13.518-31.2,31.2S304.118,229.2,321.8,229.2z + M176.2,229.2c17.682,0,31.2-13.518,31.2-31.2s-13.519-31.2-31.2-31.2c-17.683,0-31.201,13.518-31.201,31.2 + S158.518,229.2,176.2,229.2z M249,364.4c48.883,0,89.436-30.164,106.081-72.801H142.919C159.564,334.236,200.117,364.4,249,364.4z" + /> +</svg> diff --git a/res/img/icons-upload.svg b/res/img/icons-upload.svg new file mode 100644 index 0000000000..b0101e87a0 --- /dev/null +++ b/res/img/icons-upload.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="35" height="35" viewBox="0, 0, 35, 35"> + <g id="Symbols"> + <path d="M17.5,35 C27.165,35 35,27.165 35,17.5 C35,7.835 27.165,0 17.5,0 C7.835,0 0,7.835 0,17.5 C0,27.165 7.835,35 17.5,35 z" fill="#76CFA6" opacity="0.15" id="Oval-109-Copy"/> + <g id="file"> + <path d="M10,10.01 C10,7.795 11.782,6 14.004,6 L18.402,6 C18.402,6 25,12.492 25,12.492 L25,24.006 C25,26.212 23.206,28 21,28 L14,28 C11.791,28 10,26.2 10,23.99 L10,10.01 z" fill-opacity="0" stroke="#76CFA6" stroke-width="1" id="path-1"/> + <path d="M25,13 L20.157,13 C18.966,13 18,12.034 18,10.843 L18,6" fill-opacity="0" stroke="#76CFA6" stroke-width="1" id="path-3"/> + </g> + <path d="M21.479,19.066 C21.612,19.066 21.746,19.015 21.848,18.912 C22.051,18.706 22.051,18.374 21.848,18.168 L17.871,14.154 C17.668,13.948 17.338,13.949 17.135,14.153 L13.153,18.162 C12.95,18.367 12.949,18.701 13.152,18.906 C13.355,19.113 13.685,19.113 13.888,18.908 L16.987,15.788 L16.988,24.474 C16.988,24.764 17.222,25 17.509,25 C17.798,25 18.03,24.764 18.03,24.474 L18.029,15.801 L21.111,18.912 C21.212,19.015 21.345,19.066 21.479,19.066 L21.479,19.066 z" fill="#76CFA6" id="Fill-75"/> + </g> +</svg> diff --git a/res/img/icons-video.svg b/res/img/icons-video.svg new file mode 100644 index 0000000000..d367f49609 --- /dev/null +++ b/res/img/icons-video.svg @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="35px" height="35px" viewBox="0 0 35 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>05D354CE-86A7-4B6F-B9BE-F1CEBBD81B21</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Extra-icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Extra-icons-sheet" transform="translate(-542.000000, -366.000000)"> + <g id="icons_video" transform="translate(542.000000, 366.000000)"> + <path d="M17.5,35 C27.1649831,35 35,27.1649831 35,17.5 C35,7.83501688 27.1649831,0 17.5,0 C7.83501688,0 0,7.83501688 0,17.5 C0,27.1649831 7.83501688,35 17.5,35 Z" id="Oval-109-Copy-2" fill="#76CFA6" opacity="0.15"></path> + <g transform="translate(9.000000, 11.500000)" id="Rectangle-20-+-Path-16" stroke="#76CFA6"> + <g transform="scale(1.0, 0.8)"> + <rect id="Rectangle-20" x="0" y="0" width="13" height="17" rx="4"></rect> + <path d="M13,8.50795206 C13,11.2533934 15.8192656,12.6412404 15.8192656,12.6412404 C16.8995921,13.391019 17.7753697,12.9258617 17.7753697,11.6159552 L17.7753697,5.39994895 C17.7753697,4.08392094 16.8771592,3.5920349 15.8192656,4.37466376 C15.8192656,4.37466376 13,5.76251076 13,8.50795206 Z" id="Path-16"></path> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/icons_ellipsis.svg b/res/img/icons_ellipsis.svg new file mode 100644 index 0000000000..ba600ccacc --- /dev/null +++ b/res/img/icons_ellipsis.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><path d="M7.831,13.382c0.504,0 0.826,-0.378 0.826,-0.882c0,-0.518 -0.322,-0.882 -0.826,-0.882c-0.49,0 -0.826,0.364 -0.826,0.882c-0.014,0.504 0.336,0.882 0.826,0.882ZM12.493,13.382c0.504,0 0.84,-0.378 0.84,-0.882c-0.014,-0.518 -0.336,-0.882 -0.826,-0.882c-0.49,0 -0.84,0.364 -0.84,0.882c-0.014,0.504 0.336,0.882 0.826,0.882ZM17.155,13.382c0.518,0 0.84,-0.378 0.84,-0.882c0,-0.518 -0.336,-0.882 -0.826,-0.882c-0.49,0 -0.84,0.364 -0.84,0.882c0,0.504 0.336,0.882 0.826,0.882Z" style="fill:#fff;"/></svg> diff --git a/res/img/icons_global.svg b/res/img/icons_global.svg new file mode 100644 index 0000000000..6c07d3c48e --- /dev/null +++ b/res/img/icons_global.svg @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="25px" height="25px" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch --> + <title>icons_global copy 4</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="LeftPanel-for-Groups-C-Copy" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-17.000000, -23.000000)"> + <g id="icons_global-copy-4" transform="translate(17.000000, 23.000000)"> + <path d="M12.5,25 C19.4035594,25 25,19.4035594 25,12.5 C25,5.59644063 19.4035594,0 12.5,0 C5.59644063,0 0,5.59644063 0,12.5 C0,19.4035594 5.59644063,25 12.5,25 Z" id="Oval-1-Copy-7" fill="#76CFA6"></path> + <g id="Group-8" transform="translate(5.000000, 5.000000)" stroke="#FFFFFF"> + <g id="Group-7"> + <path d="M14.9847222,7.5 C14.9847222,5.43389447 14.2537996,3.66993461 12.7919325,2.20806749 C11.3300654,0.746200373 9.56610553,0.0152777778 7.5,0.0152777778 C5.43389447,0.0152777778 3.66993461,0.746200373 2.20806749,2.20806749 C0.746200373,3.66993461 0.0152777778,5.43389447 0.0152777778,7.5 C0.0152777778,9.56610553 0.746200373,11.3300654 2.20806749,12.7919325 C3.66993461,14.2537996 5.43389447,14.9847222 7.5,14.9847222 C9.56610553,14.9847222 11.3300654,14.2537996 12.7919325,12.7919325 C14.2537996,11.3300654 14.9847222,9.56610553 14.9847222,7.5 L14.9847222,7.5 Z" id="icons_settings-copy"></path> + <path d="M10.3923611,7.5 C10.3923611,5.43389447 10.1099068,3.66993461 9.54498969,2.20806749 C8.98007259,0.746200373 8.29841617,0.0152777778 7.5,0.0152777778 C6.70158383,0.0152777778 6.01992741,0.746200373 5.45501031,2.20806749 C4.8900932,3.66993461 4.60763889,5.43389447 4.60763889,7.5 C4.60763889,9.56610553 4.8900932,11.3300654 5.45501031,12.7919325 C6.01992741,14.2537996 6.70158383,14.9847222 7.5,14.9847222 C8.29841617,14.9847222 8.98007259,14.2537996 9.54498969,12.7919325 C10.1099068,11.3300654 10.3923611,9.56610553 10.3923611,7.5 L10.3923611,7.5 Z" id="icons_settings-copy-4"></path> + </g> + <path d="M0.5,7.5 L14.5,7.5" id="Line-3" stroke-linecap="square"></path> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/info.png b/res/img/info.png new file mode 100644 index 0000000000..699fd64e01 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 0000000000..1acbe59313 --- /dev/null +++ b/res/img/leave.svg @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-1 -1 20 26" + xml:space="preserve"> +<g id="Page-1" sketch:type="MSPage"> + <g id="Exit-Copy-6" sketch:type="MSLayerGroup"> + <path id="Rectangle-140_1_" sketch:type="MSShapeGroup" fill="none" stroke="#76CFA6" d="M4.4,0.5h7.5c2.2,0,4,1.8,4,4v14c0,2.2-1.8,4-4,4H4.4 + c-2.2,0-4-1.8-4-4v-14C0.4,2.3,2.2,0.5,4.4,0.5z"/> + <g id="Rectangle-140_2_"> + <g> + <path fill="#76CFA6" d="M12,23H4.5C2,23,0,21,0,18.5v-14C0,2,2,0,4.5,0H12c2.5,0,4.5,2,4.5,4.5v14C16.4,21,14.4,23,12,23z M4.4,1 + C2.5,1,0.9,2.6,0.9,4.5v14c0,1.9,1.6,3.5,3.5,3.5h7.5c1.9,0,3.5-1.6,3.5-3.5v-14c0-1.9-1.6-3.5-3.5-3.5H4.4z"/> + <g> + <path fill="none" stroke="#76CFA6" d="M3.2,20.6l8.3-1.8c1.1-0.2,2-1,2-1.7V5.7c0-0.7-0.9-1.4-2-1.7L3.2,2.2"/> + </g> + </g> + </g> + <circle id="Oval-605" sketch:type="MSShapeGroup" fill="#76CFA6" cx="10.7" cy="11.1" r="1"> + </circle> + </g> +</g> +</svg> diff --git a/res/img/list-close.png b/res/img/list-close.png new file mode 100644 index 0000000000..82b322f9d4 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 0000000000..cd88b2a88f --- /dev/null +++ b/res/img/list-close.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-249 251 20 20" + style="enable-background:new -249 251 20 20;" xml:space="preserve"> +<style type="text/css"> + .st0{opacity:0.2;} + .st1{fill:#444444;} +</style> +<title>Slice 1</title> +<desc>Created with Sketch.</desc> +<g id="Page-1" sketch:type="MSPage" class="st0"> + <path id="Triangle-1" sketch:type="MSShapeGroup" class="st1" d="M-245,270v-18l12,9L-245,270z"/> +</g> +</svg> diff --git a/res/img/list-open.png b/res/img/list-open.png new file mode 100644 index 0000000000..f8c8063197 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 0000000000..e180be8870 --- /dev/null +++ b/res/img/list-open.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-249 251 20 20" + style="enable-background:new -249 251 20 20;" xml:space="preserve"> +<style type="text/css"> + .st0{opacity:0.2;} + .st1{fill:#444444;} +</style> +<title>Slice 1</title> +<desc>Created with Sketch.</desc> +<g id="Page-1" sketch:type="MSPage" class="st0"> + <path id="Triangle-1" sketch:type="MSShapeGroup" class="st1" d="M-248,255h18l-9,12L-248,255z"/> +</g> +</svg> diff --git a/res/img/maximise.svg b/res/img/maximise.svg new file mode 100644 index 0000000000..79c6c0ab8b --- /dev/null +++ b/res/img/maximise.svg @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-254 253 10 16" + style="enable-background:new -254 253 10 16;" xml:space="preserve"> +<title>minimise</title> +<desc>Created with sketchtool.</desc> +<g id="_x30_2-Chat" sketch:type="MSPage"> + <g id="_x30_2_x5F_1-Chat-collapsed-w-topic" transform="translate(-176.000000, -27.000000)" sketch:type="MSArtboardGroup"> + <g id="Room-list" sketch:type="MSLayerGroup"> + <g id="Room-list_x2F_Header" sketch:type="MSShapeGroup"> + <g id="minimise" transform="translate(172.000000, 25.000000)"> + <path id="Path-53-Copy" fill="none" stroke-width="2" stroke="#76CFA6" d="M-248.7,256.3l5.7,5.7l-5.7,5.7"/> + </g> + </g> + </g> + </g> +</g> +</svg> diff --git a/res/img/maximize.svg b/res/img/maximize.svg new file mode 100644 index 0000000000..4f9e10191f --- /dev/null +++ b/res/img/maximize.svg @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="1792px" height="1792px" viewBox="0 0 1792 1792" enable-background="new 0 0 1792 1792" xml:space="preserve"> +<path fill="#76CFA6" d="M256,1408h1280V640H256V1408z M1792,288v1216c0,44-15.667,81.667-47,113s-69,47-113,47H160 + c-44,0-81.667-15.667-113-47s-47-69-47-113V288c0-44,15.667-81.667,47-113s69-47,113-47h1472c44,0,81.667,15.667,113,47 + S1792,244,1792,288z"/> +</svg> diff --git a/res/img/member_chevron.png b/res/img/member_chevron.png new file mode 100644 index 0000000000..cbbd289dcf 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 0000000000..b45f88950f 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 0000000000..491756b15a --- /dev/null +++ b/res/img/minimise.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="10px" height="16px" viewBox="-1 -1 10 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: sketchtool 3.5.1 (25234) - http://www.bohemiancoding.com/sketch --> + <title>minimise</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="02-Chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="02_1-Chat-collapsed-w-topic" sketch:type="MSArtboardGroup" transform="translate(-176.000000, -27.000000)" stroke-width="2" stroke="#76CFA6"> + <g id="Room-list" sketch:type="MSLayerGroup"> + <g id="Room-list/Header" sketch:type="MSShapeGroup"> + <g id="minimise" transform="translate(172.000000, 25.000000)"> + <path d="M7,5 L15,5 L15,13" id="Path-53-Copy" transform="translate(11.000000, 9.000000) scale(-1, -1) rotate(-315.000000) translate(-11.000000, -9.000000) "></path> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/minimize.svg b/res/img/minimize.svg new file mode 100644 index 0000000000..410b0bc08e --- /dev/null +++ b/res/img/minimize.svg @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="1792px" height="1792px" viewBox="0 0 1792 1792" enable-background="new 0 0 1792 1792" xml:space="preserve"> +<path fill="#76CFA6" d="M1792,1312v192c0,44-15.667,81.667-47,113s-69,47-113,47H160c-44,0-81.667-15.667-113-47s-47-69-47-113v-192 + c0-44,15.667-81.667,47-113s69-47,113-47h1472c44,0,81.667,15.667,113,47S1792,1268,1792,1312z"/> +</svg> diff --git a/res/img/mod.svg b/res/img/mod.svg new file mode 100644 index 0000000000..847baf98f9 --- /dev/null +++ b/res/img/mod.svg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="16px" height="17px" viewBox="-1 -1 15 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: sketchtool 3.4.4 (395) - http://www.bohemiancoding.com/sketch --> + <title>icons_admin</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="02_19-Room-contextual-menu-hover" sketch:type="MSArtboardGroup" transform="translate(-1000.000000, -172.000000)" stroke="#FFFFFF" fill="#C2C5AF"> + <g id="people_open" sketch:type="MSLayerGroup" transform="translate(966.000000, 59.000000)"> + <g id="icons_admin" transform="translate(35.000000, 114.000000)" sketch:type="MSShapeGroup"> + <path d="M0.441894529,1.80537109 C2.59277353,3.03442388 4.25305977,2.17675781 5.9832796,0.805371094 C8.01666135,2.17675787 9.50756797,3.12670903 11.6293941,1.80537109 C11.6293941,7.01538067 11.9379879,12.2253912 5.9832796,12.2253906 C0.0285712975,12.2253901 0.441894531,7.01538067 0.441894529,1.80537109 Z" id="Path-2-Copy-2"></path> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/network-matrix.svg b/res/img/network-matrix.svg new file mode 100644 index 0000000000..bb8278ae39 --- /dev/null +++ b/res/img/network-matrix.svg @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 520 520" style="enable-background:new 0 0 520 520;" xml:space="preserve"> +<path d="M13.7,11.9v496.2h35.7V520H0V0h49.4v11.9H13.7z"/> +<path d="M166.3,169.2v25.1h0.7c6.7-9.6,14.8-17,24.2-22.2c9.4-5.3,20.3-7.9,32.5-7.9c11.7,0,22.4,2.3,32.1,6.8 + c9.7,4.5,17,12.6,22.1,24c5.5-8.1,13-15.3,22.4-21.5c9.4-6.2,20.6-9.3,33.5-9.3c9.8,0,18.9,1.2,27.3,3.6c8.4,2.4,15.5,6.2,21.5,11.5 + c6,5.3,10.6,12.1,14,20.6c3.3,8.5,5,18.7,5,30.7v124.1h-50.9V249.6c0-6.2-0.2-12.1-0.7-17.6c-0.5-5.5-1.8-10.3-3.9-14.3 + c-2.2-4.1-5.3-7.3-9.5-9.7c-4.2-2.4-9.9-3.6-17-3.6c-7.2,0-13,1.4-17.4,4.1c-4.4,2.8-7.9,6.3-10.4,10.8c-2.5,4.4-4.2,9.4-5,15.1 + c-0.8,5.6-1.3,11.3-1.3,17v103.3h-50.9v-104c0-5.5-0.1-10.9-0.4-16.3c-0.2-5.4-1.3-10.3-3.1-14.9c-1.8-4.5-4.8-8.2-9-10.9 + c-4.2-2.7-10.3-4.1-18.5-4.1c-2.4,0-5.6,0.5-9.5,1.6c-3.9,1.1-7.8,3.1-11.5,6.1c-3.7,3-6.9,7.3-9.5,12.9c-2.6,5.6-3.9,13-3.9,22.1 + v107.6h-50.9V169.2H166.3z"/> +<path d="M506.3,508.1V11.9h-35.7V0H520v520h-49.4v-11.9H506.3z"/> +</svg> diff --git a/res/img/newmessages.png b/res/img/newmessages.png new file mode 100644 index 0000000000..a22156ab21 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 0000000000..a2ffca9020 --- /dev/null +++ b/res/img/newmessages.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>icon_newmessages</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="02-Chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="02_7-Chat-new-messages" sketch:type="MSArtboardGroup" transform="translate(-244.000000, -665.000000)"> + <g id="icon_newmessages" sketch:type="MSLayerGroup" transform="translate(244.000000, 665.000000)"> + <circle id="Oval-1909" fill="#FF0064" sketch:type="MSShapeGroup" cx="12" cy="12" r="12"></circle> + <path d="M16.3400426,11.526774 C16.4870048,11.526774 16.633967,11.4708978 16.7464849,11.3583798 C16.9699899,11.1341094 16.9699899,10.7712964 16.7464849,10.547026 L12.3659396,6.16801148 C12.1424345,5.94374103 11.7788562,5.94450646 11.5545857,6.16724605 L7.16868234,10.5401371 C6.94441188,10.7644076 6.94364646,11.127986 7.16715148,11.3522564 C7.3906565,11.5772923 7.75423488,11.5772923 7.97850533,11.3537873 L11.3915495,7.95069367 L11.3930804,17.4259289 C11.3930804,17.7428161 11.6510296,18 11.9671515,18 C12.2848042,18 12.5412226,17.7428161 12.5412226,17.4259289 L12.5396917,7.9652368 L15.9343656,11.3583798 C16.0461182,11.4708978 16.1930804,11.526774 16.3400426,11.526774 L16.3400426,11.526774 Z" fill="#FFFFFF" sketch:type="MSShapeGroup" transform="translate(11.957057, 12.000000) rotate(-180.000000) translate(-11.957057, -12.000000) "></path> + </g> + </g> + </g> +</svg> \ 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 0000000000..9eb279f851 --- /dev/null +++ b/res/img/notif-active.svg @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="13px" height="13px" viewBox="0 0 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>E15782FC-B5FA-472A-AE12-CFFF484E7253</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Left-Panel-mention-states" transform="translate(-221.000000, -165.000000)"> + <g id="notification-shortcuts" transform="translate(206.000000, 119.000000)"> + <g id="slider" transform="translate(16.000000, 16.000000)"> + <g id="notif_active" transform="translate(0.000000, 31.000000)"> + <circle id="Oval-190" stroke="#62A887" fill="#76CFA6" cx="5.5" cy="5.5" r="5.5"></circle> + <path d="M2.5,6.5 L4,8" id="Line" stroke="#FFFFFF" stroke-linecap="round"></path> + <path d="M4,2.97753906 L8.30664062,8" id="Line-Copy" stroke="#FFFFFF" stroke-linecap="round" transform="translate(6.153320, 5.488770) scale(-1, 1) translate(-6.153320, -5.488770) "></path> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/notif-slider.svg b/res/img/notif-slider.svg new file mode 100644 index 0000000000..55fa06d11a --- /dev/null +++ b/res/img/notif-slider.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="7px" height="109px" viewBox="0 0 7 109" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> + <title>16CB4618-0BD3-4568-BB20-FC56EBC46046</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="Screens-revised" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.2"> + <g id="Left-Panel-mention-states" transform="translate(-224.000000, -134.000000)" stroke="#000000"> + <g id="notification-shortcuts" transform="translate(206.000000, 119.000000)"> + <g id="slider" transform="translate(16.000000, 16.000000)"> + <g id="notif_slider" transform="translate(3.000000, 0.000000)"> + <path d="M2.5,3.49505001 L2.5,104.507355" id="Line" stroke-linecap="square"></path> + <circle id="Oval-187" fill="#F7F7F7" cx="2.5" cy="36.5" r="2.5"></circle> + <path d="M2.5,73 C3.88071187,73 5,71.8807119 5,70.5 C5,69.1192881 3.88071187,68 2.5,68 C1.11928813,68 0,69.1192881 0,70.5 C0,71.8807119 1.11928813,73 2.5,73 Z" id="Oval-187-Copy" fill="#F7F7F7"></path> + <path d="M2.5,5 C3.88071187,5 5,3.88071187 5,2.5 C5,1.11928813 3.88071187,0 2.5,0 C1.11928813,0 0,1.11928813 0,2.5 C0,3.88071187 1.11928813,5 2.5,5 Z" id="Oval-187-Copy-3" fill="#F7F7F7"></path> + <circle id="Oval-187-Copy-2" fill="#F7F7F7" cx="2.5" cy="104.5" r="2.5"></circle> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/res/img/placeholder.png b/res/img/placeholder.png new file mode 100644 index 0000000000..7da32f259c 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 0000000000..e1d59ec6f4 --- /dev/null +++ b/res/img/plus.svg @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="14px" height="14px" viewBox="-1 -1 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>Line + Line</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="Line-+-Line" sketch:type="MSLayerGroup" transform="translate(2.000000, 2.000000)" stroke="#4A4A4A" stroke-width="2.82" stroke-linecap="square"> + <path d="M4,0.228763834 L4,7.77123617" id="Line" sketch:type="MSShapeGroup"></path> + <path d="M0.228763834,4 L7.77123617,4" id="Line" sketch:type="MSShapeGroup"></path> + </g> + </g> +</svg> diff --git a/res/img/right_search.svg b/res/img/right_search.svg new file mode 100644 index 0000000000..b430a6be19 --- /dev/null +++ b/res/img/right_search.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 3.7 (28169) - http://www.bohemiancoding.com/sketch --> + <title>right_search</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Room-header/Vector-Design" transform="translate(-710.000000, -25.000000)"> + <g id="right_search" transform="translate(710.000000, 25.000000)"> + <g id="Oval-1-Copy-7-+-Group-Copy-5-Copy-Copy-Copy-Copy-Copy-Copy-Copy-Copy-Copy-Copy" fill="#76CFA6"> + <circle id="Oval-1-Copy-7" cx="12" cy="12" r="12"></circle> + </g> + <path d="M14,10.5 C14,9.53645352 13.6575555,8.71224301 12.9726562,8.02734375 C12.287757,7.34244449 11.4635465,7 10.5,7 C9.53645352,7 8.71224301,7.34244449 8.02734375,8.02734375 C7.34244449,8.71224301 7,9.53645352 7,10.5 C7,11.4635465 7.34244449,12.287757 8.02734375,12.9726562 C8.71224301,13.6575555 9.53645352,14 10.5,14 C11.4635465,14 12.287757,13.6575555 12.9726562,12.9726562 C13.6575555,12.287757 14,11.4635465 14,10.5 L14,10.5 Z M18,17 C18,17.2708347 17.9010427,17.5052073 17.703125,17.703125 C17.5052073,17.9010427 17.2708347,18 17,18 C16.7187486,18 16.4843759,17.9010427 16.296875,17.703125 L13.6171875,15.03125 C12.6848912,15.6770866 11.6458391,16 10.5,16 C9.75520461,16 9.04297215,15.8554702 8.36328125,15.5664062 C7.68359035,15.2773423 7.09765871,14.8867212 6.60546875,14.3945312 C6.11327879,13.9023413 5.7226577,13.3164096 5.43359375,12.6367188 C5.1445298,11.9570279 5,11.2447954 5,10.5 C5,9.75520461 5.1445298,9.04297215 5.43359375,8.36328125 C5.7226577,7.68359035 6.11327879,7.09765871 6.60546875,6.60546875 C7.09765871,6.11327879 7.68359035,5.7226577 8.36328125,5.43359375 C9.04297215,5.1445298 9.75520461,5 10.5,5 C11.2447954,5 11.9570279,5.1445298 12.6367188,5.43359375 C13.3164096,5.7226577 13.9023413,6.11327879 14.3945312,6.60546875 C14.8867212,7.09765871 15.2773423,7.68359035 15.5664062,8.36328125 C15.8554702,9.04297215 16,9.75520461 16,10.5 C16,11.6458391 15.6770866,12.6848912 15.03125,13.6171875 L17.7109375,16.296875 C17.9036468,16.4895843 18,16.723957 18,17 L18,17 Z" id="" fill="#FFFFFF"></path> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/scrolldown.svg b/res/img/scrolldown.svg new file mode 100644 index 0000000000..d6599c5fc7 --- /dev/null +++ b/res/img/scrolldown.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>icon_newmessages</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="02-Chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="02_7-Chat-new-messages" sketch:type="MSArtboardGroup" transform="translate(-809.000000, -325.000000)"> + <g id="icon_newmessages" sketch:type="MSLayerGroup" transform="translate(809.000000, 325.000000)"> + <circle id="Oval-1909" fill-opacity="0.5" fill="#454545" sketch:type="MSShapeGroup" cx="12" cy="12" r="12"></circle> + <path d="M16.3400426,11.526774 C16.4870048,11.526774 16.633967,11.4708978 16.7464849,11.3583798 C16.9699899,11.1341094 16.9699899,10.7712964 16.7464849,10.547026 L12.3659396,6.16801148 C12.1424345,5.94374103 11.7788562,5.94450646 11.5545857,6.16724605 L7.16868234,10.5401371 C6.94441188,10.7644076 6.94364646,11.127986 7.16715148,11.3522564 C7.3906565,11.5772923 7.75423488,11.5772923 7.97850533,11.3537873 L11.3915495,7.95069367 L11.3930804,17.4259289 C11.3930804,17.7428161 11.6510296,18 11.9671515,18 C12.2848042,18 12.5412226,17.7428161 12.5412226,17.4259289 L12.5396917,7.9652368 L15.9343656,11.3583798 C16.0461182,11.4708978 16.1930804,11.526774 16.3400426,11.526774 L16.3400426,11.526774 Z" fill="#FFFFFF" sketch:type="MSShapeGroup" transform="translate(11.957057, 12.000000) rotate(-180.000000) translate(-11.957057, -12.000000) "></path> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/scrollto.svg b/res/img/scrollto.svg new file mode 100644 index 0000000000..75df053a68 --- /dev/null +++ b/res/img/scrollto.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> + <title>Slice 1</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="scrollup"> + <g id="02-Chat" transform="translate(12.000000, 12.000000) scale(-1, 1) rotate(-180.000000) translate(-12.000000, -12.000000) "> + <g id="02_7-Chat-new-messages"> + <g id="icon_newmessages"> + <circle id="Oval-1909" fill-opacity="0.5" fill="#454545" fill-rule="nonzero" cx="12" cy="12" r="12"></circle> + <circle id="Oval" stroke="#FFFFFF" cx="12" cy="12" r="7"></circle> + <circle id="Oval" stroke="#FFFFFF" cx="12" cy="12" r="4"></circle> + <circle id="Oval" fill="#FFFFFF" cx="12" cy="12" r="1"></circle> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/scrollup.svg b/res/img/scrollup.svg new file mode 100644 index 0000000000..1692f2a6c0 --- /dev/null +++ b/res/img/scrollup.svg @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24px" + height="24px" + viewBox="0 0 24 24" + version="1.1" + id="svg2" + inkscape:version="0.48.4 r9939" + sodipodi:docname="scrollup.svg"> + <metadata + id="metadata18"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1058" + id="namedview16" + showgrid="false" + inkscape:zoom="9.8333333" + inkscape:cx="12.20339" + inkscape:cy="12" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" /> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title + id="title4">icon_newmessages</title> + <desc + id="desc6">Created with Sketch.</desc> + <defs + id="defs8" /> + <g + id="02-Chat" + sketch:type="MSPage" + transform="matrix(1,0,0,-1,0,24)" + style="fill:none;stroke:none"> + <g + id="02_7-Chat-new-messages" + sketch:type="MSArtboardGroup" + transform="translate(-809,-325)"> + <g + id="icon_newmessages" + sketch:type="MSLayerGroup" + transform="translate(809,325)"> + <circle + id="Oval-1909" + sketch:type="MSShapeGroup" + cx="12" + cy="12" + r="12" + d="M 24,12 C 24,18.627417 18.627417,24 12,24 5.372583,24 0,18.627417 0,12 0,5.372583 5.372583,0 12,0 18.627417,0 24,5.372583 24,12 z" + sodipodi:cx="12" + sodipodi:cy="12" + sodipodi:rx="12" + sodipodi:ry="12" + style="fill:#454545;fill-opacity:0.5" /> + <path + d="m 16.340043,11.526774 c 0.146962,0 0.293924,-0.05588 0.406442,-0.168394 0.223505,-0.224271 0.223505,-0.587084 0,-0.811354 L 12.36594,6.1680115 C 12.142435,5.943741 11.778856,5.9445065 11.554586,6.167246 l -4.3859037,4.372891 c -0.2242704,0.224271 -0.2250358,0.587849 -0.00153,0.812119 0.223505,0.225036 0.5870834,0.225036 0.8113538,0.0015 l 3.4130447,-3.4030933 0.0015,9.4752353 c 0,0.316887 0.25795,0.574071 0.574072,0.574071 0.317652,0 0.574071,-0.257184 0.574071,-0.574071 l -0.0015,-9.4606922 3.394674,3.3931432 c 0.111752,0.112518 0.258714,0.168394 0.405677,0.168394 l 0,0 z" + sketch:type="MSShapeGroup" + transform="matrix(-1,0,0,-1,23.914114,24)" + id="path14" + inkscape:connector-curvature="0" + style="fill:#ffffff" /> + </g> + </g> + </g> +</svg> diff --git a/res/img/search-button.svg b/res/img/search-button.svg new file mode 100644 index 0000000000..f4808842ff --- /dev/null +++ b/res/img/search-button.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="21px" height="19px" viewBox="-8 -8 37 37" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>icon_search</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="icon_search" sketch:type="MSLayerGroup" transform="translate(-8.000000, -8.000000)" stroke="#FFFFFF"> + <path d="M21.328421,19.3333333 L27.5542961,24.7357275 C27.9574623,25.085568 28.0116667,25.70516 27.6700827,26.1261351 L27.6700827,26.1261351 C27.3308636,26.5441955 26.72562,26.5965299 26.3258751,26.2496583 L20.1,20.8472641" id="Rectangle-9" sketch:type="MSShapeGroup"></path> + <g id="search" transform="translate(15.617851, 15.853553) rotate(-45.000000) translate(-15.617851, -15.853553) translate(8.117851, 7.853553)" sketch:type="MSShapeGroup"> + <ellipse id="Search" cx="7.64433504" cy="7.90518519" rx="7.1665641" ry="7.41111111"></ellipse> + </g> + </g> + </g> +</svg> \ 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 0000000000..5780277f38 --- /dev/null +++ b/res/img/search-icon-vector.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 113 144" style="enable-background:new 0 0 113 144;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#7BC9A4;} + .st1{fill:#B47BB5;} +</style> +<path class="st0" d="M61.6,0H20.8c-0.1,0-0.2,0-0.3,0C9.2,0,0,9.2,0,20.6v102.9C0,134.8,9.2,144,20.6,144c11.3,0,20.6-9.2,20.6-20.6 + v-20.6h20.5c28.3,0,51.4-23.1,51.4-51.4S90,0,61.6,0"/> +<path class="st1" d="M37.4,8.8c6.5,9.3,4.3,22.1-5,28.7c-9.3,6.5-22.1,4.3-28.6-5.1c-6.5-9.3-4.3-22.1,5-28.7 + C18.1-2.8,30.9-0.5,37.4,8.8"/> +<path class="st1" d="M109.3,111.6c6.5,9.3,4.3,22.1-5,28.7c-9.3,6.5-22.1,4.3-28.6-5.1l-30.8-44c-6.5-9.3-4.3-22.1,5-28.7 + c9.3-6.5,22.1-4.3,28.6,5.1L109.3,111.6z"/> +</svg> diff --git a/res/img/search.png b/res/img/search.png new file mode 100644 index 0000000000..2f98d29048 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 0000000000..bd4cd9200c --- /dev/null +++ b/res/img/search.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="21px" height="19px" viewBox="0 0 21 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: bin/sketchtool 1.4 (305) - http://www.bohemiancoding.com/sketch --> + <title>icons_search</title> + <desc>Created with bin/sketchtool.</desc> + <defs></defs> + <g id="02-Chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="02_13-Chat-member-profile" sketch:type="MSArtboardGroup" transform="translate(-910.000000, -34.000000)" stroke="#76CFA6"> + <g id="icons_search" sketch:type="MSLayerGroup" transform="translate(906.000000, 30.000000)"> + <path d="M17.328421,15.3333333 L23.5542961,20.7357275 C23.9574623,21.085568 24.0116667,21.70516 23.6700827,22.1261351 L23.6700827,22.1261351 C23.3308636,22.5441955 22.72562,22.5965299 22.3258751,22.2496583 L16.1,16.8472641" id="Rectangle-9" sketch:type="MSShapeGroup"></path> + <g id="search" transform="translate(11.617851, 11.853553) rotate(-45.000000) translate(-11.617851, -11.853553) translate(4.117851, 3.853553)" sketch:type="MSShapeGroup"> + <ellipse id="Search" cx="7.64433504" cy="7.90518519" rx="7.1665641" ry="7.41111111"></ellipse> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/selected.png b/res/img/selected.png new file mode 100644 index 0000000000..8931cba75f 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 0000000000..cb2e0a62d0 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 0000000000..c9587d58c2 --- /dev/null +++ b/res/img/settings-big.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="26px" height="26px" viewBox="-1 -1 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: sketchtool 3.4 (381) - http://www.bohemiancoding.com/sketch --> + <title>icons_settings</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="01-Sign-up" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="01_2-Sign-up-2" sketch:type="MSArtboardGroup" transform="translate(-14.000000, -720.000000)" fill="#454545" opacity="0.9"> + <g id="Left-panel" sketch:type="MSLayerGroup" transform="translate(-4.000000, 0.000000)"> + <g id="right_bottom" transform="translate(0.000000, 626.000000)" sketch:type="MSShapeGroup"> + <g id="Group-Copy-29" transform="translate(18.000000, 27.000000)"> + <path d="M16,79 C16,77.8958278 15.6093789,76.9531289 14.828125,76.171875 C14.0468711,75.3906211 13.1041722,75 12,75 C10.8958278,75 9.95312891,75.3906211 9.171875,76.171875 C8.39062109,76.9531289 8,77.8958278 8,79 C8,80.1041722 8.39062109,81.0468711 9.171875,81.828125 C9.95312891,82.6093789 10.8958278,83 12,83 C13.1041722,83 14.0468711,82.6093789 14.828125,81.828125 C15.6093789,81.0468711 16,80.1041722 16,79 L16,79 Z M24,77.296875 L24,80.765625 C24,80.8906256 23.9583338,81.0104161 23.875,81.125 C23.7916662,81.2395839 23.6875006,81.3072916 23.5625,81.328125 L20.671875,81.765625 C20.4739573,82.3281278 20.2708344,82.8020814 20.0625,83.1875 C20.4270852,83.7083359 20.9843712,84.4270787 21.734375,85.34375 C21.8385422,85.4687506 21.890625,85.5989577 21.890625,85.734375 C21.890625,85.8697923 21.8437505,85.9895828 21.75,86.09375 C21.4687486,86.4791686 20.9531288,87.041663 20.203125,87.78125 C19.4531212,88.520837 18.9635428,88.890625 18.734375,88.890625 C18.6093744,88.890625 18.4739591,88.8437505 18.328125,88.75 L16.171875,87.0625 C15.7135394,87.3020845 15.2395858,87.4999992 14.75,87.65625 C14.5833325,89.0729238 14.4322923,90.0416641 14.296875,90.5625 C14.223958,90.8541681 14.0364598,91 13.734375,91 L10.265625,91 C10.1197909,91 9.99218805,90.9557296 9.8828125,90.8671875 C9.77343695,90.7786454 9.71354172,90.6666673 9.703125,90.53125 L9.265625,87.65625 C8.75520578,87.4895825 8.28646047,87.2968761 7.859375,87.078125 L5.65625,88.75 C5.55208281,88.8437505 5.42187578,88.890625 5.265625,88.890625 C5.11979094,88.890625 4.98958391,88.8333339 4.875,88.71875 C3.56249344,87.5312441 2.70312703,86.6562528 2.296875,86.09375 C2.22395797,85.9895828 2.1875,85.8697923 2.1875,85.734375 C2.1875,85.6093744 2.22916625,85.4895839 2.3125,85.375 C2.46875078,85.1562489 2.73437313,84.8098982 3.109375,84.3359375 C3.48437688,83.8619768 3.76562406,83.494793 3.953125,83.234375 C3.67187359,82.7135391 3.45833406,82.1979192 3.3125,81.6875 L0.453125,81.265625 C0.317707656,81.2447916 0.20833375,81.179688 0.125,81.0703125 C0.04166625,80.960937 0,80.8385423 0,80.703125 L0,77.234375 C0,77.1093744 0.04166625,76.9895839 0.125,76.875 C0.20833375,76.7604161 0.307291094,76.6927084 0.421875,76.671875 L3.328125,76.234375 C3.47395906,75.7552059 3.67708203,75.2760441 3.9375,74.796875 C3.52083125,74.203122 2.96354516,73.4843792 2.265625,72.640625 C2.16145781,72.5156244 2.109375,72.3906256 2.109375,72.265625 C2.109375,72.1614578 2.15624953,72.0416673 2.25,71.90625 C2.52083469,71.5312481 3.03385039,70.9713579 3.7890625,70.2265625 C4.54427461,69.4817671 5.03645719,69.109375 5.265625,69.109375 C5.40104234,69.109375 5.53645766,69.1614578 5.671875,69.265625 L7.828125,70.9375 C8.28646063,70.6979155 8.76041422,70.5000008 9.25,70.34375 C9.4166675,68.9270762 9.56770766,67.9583359 9.703125,67.4375 C9.77604203,67.1458319 9.96354016,67 10.265625,67 L13.734375,67 C13.8802091,67 14.007812,67.0442704 14.1171875,67.1328125 C14.226563,67.2213546 14.2864583,67.3333327 14.296875,67.46875 L14.734375,70.34375 C15.2447942,70.5104175 15.7135395,70.7031239 16.140625,70.921875 L18.359375,69.25 C18.4531255,69.1562495 18.5781242,69.109375 18.734375,69.109375 C18.8697923,69.109375 18.9999994,69.1614578 19.125,69.265625 C20.4687567,70.5052145 21.3281231,71.3906223 21.703125,71.921875 C21.776042,72.0052088 21.8125,72.1197909 21.8125,72.265625 C21.8125,72.3906256 21.7708338,72.5104161 21.6875,72.625 C21.5312492,72.8437511 21.2656269,73.1901018 20.890625,73.6640625 C20.5156231,74.1380232 20.2343759,74.505207 20.046875,74.765625 C20.3177097,75.2864609 20.5312492,75.7968725 20.6875,76.296875 L23.546875,76.734375 C23.6822923,76.7552084 23.7916662,76.820312 23.875,76.9296875 C23.9583338,77.039063 24,77.1614577 24,77.296875 L24,77.296875 Z" id="icons_settings"></path> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/settings.png b/res/img/settings.png new file mode 100644 index 0000000000..264b3c9bc3 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 0000000000..4190c7b8de --- /dev/null +++ b/res/img/settings.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="12px" height="12px" viewBox="0 0 12 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: bin/sketchtool 1.4 (305) - http://www.bohemiancoding.com/sketch --> + <title>icon_settings_small</title> + <desc>Created with bin/sketchtool.</desc> + <defs></defs> + <g id="06a-Room-settings" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="06a_1-Room-settings-hover" sketch:type="MSArtboardGroup" transform="translate(-452.000000, -27.000000)" fill="#76CFA6"> + <path d="M460,33 C460,32.4479139 459.804689,31.9765645 459.414062,31.5859375 C459.023436,31.1953105 458.552086,31 458,31 C457.447914,31 456.976564,31.1953105 456.585938,31.5859375 C456.195311,31.9765645 456,32.4479139 456,33 C456,33.5520861 456.195311,34.0234355 456.585938,34.4140625 C456.976564,34.8046895 457.447914,35 458,35 C458.552086,35 459.023436,34.8046895 459.414062,34.4140625 C459.804689,34.0234355 460,33.5520861 460,33 L460,33 Z M464,32.1484375 L464,33.8828125 C464,33.9453128 463.979167,34.005208 463.9375,34.0625 C463.895833,34.119792 463.84375,34.1536458 463.78125,34.1640625 L462.335938,34.3828125 C462.236979,34.6640639 462.135417,34.9010407 462.03125,35.09375 C462.213543,35.354168 462.492186,35.7135394 462.867188,36.171875 C462.919271,36.2343753 462.945312,36.2994788 462.945312,36.3671875 C462.945312,36.4348962 462.921875,36.4947914 462.875,36.546875 C462.734374,36.7395843 462.476564,37.0208315 462.101562,37.390625 C461.726561,37.7604185 461.481771,37.9453125 461.367188,37.9453125 C461.304687,37.9453125 461.23698,37.9218752 461.164062,37.875 L460.085938,37.03125 C459.85677,37.1510423 459.619793,37.2499996 459.375,37.328125 C459.291666,38.0364619 459.216146,38.520832 459.148438,38.78125 C459.111979,38.9270841 459.01823,39 458.867188,39 L457.132812,39 C457.059895,39 456.996094,38.9778648 456.941406,38.9335938 C456.886718,38.8893227 456.856771,38.8333337 456.851562,38.765625 L456.632812,37.328125 C456.377603,37.2447912 456.14323,37.148438 455.929688,37.0390625 L454.828125,37.875 C454.776041,37.9218752 454.710938,37.9453125 454.632812,37.9453125 C454.559895,37.9453125 454.494792,37.916667 454.4375,37.859375 C453.781247,37.265622 453.351564,36.8281264 453.148438,36.546875 C453.111979,36.4947914 453.09375,36.4348962 453.09375,36.3671875 C453.09375,36.3046872 453.114583,36.244792 453.15625,36.1875 C453.234375,36.0781245 453.367187,35.9049491 453.554688,35.6679688 C453.742188,35.4309884 453.882812,35.2473965 453.976562,35.1171875 C453.835937,34.8567695 453.729167,34.5989596 453.65625,34.34375 L452.226562,34.1328125 C452.158854,34.1223958 452.104167,34.089844 452.0625,34.0351562 C452.020833,33.9804685 452,33.9192712 452,33.8515625 L452,32.1171875 C452,32.0546872 452.020833,31.994792 452.0625,31.9375 C452.104167,31.880208 452.153646,31.8463542 452.210938,31.8359375 L453.664062,31.6171875 C453.73698,31.377603 453.838541,31.138022 453.96875,30.8984375 C453.760416,30.601561 453.481773,30.2421896 453.132812,29.8203125 C453.080729,29.7578122 453.054688,29.6953128 453.054688,29.6328125 C453.054688,29.5807289 453.078125,29.5208337 453.125,29.453125 C453.260417,29.2656241 453.516925,28.9856789 453.894531,28.6132812 C454.272137,28.2408836 454.518229,28.0546875 454.632812,28.0546875 C454.700521,28.0546875 454.768229,28.0807289 454.835938,28.1328125 L455.914062,28.96875 C456.14323,28.8489577 456.380207,28.7500004 456.625,28.671875 C456.708334,27.9635381 456.783854,27.479168 456.851562,27.21875 C456.888021,27.0729159 456.98177,27 457.132812,27 L458.867188,27 C458.940105,27 459.003906,27.0221352 459.058594,27.0664062 C459.113282,27.1106773 459.143229,27.1666663 459.148438,27.234375 L459.367188,28.671875 C459.622397,28.7552088 459.85677,28.851562 460.070312,28.9609375 L461.179688,28.125 C461.226563,28.0781248 461.289062,28.0546875 461.367188,28.0546875 C461.434896,28.0546875 461.5,28.0807289 461.5625,28.1328125 C462.234378,28.7526073 462.664062,29.1953112 462.851562,29.4609375 C462.888021,29.5026044 462.90625,29.5598955 462.90625,29.6328125 C462.90625,29.6953128 462.885417,29.755208 462.84375,29.8125 C462.765625,29.9218755 462.632813,30.0950509 462.445312,30.3320312 C462.257812,30.5690116 462.117188,30.7526035 462.023438,30.8828125 C462.158855,31.1432305 462.265625,31.3984362 462.34375,31.6484375 L463.773438,31.8671875 C463.841146,31.8776042 463.895833,31.910156 463.9375,31.9648438 C463.979167,32.0195315 464,32.0807288 464,32.1484375 L464,32.1484375 Z" id="icon_settings_small" sketch:type="MSShapeGroup"></path> + </g> + </g> +</svg> \ 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 0000000000..9b8de53d81 --- /dev/null +++ b/res/img/sound-indicator.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="23px" height="20px" viewBox="-1 -1 23 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.3 (16618) - http://www.bohemiancoding.com/sketch --> + <title>sound_indicator</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="05-Voice-and-video" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="05_2-Video-call" sketch:type="MSArtboardGroup" transform="translate(-247.000000, -668.000000)" fill="#FFFFFF"> + <g id="sound_indicator" sketch:type="MSLayerGroup" transform="translate(247.000000, 668.000000)"> + <path d="M5.769,6.7284 L7.8,4.6968 L7.8,13.0626 L5.4174,10.68 L1.2,10.68 L1.2,7.08 L5.4174,7.08 L5.769,6.7284 L5.769,6.7284 Z M0,5.88 L0,11.88 L4.9206,11.88 L9,15.9594 L9,1.8 L4.9206,5.88 L0,5.88 L0,5.88 Z" id="Fill-28" sketch:type="MSShapeGroup"></path> + <path d="M17.1672,0 L16.2,0.72 C17.9172,3.021 18.9354,5.8728 18.9354,8.9586 C18.9354,12.0438 17.9172,14.8956 16.2,17.196 L17.1672,17.9166 C19.0314,15.417 20.1354,12.3168 20.1354,8.9586 C20.1354,5.6004 19.0314,2.4996 17.1672,0" id="Fill-29" sketch:type="MSShapeGroup"></path> + <path d="M14.1606,15.9948 C15.579,14.094 16.4304,11.7462 16.4304,9.1974 C16.4304,6.6486 15.579,4.3008 14.1606,2.4 L13.2,3.1152 C14.469,4.8156 15.2304,6.9168 15.2304,9.1974 C15.2304,11.478 14.4696,13.5786 13.2,15.2796 L14.1606,15.9948" id="Fill-30" sketch:type="MSShapeGroup"></path> + <path d="M11.7606,13.5024 C12.732,12.2016 13.314,10.5954 13.314,8.8512 C13.314,7.107 12.732,5.5002 11.7606,4.2 L10.8,4.9152 C11.6214,6.0156 12.114,7.3752 12.114,8.8512 C12.114,10.3272 11.6214,11.6862 10.8,12.7866 L11.7606,13.5024" id="Fill-31" sketch:type="MSShapeGroup"></path> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/spinner.gif b/res/img/spinner.gif new file mode 100644 index 0000000000..ab4871214b 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 0000000000..7980114438 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 0000000000..6177f15f5e --- /dev/null +++ b/res/img/tick.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="17px" height="14px" viewBox="-1 -1 17 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: sketchtool 3.4 (381) - http://www.bohemiancoding.com/sketch --> + <title>icon_tick</title> + <desc>Created with sketchtool.</desc> + <defs></defs> + <g id="06a-Room-settings" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="06_4-Room-settings-admin" sketch:type="MSArtboardGroup" transform="translate(-310.000000, -206.000000)" fill="#4A4A4A"> + <path d="M315,218 L310,213 L312,211 L315,214 L323,206 L325,208 L315,218 Z" id="icon_tick" sketch:type="MSShapeGroup"></path> + </g> + </g> +</svg> diff --git a/res/img/trans.png b/res/img/trans.png new file mode 100644 index 0000000000..8ba2310a06 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 0000000000..066a0ce8fd 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 0000000000..c11c0c452d 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 0000000000..6099c2e976 --- /dev/null +++ b/res/img/upload-big.svg @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="45px" height="59px" viewBox="-1 -1 45 59" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: bin/sketchtool 1.4 (305) - http://www.bohemiancoding.com/sketch --> + <title>icons_upload_drop</title> + <desc>Created with bin/sketchtool.</desc> + <defs></defs> + <g id="03-Input" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="03_05-File-drop" sketch:type="MSArtboardGroup" transform="translate(-570.000000, -368.000000)"> + <g id="icons_upload_drop" sketch:type="MSLayerGroup" transform="translate(570.000000, 368.000000)"> + <g id="Rectangle-5-+-Rectangle-6" sketch:type="MSShapeGroup"> + <path d="M0,4.00812931 C0,1.79450062 1.78537926,0 4.00241155,0 L24.8253683,0 C24.8253683,0 42.2466793,16.8210687 42.2466793,16.8210687 L42.2466793,53.000599 C42.2466793,55.2094072 40.4583762,57 38.2531894,57 L3.99348992,57 C1.78794634,57 0,55.1999609 0,52.9918707 L0,4.00812931 Z" id="Rectangle-5" stroke="#76CFA6"></path> + <path d="M40.5848017,19.419576 L29.8354335,19.419576 C26.7387692,19.419576 24.2284269,16.9063989 24.2284269,13.8067771 L24.2284269,4.88501382 L40.5848017,19.419576 Z" id="Rectangle-6-Copy" fill="#FFFFFF"></path> + <path d="M42.2466793,18.3870968 L29.539478,18.3870968 C26.4130381,18.3870968 23.8785579,15.8497544 23.8785579,12.7203286 L23.8785579,0" id="Rectangle-6" stroke="#76CFA6"></path> + </g> + <path d="M31.3419737,32.9284726 C31.701384,32.9284726 32.0607942,32.8000473 32.3359677,32.5414375 C32.8825707,32.0259772 32.8825707,31.1920926 32.3359677,30.6766323 L21.622922,20.6119619 C21.076319,20.0965016 20.187153,20.0982608 19.638678,20.6102026 L8.9125289,30.6607991 C8.36405391,31.1762594 8.36218198,32.0119032 8.90878504,32.5273635 C9.4553881,33.0445831 10.344554,33.0445831 10.893029,32.530882 L19.2399573,24.7092556 L19.2437012,46.487014 C19.2437012,47.2153435 19.874541,47.8064516 20.6476474,47.8064516 C21.4244976,47.8064516 22.0515936,47.2153435 22.0515936,46.487014 L22.0478497,24.7426814 L30.3498517,32.5414375 C30.6231533,32.8000473 30.9825635,32.9284726 31.3419737,32.9284726 L31.3419737,32.9284726 Z" id="Fill-75" fill="#76CFA6" sketch:type="MSShapeGroup"></path> + </g> + </g> + </g> +</svg> diff --git a/res/img/upload.png b/res/img/upload.png new file mode 100644 index 0000000000..7457bcd0f1 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 0000000000..039014a2f3 --- /dev/null +++ b/res/img/upload.svg @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="19px" height="24px" viewBox="-1 -1 19 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: bin/sketchtool 1.4 (305) - http://www.bohemiancoding.com/sketch --> + <title>icons_upload</title> + <desc>Created with bin/sketchtool.</desc> + <defs></defs> + <g id="02-Chat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="02_13-Chat-member-profile" sketch:type="MSArtboardGroup" transform="translate(-873.000000, -722.000000)"> + <g id="icons_upload" sketch:type="MSLayerGroup" transform="translate(873.000000, 722.000000)"> + <g id="Rectangle-5-+-Rectangle-6" sketch:type="MSShapeGroup"> + <path d="M0,4.00955791 C0,1.79514022 1.78163126,0 3.99825563,0 L9.59161955,0 C9.59161955,0 16.3225806,6.49234232 16.3225806,6.49234232 L16.3225806,18.0063928 C16.3225806,20.2120012 14.5290874,22 12.3296282,22 L3.99295243,22 C1.7877057,22 0,20.1996477 0,17.9904421 L0,4.00955791 Z" id="Rectangle-5" stroke="#76CFA6"></path> + <path d="M15.6804916,7.49527496 L11.5273266,7.49527496 C10.3308881,7.49527496 9.3609831,6.52527676 9.3609831,5.3289315 L9.3609831,1.88544393 L15.6804916,7.49527496 Z" id="Rectangle-6-Copy" fill="#FFFFFF"></path> + <path d="M16.3225806,7.09677419 L11.4129801,7.09677419 C10.2050375,7.09677419 9.22580645,6.11744908 9.22580645,4.90960051 L9.22580645,0" id="Rectangle-6" stroke="#76CFA6"></path> + </g> + <path d="M12.3736951,12.709235 C12.5125582,12.709235 12.6514212,12.6596674 12.7577382,12.5598531 C12.9689258,12.3609035 12.9689258,12.0390533 12.7577382,11.8401037 L8.61860697,7.95549406 C8.40741942,7.75654446 8.06387804,7.75722347 7.85196724,7.95481505 L3.70777326,11.8339926 C3.49586247,12.0329422 3.49513923,12.3554714 3.70632677,12.554421 C3.91751432,12.7540496 4.2610557,12.7540496 4.4729665,12.555779 L7.69791605,9.53690567 L7.69936254,17.9423563 C7.69936254,18.2234659 7.94309612,18.4516129 8.24179631,18.4516129 C8.541943,18.4516129 8.78423008,18.2234659 8.78423008,17.9423563 L8.78278359,9.54980684 L11.9903753,12.5598531 C12.095969,12.6596674 12.2348321,12.709235 12.3736951,12.709235 L12.3736951,12.709235 Z" id="Fill-75" fill="#76CFA6" sketch:type="MSShapeGroup"></path> + </g> + </g> + </g> +</svg> \ 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 0000000000..6de60ba39b --- /dev/null +++ b/res/img/video-mute.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="31px" height="27px" viewBox="-2 -2 31 27" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.3 (16618) - http://www.bohemiancoding.com/sketch --> + <title>icons_video copy</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="05-Voice-and-video" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="05_2-Video-call" sketch:type="MSArtboardGroup" transform="translate(-871.000000, -667.000000)" stroke="#FFFFFF"> + <g id="icons_video-copy" sketch:type="MSLayerGroup" transform="translate(871.000000, 666.000000)"> + <g id="Rectangle-20-+-Path-16" transform="translate(0.000000, 0.464286)" sketch:type="MSShapeGroup"> + <rect id="Rectangle-20" x="0" y="0.535714286" width="20" height="20" rx="4"></rect> + <path d="M20.75,10.6964286 C20.75,14.0446429 24.188247,15.7371974 24.188247,15.7371974 C25.5057636,16.651593 26.5738219,16.0843085 26.5738219,14.4868066 L26.5738219,6.90605053 C26.5738219,5.30108314 25.4784055,4.70120148 24.188247,5.65565975 C24.188247,5.65565975 20.75,7.34821429 20.75,10.6964286 Z" id="Path-16"></path> + </g> + </g> + </g> + </g> +</svg> \ 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 0000000000..a6c6c3b681 --- /dev/null +++ b/res/img/video-unmute.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="31px" height="27px" viewBox="-1 -1 31 27" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>icons_video copy</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="05-Voice-and-video" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="05_2-Video-call" sketch:type="MSArtboardGroup" transform="translate(-870.000000, -666.000000)" stroke="#FFFFFF"> + <g id="icons_video-copy" sketch:type="MSLayerGroup" transform="translate(870.000000, 666.000000)"> + <g id="Rectangle-20-+-Path-16" transform="translate(1.000000, 0.464286)" sketch:type="MSShapeGroup"> + <rect id="Rectangle-20" x="0" y="0.535714286" width="20" height="20" rx="4"></rect> + <path d="M20.75,10.6964286 C20.75,14.0446429 24.188247,15.7371974 24.188247,15.7371974 C25.5057636,16.651593 26.5738219,16.0843085 26.5738219,14.4868066 L26.5738219,6.90605053 C26.5738219,5.30108314 25.4784055,4.70120148 24.188247,5.65565975 C24.188247,5.65565975 20.75,7.34821429 20.75,10.6964286 Z" id="Path-16"></path> + </g> + <path d="M24,1 L0.00856596586,23.6585766" id="Path-98" sketch:type="MSShapeGroup"></path> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/video.png b/res/img/video.png new file mode 100644 index 0000000000..2a788f6fa4 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 0000000000..336641078e --- /dev/null +++ b/res/img/voice-mute.svg @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="21px" height="26px" viewBox="-4 -1 21 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.3 (16618) - http://www.bohemiancoding.com/sketch --> + <title>Audio</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="05-Voice-and-video" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="05_2-Video-call" sketch:type="MSArtboardGroup" transform="translate(-915.000000, -665.000000)" fill="#FFFFFF"> + <g id="Audio" sketch:type="MSLayerGroup" transform="translate(915.000000, 665.000000)"> + <path d="M3.51108197,4.57927869 C3.51108197,2.62701639 5.09940984,1.03868852 7.05206557,1.03868852 C9.00472131,1.03868852 10.5930492,2.62701639 10.5930492,4.57927869 L10.5930492,12.448918 C10.5930492,14.4015738 9.00472131,15.9899016 7.05206557,15.9899016 C5.09940984,15.9899016 3.51108197,14.4015738 3.51108197,12.448918 L3.51108197,4.57927869 L3.51108197,4.57927869 Z M7.05206557,16.7767869 C9.44183607,16.7767869 11.3799344,14.839082 11.3799344,12.448918 L11.3799344,4.57927869 C11.3799344,2.18911475 9.44183607,0.251803279 7.05206557,0.251803279 C4.66229508,0.251803279 2.72419672,2.18911475 2.72419672,4.57927869 L2.72419672,12.448918 C2.72419672,14.839082 4.66229508,16.7767869 7.05206557,16.7767869 Z M12.9517377,8.51409836 L12.9517377,12.448918 C12.9517377,15.703082 10.3042623,18.3505574 7.05009836,18.3505574 C3.79554098,18.3505574 1.14845902,15.703082 1.14845902,12.448918 L1.14845902,8.51409836 L0.36157377,8.51409836 L0.36157377,12.448918 C0.36157377,16.0217705 3.17980328,18.9407213 6.70898361,19.1201311 L6.65862295,19.1201311 L6.65862295,23.080918 L3.11567213,23.080918 L3.11567213,23.8678033 L10.9845246,23.8678033 L10.9845246,23.080918 L7.4455082,23.080918 L7.4455082,19.1201311 L7.39121311,19.1201311 C10.9203934,18.9407213 13.738623,16.0217705 13.738623,12.448918 L13.738623,8.51409836 L12.9517377,8.51409836 Z" id="Fill-16" sketch:type="MSShapeGroup"></path> + </g> + </g> + </g> +</svg> \ 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 0000000000..0d7e6f429f --- /dev/null +++ b/res/img/voice-unmute.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="21px" height="26px" viewBox="-1 -1 21 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>Audio</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="05-Voice-and-video" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="05_2-Video-call" sketch:type="MSArtboardGroup" transform="translate(-912.000000, -665.000000)"> + <g id="Audio" sketch:type="MSLayerGroup" transform="translate(912.000000, 665.000000)"> + <path d="M6.51108197,4.57927869 C6.51108197,2.62701639 8.09940984,1.03868852 10.0520656,1.03868852 C12.0047213,1.03868852 13.5930492,2.62701639 13.5930492,4.57927869 L13.5930492,12.448918 C13.5930492,14.4015738 12.0047213,15.9899016 10.0520656,15.9899016 C8.09940984,15.9899016 6.51108197,14.4015738 6.51108197,12.448918 L6.51108197,4.57927869 L6.51108197,4.57927869 Z M10.0520656,16.7767869 C12.4418361,16.7767869 14.3799344,14.839082 14.3799344,12.448918 L14.3799344,4.57927869 C14.3799344,2.18911475 12.4418361,0.251803279 10.0520656,0.251803279 C7.66229508,0.251803279 5.72419672,2.18911475 5.72419672,4.57927869 L5.72419672,12.448918 C5.72419672,14.839082 7.66229508,16.7767869 10.0520656,16.7767869 Z M15.9517377,8.51409836 L15.9517377,12.448918 C15.9517377,15.703082 13.3042623,18.3505574 10.0500984,18.3505574 C6.79554098,18.3505574 4.14845902,15.703082 4.14845902,12.448918 L4.14845902,8.51409836 L3.36157377,8.51409836 L3.36157377,12.448918 C3.36157377,16.0217705 6.17980328,18.9407213 9.70898361,19.1201311 L9.65862295,19.1201311 L9.65862295,23.080918 L6.11567213,23.080918 L6.11567213,23.8678033 L13.9845246,23.8678033 L13.9845246,23.080918 L10.4455082,23.080918 L10.4455082,19.1201311 L10.3912131,19.1201311 C13.9203934,18.9407213 16.738623,16.0217705 16.738623,12.448918 L16.738623,8.51409836 L15.9517377,8.51409836 Z" id="Fill-16" fill="#FFFFFF" sketch:type="MSShapeGroup"></path> + <path d="M19,3 L0.272141024,20.6874224" id="Path-98" stroke="#FFFFFF" sketch:type="MSShapeGroup"></path> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/res/img/voice.png b/res/img/voice.png new file mode 100644 index 0000000000..5ba765b0f4 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 0000000000..ff87270ba5 --- /dev/null +++ b/res/img/voice.svg @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="16px" height="26px" viewBox="0 0 16 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.2 (15857) - http://www.bohemiancoding.com/sketch --> + <title>icon_voice</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="icon_voice" sketch:type="MSLayerGroup" fill="#76CFA6"> + <path d="M15.690213,10.5130204 C15.690213,9.68172789 15.0096307,9.00560998 14.1739648,9.00560998 C13.3355096,9.00560998 12.6543693,9.68172789 12.6543693,10.5130204 L12.6554851,13.5200825 C12.6510222,13.5599846 11.9274851,17.4980943 7.84566437,17.4980943 C3.7599387,17.4980943 3.03472797,13.5815982 3.03361226,13.5500091 L3.03361226,10.5130204 C3.03361226,9.68172789 2.35302989,9.00560998 1.51680613,9.00560998 C0.680024521,9.00560998 0,9.68172789 0,10.5130204 L0,13.5500091 C0,15.5922177 1.86211801,19.602927 6.32830038,20.3771374 L6.32830038,22.9513732 L2.35358774,22.9513732 C1.51680613,22.9513732 0.836781609,23.6280454 0.836781609,24.4593379 C0.836781609,25.2900762 1.51680613,25.9661941 2.35358774,25.9661941 L13.3371831,25.9661941 C14.1717333,25.9661941 14.8506421,25.2900762 14.8506421,24.4593379 C14.8506421,23.6280454 14.1717333,22.9513732 13.3371831,22.9513732 L9.36079693,22.9513732 L9.36079693,20.3771374 C13.828095,19.602927 15.690213,15.5922177 15.690213,13.5500091 L15.690213,10.5130204 Z M13.3371831,23.7826658 C13.7098299,23.7826658 14.0138605,24.0863646 14.0138605,24.4593379 C14.0138605,24.8317569 13.7098299,25.1349016 13.3371831,25.1349016 L2.35358774,25.1349016 C1.97870958,25.1349016 1.67356322,24.8317569 1.67356322,24.4593379 C1.67356322,24.0863646 1.97870958,23.7826658 2.35358774,23.7826658 L6.74613333,23.7826658 C6.97764291,23.7826658 7.16508199,23.5970104 7.16508199,23.3670195 L7.16508199,20.0196816 C7.16508199,19.8113043 7.00888276,19.6350703 6.80024521,19.6079147 C2.63809349,19.0681288 0.836781609,15.334517 0.836781609,13.5500091 L0.836781609,10.5130204 C0.836781609,10.1400472 1.14192797,9.83690249 1.51680613,9.83690249 C1.89168429,9.83690249 2.19683065,10.1400472 2.19683065,10.5130204 L2.19683065,13.555551 C2.20519847,14.1812372 3.30696092,18.3293868 7.84566437,18.3293868 C12.2990161,18.3293868 13.491151,14.1175048 13.491151,13.5500091 L13.491151,10.5130204 C13.491151,10.1400472 13.797413,9.83690249 14.1739648,9.83690249 C14.5488429,9.83690249 14.8539893,10.1400472 14.8539893,10.5130204 L14.8539893,13.5500091 C14.8539893,15.334517 13.0532352,19.0681288 8.88940996,19.6079147 C8.68077241,19.6350703 8.52401533,19.8113043 8.52401533,20.0196816 L8.52401533,23.3670195 C8.52401533,23.5970104 8.71201226,23.7826658 8.94296398,23.7826658 L13.3371831,23.7826658 Z" id="Fill-200" sketch:type="MSShapeGroup"></path> + <path d="M3.04309579,10.1578404 L3.04309579,8.37998277 L3.04309579,7.54869025 L3.04309579,6.79997279 L3.04309579,5.96868027 L3.04309579,5.63727166 C3.04309579,5.49650612 3.05257931,5.35795737 3.06429425,5.21996281 L3.21324138,4.38867029 C3.76384368,2.3436907 5.62875096,0.831292517 7.84510651,0.831292517 C10.0609042,0.831292517 11.9263693,2.3436907 12.4775295,4.38867029 L12.6259188,5.21996281 C12.6376337,5.35795737 12.6476751,5.49650612 12.6476751,5.63727166 L12.6476751,5.96868027 L12.6476751,6.79997279 L12.6476751,7.54869025 L12.6476751,8.37998277 L12.6476751,10.1578404 C12.6476751,10.3872771 12.8351142,10.5734866 13.0660659,10.5734866 C13.2970176,10.5734866 13.4844567,10.3872771 13.4844567,10.1578404 L13.4844567,5.63727166 C13.4844567,2.52934603 10.954587,0 7.84510651,0 C4.7350682,0 2.20631418,2.52934603 2.20631418,5.63727166 L2.20631418,10.1578404 C2.20631418,10.3872771 2.39375326,10.5734866 2.62470498,10.5734866 C2.8556567,10.5734866 3.04309579,10.3872771 3.04309579,10.1578404 Z" id="Path" sketch:type="MSShapeGroup"></path> + </g> + </g> +</svg> \ 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 0000000000..5f7cbe7153 --- /dev/null +++ b/res/img/voip-chevron.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="22px" height="17px" viewBox="-1 -1 22 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> + <!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch --> + <title>Triangle 1</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="05-Voice-and-video" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> + <g id="05_2-Video-call" sketch:type="MSArtboardGroup" transform="translate(-912.000000, -693.000000)" fill="#76CFA6"> + <polygon id="Triangle-1" sketch:type="MSShapeGroup" transform="translate(922.000000, 700.500000) scale(1, -1) translate(-922.000000, -700.500000) " points="922 693 932 708 912 708 "></polygon> + </g> + </g> +</svg> \ 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 0000000000..a16d1001e5 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 0000000000..e8f05bcc37 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 0000000000..c5553530a8 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 0000000000..b9a96a88e5 --- /dev/null +++ b/res/img/warning.svg @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 24 23" style="enable-background:new 0 0 24 23;" xml:space="preserve"> +<style type="text/css"> + .st0{clip-path:url(#SVGID_2_);fill:#FF0064;} + .st1{clip-path:url(#SVGID_4_);fill:#FFFFFF;} +</style> +<g> + <g> + <defs> + <path id="SVGID_1_" d="M9.2,2.2c1.6-2.9,4.1-2.9,5.7,0l8.3,15.4c1.6,2.9,0.2,5.3-3.2,5.3H4c-3.3,0-4.7-2.4-3.2-5.3L9.2,2.2 + L9.2,2.2z M9.2,2.2"/> + </defs> + <clipPath id="SVGID_2_"> + <use xlink:href="#SVGID_1_" style="overflow:visible;"/> + </clipPath> + <rect x="-4.8" y="-5" class="st0" width="33.6" height="32.9"/> + </g> + <g> + <defs> + <path id="SVGID_3_" d="M12.7,15L13,5.4H11l0.3,9.6H12.7L12.7,15z M12,19.1c0.7,0,1.2-0.5,1.2-1.2c0-0.7-0.5-1.2-1.2-1.2 + c-0.7,0-1.2,0.5-1.2,1.2C10.8,18.6,11.3,19.1,12,19.1L12,19.1L12,19.1z M12,19.1"/> + </defs> + <clipPath id="SVGID_4_"> + <use xlink:href="#SVGID_3_" style="overflow:visible;"/> + </clipPath> + <rect x="5.8" y="0.4" class="st1" width="12.4" height="23.7"/> + </g> +</g> +</svg> diff --git a/res/img/warning2.png b/res/img/warning2.png new file mode 100644 index 0000000000..db0fd4a897 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 0000000000..4d227517d2 --- /dev/null +++ b/res/img/warning_yellow.svg @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve"> +<g> + <g> + <g> + <defs> + <path id="SVGID_1_" d="M191.667,56.25c33.333-60.417,85.417-60.417,118.75,0l172.916,320.834 + C516.667,437.5,487.5,487.5,416.667,487.5H83.333c-68.75,0-97.917-50-66.667-110.416L191.667,56.25L191.667,56.25z"/> + </defs> + <use xlink:href="#SVGID_1_" overflow="visible" fill="#E8BF37"/> + <clipPath id="SVGID_2_"> + <use xlink:href="#SVGID_1_" overflow="visible"/> + </clipPath> + <rect x="-100" y="-93.75" clip-path="url(#SVGID_2_)" fill="#E8BF37" width="700" height="685.417"/> + </g> + </g> + <g> + <g> + <defs> + <path id="SVGID_3_" d="M264.584,322.916l6.25-200h-41.667l6.25,200H264.584L264.584,322.916z M250,408.334 + c14.584,0,25-10.418,25-25c0-14.584-10.416-25-25-25c-14.583,0-25,10.416-25,25C225,397.916,235.417,408.334,250,408.334 + L250,408.334L250,408.334z"/> + </defs> + <clipPath id="SVGID_4_"> + <use xlink:href="#SVGID_3_" overflow="visible"/> + </clipPath> + <rect x="120.833" y="18.75" clip-path="url(#SVGID_4_)" fill="#FFFFFF" width="258.333" height="493.75"/> + </g> + </g> +</g> +</svg> diff --git a/res/img/zoom.png b/res/img/zoom.png new file mode 100644 index 0000000000..f05ea959b4 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 0000000000..fec27ba4c5 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 0000000000..5d64a7d0d9 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 0000000000..50c34e5640 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 0000000000..927ce1f634 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 0000000000..b87eeda7c2 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 0000000000..adc74437d0 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 0000000000..36200cd89d 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 0000000000..708213bfac 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 0000000000..6ee34bf395 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 0000000000..7dbfdcd017 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 0000000000..31773ebd09 --- /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 0000000000..b69f096db7 --- /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 0000000000..5d5f5d7c90 --- /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 0000000000..2099f41f60 --- /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 0000000000..3929ab88c9 --- /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 0000000000..19081726b2 --- /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 0000000000..d289ca5da1 --- /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 <RoomTooltip className="mx_BottomLeftMenu_tooltip" label={label} />; + } + }, + + _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") ? + <GroupsButton tooltip={true} /> : null; + + return ( + <div className="mx_BottomLeftMenu"> + <div className="mx_BottomLeftMenu_options"> + <HomeButton tooltip={true} /> + <div ref={this._collectPeopleButton}> + <StartChatButton tooltip={true} /> + </div> + <div ref={this._collectDirectoryButton}> + <RoomDirectoryButton tooltip={true} /> + </div> + <div ref={this._collectCreateRoomButton}> + <CreateRoomButton tooltip={true} /> + </div> + { groupsButton } + <span className="mx_BottomLeftMenu_settings"> + <SettingsButton tooltip={true} /> + </span> + </div> + </div> + ); + }, +}); diff --git a/src/components/structures/CompatibilityPage.js b/src/components/structures/CompatibilityPage.js new file mode 100644 index 0000000000..4cbaab3dfa --- /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 ( + <div className="mx_CompatibilityPage"> + <div className="mx_CompatibilityPage_box"> + <p>{ _t("Sorry, your browser is <b>not</b> able to run Riot.", {}, { 'b': (sub) => <b>{sub}</b> }) } </p> + <p> + { _t("Riot uses many advanced browser features, some of which are not available or experimental in your current browser.") } + </p> + <p> + { _t('Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.', + {}, + { + 'chromeLink': (sub) => <a href="https://www.google.com/chrome">{sub}</a>, + 'firefoxLink': (sub) => <a href="https://getfirefox.com">{sub}</a>, + }, + )} + { _t('<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.', + {}, + { + 'safariLink': (sub) => <a href="http://apple.com/safari">{sub}</a>, + 'operaLink': (sub) => <a href="http://opera.com">{sub}</a>, + }, + )} + </p> + <p> + { _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!") } + </p> + <button onClick={this.onAccept}> + { _t("I understand the risks and wish to continue") } + </button> + </div> + </div> + ); + } +}); diff --git a/src/components/structures/HomePage.js b/src/components/structures/HomePage.js new file mode 100644 index 0000000000..457796f5dc --- /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 ( + <div className="mx_HomePage"> + <iframe src={ this.state.iframeSrc } /> + </div> + ); + } + else { + const GeminiScrollbarWrapper = sdk.getComponent("elements.GeminiScrollbarWrapper"); + return ( + <GeminiScrollbarWrapper autoshow={true} className="mx_HomePage"> + <div className="mx_HomePage_body" dangerouslySetInnerHTML={{ __html: this.state.page }}> + </div> + </GeminiScrollbarWrapper> + ); + } + } +} + +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 0000000000..5acceb1009 --- /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 = <LoginBox collapsed={ this.props.collapsed }/>; + } else { + const SearchBox = sdk.getComponent('structures.SearchBox'); + topBox = <SearchBox collapsed={ this.props.collapsed } onSearch={ this.onSearch } />; + } + + const classes = classNames( + "mx_LeftPanel", + { + "collapsed": this.props.collapsed, + }, + ); + + const tagPanelEnabled = !SettingsStore.getValue("TagPanel.disableTagPanel"); + const tagPanel = tagPanelEnabled ? <TagPanel /> : <div />; + + 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 ( + <div className={containerClasses}> + { tagPanel } + <aside className={classes} onKeyDown={ this._onKeyDown } onFocus={ this._onFocus } onBlur={ this._onBlur }> + { topBox } + <CallPreview ConferenceHandler={VectorConferenceHandler} /> + <RoomList + ref={this.collectRoomList} + collapsed={this.props.collapsed} + searchFilter={this.state.searchFilter} + ConferenceHandler={VectorConferenceHandler} /> + <BottomLeftMenu collapsed={this.props.collapsed}/> + </aside> + </div> + ); + } +}); + +module.exports = LeftPanel; diff --git a/src/components/structures/LoginBox.js b/src/components/structures/LoginBox.js new file mode 100644 index 0000000000..a9ea1f95c6 --- /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 = + <AccessibleButton className="mx_SearchBox_maximise" onClick={ this.onToggleCollapse.bind(this, true) }> + <TintableSvg src="img/maximise.svg" width="10" height="16" alt="Expand panel"/> + </AccessibleButton> + } + else { + toggleCollapse = + <AccessibleButton className="mx_SearchBox_minimise" onClick={ this.onToggleCollapse.bind(this, false) }> + <TintableSvg src="img/minimise.svg" width="10" height="16" alt="Collapse panel"/> + </AccessibleButton> + } + + var loginButton; + if (!this.props.collapsed) { + loginButton = ( + <div className="mx_LoginBox_loginButton_wrapper"> + <AccessibleButton className="mx_LoginBox_loginButton" element="button" onClick={this.onLoginClick}> + { _t("Login") } + </AccessibleButton> + <AccessibleButton className="mx_LoginBox_registerButton" element="button" onClick={this.onRegisterClick}> + { _t("Register") } + </AccessibleButton> + </div> + ); + } + + var self = this; + return ( + <div className="mx_SearchBox mx_LoginBox"> + { loginButton } + { toggleCollapse } + </div> + ); + } +}); diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js new file mode 100644 index 0000000000..ca1e331d15 --- /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 <AccessibleButton + aria-label={this.props.title} + title={this.props.title} + className="mx_RightPanel_headerButton" + onClick={this.onClick} > + + <div className="mx_RightPanel_headerButton_badge"> + { this.props.badge ? this.props.badge : <span> </span> } + </div> + <TintableSvg src={this.props.iconSrc} width="25" height="25" /> + { this.props.isHighlighted ? <div className="mx_RightPanel_headerButton_highlight" /> : <div /> } + + </AccessibleButton>; + } +} + +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 = <div title={membersTitle}>{ formatCount(numMembers) }</div>; + isUserInRoom = room.hasMembershipState(this.context.matrixClient.credentials.userId, 'join'); + } + + if (isUserInRoom) { + inviteGroup = + <AccessibleButton className="mx_RightPanel_invite" onClick={this.onInviteButtonClick}> + <div className="mx_RightPanel_icon" > + <TintableSvg src="img/icon-invite-people.svg" width="35" height="35" /> + </div> + <div className="mx_RightPanel_message">{ _t('Invite to this room') }</div> + </AccessibleButton>; + } + } + + const isPhaseGroup = [ + this.Phase.GroupMemberInfo, + this.Phase.GroupMemberList, + ].includes(this.state.phase); + + let headerButtons = []; + if (this.props.roomId) { + headerButtons = [ + <HeaderButton key="_membersButton" title={membersTitle} iconSrc="img/icons-people.svg" + isHighlighted={[this.Phase.RoomMemberList, this.Phase.RoomMemberInfo].includes(this.state.phase)} + clickPhase={this.Phase.RoomMemberList} + badge={membersBadge} + analytics={['Right Panel', 'Member List Button', 'click']} + />, + <HeaderButton key="_filesButton" title={_t('Files')} iconSrc="img/icons-files.svg" + isHighlighted={this.state.phase === this.Phase.FilePanel} + clickPhase={this.Phase.FilePanel} + analytics={['Right Panel', 'File List Button', 'click']} + />, + <HeaderButton key="_notifsButton" title={_t('Notifications')} iconSrc="img/icons-notifications.svg" + isHighlighted={this.state.phase === this.Phase.NotificationPanel} + clickPhase={this.Phase.NotificationPanel} + analytics={['Right Panel', 'Notification List Button', 'click']} + />, + ]; + } else if (this.props.groupId) { + headerButtons = [ + <HeaderButton key="_groupMembersButton" title={_t('Members')} iconSrc="img/icons-people.svg" + isHighlighted={isPhaseGroup} + clickPhase={this.Phase.GroupMemberList} + analytics={['Right Panel', 'Group Member List Button', 'click']} + />, + <HeaderButton key="_roomsButton" title={_t('Rooms')} iconSrc="img/icons-room.svg" + isHighlighted={[this.Phase.GroupRoomList, this.Phase.GroupRoomInfo].includes(this.state.phase)} + clickPhase={this.Phase.GroupRoomList} + analytics={['Right Panel', 'Group Room List Button', 'click']} + />, + ]; + } + + 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( + <div className="mx_RightPanel_headerButton mx_RightPanel_collapsebutton" key="_minimizeButton" + title={_t("Hide panel")} aria-label={_t("Hide panel")} onClick={this.onCollapseClick} + > + <TintableSvg src="img/minimise.svg" width="10" height="16" /> + </div>, + ); + } + + let panel = <div />; + if (!this.props.collapsed) { + if (this.props.roomId && this.state.phase === this.Phase.RoomMemberList) { + panel = <MemberList roomId={this.props.roomId} key={this.props.roomId} />; + } else if (this.props.groupId && this.state.phase === this.Phase.GroupMemberList) { + panel = <GroupMemberList groupId={this.props.groupId} key={this.props.groupId} />; + } else if (this.state.phase === this.Phase.GroupRoomList) { + panel = <GroupRoomList groupId={this.props.groupId} key={this.props.groupId} />; + } else if (this.state.phase === this.Phase.RoomMemberInfo) { + panel = <MemberInfo member={this.state.member} key={this.props.roomId || this.state.member.userId} />; + } else if (this.state.phase === this.Phase.GroupMemberInfo) { + panel = <GroupMemberInfo + groupMember={this.state.member} + groupId={this.props.groupId} + key={this.state.member.user_id} />; + } else if (this.state.phase === this.Phase.GroupRoomInfo) { + panel = <GroupRoomInfo + groupRoomId={this.state.groupRoomId} + groupId={this.props.groupId} + key={this.state.groupRoomId} />; + } else if (this.state.phase === this.Phase.NotificationPanel) { + panel = <NotificationPanel />; + } else if (this.state.phase === this.Phase.FilePanel) { + panel = <FilePanel roomId={this.props.roomId} />; + } + } + + if (!panel) { + panel = <div className="mx_RightPanel_blank" />; + } + + if (this.props.groupId && this.state.isUserPrivilegedInGroup) { + inviteGroup = isPhaseGroup ? ( + <AccessibleButton className="mx_RightPanel_invite" onClick={this.onInviteToGroupButtonClick}> + <div className="mx_RightPanel_icon" > + <TintableSvg src="img/icon-invite-people.svg" width="35" height="35" /> + </div> + <div className="mx_RightPanel_message">{ _t('Invite to this community') }</div> + </AccessibleButton> + ) : ( + <AccessibleButton className="mx_RightPanel_invite" onClick={this.onAddRoomToGroupButtonClick}> + <div className="mx_RightPanel_icon" > + <TintableSvg src="img/icons-room-add.svg" width="35" height="35" /> + </div> + <div className="mx_RightPanel_message">{ _t('Add rooms to this community') }</div> + </AccessibleButton> + ); + } + + const classes = classNames("mx_RightPanel", "mx_fadable", { + "collapsed": this.props.collapsed, + "mx_fadable_faded": this.props.disabled, + }); + + return ( + <aside className={classes}> + <div className="mx_RightPanel_header"> + <div className="mx_RightPanel_headerButtonGroup"> + { headerButtons } + </div> + </div> + { panel } + <div className="mx_RightPanel_footer"> + { inviteGroup } + </div> + </aside> + ); + }, +}); diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js new file mode 100644 index 0000000000..76360383d6 --- /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 = ( + <div className="mx_RoomDirectory_perm">{ _t('World readable') }</div> + ); + } + if (rooms[i].guest_can_join) { + guestJoin = ( + <div className="mx_RoomDirectory_perm">{ _t('Guests can join') }</div> + ); + } + + perms = null; + if (guestRead || guestJoin) { + perms = <div className="mx_RoomDirectory_perms">{guestRead}{guestJoin}</div>; + } + + var topic = rooms[i].topic || ''; + topic = linkifyString(sanitizeHtml(topic)); + + rows.push( + <tr key={ rooms[i].room_id } + onClick={self.onRoomClicked.bind(self, rooms[i])} + // cancel onMouseDown otherwise shift-clicking highlights text + onMouseDown={(ev) => {ev.preventDefault();}} + > + <td className="mx_RoomDirectory_roomAvatar"> + <BaseAvatar width={24} height={24} resizeMethod='crop' + name={ name } idName={ name } + url={ ContentRepo.getHttpUriForMxc( + MatrixClientPeg.get().getHomeserverUrl(), + rooms[i].avatar_url, 24, 24, "crop") } /> + </td> + <td className="mx_RoomDirectory_roomDescription"> + <div className="mx_RoomDirectory_name">{ name }</div> + { perms } + <div className="mx_RoomDirectory_topic" + onClick={ function(e) { e.stopPropagation() } } + dangerouslySetInnerHTML={{ __html: topic }}/> + <div className="mx_RoomDirectory_alias">{ get_display_alias_for_room(rooms[i]) }</div> + </td> + <td className="mx_RoomDirectory_roomMemberCount"> + { rooms[i].num_joined_members } + </td> + </tr> + ); + } + 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 ( + <div className="mx_RoomDirectory"> + <SimpleRoomHeader title={ _t('Directory') } /> + <Loader /> + </div> + ); + } + + let content; + if (this.state.loading) { + content = <div className="mx_RoomDirectory"> + <Loader /> + </div>; + } 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 = <i>{ _t('No rooms to show') }</i>; + } else { + scrollpanel_content = <table ref="directory_table" className="mx_RoomDirectory_table"> + <tbody> + { this.getRows() } + </tbody> + </table>; + } + const ScrollPanel = sdk.getComponent("structures.ScrollPanel"); + content = <ScrollPanel ref={this.collectScrollPanel} + className="mx_RoomDirectory_tableWrapper" + onFillRequest={ this.onFillRequest } + stickyBottom={false} + startAtBottom={false} + onResize={function(){}} + > + { scrollpanel_content } + </ScrollPanel>; + } + + const protocolName = protocolNameForInstanceId(this.protocols, this.state.instanceId); + let instance_expected_field_type; + if ( + protocolName && + this.protocols && + this.protocols[protocolName] && + this.protocols[protocolName].location_fields.length > 0 && + this.protocols[protocolName].field_types + ) { + const last_field = this.protocols[protocolName].location_fields.slice(-1)[0]; + instance_expected_field_type = this.protocols[protocolName].field_types[last_field]; + } + + + let placeholder = _t('Search for a room'); + if (!this.state.instanceId) { + placeholder = _t('#example') + ':' + this.state.roomServer; + } else if (instance_expected_field_type) { + placeholder = instance_expected_field_type.placeholder; + } + + let showJoinButton = this._stringLooksLikeId(this.state.filterString, instance_expected_field_type); + if (protocolName) { + const instance = instanceForInstanceId(this.protocols, this.state.instanceId); + if (this._getFieldsForThirdPartyLocation(this.state.filterString, this.protocols[protocolName], instance) === null) { + showJoinButton = false; + } + } + + const NetworkDropdown = sdk.getComponent('directory.NetworkDropdown'); + const DirectorySearchBox = sdk.getComponent('elements.DirectorySearchBox'); + return ( + <div className="mx_RoomDirectory"> + <SimpleRoomHeader title={ _t('Directory') } icon="img/icons-directory.svg" /> + <div className="mx_RoomDirectory_list"> + <div className="mx_RoomDirectory_listheader"> + <DirectorySearchBox + className="mx_RoomDirectory_searchbox" + onChange={this.onFilterChange} onClear={this.onFilterClear} onJoinClick={this.onJoinClick} + placeholder={placeholder} showJoinButton={showJoinButton} + /> + <NetworkDropdown config={this.props.config} protocols={this.protocols} onOptionChange={this.onOptionChange} /> + </div> + {content} + </div> + </div> + ); + } +}); + +// 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 0000000000..fb82ee067b --- /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 <DNDRoomTile /> when editable + const RoomTileComponent = this.props.editable ? DNDRoomTile : RoomTile; + return <RoomTileComponent + index={index} // For DND + room={room} + roomSubList={this} + tagName={this.props.tagName} + key={room.roomId} + collapsed={this.props.collapsed || false} + unread={Unread.doesRoomHaveUnreadMessages(room)} + highlight={room.getUnreadNotificationCount('highlight') > 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 = <div className={badgeClasses}>{ FormattingUtils.formatCount(subListNotifCount) }</div>; + } else if (this.props.isInvite) { + // no notifications but highlight anyway because this is an invite badge + badge = <div className={badgeClasses}>!</div>; + } + + // 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 = <IncomingCallBox className="mx_RoomSubList_incomingCall" incomingCall={ this.props.incomingCall }/>; + } + } + + var tabindex = this.props.searchFilter === "" ? "0" : "-1"; + + return ( + <div className="mx_RoomSubList_labelContainer" title={ title } ref="header"> + <AccessibleButton onClick={ this.onClick } className="mx_RoomSubList_label" tabIndex={tabindex}> + { this.props.collapsed ? '' : this.props.label } + <div className="mx_RoomSubList_roomCount">{ roomCount }</div> + <div className={chevronClasses}></div> + { badge } + { incomingCall } + </AccessibleButton> + </div> + ); + }, + + _createOverflowTile: function(overflowCount, totalCount) { + var content = <div className="mx_RoomSubList_chevronDown"></div>; + + var overflowNotifications = this.roomNotificationCount(TRUNCATE_AT); + var overflowNotifCount = overflowNotifications[0]; + var overflowNotifHighlight = overflowNotifications[1]; + if (overflowNotifCount && !this.props.collapsed) { + content = FormattingUtils.formatCount(overflowNotifCount); + } + + var badgeClasses = classNames({ + 'mx_RoomSubList_moreBadge': true, + 'mx_RoomSubList_moreBadgeNotify': overflowNotifCount && !this.props.collapsed, + 'mx_RoomSubList_moreBadgeHighlight': overflowNotifHighlight && !this.props.collapsed, + }); + + return ( + <AccessibleButton className="mx_RoomSubList_ellipsis" onClick={this._showFullMemberList}> + <div className="mx_RoomSubList_line"></div> + <div className="mx_RoomSubList_more">{ _t("more") }</div> + <div className={ badgeClasses }>{ content }</div> + </AccessibleButton> + ); + }, + + _showFullMemberList: function() { + this.setState({ + truncateAt: -1 + }); + + this.props.onShowMoreRooms(); + this.props.onHeaderClick(false); + }, + + render: function() { + var connectDropTarget = this.props.connectDropTarget; + var TruncatedList = sdk.getComponent('elements.TruncatedList'); + + var label = this.props.collapsed ? null : this.props.label; + + let content; + if (this.state.sortedList.length === 0 && !this.props.searchFilter && this.props.extraTiles.length === 0) { + content = this.props.emptyContent; + } else { + content = this.makeRoomTiles(); + content.push(...this.props.extraTiles); + } + + if (this.state.sortedList.length > 0 || this.props.extraTiles.length > 0 || this.props.editable) { + var subList; + var classes = "mx_RoomSubList"; + + if (!this.state.hidden) { + subList = <TruncatedList className={ classes } truncateAt={this.state.truncateAt} + createOverflowElement={this._createOverflowTile} > + { content } + </TruncatedList>; + } + else { + subList = <TruncatedList className={ classes }> + </TruncatedList>; + } + + const subListContent = <div> + { this._getHeaderJsx() } + { subList } + </div>; + + return this.props.editable ? + <Droppable + droppableId={"room-sub-list-droppable_" + this.props.tagName} + type="draggable-RoomTile" + > + { (provided, snapshot) => ( + <div ref={provided.innerRef}> + { subListContent } + </div> + ) } + </Droppable> : subListContent; + } + else { + var Loader = sdk.getComponent("elements.Spinner"); + return ( + <div className="mx_RoomSubList"> + { this.props.alwaysShowHeader ? this._getHeaderJsx() : undefined } + { (this.props.showSpinner && !this.state.hidden) ? <Loader /> : undefined } + </div> + ); + } + } +}); + +module.exports = RoomSubList; diff --git a/src/components/structures/SearchBox.js b/src/components/structures/SearchBox.js new file mode 100644 index 0000000000..459df3bd26 --- /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 = + <AccessibleButton className="mx_SearchBox_maximise" tabIndex={collapseTabIndex} onClick={ this.onToggleCollapse.bind(this, true) }> + <TintableSvg src="img/maximise.svg" width="10" height="16" alt={ _t("Expand panel") }/> + </AccessibleButton> + } + else { + toggleCollapse = + <AccessibleButton className="mx_SearchBox_minimise" tabIndex={collapseTabIndex} onClick={ this.onToggleCollapse.bind(this, false) }> + <TintableSvg src="img/minimise.svg" width="10" height="16" alt={ _t("Collapse panel") }/> + </AccessibleButton> + } + + var searchControls; + if (!this.props.collapsed) { + searchControls = [ + this.state.searchTerm.length > 0 ? + <AccessibleButton key="button" + className="mx_SearchBox_closeButton" + onClick={ ()=>{ this._clearSearch(); } }> + <TintableSvg + className="mx_SearchBox_searchButton" + src="img/icons-close.svg" width="24" height="24" + /> + </AccessibleButton> + : + <TintableSvg + key="button" + className="mx_SearchBox_searchButton" + src="img/icons-search-copy.svg" width="13" height="13" + />, + <input + key="searchfield" + type="text" + ref="search" + className="mx_SearchBox_search" + value={ this.state.searchTerm } + onChange={ this.onChange } + onKeyDown={ this._onKeyDown } + placeholder={ _t('Filter room names') } + /> + ]; + } + + var self = this; + return ( + <div className="mx_SearchBox"> + { searchControls } + { toggleCollapse } + </div> + ); + } +}); diff --git a/src/components/structures/ViewSource.js b/src/components/structures/ViewSource.js new file mode 100644 index 0000000000..3a5d35a561 --- /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 ( + <div className="mx_ViewSource"> + <SyntaxHighlight className="json"> + { JSON.stringify(this.props.content, null, 2) } + </SyntaxHighlight> + </div> + ); + } +}); diff --git a/src/components/views/context_menus/GenericElementContextMenu.js b/src/components/views/context_menus/GenericElementContextMenu.js new file mode 100644 index 0000000000..3f4804dbd1 --- /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 <div>{ this.props.element }</div>; + } +} diff --git a/src/components/views/context_menus/GenericTextContextMenu.js b/src/components/views/context_menus/GenericTextContextMenu.js new file mode 100644 index 0000000000..2319fe05a2 --- /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 <div>{ this.props.message }</div>; + } +} diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js new file mode 100644 index 0000000000..860d94ea0e --- /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 = ( + <div className="mx_MessageContextMenu_field" onClick={this.onResendClick}> + { _t('Resend') } + </div> + ); + } + + if (!eventStatus && this.state.canRedact) { + redactButton = ( + <div className="mx_MessageContextMenu_field" onClick={this.onRedactClick}> + { _t('Remove') } + </div> + ); + } + + if (eventStatus === "queued" || eventStatus === "not_sent") { + cancelButton = ( + <div className="mx_MessageContextMenu_field" onClick={this.onCancelSendClick}> + { _t('Cancel Sending') } + </div> + ); + } + + if (!eventStatus && this.props.mxEvent.getType() === 'm.room.message') { + const content = this.props.mxEvent.getContent(); + if (content.msgtype && content.msgtype !== 'm.bad.encrypted' && content.hasOwnProperty('body')) { + forwardButton = ( + <div className="mx_MessageContextMenu_field" onClick={this.onForwardClick}> + { _t('Forward Message') } + </div> + ); + + if (SettingsStore.isFeatureEnabled("feature_rich_quoting")) { + replyButton = ( + <div className="mx_MessageContextMenu_field" onClick={this.onReplyClick}> + { _t('Reply') } + </div> + ); + } + + if (this.state.canPin) { + pinButton = ( + <div className="mx_MessageContextMenu_field" onClick={this.onPinClick}> + { this._isPinned() ? _t('Unpin Message') : _t('Pin Message') } + </div> + ); + } + } + } + + const viewSourceButton = ( + <div className="mx_MessageContextMenu_field" onClick={this.onViewSourceClick}> + { _t('View Source') } + </div> + ); + + if (this.props.mxEvent.getType() !== this.props.mxEvent.getWireType()) { + viewClearSourceButton = ( + <div className="mx_MessageContextMenu_field" onClick={this.onViewClearSourceClick}> + { _t('View Decrypted Source') } + </div> + ); + } + + if (this.props.eventTileOps) { + if (this.props.eventTileOps.isWidgetHidden()) { + unhidePreviewButton = ( + <div className="mx_MessageContextMenu_field" onClick={this.onUnhidePreviewClick}> + { _t('Unhide Preview') } + </div> + ); + } + } + + // 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 = ( + <div className="mx_MessageContextMenu_field"> + <a href={makeEventPermalink(this.props.mxEvent.getRoomId(), this.props.mxEvent.getId())} + target="_blank" rel="noopener" onClick={this.closeMenu}>{ _t('Permalink') }</a> + </div> + ); + + if (this.props.eventTileOps && this.props.eventTileOps.getInnerText) { + quoteButton = ( + <div className="mx_MessageContextMenu_field" onClick={this.onQuoteClick}> + { _t('Quote') } + </div> + ); + } + + // 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 = ( + <div className="mx_MessageContextMenu_field"> + <a href={this.props.mxEvent.event.content.external_url} + rel="noopener" target="_blank" onClick={this.closeMenu}>{ _t('Source URL') }</a> + </div> + ); + } + + + return ( + <div> + { resendButton } + { redactButton } + { cancelButton } + { forwardButton } + { pinButton } + { viewSourceButton } + { viewClearSourceButton } + { unhidePreviewButton } + { permalinkButton } + { quoteButton } + { replyButton } + { externalURLButton } + </div> + ); + }, +}); diff --git a/src/components/views/context_menus/RoomTileContextMenu.js b/src/components/views/context_menus/RoomTileContextMenu.js new file mode 100644 index 0000000000..77f71fa8fa --- /dev/null +++ b/src/components/views/context_menus/RoomTileContextMenu.js @@ -0,0 +1,368 @@ +/* +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. +*/ + +'use strict'; + +import Promise from 'bluebird'; +import React from 'react'; +import classNames from 'classnames'; +import PropTypes from 'prop-types'; +import sdk from '../../../index'; +import { _t, _td } from '../../../languageHandler'; +import MatrixClientPeg from '../../../MatrixClientPeg'; +import dis from '../../../dispatcher'; +import DMRoomMap from '../../../utils/DMRoomMap'; +import * as Rooms from '../../../Rooms'; +import * as RoomNotifs from '../../../RoomNotifs'; +import Modal from '../../../Modal'; +import RoomListActions from '../../../actions/RoomListActions'; + +module.exports = React.createClass({ + displayName: 'RoomTileContextMenu', + + propTypes: { + room: PropTypes.object.isRequired, + /* callback called when the menu is dismissed */ + onFinished: PropTypes.func, + }, + + getInitialState() { + const dmRoomMap = new DMRoomMap(MatrixClientPeg.get()); + return { + roomNotifState: RoomNotifs.getRoomNotifsState(this.props.room.roomId), + isFavourite: this.props.room.tags.hasOwnProperty("m.favourite"), + isLowPriority: this.props.room.tags.hasOwnProperty("m.lowpriority"), + isDirectMessage: Boolean(dmRoomMap.getUserIdForRoomId(this.props.room.roomId)), + }; + }, + + componentWillMount: function() { + this._unmounted = false; + }, + + componentWillUnmount: function() { + this._unmounted = true; + }, + + _toggleTag: function(tagNameOn, tagNameOff) { + if (!MatrixClientPeg.get().isGuest()) { + Promise.delay(500).then(() => { + dis.dispatch(RoomListActions.tagRoom( + MatrixClientPeg.get(), + this.props.room, + tagNameOff, tagNameOn, + undefined, 0, + ), true); + + this.props.onFinished(); + }); + } + }, + + _onClickFavourite: function() { + // Tag room as 'Favourite' + if (!this.state.isFavourite && this.state.isLowPriority) { + this.setState({ + isFavourite: true, + isLowPriority: false, + }); + this._toggleTag("m.favourite", "m.lowpriority"); + } else if (this.state.isFavourite) { + this.setState({isFavourite: false}); + this._toggleTag(null, "m.favourite"); + } else if (!this.state.isFavourite) { + this.setState({isFavourite: true}); + this._toggleTag("m.favourite"); + } + }, + + _onClickLowPriority: function() { + // Tag room as 'Low Priority' + if (!this.state.isLowPriority && this.state.isFavourite) { + this.setState({ + isFavourite: false, + isLowPriority: true, + }); + this._toggleTag("m.lowpriority", "m.favourite"); + } else if (this.state.isLowPriority) { + this.setState({isLowPriority: false}); + this._toggleTag(null, "m.lowpriority"); + } else if (!this.state.isLowPriority) { + this.setState({isLowPriority: true}); + this._toggleTag("m.lowpriority"); + } + }, + + _onClickDM: function() { + if (MatrixClientPeg.get().isGuest()) return; + + const newIsDirectMessage = !this.state.isDirectMessage; + this.setState({ + isDirectMessage: newIsDirectMessage, + }); + + Rooms.guessAndSetDMRoom( + this.props.room, newIsDirectMessage, + ).delay(500).finally(() => { + // Close the context menu + if (this.props.onFinished) { + this.props.onFinished(); + } + }, (err) => { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Failed to set Direct Message status of room', '', ErrorDialog, { + title: _t('Failed to set Direct Message status of room'), + description: ((err && err.message) ? err.message : _t('Operation failed')), + }); + }); + }, + + _onClickLeave: function() { + // Leave room + dis.dispatch({ + action: 'leave_room', + room_id: this.props.room.roomId, + }); + + // Close the context menu + if (this.props.onFinished) { + this.props.onFinished(); + } + }, + + _onClickReject: function() { + dis.dispatch({ + action: 'reject_invite', + room_id: this.props.room.roomId, + }); + + // Close the context menu + if (this.props.onFinished) { + this.props.onFinished(); + } + }, + + _onClickForget: function() { + // FIXME: duplicated with RoomSettings (and dead code in RoomView) + MatrixClientPeg.get().forget(this.props.room.roomId).done(function() { + dis.dispatch({ action: 'view_next_room' }); + }, function(err) { + const errCode = err.errcode || _td("unknown error code"); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Failed to forget room', '', ErrorDialog, { + title: _t('Failed to forget room %(errCode)s', {errCode: errCode}), + description: ((err && err.message) ? err.message : _t('Operation failed')), + }); + }); + + // Close the context menu + if (this.props.onFinished) { + this.props.onFinished(); + } + }, + + _saveNotifState: function(newState) { + if (MatrixClientPeg.get().isGuest()) return; + + const oldState = this.state.roomNotifState; + const roomId = this.props.room.roomId; + + this.setState({ + roomNotifState: newState, + }); + RoomNotifs.setRoomNotifsState(roomId, newState).done(() => { + // delay slightly so that the user can see their state change + // before closing the menu + return Promise.delay(500).then(() => { + if (this._unmounted) return; + // Close the context menu + if (this.props.onFinished) { + this.props.onFinished(); + } + }); + }, (error) => { + // TODO: some form of error notification to the user + // to inform them that their state change failed. + // For now we at least set the state back + if (this._unmounted) return; + this.setState({ + roomNotifState: oldState, + }); + }); + }, + + _onClickAlertMe: function() { + this._saveNotifState(RoomNotifs.ALL_MESSAGES_LOUD); + }, + + _onClickAllNotifs: function() { + this._saveNotifState(RoomNotifs.ALL_MESSAGES); + }, + + _onClickMentions: function() { + this._saveNotifState(RoomNotifs.MENTIONS_ONLY); + }, + + _onClickMute: function() { + this._saveNotifState(RoomNotifs.MUTE); + }, + + _renderNotifMenu: function() { + const alertMeClasses = classNames({ + 'mx_RoomTileContextMenu_notif_field': true, + 'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.ALL_MESSAGES_LOUD, + }); + + const allNotifsClasses = classNames({ + 'mx_RoomTileContextMenu_notif_field': true, + 'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.ALL_MESSAGES, + }); + + const mentionsClasses = classNames({ + 'mx_RoomTileContextMenu_notif_field': true, + 'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.MENTIONS_ONLY, + }); + + const muteNotifsClasses = classNames({ + 'mx_RoomTileContextMenu_notif_field': true, + 'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.MUTE, + }); + + return ( + <div> + <div className="mx_RoomTileContextMenu_notif_picker" > + <img src="img/notif-slider.svg" width="20" height="107" /> + </div> + <div className={alertMeClasses} onClick={this._onClickAlertMe} > + <img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" /> + <img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute-off-copy.svg" width="16" height="12" /> + { _t('All messages (noisy)') } + </div> + <div className={allNotifsClasses} onClick={this._onClickAllNotifs} > + <img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" /> + <img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute-off.svg" width="16" height="12" /> + { _t('All messages') } + </div> + <div className={mentionsClasses} onClick={this._onClickMentions} > + <img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" /> + <img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute-mentions.svg" width="16" height="12" /> + { _t('Mentions only') } + </div> + <div className={muteNotifsClasses} onClick={this._onClickMute} > + <img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" /> + <img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute.svg" width="16" height="12" /> + { _t('Mute') } + </div> + </div> + ); + }, + + _renderLeaveMenu: function(membership) { + if (!membership) { + return null; + } + + let leaveClickHandler = null; + let leaveText = null; + + switch (membership) { + case "join": + leaveClickHandler = this._onClickLeave; + leaveText = _t('Leave'); + break; + case "leave": + case "ban": + leaveClickHandler = this._onClickForget; + leaveText = _t('Forget'); + break; + case "invite": + leaveClickHandler = this._onClickReject; + leaveText = _t('Reject'); + break; + } + + return ( + <div> + <div className="mx_RoomTileContextMenu_leave" onClick={leaveClickHandler} > + <img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_delete.svg" width="15" height="15" /> + { leaveText } + </div> + </div> + ); + }, + + _renderRoomTagMenu: function() { + const favouriteClasses = classNames({ + 'mx_RoomTileContextMenu_tag_field': true, + 'mx_RoomTileContextMenu_tag_fieldSet': this.state.isFavourite, + 'mx_RoomTileContextMenu_tag_fieldDisabled': false, + }); + + const lowPriorityClasses = classNames({ + 'mx_RoomTileContextMenu_tag_field': true, + 'mx_RoomTileContextMenu_tag_fieldSet': this.state.isLowPriority, + 'mx_RoomTileContextMenu_tag_fieldDisabled': false, + }); + + const dmClasses = classNames({ + 'mx_RoomTileContextMenu_tag_field': true, + 'mx_RoomTileContextMenu_tag_fieldSet': this.state.isDirectMessage, + 'mx_RoomTileContextMenu_tag_fieldDisabled': false, + }); + + return ( + <div> + <div className={favouriteClasses} onClick={this._onClickFavourite} > + <img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_fave.svg" width="15" height="15" /> + <img className="mx_RoomTileContextMenu_tag_icon_set" src="img/icon_context_fave_on.svg" width="15" height="15" /> + { _t('Favourite') } + </div> + <div className={lowPriorityClasses} onClick={this._onClickLowPriority} > + <img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_low.svg" width="15" height="15" /> + <img className="mx_RoomTileContextMenu_tag_icon_set" src="img/icon_context_low_on.svg" width="15" height="15" /> + { _t('Low Priority') } + </div> + <div className={dmClasses} onClick={this._onClickDM} > + <img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_person.svg" width="15" height="15" /> + <img className="mx_RoomTileContextMenu_tag_icon_set" src="img/icon_context_person_on.svg" width="15" height="15" /> + { _t('Direct Chat') } + </div> + </div> + ); + }, + + render: function() { + const myMember = this.props.room.getMember( + MatrixClientPeg.get().credentials.userId, + ); + + // Can't set notif level or tags on non-join rooms + if (myMember.membership !== 'join') { + return this._renderLeaveMenu(myMember.membership); + } + + return ( + <div> + { this._renderNotifMenu() } + <hr className="mx_RoomTileContextMenu_separator" /> + { this._renderLeaveMenu(myMember.membership) } + <hr className="mx_RoomTileContextMenu_separator" /> + { this._renderRoomTagMenu() } + </div> + ); + }, +}); diff --git a/src/components/views/context_menus/TagTileContextMenu.js b/src/components/views/context_menus/TagTileContextMenu.js new file mode 100644 index 0000000000..32f5365b82 --- /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 <div> + <div className="mx_TagTileContextMenu_item" onClick={this._onViewCommunityClick} > + <TintableSvg + className="mx_TagTileContextMenu_item_icon" + src="img/icons-groups.svg" + width="15" + height="15" + /> + { _t('View Community') } + </div> + <hr className="mx_TagTileContextMenu_separator" /> + <div className="mx_TagTileContextMenu_item" onClick={this._onRemoveClick} > + <img className="mx_TagTileContextMenu_item_icon" src="img/icon_context_delete.svg" width="15" height="15" /> + { _t('Remove') } + </div> + </div>; + } +} diff --git a/src/components/views/dialogs/BugReportDialog.js b/src/components/views/dialogs/BugReportDialog.js new file mode 100644 index 0000000000..2025b6fc81 --- /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 = <div className="error"> + {this.state.err} + </div>; + } + + let cancelButton = null; + if (!this.state.busy) { + cancelButton = <button onClick={this._onCancel}> + { _t("Cancel") } + </button>; + } + + let progress = null; + if (this.state.busy) { + progress = ( + <div className="progress"> + <Loader /> + {this.state.progress} ... + </div> + ); + } + + return ( + <div className="mx_BugReportDialog"> + <div className="mx_Dialog_title"> + { _t("Submit debug logs") } + </div> + <div className="mx_Dialog_content"> + <p> + { _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.", + ) } + </p> + <p> + { _t( + "<a>Click here</a> to create a GitHub issue.", + {}, + { + a: (sub) => <a + target="_blank" + href="https://github.com/vector-im/riot-web/issues/new" + > + { sub } + </a>, + }, + ) } + </p> + <div className="mx_BugReportDialog_field_container"> + <label + htmlFor="mx_BugReportDialog_issueUrl" + className="mx_BugReportDialog_field_label" + > + { _t("GitHub issue link:") } + </label> + <input + id="mx_BugReportDialog_issueUrl" + type="text" + className="mx_BugReportDialog_field_input" + onChange={this._onIssueUrlChange} + value={this.state.issueUrl} + placeholder="https://github.com/vector-im/riot-web/issues/1337" + /> + </div> + <div className="mx_BugReportDialog_field_container"> + <label + htmlFor="mx_BugReportDialog_notes_label" + className="mx_BugReportDialog_field_label" + > + { _t("Notes:") } + </label> + <textarea + className="mx_BugReportDialog_field_input" + rows={5} + onChange={this._onTextChange} + value={this.state.text} + /> + </div> + {progress} + {error} + </div> + <div className="mx_Dialog_buttons"> + <button + className="mx_Dialog_primary danger" + onClick={this._onSubmit} + autoFocus={true} + disabled={this.state.busy} + > + { _t("Send logs") } + </button> + + {cancelButton} + </div> + </div> + ); + } +} + +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 0000000000..e71fcdb624 --- /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<REPOS.length; i++) { + const oldVersion = version2[2*i]; + const newVersion = version[2*i]; + request(`https://api.github.com/repos/${REPOS[i]}/compare/${oldVersion}...${newVersion}`, (a, b, body) => { + if(body == null) return; + this.setState({[REPOS[i]]: JSON.parse(body).commits}); + }); + } + } + + _elementsForCommit(commit) { + return ( + <li key={commit.sha} className="mx_ChangelogDialog_li"> + <a href={commit.html_url} target="_blank" rel="noopener"> + {commit.commit.message} + </a> + </li> + ); + } + + render() { + const Spinner = sdk.getComponent('views.elements.Spinner'); + const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); + + const logs = REPOS.map(repo => { + if (this.state[repo] == null) return <Spinner key={repo} />; + return ( + <div key={repo}> + <h2>{repo}</h2> + <ul> + {this.state[repo].map(this._elementsForCommit)} + </ul> + </div> + ) + }); + + const content = ( + <div className="mx_ChangelogDialog_content"> + {this.props.version == null || this.props.newVersion == null ? <h2>{_t("Unavailable")}</h2> : logs} + </div> + ); + + + return ( + <QuestionDialog + title={_t("Changelog")} + description={content} + button={_t("Update")} + onFinished={this.props.onFinished} + /> + ) + } +} + +ChangelogDialog.propTypes = { + version: React.PropTypes.string.isRequired, + newVersion: React.PropTypes.string.isRequired, + onFinished: React.PropTypes.func.isRequired, +}; diff --git a/src/components/views/dialogs/DevtoolsDialog.js b/src/components/views/dialogs/DevtoolsDialog.js new file mode 100644 index 0000000000..1d3c8ecc09 --- /dev/null +++ b/src/components/views/dialogs/DevtoolsDialog.js @@ -0,0 +1,623 @@ +/* +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 sdk from '../../../index'; +import SyntaxHighlight from '../elements/SyntaxHighlight'; +import { _t } from '../../../languageHandler'; +import MatrixClientPeg from '../../../MatrixClientPeg'; + +class DevtoolsComponent extends React.Component { + static contextTypes = { + roomId: PropTypes.string.isRequired, + }; +} + +class GenericEditor extends DevtoolsComponent { + // static propTypes = {onBack: PropTypes.func.isRequired}; + + constructor(props, context) { + super(props, context); + this._onChange = this._onChange.bind(this); + this.onBack = this.onBack.bind(this); + } + + onBack() { + if (this.state.message) { + this.setState({ message: null }); + } else { + this.props.onBack(); + } + } + + _onChange(e) { + this.setState({[e.target.id]: e.target.type === 'checkbox' ? e.target.checked : e.target.value}); + } + + _buttons() { + return <div className="mx_Dialog_buttons"> + <button onClick={this.onBack}>{ _t('Back') }</button> + { !this.state.message && <button onClick={this._send}>{ _t('Send') }</button> } + </div>; + } + + textInput(id, label) { + return <div className="mx_DevTools_inputRow"> + <div className="mx_DevTools_inputLabelCell"> + <label htmlFor={id}>{ label }</label> + </div> + <div className="mx_DevTools_inputCell"> + <input id={id} className="mx_TextInputDialog_input" onChange={this._onChange} value={this.state[id]} size="32" /> + </div> + </div>; + } +} + +class SendCustomEvent extends GenericEditor { + static getLabel() { return _t('Send Custom Event'); } + + static propTypes = { + onBack: PropTypes.func.isRequired, + forceStateEvent: PropTypes.bool, + inputs: PropTypes.object, + }; + + constructor(props, context) { + super(props, context); + this._send = this._send.bind(this); + + const {eventType, stateKey, evContent} = Object.assign({ + eventType: '', + stateKey: '', + evContent: '{\n\n}', + }, this.props.inputs); + + this.state = { + isStateEvent: Boolean(this.props.forceStateEvent), + + eventType, + stateKey, + evContent, + }; + } + + send(content) { + const cli = MatrixClientPeg.get(); + if (this.state.isStateEvent) { + return cli.sendStateEvent(this.context.roomId, this.state.eventType, content, this.state.stateKey); + } else { + return cli.sendEvent(this.context.roomId, this.state.eventType, content); + } + } + + async _send() { + if (this.state.eventType === '') { + this.setState({ message: _t('You must specify an event type!') }); + return; + } + + let message; + try { + const content = JSON.parse(this.state.evContent); + await this.send(content); + message = _t('Event sent!'); + } catch (e) { + message = _t('Failed to send custom event.') + ' (' + e.toString() + ')'; + } + this.setState({ message }); + } + + render() { + if (this.state.message) { + return <div> + <div className="mx_Dialog_content"> + { this.state.message } + </div> + { this._buttons() } + </div>; + } + + return <div> + <div className="mx_Dialog_content"> + { this.textInput('eventType', _t('Event Type')) } + { this.state.isStateEvent && this.textInput('stateKey', _t('State Key')) } + + <br /> + + <div className="mx_UserSettings_profileLabelCell"> + <label htmlFor="evContent"> { _t('Event Content') } </label> + </div> + <div> + <textarea id="evContent" onChange={this._onChange} value={this.state.evContent} className="mx_TextInputDialog_input" cols="63" rows="5" /> + </div> + </div> + <div className="mx_Dialog_buttons"> + <button onClick={this.onBack}>{ _t('Back') }</button> + { !this.state.message && <button onClick={this._send}>{ _t('Send') }</button> } + { !this.state.message && !this.props.forceStateEvent && <div style={{float: "right"}}> + <input id="isStateEvent" className="mx_DevTools_tgl mx_DevTools_tgl-flip" type="checkbox" onChange={this._onChange} checked={this.state.isStateEvent} /> + <label className="mx_DevTools_tgl-btn" data-tg-off="Event" data-tg-on="State Event" htmlFor="isStateEvent" /> + </div> } + </div> + </div>; + } +} + +class SendAccountData extends GenericEditor { + static getLabel() { return _t('Send Account Data'); } + + static propTypes = { + isRoomAccountData: PropTypes.bool, + forceMode: PropTypes.bool, + inputs: PropTypes.object, + }; + + constructor(props, context) { + super(props, context); + this._send = this._send.bind(this); + + const {eventType, evContent} = Object.assign({ + eventType: '', + evContent: '{\n\n}', + }, this.props.inputs); + + this.state = { + isRoomAccountData: Boolean(this.props.isRoomAccountData), + + eventType, + evContent, + }; + } + + send(content) { + const cli = MatrixClientPeg.get(); + if (this.state.isRoomAccountData) { + return cli.setRoomAccountData(this.context.roomId, this.state.eventType, content); + } + return cli.setAccountData(this.state.eventType, content); + } + + async _send() { + if (this.state.eventType === '') { + this.setState({ message: _t('You must specify an event type!') }); + return; + } + + let message; + try { + const content = JSON.parse(this.state.evContent); + await this.send(content); + message = _t('Event sent!'); + } catch (e) { + message = _t('Failed to send custom event.') + ' (' + e.toString() + ')'; + } + this.setState({ message }); + } + + render() { + if (this.state.message) { + return <div> + <div className="mx_Dialog_content"> + { this.state.message } + </div> + { this._buttons() } + </div>; + } + + return <div> + <div className="mx_Dialog_content"> + { this.textInput('eventType', _t('Event Type')) } + <br /> + + <div className="mx_UserSettings_profileLabelCell"> + <label htmlFor="evContent"> { _t('Event Content') } </label> + </div> + <div> + <textarea id="evContent" onChange={this._onChange} value={this.state.evContent} className="mx_TextInputDialog_input" cols="63" rows="5" /> + </div> + </div> + <div className="mx_Dialog_buttons"> + <button onClick={this.onBack}>{ _t('Back') }</button> + { !this.state.message && <button onClick={this._send}>{ _t('Send') }</button> } + { !this.state.message && <div style={{float: "right"}}> + <input id="isRoomAccountData" className="mx_DevTools_tgl mx_DevTools_tgl-flip" type="checkbox" onChange={this._onChange} checked={this.state.isRoomAccountData} disabled={this.props.forceMode} /> + <label className="mx_DevTools_tgl-btn" data-tg-off="Account Data" data-tg-on="Room Data" htmlFor="isRoomAccountData" /> + </div> } + </div> + </div>; + } +} + +class FilteredList extends React.Component { + static propTypes = { + children: PropTypes.any, + query: PropTypes.string, + onChange: PropTypes.func, + }; + + constructor(props, context) { + super(props, context); + this.onQuery = this.onQuery.bind(this); + } + + onQuery(ev) { + if (this.props.onChange) this.props.onChange(ev.target.value); + } + + filterChildren() { + if (this.props.query) { + const lowerQuery = this.props.query.toLowerCase(); + return this.props.children.filter((child) => child.key.toLowerCase().includes(lowerQuery)); + } + return this.props.children; + } + + render() { + return <div> + <input size="64" + onChange={this.onQuery} + value={this.props.query} + placeholder={_t('Filter results')} + className="mx_TextInputDialog_input mx_DevTools_RoomStateExplorer_query" /> + { this.filterChildren() } + </div>; + } +} + +class RoomStateExplorer extends DevtoolsComponent { + static getLabel() { return _t('Explore Room State'); } + + + static propTypes = { + onBack: PropTypes.func.isRequired, + }; + + constructor(props, context) { + super(props, context); + + const room = MatrixClientPeg.get().getRoom(this.context.roomId); + this.roomStateEvents = room.currentState.events; + + this.onBack = this.onBack.bind(this); + this.editEv = this.editEv.bind(this); + this.onQueryEventType = this.onQueryEventType.bind(this); + this.onQueryStateKey = this.onQueryStateKey.bind(this); + + this.state = { + eventType: null, + event: null, + editing: false, + + queryEventType: '', + queryStateKey: '', + }; + } + + browseEventType(eventType) { + return () => { + this.setState({ eventType }); + }; + } + + onViewSourceClick(event) { + return () => { + this.setState({ event }); + }; + } + + onBack() { + if (this.state.editing) { + this.setState({ editing: false }); + } else if (this.state.event) { + this.setState({ event: null }); + } else if (this.state.eventType) { + this.setState({ eventType: null }); + } else { + this.props.onBack(); + } + } + + editEv() { + this.setState({ editing: true }); + } + + onQueryEventType(filterEventType) { + this.setState({ queryEventType: filterEventType }); + } + + onQueryStateKey(filterStateKey) { + this.setState({ queryStateKey: filterStateKey }); + } + + render() { + if (this.state.event) { + if (this.state.editing) { + return <SendCustomEvent forceStateEvent={true} onBack={this.onBack} inputs={{ + eventType: this.state.event.getType(), + evContent: JSON.stringify(this.state.event.getContent(), null, '\t'), + stateKey: this.state.event.getStateKey(), + }} />; + } + + return <div className="mx_ViewSource"> + <div className="mx_Dialog_content"> + <SyntaxHighlight className="json"> + { JSON.stringify(this.state.event.event, null, 2) } + </SyntaxHighlight> + </div> + <div className="mx_Dialog_buttons"> + <button onClick={this.onBack}>{ _t('Back') }</button> + <button onClick={this.editEv}>{ _t('Edit') }</button> + </div> + </div>; + } + + let list = null; + + const classes = 'mx_DevTools_RoomStateExplorer_button'; + if (this.state.eventType === null) { + list = <FilteredList query={this.state.queryEventType} onChange={this.onQueryEventType}> + { + Object.keys(this.roomStateEvents).map((evType) => { + const stateGroup = this.roomStateEvents[evType]; + const stateKeys = Object.keys(stateGroup); + + let onClickFn; + if (stateKeys.length > 1) { + onClickFn = this.browseEventType(evType); + } else if (stateKeys.length === 1) { + onClickFn = this.onViewSourceClick(stateGroup[stateKeys[0]]); + } + + return <button className={classes} key={evType} onClick={onClickFn}> + { evType } + </button>; + }) + } + </FilteredList>; + } else { + const stateGroup = this.roomStateEvents[this.state.eventType]; + + list = <FilteredList query={this.state.queryStateKey} onChange={this.onQueryStateKey}> + { + Object.keys(stateGroup).map((stateKey) => { + const ev = stateGroup[stateKey]; + return <button className={classes} key={stateKey} onClick={this.onViewSourceClick(ev)}> + { stateKey } + </button>; + }) + } + </FilteredList>; + } + + return <div> + <div className="mx_Dialog_content"> + { list } + </div> + <div className="mx_Dialog_buttons"> + <button onClick={this.onBack}>{ _t('Back') }</button> + </div> + </div>; + } +} + +class AccountDataExplorer extends DevtoolsComponent { + static getLabel() { return _t('Explore Account Data'); } + + static propTypes = { + onBack: PropTypes.func.isRequired, + }; + + constructor(props, context) { + super(props, context); + + this.onBack = this.onBack.bind(this); + this.editEv = this.editEv.bind(this); + this._onChange = this._onChange.bind(this); + this.onQueryEventType = this.onQueryEventType.bind(this); + + this.state = { + isRoomAccountData: false, + event: null, + editing: false, + + queryEventType: '', + }; + } + + getData() { + const cli = MatrixClientPeg.get(); + if (this.state.isRoomAccountData) { + return cli.getRoom(this.context.roomId).accountData; + } + return cli.store.accountData; + } + + onViewSourceClick(event) { + return () => { + this.setState({ event }); + }; + } + + onBack() { + if (this.state.editing) { + this.setState({ editing: false }); + } else if (this.state.event) { + this.setState({ event: null }); + } else { + this.props.onBack(); + } + } + + _onChange(e) { + this.setState({[e.target.id]: e.target.type === 'checkbox' ? e.target.checked : e.target.value}); + } + + editEv() { + this.setState({ editing: true }); + } + + onQueryEventType(queryEventType) { + this.setState({ queryEventType }); + } + + render() { + if (this.state.event) { + if (this.state.editing) { + return <SendAccountData isRoomAccountData={this.state.isRoomAccountData} onBack={this.onBack} inputs={{ + eventType: this.state.event.getType(), + evContent: JSON.stringify(this.state.event.getContent(), null, '\t'), + }} forceMode={true} />; + } + + return <div className="mx_ViewSource"> + <div className="mx_Dialog_content"> + <SyntaxHighlight className="json"> + { JSON.stringify(this.state.event.event, null, 2) } + </SyntaxHighlight> + </div> + <div className="mx_Dialog_buttons"> + <button onClick={this.onBack}>{ _t('Back') }</button> + <button onClick={this.editEv}>{ _t('Edit') }</button> + </div> + </div>; + } + + const rows = []; + + const classes = 'mx_DevTools_RoomStateExplorer_button'; + + const data = this.getData(); + Object.keys(data).forEach((evType) => { + const ev = data[evType]; + rows.push(<button className={classes} key={evType} onClick={this.onViewSourceClick(ev)}> + { evType } + </button>); + }); + + return <div> + <div className="mx_Dialog_content"> + <FilteredList query={this.state.queryEventType} onChange={this.onQueryEventType}> + { rows } + </FilteredList> + </div> + <div className="mx_Dialog_buttons"> + <button onClick={this.onBack}>{ _t('Back') }</button> + { !this.state.message && <div style={{float: "right"}}> + <input id="isRoomAccountData" className="mx_DevTools_tgl mx_DevTools_tgl-flip" type="checkbox" onChange={this._onChange} checked={this.state.isRoomAccountData} /> + <label className="mx_DevTools_tgl-btn" data-tg-off="Account Data" data-tg-on="Room Data" htmlFor="isRoomAccountData" /> + </div> } + </div> + </div>; + } +} + +const Entries = [ + SendCustomEvent, + RoomStateExplorer, + SendAccountData, + AccountDataExplorer, +]; + +export default class DevtoolsDialog extends React.Component { + static childContextTypes = { + roomId: PropTypes.string.isRequired, + // client: PropTypes.instanceOf(MatixClient), + }; + + static propTypes = { + roomId: PropTypes.string.isRequired, + onFinished: PropTypes.func.isRequired, + }; + + constructor(props, context) { + super(props, context); + this.onBack = this.onBack.bind(this); + this.onCancel = this.onCancel.bind(this); + + this.state = { + mode: null, + }; + } + + componentWillUnmount() { + this._unmounted = true; + } + + getChildContext() { + return { roomId: this.props.roomId }; + } + + _setMode(mode) { + return () => { + this.setState({ mode }); + }; + } + + onBack() { + if (this.prevMode) { + this.setState({ mode: this.prevMode }); + this.prevMode = null; + } else { + this.setState({ mode: null }); + } + } + + onCancel() { + this.props.onFinished(false); + } + + render() { + let body; + + if (this.state.mode) { + body = <div> + <div className="mx_DevTools_label_left">{ this.state.mode.getLabel() }</div> + <div className="mx_DevTools_label_right">Room ID: { this.props.roomId }</div> + <div className="mx_DevTools_label_bottom" /> + <this.state.mode onBack={this.onBack} /> + </div>; + } else { + const classes = "mx_DevTools_RoomStateExplorer_button"; + body = <div> + <div> + <div className="mx_DevTools_label_left">{ _t('Toolbox') }</div> + <div className="mx_DevTools_label_right">Room ID: { this.props.roomId }</div> + <div className="mx_DevTools_label_bottom" /> + + <div className="mx_Dialog_content"> + { Entries.map((Entry) => { + const label = Entry.getLabel(); + const onClick = this._setMode(Entry); + return <button className={classes} key={label} onClick={onClick}>{ label }</button>; + }) } + </div> + </div> + <div className="mx_Dialog_buttons"> + <button onClick={this.onCancel}>{ _t('Cancel') }</button> + </div> + </div>; + } + + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + return ( + <BaseDialog className="mx_QuestionDialog" onFinished={this.props.onFinished} title={_t('Developer Tools')}> + { body } + </BaseDialog> + ); + } +} diff --git a/src/components/views/dialogs/SetPasswordDialog.js b/src/components/views/dialogs/SetPasswordDialog.js new file mode 100644 index 0000000000..31c4ad7a3f --- /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 <BaseDialog className="mx_SetPasswordDialog" + onFinished={props.onFinished} + title={ title } + > + <div className="mx_Dialog_content"> + <p> + { advice } + </p> + <p> + { extraAdvice } + </p> + </div> + <div className="mx_Dialog_buttons"> + <button + className="mx_Dialog_primary" + autoFocus={true} + onClick={props.onFinished}> + { _t('Continue') } + </button> + </div> + </BaseDialog>; +}; + +/** + * Prompt the user to set a password + * + * On success, `onFinished()` when finished + */ +export default React.createClass({ + displayName: 'SetPasswordDialog', + propTypes: { + onFinished: React.PropTypes.func.isRequired, + }, + + getInitialState: function() { + return { + error: null, + }; + }, + + componentWillMount: function() { + console.info('SetPasswordDialog component will mount'); + }, + + _onPasswordChanged: function(res) { + Modal.createDialog(WarmFuzzy, { + didSetEmail: res.didSetEmail, + onFinished: () => { + this._onContinueClicked(); + }, + }); + }, + + _onContinueClicked: function() { + this.props.onFinished(true); + }, + + _onPasswordChangeError: function(err) { + let errMsg = err.error || ""; + if (err.httpStatus === 403) { + errMsg = _t('Failed to change password. Is your password correct?'); + } else if (err.httpStatus) { + errMsg += ' ' + _t( + '(HTTP status %(httpStatus)s)', + { httpStatus: err.httpStatus }, + ); + } + this.setState({ + error: errMsg, + }); + }, + + render: function() { + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + const ChangePassword = sdk.getComponent('views.settings.ChangePassword'); + + return ( + <BaseDialog className="mx_SetPasswordDialog" + onFinished={this.props.onFinished} + title={ _t('Please set a password!') } + > + <div className="mx_Dialog_content"> + <p> + { _t('This will allow you to return to your account after signing out, and sign in on other devices.') } + </p> + <ChangePassword + className="mx_SetPasswordDialog_change_password" + rowClassName="" + rowLabelClassName="" + rowInputClassName="" + buttonClassName="mx_Dialog_primary mx_SetPasswordDialog_change_password_button" + confirm={false} + autoFocusNewPasswordInput={true} + shouldAskForEmail={true} + onError={this._onPasswordChangeError} + onFinished={this._onPasswordChanged} /> + <div className="error"> + { this.state.error } + </div> + </div> + </BaseDialog> + ); + }, +}); diff --git a/src/components/views/directory/NetworkDropdown.js b/src/components/views/directory/NetworkDropdown.js new file mode 100644 index 0000000000..b45bd286f2 --- /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 = <img src="img/network-matrix.svg" />; + 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 = <img src={imgUrl} />; + name = instance.desc; + span_class = 'mx_NetworkDropdown_menu_network'; + } + + const click_handler = handleClicks ? this.onMenuOptionClick.bind(this, server, instance, includeAll) : null; + + return <div key={key} className="mx_NetworkDropdown_networkoption" onClick={click_handler}> + {icon} + <span className="mx_NetworkDropdown_menu_network">{name}</span> + </div> + } + + render() { + let current_value; + + let menu; + if (this.state.expanded) { + const menu_options = this._getMenuOptions(); + menu = <div className="mx_NetworkDropdown_menu"> + {menu_options} + </div>; + current_value = <input type="text" className="mx_NetworkDropdown_networkoption" + ref={this.collectInputTextBox} onKeyUp={this.onInputKeyUp} + placeholder="matrix.org" // 'matrix.org' as an example of an HS name + /> + } else { + const instance = instanceForInstanceId(this.props.protocols, this.state.selectedInstanceId); + current_value = this._makeMenuOption( + this.state.selectedServer, instance, this.state.includeAll, false + ); + } + + return <div className="mx_NetworkDropdown" ref={this.collectRoot}> + <div className="mx_NetworkDropdown_input" onClick={this.onInputClick}> + {current_value} + <span className="mx_NetworkDropdown_arrow"></span> + {menu} + </div> + </div>; + } +} + +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 0000000000..f3ad5a9696 --- /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 = <a href={ this.props.link } target="_blank" rel="noopener">{ name }</a>; + } + 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 = (<div className="mx_ImageView_metadata"> + { _t('Uploaded on %(date)s by %(user)s', {date: formatDate(new Date(this.props.mxEvent.getTs())), user: sender}) } + </div>); + } + + var eventRedact; + if(showEventMeta) { + eventRedact = (<div className="mx_ImageView_button" onClick={this.onRedactClick}> + { _t('Remove') } + </div>); + } + + return ( + <div className="mx_ImageView"> + <div className="mx_ImageView_lhs"> + </div> + <div className="mx_ImageView_content"> + <img src={this.props.src} style={style}/> + <div className="mx_ImageView_labelWrapper"> + <div className="mx_ImageView_label"> + <AccessibleButton className="mx_ImageView_cancel" onClick={ this.props.onFinished }><img src="img/cancel-white.svg" width="18" height="18" alt={ _t('Close') }/></AccessibleButton> + <div className="mx_ImageView_shim"> + </div> + <div className="mx_ImageView_name"> + { this.getName() } + </div> + { eventMeta } + <a className="mx_ImageView_link" href={ this.props.src } download={ this.props.name } target="_blank" rel="noopener"> + <div className="mx_ImageView_download"> + { _t('Download this file') }<br/> + <span className="mx_ImageView_size">{ size_res }</span> + </div> + </a> + { eventRedact } + <div className="mx_ImageView_shim"> + </div> + </div> + </div> + </div> + <div className="mx_ImageView_rhs"> + </div> + </div> + ); + } +}); diff --git a/src/components/views/elements/InlineSpinner.js b/src/components/views/elements/InlineSpinner.js new file mode 100644 index 0000000000..adb916fcf0 --- /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 ( + <div className="mx_InlineSpinner"> + <img src="img/spinner.gif" width={w} height={h} className={imgClass}/> + </div> + ); + } +}); diff --git a/src/components/views/elements/Spinner.js b/src/components/views/elements/Spinner.js new file mode 100644 index 0000000000..2b620f12c5 --- /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 ( + <div className="mx_Spinner"> + <img src="img/spinner.gif" width={w} height={h} className={imgClass}/> + </div> + ); + } +}); diff --git a/src/components/views/elements/SyntaxHighlight.js b/src/components/views/elements/SyntaxHighlight.js new file mode 100644 index 0000000000..82b5ae572c --- /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 <pre className={`${className} mx_SyntaxHighlight`} ref={this._ref}> + <code>{ children }</code> + </pre>; + } +} diff --git a/src/components/views/globals/MatrixToolbar.js b/src/components/views/globals/MatrixToolbar.js new file mode 100644 index 0000000000..f85a30bcdf --- /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 ( + <div className="mx_MatrixToolbar"> + <img className="mx_MatrixToolbar_warning" src="img/warning.svg" width="24" height="23" alt="Warning"/> + <div className="mx_MatrixToolbar_content"> + { _t('You are not receiving desktop notifications') } <a className="mx_MatrixToolbar_link" onClick={ this.onClick }> { _t('Enable them now') }</a> + </div> + <AccessibleButton className="mx_MatrixToolbar_close" onClick={ this.hideToolbar } ><img src="img/cancel.svg" width="18" height="18" /></AccessibleButton> + </div> + ); + }, +}); diff --git a/src/components/views/globals/NewVersionBar.js b/src/components/views/globals/NewVersionBar.js new file mode 100644 index 0000000000..527df5f864 --- /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: <div className="mx_MatrixToolbar_changelog">{releaseNotes}</div>, + 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 = ( + <button className="mx_MatrixToolbar_action" onClick={this.displayReleaseNotes}> + { _t("What's new?") } + </button> + ); + } else if (checkVersion(this.props.version) && checkVersion(this.props.newVersion)) { + action_button = ( + <button className="mx_MatrixToolbar_action" onClick={this.displayChangelog}> + { _t("What's new?") } + </button> + ); + } else if (PlatformPeg.get()) { + action_button = ( + <button className="mx_MatrixToolbar_action" onClick={this.onUpdateClicked}> + { _t("Update") } + </button> + ); + } + return ( + <div className="mx_MatrixToolbar"> + <img className="mx_MatrixToolbar_warning" src="img/warning.svg" width="24" height="23" alt="Warning"/> + <div className="mx_MatrixToolbar_content"> + {_t("A new version of Riot is available.")} + </div> + {action_button} + </div> + ); + } +}); diff --git a/src/components/views/globals/PasswordNagBar.js b/src/components/views/globals/PasswordNagBar.js new file mode 100644 index 0000000000..93f4fe06e5 --- /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 ( + <div className={toolbarClasses} onClick={this.onUpdateClicked}> + <img className="mx_MatrixToolbar_warning" + src="img/warning.svg" + width="24" + height="23" + alt="Warning" + /> + <div className="mx_MatrixToolbar_content"> + { _t( + "To return to your account in future you need to <u>set a password</u>", + {}, + { 'u': (sub) => <u>{ sub }</u> }, + ) } + </div> + <button className="mx_MatrixToolbar_action"> + { _t("Set Password") } + </button> + </div> + ); + }, +}); diff --git a/src/components/views/globals/UpdateCheckBar.js b/src/components/views/globals/UpdateCheckBar.js new file mode 100644 index 0000000000..53801311d8 --- /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 <div></div>; + } + + const updateCheckStatusEnum = PlatformPeg.get().getUpdateCheckStatusEnum(); + const doneStatuses = [ + updateCheckStatusEnum.ERROR, + updateCheckStatusEnum.NOTAVAILABLE, + ]; + + let image; + if (doneStatuses.includes(this.props.status)) { + image = <img className="mx_MatrixToolbar_warning" src="img/warning.svg" width="24" height="23" alt={warning}/>; + } else { + image = <img className="mx_MatrixToolbar_warning" src="img/spinner.gif" width="24" height="23" alt={message}/>; + } + + return ( + <div className="mx_MatrixToolbar"> + {image} + <div className="mx_MatrixToolbar_content"> + {message} + </div> + <AccessibleButton className="mx_MatrixToolbar_close" onClick={this.hideToolbar}> + <img src="img/cancel.svg" width="18" height="18" /> + </AccessibleButton> + </div> + ); + } +}); diff --git a/src/components/views/login/CountryDropdown.js b/src/components/views/login/CountryDropdown.js index 3fd28e32d2..8c4467bb99 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 <img src={`flags/${iso2}.png`} />; + return <img src={`img/flags/${iso2}.png`} />; } _getShortOption(iso2) { diff --git a/src/components/views/messages/DateSeparator.js b/src/components/views/messages/DateSeparator.js new file mode 100644 index 0000000000..a0ea704502 --- /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 <h2 className="mx_DateSeparator">{ this.getLabel() }</h2>; + } +} diff --git a/src/components/views/messages/MessageTimestamp.js b/src/components/views/messages/MessageTimestamp.js new file mode 100644 index 0000000000..0bbb3f631e --- /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 ( + <span className="mx_MessageTimestamp" title={formatFullDate(date, this.props.showTwelveHour)}> + { formatTime(date, this.props.showTwelveHour) } + </span> + ); + } +} diff --git a/src/components/views/rooms/DNDRoomTile.js b/src/components/views/rooms/DNDRoomTile.js new file mode 100644 index 0000000000..69c2f979ed --- /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 <div> + <Draggable + key={props.room.roomId} + draggableId={props.tagName + '_' + props.room.roomId} + index={props.index} + type="draggable-RoomTile" + > + { (provided, snapshot) => { + return ( + <div> + <div + ref={provided.innerRef} + {...provided.draggableProps} + {...provided.dragHandleProps} + > + <div className={this.getClassName(snapshot.isDragging)}> + <RoomTile {...props} /> + </div> + </div> + { provided.placeholder } + </div> + ); + } } + </Draggable> + </div>; + } +} diff --git a/src/components/views/rooms/RoomDropTarget.js b/src/components/views/rooms/RoomDropTarget.js new file mode 100644 index 0000000000..3cb10630fa --- /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 ( + <div className="mx_RoomDropTarget_container"> + <div className="mx_RoomDropTarget"> + <div className="mx_RoomDropTarget_label"> + { this.props.label } + </div> + </div> + </div> + ); + } +}); diff --git a/src/components/views/rooms/RoomTooltip.js b/src/components/views/rooms/RoomTooltip.js new file mode 100644 index 0000000000..b17f54ef3c --- /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 = ( + <div className={tooltipClasses} style={style} > + <div className="mx_RoomTooltip_chevron"></div> + { label } + </div> + ); + + // 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 ( + <div className={this.props.className} > + </div> + ); + }, +}); diff --git a/src/components/views/rooms/SearchBar.js b/src/components/views/rooms/SearchBar.js new file mode 100644 index 0000000000..a196c5b78d --- /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 ( + <div className="mx_SearchBar"> + <input ref="search_term" className="mx_SearchBar_input" type="text" autoFocus={true} placeholder={_t("Search…")} onKeyDown={this.onSearchChange}/> + <AccessibleButton className={ searchButtonClasses } onClick={this.onSearch}><img src="img/search-button.svg" width="37" height="37" alt={_t("Search")}/></AccessibleButton> + <AccessibleButton className={ thisRoomClasses } onClick={this.onThisRoomClick}>{_t("This Room")}</AccessibleButton> + <AccessibleButton className={ allRoomsClasses } onClick={this.onAllRoomsClick}>{_t("All Rooms")}</AccessibleButton> + <AccessibleButton className="mx_SearchBar_cancel" onClick={this.props.onCancelClick}><img src="img/cancel.svg" width="18" height="18" /></AccessibleButton> + </div> + ); + } +}); diff --git a/src/components/views/settings/IntegrationsManager.js b/src/components/views/settings/IntegrationsManager.js new file mode 100644 index 0000000000..29ae4af93d --- /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 ( + <iframe src={ this.props.src }></iframe> + ); + } +}); diff --git a/src/components/views/settings/Notifications.js b/src/components/views/settings/Notifications.js new file mode 100644 index 0000000000..39774778e1 --- /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" : ( + <span> + { _t('Messages containing <span>keywords</span>', + {}, + { 'span': (sub) => + <span className="mx_UserNotifSettings_keywords" onClick={ self.onKeywordsClicked }>{sub}</span> + }, + )} + </span> + ), + "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 ( + <tr key={ className }> + <th> + { title } + </th> + + <th> + <input className= {className + "-" + PushRuleVectorState.OFF} + type="radio" + checked={ pushRuleVectorState === PushRuleVectorState.OFF } + onChange={ this.onNotifStateButtonClicked } /> + </th> + + <th> + <input className= {className + "-" + PushRuleVectorState.ON} + type="radio" + checked={ pushRuleVectorState === PushRuleVectorState.ON } + onChange={ this.onNotifStateButtonClicked } /> + </th> + + <th> + <input className= {className + "-" + PushRuleVectorState.LOUD} + type="radio" + checked={ pushRuleVectorState === PushRuleVectorState.LOUD } + onChange={ this.onNotifStateButtonClicked } /> + </th> + </tr> + ); + }, + + renderNotifRulesTableRows: function() { + const rows = []; + for (let i in this.state.vectorPushRules) { + const rule = this.state.vectorPushRules[i]; + //console.log("rendering: " + rule.description + ", " + rule.vectorRuleId + ", " + rule.vectorState); + rows.push(this.renderNotifRulesTableRow(rule.description, rule.vectorRuleId, rule.vectorState)); + } + return rows; + }, + + emailNotificationsRow: function(address, label) { + return (<div className="mx_UserNotifSettings_tableRow"> + <div className="mx_UserNotifSettings_inputCell"> + <input id="enableEmailNotifications_{address}" + ref="enableEmailNotifications_{address}" + type="checkbox" + checked={ UserSettingsStore.hasEmailPusher(this.state.pushers, address) } + onChange={ this.onEnableEmailNotificationsChange.bind(this, address) } + /> + </div> + <div className="mx_UserNotifSettings_labelCell"> + <label htmlFor="enableEmailNotifications_{address}"> + {label} + </label> + </div> + </div>); + }, + + render: function() { + const self = this; + + let spinner; + if (this.state.phase === this.phases.LOADING) { + const Loader = sdk.getComponent("elements.Spinner"); + spinner = <Loader />; + } + + let masterPushRuleDiv; + if (this.state.masterPushRule) { + masterPushRuleDiv = ( + <div className="mx_UserNotifSettings_tableRow"> + <div className="mx_UserNotifSettings_inputCell"> + <input id="enableNotifications" + ref="enableNotifications" + type="checkbox" + checked={ !this.state.masterPushRule.enabled } + onChange={ this.onEnableNotificationsChange } + /> + </div> + <div className="mx_UserNotifSettings_labelCell"> + <label htmlFor="enableNotifications"> + { _t('Enable notifications for this account') } + </label> + </div> + </div> + ); + } + + // 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 ( + <div> + {masterPushRuleDiv} + + <div className="mx_UserSettings_notifTable"> + { _t('All notifications are currently disabled for all targets.') }. + </div> + </div> + ); + } + + const emailThreepids = this.props.threepids.filter((tp) => tp.medium === "email"); + let emailNotificationsRow; + if (emailThreepids.length === 0) { + emailNotificationsRow = <div> + { _t('Add an email address above to configure email notifications') } + </div>; + } 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(<li>{ _t(rule.description) }</li>); + } + + // 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(<li>{ _t('Notifications on the following keywords follow rules which can’t be displayed here:') } { externalKeywords }</li>); + } + + let devicesSection; + if (this.state.pushers === undefined) { + devicesSection = <div className="error">{ _t('Unable to fetch notification target list') }</div> + } 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(<tr key={ i }> + <td>{this.state.pushers[i].app_display_name}</td> + <td>{this.state.pushers[i].device_display_name}</td> + </tr>); + } + devicesSection = (<table className="mx_UserSettings_devicesTable"> + <tbody> + {rows} + </tbody> + </table>); + } + if (devicesSection) { + devicesSection = (<div> + <h3>{ _t('Notification targets') }</h3> + { devicesSection } + </div>); + } + + let advancedSettings; + if (externalRules.length) { + advancedSettings = ( + <div> + <h3>{ _t('Advanced notification settings') }</h3> + { _t('There are advanced notifications which are not shown here') }.<br/> + { _t('You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply') }. + <ul> + { externalRules } + </ul> + </div> + ); + } + + return ( + <div> + + {masterPushRuleDiv} + + <div className="mx_UserSettings_notifTable"> + + { spinner } + + <div className="mx_UserNotifSettings_tableRow"> + <div className="mx_UserNotifSettings_inputCell"> + <input id="enableDesktopNotifications" + ref="enableDesktopNotifications" + type="checkbox" + checked={ SettingsStore.getValue("notificationsEnabled") } + onChange={ this.onEnableDesktopNotificationsChange } /> + </div> + <div className="mx_UserNotifSettings_labelCell"> + <label htmlFor="enableDesktopNotifications"> + { _t('Enable desktop notifications') } + </label> + </div> + </div> + + <div className="mx_UserNotifSettings_tableRow"> + <div className="mx_UserNotifSettings_inputCell"> + <input id="enableDesktopNotificationBody" + ref="enableDesktopNotificationBody" + type="checkbox" + checked={ SettingsStore.getValue("notificationBodyEnabled") } + onChange={ this.onEnableDesktopNotificationBodyChange } /> + </div> + <div className="mx_UserNotifSettings_labelCell"> + <label htmlFor="enableDesktopNotificationBody"> + { _t('Show message in desktop notification') } + </label> + </div> + </div> + + <div className="mx_UserNotifSettings_tableRow"> + <div className="mx_UserNotifSettings_inputCell"> + <input id="enableDesktopAudioNotifications" + ref="enableDesktopAudioNotifications" + type="checkbox" + checked={ SettingsStore.getValue("audioNotificationsEnabled") } + onChange={ this.onEnableAudioNotificationsChange } /> + </div> + <div className="mx_UserNotifSettings_labelCell"> + <label htmlFor="enableDesktopAudioNotifications"> + { _t('Enable audible notifications in web client') } + </label> + </div> + </div> + + { emailNotificationsRow } + + <div className="mx_UserNotifSettings_pushRulesTableWrapper"> + <table className="mx_UserNotifSettings_pushRulesTable"> + <thead> + <tr> + <th width="55%"></th> + <th width="15%">{ _t('Off') }</th> + <th width="15%">{ _t('On') }</th> + <th width="15%">{ _t('Noisy') }</th> + </tr> + </thead> + <tbody> + + { this.renderNotifRulesTableRows() } + + </tbody> + </table> + </div> + + { advancedSettings } + + { devicesSection } + + </div> + + </div> + ); + } +}); diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index f7f674cf9a..cb223f5aaf 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 0000000000..24f19a9ce6 --- /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 <span>keywords</span>": "Müəyyən <span>açar sözləri</span> ö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 0967ef424b..7e79f5d355 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 ca12b3de1f..0992d550f1 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, <a>click here</a> to send a bug report.": "В противен случай, <a>натиснете тук</a>, за да изпратите съобщение за грешка.", - "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 <span></span> homeserver, or you can pick a <a>different server</a>.": "Това ще бъде името на профила Ви на <span></span> Home сървъра, или можете да изберете <a>друг сървър</a>.", "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.": "Заявката за ключ е изпратена.", "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Заявете отново ключове за шифроване</requestLink> от другите Ви устройства.", "%(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, логовете за дебъгване могат да ни помогнат да проследим проблема. Логовете за дебъгване съдържат данни за използване на приложението, включващи потребителското Ви име, идентификаторите или псевдонимите на стаите или групите, които сте посетили, и потребителските имена на други потребители. Те не съдържат съобщения.", @@ -1018,5 +1008,162 @@ "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.", + "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 <u>set a password</u>": "За да се върнете в профила си в бъдеще, трябва да <u>зададете парола</u>", + "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:": "Известия за следните ключови думи изпълняват правила, които не могат да бъдат показани тук:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> и <operaLink>Opera</operaLink> са други алтернативи.", + "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 <span>keywords</span>": "Съобщения, съдържащи <span>ключови думи</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Моля, инсталирайте <chromeLink>Chrome</chromeLink> или <firefoxLink>Firefox</firefoxLink> за най-добро преживяване.", + "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": "Ключови думи", + "<a>Click here</a> to create a GitHub issue.": "<a>Натиснете тук</a>, за да създадете 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 <b>not</b> able to run Riot.": "За жалост, Вашият браузър <b>не</b> може да пусне 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 0000000000..9e26dfeeb6 --- /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 0000000000..0967ef424b --- /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 0000000000..9e26dfeeb6 --- /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 8f9da794b6..9774b5bb20 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 <u>set a password</u>": "Per poder tornar al vostre compte en un futur, heu de <u>set a password</u>", + "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í:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> i <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Missatges que contenen <span>keywords</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Si us plau, instal·leu <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> 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", + "<a>Click here</a> to create a GitHub issue.": "<a>Clica aquí</a> 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 <b>not</b> able to run Riot.": "Disculpeu, el seu navegador <b>not</b> 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 4267954d4c..920c77dd25 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 <a>homeserver's SSL certificate</a> 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 <a>SSL certifikát</a> 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 <u>set a password</u>": "Abyste se mohli ke svému účtu v budoucnu vrátit, musíte si <u>nastavit heslo</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> a <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Zprávy obsahující <span>klíčová slova</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Pro nejlepší zážitek si prosím nainstalujte <chromeLink>Chrome</chromeLink> nebo <firefoxLink>Firefox</firefoxLink>.", + "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 <b>not</b> able to run Riot.": "Omlouváme se, váš prohlížeč <b>není</b> 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 31fb7d9d01..cc3ef49b55 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", @@ -244,5 +243,155 @@ "%(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.", "Submit debug logs": "Indsend debug-logfiler", - "Online": "Online" + "Online": "Online", + "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 <u>set a password</u>": "For at komme ind på din konto i fremtiden skal du <u>indstille et password</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> og <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Beskeder der indeholder <span>keywords</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Installer venligst <chromeLink>Chrome</chromeLink> eller <firefoxLink>Firefox</firefoxLink> 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 <b>not</b> able to run Riot.": "Beklager, din browser kan <b>ikke</b> 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 b90376f2e4..521cd3a4ab 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.", "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "Verschlüsselungs-Schlüssel von deinen anderen Geräten <requestLink>erneut anfragen</requestLink>.", "%(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", @@ -1015,5 +1008,162 @@ "Manage sticker packs": "Verwalte Stickerpacks", "Who can join this community?": "Wer kann dieser Community beitreten?", "Everyone": "Jeder", - "Stickerpack": "Stickerpack" + "Stickerpack": "Stickerpack", + "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 <u>set a password</u>": "Um in Zukunft auf dein Benutzerkonto zugreifen zu können, musst du <u>ein Passwort setzen</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> und <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Nachrichten, die <span>Schlüsselwörter</span> 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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Bitte installiere <chromeLink>Chrome</chromeLink> oder <firefoxLink>Firefox</firefoxLink> 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", + "<a>Click here</a> to create a GitHub issue.": "<a>Klicke hier</a> 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 <b>not</b> able to run Riot.": "Es tut uns leid, aber dein Browser kann Riot <b>nicht</b> 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 ab16f215bc..b5acd8855e 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 <u>set a password</u>": "Για να επιστρέψετε στον λογαριασμό σας μελλοντικα πρέπει να ορίσετε έναν <u>κωδικό πρόσβασης</u>", + "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 <span>keywords</span>": "Μηνύματα που περιέχουν <span>λέξεις κλειδιά</span>", + "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 <b>not</b> able to run Riot.": "Λυπούμαστε, αλλά ο περιηγητές σας <b>δεν</b> υποστηρίζεται από το 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 725ddbaa2f..4422c754d5 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 <span>keywords</span>": "Messages containing <span>keywords</span>", + "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 <u>set a password</u>": "To return to your account in future you need to <u>set a password</u>", + "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.", + "<a>Click here</a> to create a GitHub issue.": "<a>Click here</a> 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 <span></span> homeserver, or you can pick a <a>different server</a>.": "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.", "If you already have a Matrix account you can <a>log in</a> instead.": "If you already have a Matrix account you can <a>log in</a> 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 <b>not</b> able to run Riot.": "Sorry, your browser is <b>not</b> able to run Riot.", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.", + "Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.", + "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 <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> 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.<br />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.<br />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 <i>+example:matrix.org</i>.": "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.", "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", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.", @@ -824,13 +978,13 @@ "%(count)s of your messages have not been sent.|one": "Your message was not sent.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Resend message</resendText> or <cancelText>cancel message</cancelText> 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 <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?", + "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 2ce5cb541b..a3184fdc38 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 <a>enable unsafe scripts</a>.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.", @@ -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 <a>web browser</a>": "Robot check is currently unavailable on desktop - please use a <a>web browser</a>", "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 <u>set a password</u>": "To return to your account in future you need to <u>set a password</u>", + "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 <span>keywords</span>": "Messages containing <span>keywords</span>", + "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 <b>not</b> able to run Riot.": "Sorry, your browser is <b>not</b> 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 e6f1ba6e8b..f62c4b7c2d 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", @@ -964,5 +958,157 @@ "%(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", - "Submit debug logs": "Sendi sencimigan protokolon" + "Submit debug logs": "Sendi sencimigan protokolon", + "Fetching third party location failed": "Malsukcesis trovi lokon de ekstera liveranto", + "A new version of Riot is available.": "Nova versio de Riot haveblas.", + "I understand the risks and wish to continue": "Mi komprenas la riskojn kaj volas daŭrigi", + "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 <u>set a password</u>": "Por reveni al via konto estonte, vi devas <u>agordi pasvorton</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "Ankaŭ <safariLink>Safario</safariLink> kaj <operaLink>Opero</operaLink> 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 <span>keywords</span>": "Mesaĝoj enhavantaj <span>ŝlosilovortojn</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Bonvolu instali <chromeLink>Ĥromon</chromeLink> aŭ <firefoxLink>Fajrovulpon</firefoxLink> 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 <b>not</b> able to run Riot.": "Pardonu, via foliumilo <b>ne kapablas</b> 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 0241d6a0cc..36bf4b7b3b 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 <a>enable unsafe scripts</a>.": "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 <a>habilitando los scripts inseguros</a>.", @@ -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 <u>set a password</u>": "Para regresar a tu cuenta en el futuro debes <u>establecer una contraseña</u>", + "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í:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> y <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Mensajes que contienen <span>palabras clave</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Por favor instala <chromeLink>Chrome</chromeLink> o <firefoxLink>Firefox</firefoxLink> 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", + "<a>Click here</a> to create a GitHub issue.": "<a>Haz click aquí</a> 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 <b>not</b> able to run Riot.": "¡Lo sentimos! Su navegador <b>no puede</b> 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 20fc14acad..93f150294d 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.", "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Berriz eskatu zifratze-gakoak</requestLink> 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.", @@ -1015,5 +1008,162 @@ "Show Stickers": "Erakutsi eranskailuak", "Manage sticker packs": "Kudeatu eranskailu-multzoak", "Who can join this community?": "Nor elkartu daiteke komunitate honetara?", - "Everyone": "Edonor" + "Everyone": "Edonor", + "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 <u>set a password</u>": "Etorkizunean kontura itzuli ahal izateko <u>pasahitz bat ezarri</u> 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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> eta <operaLink>Opera</operaLink> 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 <span>keywords</span>": "<span>Hitz gakoak</span> 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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Instalatu <chromeLink>Chrome</chromeLink> edo <firefoxLink>Firefox</firefoxLink> 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", + "<a>Click here</a> to create a GitHub issue.": "<a>Egin klik hemen</a> 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 <b>not</b> able to run Riot.": "Zure nabigatzaileak <b>ez</b> 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 0967ef424b..2e359e21cb 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 <u>set a password</u>": "برای بازگشتِ دوباره به اکانتان در آینده نیاز به <u> ثبت یک پسورد </u> دارید", + "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 <span>keywords</span>": "پیامهای دارای <span> این کلیدواژهها </span>", + "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 <b>not</b> able to run Riot.": "متاسفانه مرورگر شما <b>نمیتواند</b> رایوت را اجرا کند.", + "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 ae12f57e28..4a83f456c7 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 <u>set a password</u>": "Voidaksesi tulevaisuudessa palata tilillesi sinut pitää <u>asettaa salasana</u>", + "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ä:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> ja <operaLink>Opera</operaLink> 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 <span>keywords</span>": "<span>Avainsanoja</span> 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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Asenna <chromeLink>Chrome</chromeLink> tai <firefoxLink>Firefox</firefoxLink> 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 <b>not</b> able to run Riot.": "Valitettavasti Riot <b>ei</b> 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 9b7bf87a6a..1800476c46 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 <a>enable unsafe scripts</a>.": "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 <a>activez le support des scripts non-vérifiés</a>.", "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.", "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Re-demander les clés de chiffrement</requestLink> 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 <u>set a password</u>": "Pour pouvoir retrouver votre compte dans le futur, vous devez <u>définir un mot de passe</u>", + "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 :", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> et <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Messages contenant des <span>mots-clés</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Veuillez installer <chromeLink>Chrome</chromeLink> ou <firefoxLink>Firefox</firefoxLink> 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 <b>not</b> able to run Riot.": "Désolé, Riot <b>n'</b>est <b>pas</b> 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 f1f541d850..1883d29bb2 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", @@ -1015,5 +1008,162 @@ "Show Stickers": "Mostrar pegatinas", "Manage sticker packs": "Xestionar os paquetes de pegatinas", "Who can join this community?": "Quén pode unirse a esta comunidade?", - "Everyone": "Todo o mundo" + "Everyone": "Todo o mundo", + "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 <u>set a password</u>": "Para voltar a súa conta no futuro debe <u>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í:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> e <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Mensaxes que conteñen <span>palabras chave</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Por favor instale <chromeLink>Chrome</chromeLink> ou <firefoxLink>Firefox</firefoxLink> 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", + "<a>Click here</a> to create a GitHub issue.": "<a>Pulse aquí</a> 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 <b>not</b> able to run Riot.": "Desculpe, o seu navegador <b>non pode</b> 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 e3de41600a..9543a64b8f 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 <u>set a password</u>": "להשתמש בחשבונך בעתיד, עליך <u>להגדיר סיסמא</u>", + "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:": "התראה על מילות המפתח הבאות עוקבת אחר החוקים שאינם יכולים להיות מוצגים כאן:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> וגם <operaLink>Opera</operaLink> עובדים.", + "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 <span>keywords</span>": "הודעות המכילות <span> מילות מפתח </span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "אנא התקן <firefoxLink>Firefox</firefoxLink> או <chromeLink>Chrome</chromeLink> לחוויה מיטבית.", + "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": "מתי אני מוזמן לחדר", + "<a>Click here</a> to create a GitHub issue.": "<a>הקלק כאן <a/>ליצירת דווח תקלה ב: 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 <b>not</b> able to run Riot.": "מצטערים, הדפדפן שלך הוא <b> אינו</b> יכול להריץ את 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 0000000000..f8bfb088a8 --- /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 23ab91215e..88e0fa22db 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 <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Nem lehet kapcsolódni a saját szerverhez - ellenőrizd a kapcsolatot, biztosítsd, hogy a <a>saját szerver tanúsítványa</a> hiteles legyen, és a böngésző kiterjesztések ne blokkolják a kéréseket.", @@ -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.", "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Kulcsok újrakérése</requestLink> 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 <u>set a password</u>": "Hogy később visszaléphess a fiókodba, be kell állítanod egy <u>jelszót</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safarival</safariLink> és <operaLink>Operával</operaLink> 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 <span>keywords</span>": "<span>Kulcsszavakat</span> 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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "A legjobb élmény érdekében telepíts <chromeLink>Chrome</chromeLink> vagy <firefoxLink>Firefox</firefoxLink> 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", + "<a>Click here</a> to create a GitHub issue.": "<a>Kattints ide</a> 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 <b>not</b> able to run Riot.": "Elnézést, a böngésződben <b>nem</b> 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 e95f3b13af..5eccf72100 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 <u>set a password</u>": "Untuk kembali ke akun di lain waktu, Anda perlu <u>mengisi password</u>", + "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 <span>keywords</span>": "Pesan mengandung <span>kata kunci</span>", + "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 <b>not</b> able to run Riot.": "Maaf, browser Anda <b>tidak</b> 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 b918dce1ee..0f7851621f 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 <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Le modifiche al <bold1>nome</bold1> e all'<bold2>avatar</bold2> effettuate alla tua comunità potrebbero non essere visibili agli altri utenti per i prossimi 30 minuti.", @@ -1007,5 +999,162 @@ "You don't currently have any stickerpacks enabled": "Non hai ancora alcun pacchetto di adesivi attivato", "Add a stickerpack": "Aggiungi un pacchetto di adesivi", "Who can join this community?": "Chi può unirsi a questa comunità?", - "Everyone": "Tutti" + "Everyone": "Tutti", + "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 <u>set a password</u>": "Per tornare nel tuo account in futuro devi <u>impostare una password</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "Anche <safariLink>Safari</safariLink> e <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Messaggi contenenti <span>parole chiave</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Installa <chromeLink>Chrome</chromeLink> o <firefoxLink>Firefox</firefoxLink> 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", + "<a>Click here</a> to create a GitHub issue.": "<a>Clicca qui</a> 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 <b>not</b> able to run Riot.": "Spiacenti, ma il tuo browser <b>non</b> è 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 ce77c0b994..e8d1353c3b 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -87,5 +87,65 @@ "Your identity server's URL": "あなたのアイデンティティサーバのURL", "Analytics": "分析", "The information being sent to us to help make Riot.im better includes:": "Riot.imをよりよくするために私達に送信される情報は以下を含みます:", - "We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "私達はこのアプリであなたが利用したページ(現在は<CurrentPageHash>)、あなたのユーザエージェント(現在は<CurrentUserAgent>)、並びにあなたの端末の解像度(現在の端末では<CurrentDeviceResolution>)も記録します。" + "We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "私達はこのアプリであなたが利用したページ(現在は<CurrentPageHash>)、あなたのユーザエージェント(現在は<CurrentUserAgent>)、並びにあなたの端末の解像度(現在の端末では<CurrentDeviceResolution>)も記録します。", + "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 <b>not</b> able to run Riot.": "申し訳ありません。あなたのブラウザではRiotは<b>動作できません</b>。", + "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 <span>keywords</span>": "<span>keywords</span>を含むメッセージ", + "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 183a519320..32ca09aee1 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 <u>set a password</u>": "나중에 계정으로 돌아가려면 <u>비밀번호 설정</u>을 해야만 해요", + "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 <span>keywords</span>": "<span>키워드</span>가 적힌 메시지", + "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 <b>not</b> able to run Riot.": "죄송해요. 브라우저에서 라이엇을 켤 수가 <b>없어요</b>.", + "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 38cc908111..277b0cf427 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 <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "Mes taip pat saugome kiekvieną puslapį, kurį jūs naudojate programėlėje (dabartinis <CurrentPageHash>), jūsų paskyros agentas (<CurrentUserAgent>) ir jūsų įrenginio rezoliucija (<CurrentDeviceResolution>)." + "We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "Mes taip pat saugome kiekvieną puslapį, kurį jūs naudojate programėlėje (dabartinis <CurrentPageHash>), jūsų paskyros agentas (<CurrentUserAgent>) ir jūsų įrenginio rezoliucija (<CurrentDeviceResolution>).", + "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 <u>set a password</u>": "Ateityje norėdami prisijungti prie savo paskyros turite <u>susigalvoti slaptažodį</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "Naudojant <safariLink>Safari</safariLink> ir <operaLink>Opera</operaLink> taip pat gerai veikia.", + "Please set a password!": "Prašau įrašykite slaptažodį!", + "powered by Matrix": "palaikomas Matrix", + "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 <span>keywords</span>": "Žinutės, kuriose yra <span>raktažodžiai</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Prašau įdiekite <chromeLink>Chrome</chromeLink> arba <firefoxLink>Firefox</firefoxLink> 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 <b>not</b> able to run Riot.": "Atleiskite, jūsų naršyklė <b>negali</b> 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 8bb4d0a9bc..a4a222a602 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 <a>homeserver's SSL certificate</a> 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 <a> bāzes servera SSL sertifikāts</a> 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.<br />Click here to open settings and give it one!": "Jūsu kopienai nav plašāka HTML-lapas apraksta ko parādīt dalībniekiem.<br />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 <u>set a password</u>": "Lai nākotnē atgrieztos savā kontā, nepieciešams <u>iestatīt paroli</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> un <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Ziņas, kuras satur <span>atslēgvārdus</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Labāko lietošanas pieredzi gūsi uzstādot pārlūkprogrammu <chromeLink>Chromium</chromeLink> vai <firefoxLink>Firefox</firefoxLink>.", + "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ā", + "<a>Click here</a> to create a GitHub issue.": "<a>Nospied šeit</a> 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 <b>not</b> able to run Riot.": "Atvaino, diemžēl tavs tīmekļa pārlūks <b>nespēj</b> 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 2deda25ee0..098c062006 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 <u>set a password</u>": "വീണ്ടും ഈ അക്കൌണ്ട് ഉപയോഗിക്കണമെങ്കില് <u>ഒരു രഹസ്യവാക്ക് സെറ്റ് ചെയ്യുക</u>", + "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 <span>keywords</span>": "<span>കീവേഡുകള്</span>അടങ്ങിയ സന്ദേശങ്ങള്ക്ക്", + "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 <b>not</b> able to run Riot.": "ക്ഷമിക്കണം, നിങ്ങളുടെ ബ്രൌസര് റയട്ട് പ്രവര്ത്തിപ്പിക്കാന് <b>പര്യാപ്തമല്ല</b>.", + "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 3919993663..47da50122c 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 <span>keywords</span>": "Meldinger som inneholder <span>nøkkelord</span>", + "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 <b>not</b> able to run Riot.": "Beklager, din nettleser er <b>ikke</b> 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 0000000000..9e26dfeeb6 --- /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 516fc9dd21..61e22d3996 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 <a>enable unsafe scripts</a>.": "Kan niet met de thuisserver verbinden via HTTP wanneer er een HTTPS-URL in je browser balk staat. Gebruik HTTPS of <a>activeer onveilige scripts</a>.", @@ -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 <StartChatButton> to start a chat with someone": "Druk op <StartChatButton> 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", @@ -1017,5 +1009,154 @@ "Debug Logs Submission": "Debug Logs Indienen", "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.": "Als je een bug via Github hebt ingediend kunnen debug logs ons helpen om het probleem te vinden. Debug logs bevatten applicatie-gebruik data inclusief je gebruikersnaam, de ID's of namen van de ruimtes en groepen die je hebt bezocht en de gebruikersnamen van andere gebruikers. Ze bevatten geen berichten.", "Submit debug logs": "Debug logs indienen", - "Opens the Developer Tools dialog": "Opent het Ontwikkelaars Gereedschappen dialoog" + "Opens the Developer Tools dialog": "Opent het Ontwikkelaars Gereedschappen dialoog", + "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 <u>set a password</u>": "Om in de toekomst naar je account terug te gaan moet je <u>een wachtwoord instellen</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> en <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Berichten die <span>trefwoorden</span> 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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Installeer alstublieft <chromeLink>Chrome</chromeLink> of <firefoxLink>Firefox</firefoxLink> 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 <b>not</b> able to run Riot.": "Sorry, uw browser werkt <b>niet</b> 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 e031f78394..2345164987 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 <a>homeserver's SSL certificate</a> 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 <a>certyfikat SSL serwera</a> 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)", @@ -779,5 +774,172 @@ "You are trying to access a room.": "Próbujesz uzyskać dostęp do pokoju.", "To change the room's avatar, you must be a": "Aby zmienić awatar pokoju, musisz być", "To change the room's name, you must be a": "Aby zmienić nazwę pokoju, musisz być", - "To change the room's main address, you must be a": "Aby zmienić główny adres pokoju, musisz być" + "To change the room's main address, you must be a": "Aby zmienić główny adres pokoju, musisz być", + "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 <u>set a password</u>": "Aby wrócić do swojego konta w przyszłości musisz <u> ustawić hasło </u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> i <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Wiadomości zawierające <span>słowa kluczowe</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Zainstaluj <chromeLink>Chrome</chromeLink> lub <firefoxLink>Firefox</firefoxLink> 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", + "<a>Click here</a> to create a GitHub issue.": "<a>Kliknij tutaj</a> 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 <b>not</b> able to run Riot.": "Przepraszamy, Twoja przeglądarka <b>nie jest w stanie</b> 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 2a99cd191c..d8b9d11040 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 <StartChatButton> to start a chat with someone": "Clique <StartChatButton> 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 <eventType/>, you must be a": "Para enviar eventos do tipo <eventType/>, tens de ser um(a)" + "To send events of type <eventType/>, you must be a": "Para enviar eventos do tipo <eventType/>, 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 <u>set a password</u>": "Para voltar à sua conta no futuro, necessita de <u>definir uma palavra-passe</u>", + "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 <span>keywords</span>": "Mensagens contendo <span>palavras-chave</span>", + "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 <b>not</b> able to run Riot.": "Desculpe, o seu navegador <b>não</b> é 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 fc0899873a..37a9a958a1 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.", "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Requisitar novamente chaves de encriptação</requestLink> 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 <u>set a password</u>": "Para poder, futuramente, retornar à sua conta, você precisa <u>definir uma senha</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> e <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Mensagens contendo <span>palavras-chave</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Por favor Instale <chromeLink>Chrome</chromeLink> Ou <firefoxLink>Firefox</firefoxLink> 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 <b>not</b> able to run Riot.": "Perdão. O seu navegador <b>não</b> é 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 854b85cf23..d1e828a1d6 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,6 @@ "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Изменения <bold1>имени</bold1> и <bold2>аватара</bold2>, внесенные в ваше сообщество, могут не отображаться другим пользователям в течение 30 минут.", "Join this community": "Присоединиться к сообществу", "Leave this community": "Покинуть это сообщество", - "here": "здесь", - "to add some!": "для добавления!", - "Click": "Нажмите", "Who can join this community?": "Кто может присоединиться к этому сообществу?", "Everyone": "Все", "Stickerpack": "Этикетки", @@ -1014,5 +1004,162 @@ "Add a stickerpack": "Добавить этикетки", "Hide Stickers": "Скрыть этикетки", "Show Stickers": "Показать этикетки", - "Manage sticker packs": "Упорядочить этикетки" + "Manage sticker packs": "Упорядочить этикетки", + "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 <u>set a password</u>": "Чтобы вернуться к учетной записи в будущем, необходимо <u>задать пароль</u>", + "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:": "Уведомления по следующим ключевым словам соответствуют правилам, которые нельзя отобразить здесь:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> и <operaLink>Opera</operaLink> работают тоже.", + "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 <span>keywords</span>": "Сообщения, содержащие определенные <span>ключевые слова</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Лучший опыт вы получите, установив <chromeLink>Chrome</chromeLink> или <firefoxLink>Firefox</firefoxLink>.", + "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": "Когда меня приглашают в комнату", + "<a>Click here</a> to create a GitHub issue.": "<a>Нажмите здесь</a> для создания запроса о проблеме на 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 <b>not</b> able to run Riot.": "К сожалению, ваш браузер <b>не способен</b> запустить 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 6baadea1a6..3422c364c4 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", @@ -1014,5 +1008,162 @@ "Show Stickers": "Zobraziť nálepky", "Manage sticker packs": "Spravovať balíčky s nálepkami", "Who can join this community?": "Kto môže vstúpiť do tejto komunity?", - "Everyone": "Ktokoľvek" + "Everyone": "Ktokoľvek", + "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 <u>set a password</u>": "Aby ste sa v budúcnosti mohli vrátiť k vašemu účtu mali by ste si teraz <u>nastaviť heslo</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "Správne fungujú aj <safariLink>Safari</safariLink> a <operaLink>Opera</operaLink>.", + "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 <span>keywords</span>": "Správy obsahujúce <span>kľúčové slová</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Aby ste s používania mali čo možno najlepší dojem, nainštalujte si <chromeLink>Chrome</chromeLink> alebo <firefoxLink>Firefox</firefoxLink>.", + "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", + "<a>Click here</a> to create a GitHub issue.": "<a>Kliknutím sem</a> 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 <b>not</b> able to run Riot.": "Prepáčte, vo vašom prehliadači <b>nie je</b> 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 3d8e6553ed..dc26c7c283 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 <u>set a password</u>": "Që të riktheheni te llogaria juaj në të ardhmen, lypset të <u>caktoni një fjalëkalim</u>", + "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:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> dhe <operaLink>Opera</operaLink> 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 <span>keywords</span>": "Mesazhe që përmbajnë <span>fjalëkyçe</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Ju lutemi, për funksionimin më të mirë, instaloni <chromeLink>Chrome</chromeLink> ose <firefoxLink>Firefox</firefoxLink>.", + "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", + "<a>Click here</a> to create a GitHub issue.": "<a>Klikoni këtu</a> 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 <b>not</b> able to run Riot.": "Na ndjeni, shfletuesi juaj <b>nuk</b> ë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 a6d8ab8540..8d218f5595 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.": "Захтев за дељење кључа послат.", "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Поново затражи кључеве за шифровање</requestLink> са осталих ваших уређаја.", "%(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 <u>set a password</u>": "Да бисте се вратили на ваш налог у будућности, морате <u>поставити лозинку</u>", + "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:": "Обавештења за следеће кључне речи прате правила која не могу бити приказана овде:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Сафари</safariLink> и <operaLink>Опера</operaLink> такође раде.", + "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 <span>keywords</span>": "Поруке које садрже <span>кључне речи</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Инсталирајте <chromeLink>Хром (Chrome)</chromeLink> или <firefoxLink>Фајерфокс (Firefox)</firefoxLink> за најбољи угођај.", + "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 <b>not</b> able to run Riot.": "Нажалост, ваш прегледач <b>не може</b> да покреће 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 8c0c722bdd..cd502e5bb7 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 <u>set a password</u>": "För att återgå till ditt konto i framtiden måste du <u>välja ett lösenord</u>", + "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 <span>keywords</span>": "Meddelanden som innehåller <span>nyckelord</span>", + "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 <b>not</b> able to run Riot.": "Beklagar, din webbläsare kan <b>inte</b> 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 0000000000..202e5326f0 --- /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 <span>keywords</span>": "<span>முக்கிய</span> கொண்ட செய்திகள்", + "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 ec45eefadf..b6102a5eb5 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 <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "గృహనిర్వాహకులకు కనెక్ట్ చేయలేరు - దయచేసి మీ కనెక్టివిటీని తనిఖీ చేయండి, మీ <a> 1 హోమరుసు యొక్క ఎస్ఎస్ఎల్ సర్టిఫికేట్ </a> 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 <span>keywords</span>": "కీలక పదాలను</span>కలిగి ఉన్న సందేశం<span>", + "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 <b>not</b> able to run Riot.": "క్షమించండి, మీ బ్రౌజర్ <b>రియట్ని అమలు చేయలేరు</b>.", + "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 540902c8f1..17ba4d461f 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 <u>set a password</u>": "คุณต้อง<u>ตั้งรหัสผ่าน</u>เพื่อจะกลับมาที่บัญชีนี้ในอนาคต", + "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 <span>keywords</span>": "ข้อความที่มี<span>คีย์เวิร์ด</span>", + "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 <b>not</b> able to run Riot.": "ขออภัย เบราว์เซอร์ของคุณ<b>ไม่</b>สามารถ 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 922bdc33a1..d890ed634e 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 <a>homeserver's SSL certificate</a> 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 ,<a> Ana Sunucu SSL sertifikanızın </a> 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 <span>keywords</span>": "<span> anahtar kelimeleri </span> 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 <b>not</b> able to run Riot.": "Üzgünüz , tarayıcınız Riot'u <b> çalıştıramıyor </b>.", + "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 2ff04fec65..25a70e0522 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 <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Не вдається підключитись до домашнього серверу - перевірте підключення, переконайтесь, що ваш <a>SSL-сертифікат домашнього сервера</a> є довіреним і що розширення браузера не блокує запити.", @@ -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 <u>set a password</u>": "Щоб мати змогу використовувати вашу обліковку у майбутньому, <u>зазначте пароль</u>", + "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:": "Сповіщення з наступних ключових слів дотримуються правил, що не можуть бути показані тут:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> та <operaLink>Opera</operaLink> працюють теж.", + "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 <span>keywords</span>": "Повідомлення, що містять <span>ключові слова</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Краще встановіть <chromeLink>Chrome</chromeLink> або <firefoxLink>Firefox</firefoxLink>.", + "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": "Переглянути джерело", + "<a>Click here</a> to create a GitHub issue.": "<a>Нажміть тут</a> для створення запитання по проблемі на 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 <b>not</b> able to run Riot.": "Вибачте, ваш оглядач <b>не</b> спроможний запустити 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 2024ae50f8..3c960c44c6 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 <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "无法连接主服务器 - 请检查网络连接,确保你的<a>主服务器 SSL 证书</a>被信任,且没有浏览器插件拦截请求。", @@ -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 离开了聊天室。", @@ -727,7 +723,6 @@ "You have entered an invalid address.": "你输入了一个无效地址。", "Advanced options": "高级选项", "Leave": "离开", - "Unable to leave room": "无法离开聊天室", "Description": "描述", "Warning": "警告", "Light theme": "浅色主题", @@ -986,5 +981,162 @@ "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "要加入已有的社区,你需要知道它的社区链接,比如 <i>+example:matrix.org</i>。", "Visibility in Room List": "是否在聊天室目录中可见", "Something went wrong when trying to get your communities.": "获取你加入的社区时发生错误。", - "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "删除小部件后,此聊天室中的所有用户的这个小部件都会被删除。你确定要删除这个小部件吗?" + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "删除小部件后,此聊天室中的所有用户的这个小部件都会被删除。你确定要删除这个小部件吗?", + "Fetching third party location failed": "获取第三方位置失败", + "A new version of Riot is available.": "Riot 有更新可用。", + "Couldn't load home page": "不能加载首页", + "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 <u>set a password</u>": "要在未来回到您的账号,您需要 <u>设置密码</u>", + "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:": "以下关键字依照规则将不会在此显示:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> 和 <operaLink>Opera</operaLink> 也能工作。", + "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 <span>keywords</span>": "消息包含 <span>关键字</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "请安装 <chromeLink>Chrome</chromeLink> 或 <firefoxLink>Firefox</firefoxLink> 以获得最佳体验。", + "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": "当我被邀请进入聊天室", + "<a>Click here</a> to create a GitHub issue.": "<a>点击这里</a> 创建一个 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 <b>not</b> able to run Riot.": "抱歉,您的浏览器 <b>无法</b> 运行 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 0be62a27e5..a404604ec2 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 <a>enable unsafe scripts</a>.": "當瀏覽器網址列裡有 HTTPS URL 時,不能使用 HTTP 連線到家伺服器。請採用 HTTPS 或者<a>允許不安全的指令稿</a>。", "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.": "金鑰請求已傳送。", "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "從您的其他裝置<requestLink>重新請求加密金鑰</requestLink>。", "%(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 <u>set a password</u>": "未來若需回來使用您的帳號,您需要 <u>設定密碼</u>", + "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:": "以下關鍵字依照規則其通知將不會顯示在此:", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> 與 <operaLink>Opera</operaLink> 也可以運作。", + "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 <span>keywords</span>": "訊息包含 <span>關鍵字</span>", + "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 <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "請安裝 <chromeLink>Chrome</chromeLink> 或 <firefoxLink>Firefox</firefoxLink> 以取得最佳體驗。", + "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": "關鍵字", + "<a>Click here</a> to create a GitHub issue.": "<a>點選這裡</a>來建立 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 <b>not</b> able to run Riot.": "可惜,您的瀏覽器 <b>無法</b> 執行 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 0000000000..25a7bac96e --- /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 0000000000..c8aeb46854 --- /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 0000000000..c838aa20ed --- /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 0000000000..22a8f1db40 --- /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 0000000000..47e5d56f46 --- /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 0000000000..8ed77e9d41 --- /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 0000000000..11e19a709e --- /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<Object[]>} Resolves to an array of objects. The array is + * sorted in time (oldest first) based on when the log file was created (the + * log ID). The objects have said log ID in an "id" field and "lines" which + * is a big string with all the new-line delimited logs. + */ + async consume() { + const db = this.db; + + // Returns: a string representing the concatenated logs for this ID. + function fetchLogs(id) { + const o = db.transaction("logs", "readonly").objectStore("logs"); + return selectQuery(o.index("id"), IDBKeyRange.only(id), + (cursor) => { + return { + lines: cursor.value.lines, + index: cursor.value.index, + } + }).then((linesArray) => { + // We have been storing logs periodically, so string them all + // together *in order of index* now + linesArray.sort((a, b) => { + return a.index - b.index; + }) + return linesArray.map((l) => l.lines).join(""); + }); + } + + // Returns: A sorted array of log IDs. (newest first) + function fetchLogIds() { + // To gather all the log IDs, query for all records in logslastmod. + const o = db.transaction("logslastmod", "readonly").objectStore( + "logslastmod" + ); + return selectQuery(o, undefined, (cursor) => { + return { + id: cursor.value.id, + ts: cursor.value.ts, + }; + }).then((res) => { + // Sort IDs by timestamp (newest first) + return res.sort((a, b) => { + return b.ts - a.ts; + }).map((a) => a.id); + }); + } + + function deleteLogs(id) { + return new Promise((resolve, reject) => { + const txn = db.transaction( + ["logs", "logslastmod"], "readwrite" + ); + const o = txn.objectStore("logs"); + // only load the key path, not the data which may be huge + const query = o.index("id").openKeyCursor(IDBKeyRange.only(id)); + query.onsuccess = (event) => { + const cursor = event.target.result; + if (!cursor) { + return; + } + o.delete(cursor.primaryKey); + cursor.continue(); + } + txn.oncomplete = () => { + resolve(); + }; + txn.onerror = (event) => { + reject( + new Error( + "Failed to delete logs for " + + `'${id}' : ${event.target.errorCode}` + ) + ); + }; + // delete last modified entries + const lastModStore = txn.objectStore("logslastmod"); + lastModStore.delete(id); + }); + } + + let allLogIds = await fetchLogIds(); + let removeLogIds = []; + let logs = []; + let size = 0; + for (let i = 0; i < allLogIds.length; i++) { + let lines = await fetchLogs(allLogIds[i]); + + // always include at least one log file, but only include + // subsequent ones if they won't take us over the MAX_LOG_SIZE + if (i > 0 && size + lines.length > MAX_LOG_SIZE) { + // the remaining log IDs should be removed. If we go out of + // bounds this is just [] + // + // XXX: there's nothing stopping the current session exceeding + // MAX_LOG_SIZE. We ought to think about culling it. + removeLogIds = allLogIds.slice(i + 1); + break; + } + + logs.push({ + lines: lines, + id: allLogIds[i], + }); + size += lines.length; + } + if (removeLogIds.length > 0) { + console.log("Removing logs: ", removeLogIds); + // Don't await this because it's non-fatal if we can't clean up + // logs. + Promise.all(removeLogIds.map((id) => deleteLogs(id))).then(() => { + console.log(`Removed ${removeLogIds.length} old logs.`); + }, (err) => { + console.error(err); + }) + } + return logs; + } + + _generateLogEntry(lines) { + return { + id: this.id, + lines: lines, + index: this.index++ + }; + } + + _generateLastModifiedTime() { + return { + id: this.id, + ts: Date.now(), + }; + } +} + +/** + * Helper method to collect results from a Cursor and promiseify it. + * @param {ObjectStore|Index} store The store to perform openCursor on. + * @param {IDBKeyRange=} keyRange Optional key range to apply on the cursor. + * @param {Function} resultMapper A function which is repeatedly called with a + * Cursor. + * Return the data you want to keep. + * @return {Promise<T[]>} Resolves to an array of whatever you returned from + * resultMapper. + */ +function selectQuery(store, keyRange, resultMapper) { + const query = store.openCursor(keyRange); + return new Promise((resolve, reject) => { + let results = []; + query.onerror = (event) => { + reject(new Error("Query failed: " + event.target.errorCode)); + }; + // collect results + query.onsuccess = (event) => { + const cursor = event.target.result; + if (!cursor) { + resolve(results); + return; // end of results + } + results.push(resultMapper(cursor)); + cursor.continue(); + } + }); +} + + +let store = null; +let logger = null; +let initPromise = null; +module.exports = { + + /** + * Configure rage shaking support for sending bug reports. + * Modifies globals. + * @return {Promise} Resolves when set up. + */ + init: function() { + if (initPromise) { + return initPromise; + } + logger = new ConsoleLogger(); + logger.monkeyPatch(window.console); + + // just *accessing* indexedDB throws an exception in firefox with + // indexeddb disabled. + let indexedDB; + try { + indexedDB = window.indexedDB; + } catch(e) {} + + if (indexedDB) { + store = new IndexedDBLogStore(indexedDB, logger); + initPromise = store.connect(); + return initPromise; + } + initPromise = Promise.resolve(); + return initPromise; + }, + + flush: function() { + if (!store) { + return; + } + store.flush(); + }, + + /** + * Clean up old logs. + * @return Promise Resolves if cleaned logs. + */ + cleanup: async function() { + if (!store) { + return; + } + await store.consume(); + }, + + /** + * Get a recent snapshot of the logs, ready for attaching to a bug report + * + * @return {Array<{lines: string, id, string}>} list of log data + */ + getLogsForReport: async function() { + if (!logger) { + throw new Error( + "No console logger, did you forget to call init()?" + ); + } + // If in incognito mode, store is null, but we still want bug report + // sending to work going off the in-memory console logs. + if (store) { + // flush most recent logs + await store.flush(); + return await store.consume(); + } + else { + return [{ + lines: logger.flush(true), + id: "-", + }]; + } + }, +}; diff --git a/src/rageshake/submit-rageshake.js b/src/rageshake/submit-rageshake.js new file mode 100644 index 0000000000..086cf25d00 --- /dev/null +++ b/src/rageshake/submit-rageshake.js @@ -0,0 +1,126 @@ +/* +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 pako from 'pako'; +import Promise from 'bluebird'; + +import MatrixClientPeg from '../MatrixClientPeg'; +import PlatformPeg from '../PlatformPeg'; +import { _t } from '../languageHandler'; + +import rageshake from './rageshake' + + +// polyfill textencoder if necessary +import * as TextEncodingUtf8 from 'text-encoding-utf-8'; +let TextEncoder = window.TextEncoder; +if (!TextEncoder) { + TextEncoder = TextEncodingUtf8.TextEncoder; +} + +/** + * Send a bug report. + * + * @param {string} bugReportEndpoint HTTP url to send the report to + * + * @param {object} opts optional dictionary of options + * + * @param {string} opts.userText Any additional user input. + * + * @param {boolean} opts.sendLogs True to send logs + * + * @param {function(string)} opts.progressCallback Callback to call with progress updates + * + * @return {Promise} Resolved when the bug report is sent. + */ +export default async function sendBugReport(bugReportEndpoint, opts) { + if (!bugReportEndpoint) { + throw new Error("No bug report endpoint has been set."); + } + + opts = opts || {}; + const progressCallback = opts.progressCallback || (() => {}); + + progressCallback(_t("Collecting app version information")); + let version = "UNKNOWN"; + try { + version = await PlatformPeg.get().getAppVersion(); + } + catch (err) {} // PlatformPeg already logs this. + + let userAgent = "UNKNOWN"; + if (window.navigator && window.navigator.userAgent) { + userAgent = window.navigator.userAgent; + } + + const client = MatrixClientPeg.get(); + + console.log("Sending bug report."); + + const body = new FormData(); + body.append('text', opts.userText || "User did not supply any additional text."); + body.append('app', 'riot-web'); + body.append('version', version); + body.append('user_agent', userAgent); + + if (client) { + body.append('user_id', client.credentials.userId); + body.append('device_id', client.deviceId); + } + + if (opts.sendLogs) { + progressCallback(_t("Collecting logs")); + const logs = await rageshake.getLogsForReport(); + for (let entry of logs) { + // encode as UTF-8 + const buf = new TextEncoder().encode(entry.lines); + + // compress + const compressed = pako.gzip(buf); + + body.append('compressed-log', new Blob([compressed]), entry.id); + } + } + + progressCallback(_t("Uploading report")); + await _submitReport(bugReportEndpoint, body, progressCallback); +} + +function _submitReport(endpoint, body, progressCallback) { + const deferred = Promise.defer(); + + const req = new XMLHttpRequest(); + req.open("POST", endpoint); + req.timeout = 5 * 60 * 1000; + req.onreadystatechange = function() { + if (req.readyState === XMLHttpRequest.LOADING) { + progressCallback(_t("Waiting for response from server")); + } else if (req.readyState === XMLHttpRequest.DONE) { + on_done(); + } + }; + req.send(body); + return deferred.promise; + + function on_done() { + if (req.status < 200 || req.status >= 400) { + deferred.reject(new Error(`HTTP ${req.status}`)); + return; + } + deferred.resolve(); + } +} diff --git a/src/utils/DirectoryUtils.js b/src/utils/DirectoryUtils.js new file mode 100644 index 0000000000..72e44681b6 --- /dev/null +++ b/src/utils/DirectoryUtils.js @@ -0,0 +1,23 @@ +// Find a protocol 'instance' with a given instance_id +// in the supplied protocols dict +export function instanceForInstanceId(protocols, instance_id) { + if (!instance_id) return null; + for (const proto of Object.keys(protocols)) { + if (!protocols[proto].instances && protocols[proto].instances instanceof Array) continue; + for (const instance of protocols[proto].instances) { + if (instance.instance_id == instance_id) return instance; + } + } +} + +// given an instance_id, return the name of the protocol for +// that instance ID in the supplied protocols dict +export function protocolNameForInstanceId(protocols, instance_id) { + if (!instance_id) return null; + for (const proto of Object.keys(protocols)) { + if (!protocols[proto].instances && protocols[proto].instances instanceof Array) continue; + for (const instance of protocols[proto].instances) { + if (instance.instance_id == instance_id) return proto; + } + } +} diff --git a/test/notifications/ContentRules-test.js b/test/notifications/ContentRules-test.js new file mode 100644 index 0000000000..b58667fee9 --- /dev/null +++ b/test/notifications/ContentRules-test.js @@ -0,0 +1,117 @@ +/* +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. +*/ + +var notifications = require('../../src/notifications'); + +var ContentRules = notifications.ContentRules; +var PushRuleVectorState = notifications.PushRuleVectorState; + +var expect = require('expect'); +var test_utils = require('../test-utils'); + +var NORMAL_RULE = { + actions: [ + "notify", + { set_tweak: "highlight", value: false }, + ], + enabled: true, + pattern: "vdh2", + rule_id: "vdh2", +}; + +var LOUD_RULE = { + actions: [ + "notify", + { set_tweak: "highlight" }, + { set_tweak: "sound", value: "default" }, + ], + enabled: true, + pattern: "vdh2", + rule_id: "vdh2", +}; + +var USERNAME_RULE = { + actions: [ + "notify", + { set_tweak: "sound", value: "default" }, + { set_tweak: "highlight" }, + ], + default: true, + enabled: true, + pattern: "richvdh", + rule_id: ".m.rule.contains_user_name", +}; + + + +describe("ContentRules", function() { + beforeEach(function() { + test_utils.beforeEach(this); + }); + + describe("parseContentRules", function() { + it("should handle there being no keyword rules", function() { + var rules = { 'global': { 'content': [ + USERNAME_RULE, + ]}}; + var parsed = ContentRules.parseContentRules(rules); + expect(parsed.rules).toEqual([]); + expect(parsed.vectorState).toEqual(PushRuleVectorState.ON); + expect(parsed.externalRules).toEqual([]); + }); + + it("should parse regular keyword notifications", function() { + var rules = { 'global': { 'content': [ + NORMAL_RULE, + USERNAME_RULE, + ]}}; + + var parsed = ContentRules.parseContentRules(rules); + expect(parsed.rules.length).toEqual(1); + expect(parsed.rules[0]).toEqual(NORMAL_RULE); + expect(parsed.vectorState).toEqual(PushRuleVectorState.ON); + expect(parsed.externalRules).toEqual([]); + }); + + it("should parse loud keyword notifications", function() { + var rules = { 'global': { 'content': [ + LOUD_RULE, + USERNAME_RULE, + ]}}; + + var parsed = ContentRules.parseContentRules(rules); + expect(parsed.rules.length).toEqual(1); + expect(parsed.rules[0]).toEqual(LOUD_RULE); + expect(parsed.vectorState).toEqual(PushRuleVectorState.LOUD); + expect(parsed.externalRules).toEqual([]); + }); + + it("should parse mixed keyword notifications", function() { + var rules = { 'global': { 'content': [ + LOUD_RULE, + NORMAL_RULE, + USERNAME_RULE, + ]}}; + + var parsed = ContentRules.parseContentRules(rules); + expect(parsed.rules.length).toEqual(1); + expect(parsed.rules[0]).toEqual(LOUD_RULE); + expect(parsed.vectorState).toEqual(PushRuleVectorState.LOUD); + expect(parsed.externalRules.length).toEqual(1); + expect(parsed.externalRules[0]).toEqual(NORMAL_RULE); + }); + }); +}); diff --git a/test/notifications/PushRuleVectorState-test.js b/test/notifications/PushRuleVectorState-test.js new file mode 100644 index 0000000000..ff0de3e470 --- /dev/null +++ b/test/notifications/PushRuleVectorState-test.js @@ -0,0 +1,62 @@ +/* +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. +*/ + +var notifications = require('../../src/notifications'); + +var prvs = notifications.PushRuleVectorState; + +var expect = require('expect'); + +describe("PushRuleVectorState", function() { + describe("contentRuleVectorStateKind", function() { + it("should understand normal notifications", function () { + var rule = { + actions: [ + "notify", + ], + }; + + expect(prvs.contentRuleVectorStateKind(rule)). + toEqual(prvs.ON); + }); + + it("should handle loud notifications", function () { + var rule = { + actions: [ + "notify", + { set_tweak: "highlight", value: true }, + { set_tweak: "sound", value: "default" }, + ] + }; + + expect(prvs.contentRuleVectorStateKind(rule)). + toEqual(prvs.LOUD); + }); + + it("should understand missing highlight.value", function () { + var rule = { + actions: [ + "notify", + { set_tweak: "highlight" }, + { set_tweak: "sound", value: "default" }, + ] + }; + + expect(prvs.contentRuleVectorStateKind(rule)). + toEqual(prvs.LOUD); + }); + }); +});