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/.eslintrc.js b/.eslintrc.js index c6aeb0d1be..bf423a1ad8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -41,7 +41,8 @@ module.exports = { "react/jsx-uses-react": "error", // bind or arrow function in props causes performance issues - "react/jsx-no-bind": ["error", { + // (but we currently use them in some places) + "react/jsx-no-bind": ["warn", { "ignoreRefs": true, }], "react/jsx-key": ["error"], @@ -50,7 +51,12 @@ module.exports = { // // // https://github.com/yannickcr/eslint-plugin-react/blob/HEAD/docs/rules/jsx-curly-spacing.md - "react/jsx-curly-spacing": ["error", {"when": "never", "children": {"when": "always"}}], + // + // Disabled for now - if anything we'd like to *enforce* spacing in JSX + // curly brackets for legibility, but in practice it's not clear that the + // consistency particularly improves legibility here. --Matthew + // + // "react/jsx-curly-spacing": ["error", {"when": "never", "children": {"when": "always"}}], // Assert spacing before self-closing JSX tags, and no spacing before or // after the closing slash, and no spacing after the opening bracket of @@ -88,7 +94,6 @@ module.exports = { "valid-jsdoc": ["warn"], "new-cap": ["warn"], "key-spacing": ["warn"], - "arrow-parens": ["warn"], "prefer-const": ["warn"], // crashes currently: https://github.com/eslint/eslint/issues/6274 diff --git a/.travis-test-riot.sh b/.travis-test-riot.sh index 87200871a5..eeba4d0b7e 100755 --- a/.travis-test-riot.sh +++ b/.travis-test-riot.sh @@ -9,16 +9,9 @@ set -ev RIOT_WEB_DIR=riot-web REACT_SDK_DIR=`pwd` -curbranch="${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH}" -echo "Determined branch to be $curbranch" - -git clone https://github.com/vector-im/riot-web.git \ - "$RIOT_WEB_DIR" - +scripts/fetchdep.sh vector-im riot-web cd "$RIOT_WEB_DIR" -git checkout "$curbranch" || git checkout develop - mkdir node_modules npm install diff --git a/.travis.yml b/.travis.yml index 4137d754bf..ec07243a28 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,10 @@ dist: trusty # we don't need sudo, so can run in a container, which makes startup much # quicker. -sudo: false +# +# unfortunately we do temporarily require sudo as a workaround for +# https://github.com/travis-ci/travis-ci/issues/8836 +sudo: required language: node_js node_js: @@ -12,6 +15,5 @@ addons: chrome: stable install: - npm install - - (cd node_modules/matrix-js-sdk && npm install) script: ./scripts/travis.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 87459882c9..b161a9d908 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,678 @@ +Changes in [0.12.5](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.5) (2018-05-17) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.4...v0.12.5) + + * Fix image size jumping regression + [\#1909](https://github.com/matrix-org/matrix-react-sdk/pull/1909) + +Changes in [0.12.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.4) (2018-05-16) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.4-rc.6...v0.12.4) + + * No changes from rc.5 + +Changes in [0.12.4-rc.6](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.4-rc.6) (2018-05-15) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.4-rc.5...v0.12.4-rc.6) + + * Wait for deletion of widgets as well addition + [\#1907](https://github.com/matrix-org/matrix-react-sdk/pull/1907) + +Changes in [0.12.4-rc.5](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.4-rc.5) (2018-05-15) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.4-rc.4...v0.12.4-rc.5) + + * Wait for echo from server when adding user widgets + [\#1905](https://github.com/matrix-org/matrix-react-sdk/pull/1905) + +Changes in [0.12.4-rc.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.4-rc.4) (2018-05-14) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.4-rc.3...v0.12.4-rc.4) + + * Update from Weblate. + [\#1904](https://github.com/matrix-org/matrix-react-sdk/pull/1904) + * Correctly identify sticker picker widgets + [\#1894](https://github.com/matrix-org/matrix-react-sdk/pull/1894) + * Quick fix for sticker picker position + [\#1903](https://github.com/matrix-org/matrix-react-sdk/pull/1903) + * Remove redundant logging (currently shown on every render when no sti… + [\#1901](https://github.com/matrix-org/matrix-react-sdk/pull/1901) + * Fix stickers briefly being 2x the size + [\#1899](https://github.com/matrix-org/matrix-react-sdk/pull/1899) + * Send required properties when making requests to widgets over postMessage + [\#1891](https://github.com/matrix-org/matrix-react-sdk/pull/1891) + * Fix room widget second load infini spinner + [\#1897](https://github.com/matrix-org/matrix-react-sdk/pull/1897) + * Update widget state when account data changes + [\#1896](https://github.com/matrix-org/matrix-react-sdk/pull/1896) + * Remove margins when in a ReplyThread to stop them taking so much space + [\#1882](https://github.com/matrix-org/matrix-react-sdk/pull/1882) + * Add setting to enable widget screenshots (if widgets declare support) + [\#1892](https://github.com/matrix-org/matrix-react-sdk/pull/1892) + * T3chguy/replies html tag + [\#1889](https://github.com/matrix-org/matrix-react-sdk/pull/1889) + * Instant Sticker Picker + [\#1888](https://github.com/matrix-org/matrix-react-sdk/pull/1888) + * Update widget 'widgetData' key to 'data' to match spec. + [\#1887](https://github.com/matrix-org/matrix-react-sdk/pull/1887) + * Fix 'state_key' field name. + [\#1886](https://github.com/matrix-org/matrix-react-sdk/pull/1886) + * Improve appearance of short-lived app loading spinner + [\#1885](https://github.com/matrix-org/matrix-react-sdk/pull/1885) + * Take feature_sticker_messagse out of labs + [\#1883](https://github.com/matrix-org/matrix-react-sdk/pull/1883) + * Fix issue incorrect positioning with widget loading indicator + [\#1884](https://github.com/matrix-org/matrix-react-sdk/pull/1884) + * Users should always be able to edit their user/non-room widgets + [\#1879](https://github.com/matrix-org/matrix-react-sdk/pull/1879) + +Changes in [0.12.4-rc.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.4-rc.3) (2018-05-11) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.4-rc.2...v0.12.4-rc.3) + + * Instant Sticker Picker :zap: + [\#1888](https://github.com/matrix-org/matrix-react-sdk/pull/1888) + +Changes in [0.12.4-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.4-rc.2) (2018-05-09) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.4-rc.1...v0.12.4-rc.2) + + * Improve appearance of short-lived widget loading spinner + * Make sticker picker fully-fledged feature + * Fix incorrect positioning with widget loading indicator + +Changes in [0.12.4-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.4-rc.1) (2018-05-09) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.3...v0.12.4-rc.1) + + * Update from Weblate. + [\#1881](https://github.com/matrix-org/matrix-react-sdk/pull/1881) + * Pin lolex at 2.3.2 to avoid bug causing tests to fail + [\#1880](https://github.com/matrix-org/matrix-react-sdk/pull/1880) + * Replies: un-break click-to-mention on SenderProfile for reply&preview + [\#1878](https://github.com/matrix-org/matrix-react-sdk/pull/1878) + * Add tests for RoomList + [\#1877](https://github.com/matrix-org/matrix-react-sdk/pull/1877) + * Fix crash when browser doesn't report page change measurement + [\#1874](https://github.com/matrix-org/matrix-react-sdk/pull/1874) + * fix thinko when changing from ClientPeg to context in static method (DUH) + [\#1875](https://github.com/matrix-org/matrix-react-sdk/pull/1875) + * Fix Replies :D + [\#1873](https://github.com/matrix-org/matrix-react-sdk/pull/1873) + * Update eslint-plugin-react + [\#1871](https://github.com/matrix-org/matrix-react-sdk/pull/1871) + * relax lint for jsx-curly-spacing and arrow-parens + [\#1872](https://github.com/matrix-org/matrix-react-sdk/pull/1872) + * Use develop js-sdk in jenkins build + [\#1870](https://github.com/matrix-org/matrix-react-sdk/pull/1870) + * Replies + [\#1741](https://github.com/matrix-org/matrix-react-sdk/pull/1741) + * Use the right js-sdk branch when testing + [\#1869](https://github.com/matrix-org/matrix-react-sdk/pull/1869) + * Prevent error responses wedging group request concurrency limit + [\#1867](https://github.com/matrix-org/matrix-react-sdk/pull/1867) + * Refresh group rooms and members when selecting a tag + [\#1868](https://github.com/matrix-org/matrix-react-sdk/pull/1868) + * Refactor GroupStores into one global GroupStore + [\#1866](https://github.com/matrix-org/matrix-react-sdk/pull/1866) + * Switch back to using blob URLs for rendering e2e attachments + [\#1864](https://github.com/matrix-org/matrix-react-sdk/pull/1864) + * Hide inline encryption icons except when hovering over a message + [\#1845](https://github.com/matrix-org/matrix-react-sdk/pull/1845) + * UI fixes in SessionRestoreErrorDialog + [\#1860](https://github.com/matrix-org/matrix-react-sdk/pull/1860) + * Fix UX issues with bug report dialog + [\#1863](https://github.com/matrix-org/matrix-react-sdk/pull/1863) + * fix ugly img errors and correctly render SVG thumbnails + [\#1865](https://github.com/matrix-org/matrix-react-sdk/pull/1865) + * Fix error handling on session restore + [\#1859](https://github.com/matrix-org/matrix-react-sdk/pull/1859) + * Add tests for GroupView + [\#1862](https://github.com/matrix-org/matrix-react-sdk/pull/1862) + * Update version of hoek + [\#1861](https://github.com/matrix-org/matrix-react-sdk/pull/1861) + * Fix bug that caused crash when analytics HS/IS whitelists not specified + [\#1858](https://github.com/matrix-org/matrix-react-sdk/pull/1858) + * Fix Analytics to not import DEFAULTS, therefore avoiding NPE + [\#1857](https://github.com/matrix-org/matrix-react-sdk/pull/1857) + * Null check piwik config before using it + [\#1856](https://github.com/matrix-org/matrix-react-sdk/pull/1856) + * Track actual window location origin and hash + [\#1853](https://github.com/matrix-org/matrix-react-sdk/pull/1853) + * Replace document.origin with window.location.origin + [\#1855](https://github.com/matrix-org/matrix-react-sdk/pull/1855) + * Optionally hide widget popout button. + [\#1854](https://github.com/matrix-org/matrix-react-sdk/pull/1854) + * Add a button to 'pop out' widgets in to their own tab. + [\#1851](https://github.com/matrix-org/matrix-react-sdk/pull/1851) + +Changes in [0.12.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.3) (2018-04-30) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.3-rc.3...v0.12.3) + + * No changes since rc.3 + +Changes in [0.12.3-rc.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.3-rc.3) (2018-04-26) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.3-rc.2...v0.12.3-rc.3) + + * Replace document.origin with window.location.origin + [\#1855](https://github.com/matrix-org/matrix-react-sdk/pull/1855) + +Changes in [0.12.3-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.3-rc.2) (2018-04-25) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.3-rc.1...v0.12.3-rc.2) + + * Fix npm packaging + +Changes in [0.12.3-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.3-rc.1) (2018-04-25) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.2...v0.12.3-rc.1) + + * Update from Weblate. + [\#1852](https://github.com/matrix-org/matrix-react-sdk/pull/1852) + * Support origin lock in cross-origin renderer + [\#1849](https://github.com/matrix-org/matrix-react-sdk/pull/1849) + * s/contian/contain/g + [\#1850](https://github.com/matrix-org/matrix-react-sdk/pull/1850) + * Don't autocomplete users for single "@" + [\#1848](https://github.com/matrix-org/matrix-react-sdk/pull/1848) + * Update from Weblate. + [\#1844](https://github.com/matrix-org/matrix-react-sdk/pull/1844) + * Bind onImageError in constructor + [\#1846](https://github.com/matrix-org/matrix-react-sdk/pull/1846) + * Use mxid as sender name on set display name + [\#1841](https://github.com/matrix-org/matrix-react-sdk/pull/1841) + * Fix rageshake + [\#1840](https://github.com/matrix-org/matrix-react-sdk/pull/1840) + * Add UI for displaying room avatars full size + [\#1843](https://github.com/matrix-org/matrix-react-sdk/pull/1843) + * Update from Weblate. + [\#1842](https://github.com/matrix-org/matrix-react-sdk/pull/1842) + * move everything not explicitly riot (or status) branded into matrix-react- + sdk + [\#1836](https://github.com/matrix-org/matrix-react-sdk/pull/1836) + * Null check node before we pass it to velocity + [\#1838](https://github.com/matrix-org/matrix-react-sdk/pull/1838) + * Remove presence management + [\#1676](https://github.com/matrix-org/matrix-react-sdk/pull/1676) + * Null check stylesheet href + [\#1835](https://github.com/matrix-org/matrix-react-sdk/pull/1835) + * TopUnreadMessagesBar a11y + [\#1819](https://github.com/matrix-org/matrix-react-sdk/pull/1819) + * Use correct 1-1 room avatar after users leave + [\#593](https://github.com/matrix-org/matrix-react-sdk/pull/593) + * Use GeminiScrollbarWrapper in Flair settings of UserSettings + [\#1833](https://github.com/matrix-org/matrix-react-sdk/pull/1833) + * Add 500ms delay to show `membershipBusy` for longer + [\#1832](https://github.com/matrix-org/matrix-react-sdk/pull/1832) + * Improve group join/leave feedback + [\#1831](https://github.com/matrix-org/matrix-react-sdk/pull/1831) + * Update from Weblate. + [\#1830](https://github.com/matrix-org/matrix-react-sdk/pull/1830) + * Bump source-map-loader version to avoid bug /w inline base64 maps + [\#1829](https://github.com/matrix-org/matrix-react-sdk/pull/1829) + * Make stickers/messages continuations of each other + [\#1828](https://github.com/matrix-org/matrix-react-sdk/pull/1828) + * Update to match is_openly_joinable API + [\#1827](https://github.com/matrix-org/matrix-react-sdk/pull/1827) + * Fix to prevent guests from seeing features + [\#1826](https://github.com/matrix-org/matrix-react-sdk/pull/1826) + * Fix broken ForgotPassword component + [\#1825](https://github.com/matrix-org/matrix-react-sdk/pull/1825) + * Fix warning "Unknown prop `wrappedRef` on
tag..." + [\#1824](https://github.com/matrix-org/matrix-react-sdk/pull/1824) + * Add radio button for setting group is_joinable + [\#1817](https://github.com/matrix-org/matrix-react-sdk/pull/1817) + * Fix widget grant / revoke permission binding + [\#1823](https://github.com/matrix-org/matrix-react-sdk/pull/1823) + * Sticker picker styling + [\#1822](https://github.com/matrix-org/matrix-react-sdk/pull/1822) + * Bi-directional widget postMessaging API (stickerpacks) [WIP] + [\#1672](https://github.com/matrix-org/matrix-react-sdk/pull/1672) + * Add null-guard to prevent RoomAvatar NPE when room is null + [\#1821](https://github.com/matrix-org/matrix-react-sdk/pull/1821) + * Don't notify for bad encrypted messages + [\#1818](https://github.com/matrix-org/matrix-react-sdk/pull/1818) + * Join this community button + [\#1815](https://github.com/matrix-org/matrix-react-sdk/pull/1815) + * Reword group setting delay + [\#1816](https://github.com/matrix-org/matrix-react-sdk/pull/1816) + * Track duration of page changes + [\#1814](https://github.com/matrix-org/matrix-react-sdk/pull/1814) + * Wrap GeminiScrollbar in a component, enabled forceGemini + [\#1810](https://github.com/matrix-org/matrix-react-sdk/pull/1810) + * Add display name to the read receipt view + [\#1742](https://github.com/matrix-org/matrix-react-sdk/pull/1742) + * Fix broken import preventing people tag + [\#1811](https://github.com/matrix-org/matrix-react-sdk/pull/1811) + * Add /devtools to Autocomplete and run gen-i18n + [\#1778](https://github.com/matrix-org/matrix-react-sdk/pull/1778) + * Fix PresenceLabel in MemberInfo + [\#1809](https://github.com/matrix-org/matrix-react-sdk/pull/1809) + * Fix room tile badge not disappearing when receiving a read receipt + [\#1807](https://github.com/matrix-org/matrix-react-sdk/pull/1807) + * Option to remove the presence feature by HS + [\#1806](https://github.com/matrix-org/matrix-react-sdk/pull/1806) + * Dialog a11y + [\#1652](https://github.com/matrix-org/matrix-react-sdk/pull/1652) + * Change wording of debug log submission + [\#1740](https://github.com/matrix-org/matrix-react-sdk/pull/1740) + * Fix TextualBody.js to remove NodeList.forEach() + [\#1768](https://github.com/matrix-org/matrix-react-sdk/pull/1768) + * Use undocumented piwik cmd to disable heartbeattimer + [\#1770](https://github.com/matrix-org/matrix-react-sdk/pull/1770) + * Enable autocompletion for non-English languages. + [\#1800](https://github.com/matrix-org/matrix-react-sdk/pull/1800) + +Changes in [0.12.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.2) (2018-04-12) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.1...v0.12.2) + + * Null check stylesheet href + [\#1835](https://github.com/matrix-org/matrix-react-sdk/pull/1835) + * Remove the presence management labs feature + +Changes in [0.12.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.1) (2018-04-11) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.0...v0.12.1) + + * Use correct js-sdk version + +Changes in [0.12.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.0) (2018-04-11) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.0-rc.7...v0.12.0) + + * Further improve group joining/leaving feedback + [\#1832](https://github.com/matrix-org/matrix-react-sdk/pull/1832) + * Cosmetic changes to Communities button + +Changes in [0.12.0-rc.7](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.0-rc.7) (2018-04-10) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.0-rc.6...v0.12.0-rc.7) + + * Reword group setting delay + [\#1816](https://github.com/matrix-org/matrix-react-sdk/pull/1816) + * Improve group joining/leaving feedback + [\#1831](https://github.com/matrix-org/matrix-react-sdk/pull/1831) + +Changes in [0.12.0-rc.6](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.0-rc.6) (2018-04-09) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.0-rc.5...v0.12.0-rc.6) + + * Fix group join button not appearing + +Changes in [0.12.0-rc.5](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.0-rc.5) (2018-04-09) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.0-rc.4...v0.12.0-rc.5) + + * Added radio button to set group join policy + * Fix to prevent guests from accessing lab features + * Fix broken forgot password page + * Fix crash when joining a room after peeking + +Changes in [0.12.0-rc.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.0-rc.4) (2018-03-22) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.0-rc.3...v0.12.0-rc.4) + + * Fix broken import preventing people tag + [\#1811](https://github.com/matrix-org/matrix-react-sdk/pull/1811) + +Changes in [0.12.0-rc.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.0-rc.3) (2018-03-20) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.0-rc.2...v0.12.0-rc.3) + + * Fix room tile badge not disappearing when receiving a read receipt + [\#1807](https://github.com/matrix-org/matrix-react-sdk/pull/1807) + +Changes in [0.12.0-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.0-rc.2) (2018-03-19) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.0-rc.1...v0.12.0-rc.2) + + * Take TagPanel out of labs + [\#1805](https://github.com/matrix-org/matrix-react-sdk/pull/1805) + +Changes in [0.12.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.0-rc.1) (2018-03-19) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.11.4...v0.12.0-rc.1) + + * Remove the message on migrating crypto data + [\#1803](https://github.com/matrix-org/matrix-react-sdk/pull/1803) + * Update from Weblate. + [\#1804](https://github.com/matrix-org/matrix-react-sdk/pull/1804) + * Improve room list performance when receiving messages + [\#1801](https://github.com/matrix-org/matrix-react-sdk/pull/1801) + * Add change delay warning in GroupView settings + [\#1802](https://github.com/matrix-org/matrix-react-sdk/pull/1802) + * Only use `dangerouslySetInnerHTML` for HTML messages + [\#1799](https://github.com/matrix-org/matrix-react-sdk/pull/1799) + * Limit group requests to 3 at once + [\#1798](https://github.com/matrix-org/matrix-react-sdk/pull/1798) + * Show GroupMemberList after inviting a group member + [\#1796](https://github.com/matrix-org/matrix-react-sdk/pull/1796) + * Fix syntax fail + [\#1794](https://github.com/matrix-org/matrix-react-sdk/pull/1794) + * Use TintableSvg for TagPanel clear filter button + [\#1793](https://github.com/matrix-org/matrix-react-sdk/pull/1793) + * Fix missing space between "...is a" and user ID + [\#1792](https://github.com/matrix-org/matrix-react-sdk/pull/1792) + * E2E "fudge-button" + [\#1791](https://github.com/matrix-org/matrix-react-sdk/pull/1791) + * Remove spurious console.trace + [\#1790](https://github.com/matrix-org/matrix-react-sdk/pull/1790) + * Don't reset the presence timer on every dispatch + [\#1789](https://github.com/matrix-org/matrix-react-sdk/pull/1789) + * Potentially fix a memory leak in FlairStore + [\#1788](https://github.com/matrix-org/matrix-react-sdk/pull/1788) + * Implement transparent RoomTile for use in some places + [\#1785](https://github.com/matrix-org/matrix-react-sdk/pull/1785) + * Fix varying default group avatar colour for given group + [\#1784](https://github.com/matrix-org/matrix-react-sdk/pull/1784) + * Fix bug where avatar change not reflected in LLP + [\#1783](https://github.com/matrix-org/matrix-react-sdk/pull/1783) + * Workaround for atlassian/react-beautiful-dnd#273 + [\#1782](https://github.com/matrix-org/matrix-react-sdk/pull/1782) + * Add setting to disable TagPanel + [\#1781](https://github.com/matrix-org/matrix-react-sdk/pull/1781) + * [DO NOT MERGE] Tests proven to fail + [\#1780](https://github.com/matrix-org/matrix-react-sdk/pull/1780) + * Fix room power level settings + [\#1779](https://github.com/matrix-org/matrix-react-sdk/pull/1779) + * fix shouldHideEvent saying an event is a leave/join when a profile ch… + [\#1769](https://github.com/matrix-org/matrix-react-sdk/pull/1769) + * Add "Did you know:..." microcopy to groups view + [\#1777](https://github.com/matrix-org/matrix-react-sdk/pull/1777) + * Give emptySubListTip a container for correct bg colour + [\#1753](https://github.com/matrix-org/matrix-react-sdk/pull/1753) + * Do proper null-checks on decypted events to fix NPEs + [\#1776](https://github.com/matrix-org/matrix-react-sdk/pull/1776) + * Reorder the RoomListStore lists on Event.decrypted + [\#1775](https://github.com/matrix-org/matrix-react-sdk/pull/1775) + * Fix bug where global "Never send to unverified..." is ignored + [\#1772](https://github.com/matrix-org/matrix-react-sdk/pull/1772) + * Fix bug that prevented tint updates + [\#1767](https://github.com/matrix-org/matrix-react-sdk/pull/1767) + * Fix group member spinner being out of flex order + [\#1765](https://github.com/matrix-org/matrix-react-sdk/pull/1765) + * Allow widget iframes to request camera and microphone permissions. + [\#1766](https://github.com/matrix-org/matrix-react-sdk/pull/1766) + * Change icon from "R" to "X" + [\#1764](https://github.com/matrix-org/matrix-react-sdk/pull/1764) + * Regenerate room lists on Room event + [\#1762](https://github.com/matrix-org/matrix-react-sdk/pull/1762) + * Fix DMs being marked as with the current user ("me") + [\#1761](https://github.com/matrix-org/matrix-react-sdk/pull/1761) + * Make RoomListStore aware of Room.timeline events + [\#1756](https://github.com/matrix-org/matrix-react-sdk/pull/1756) + * improve origin check of ScalarMessaging postmessage API. + [\#1760](https://github.com/matrix-org/matrix-react-sdk/pull/1760) + * Implement global filter to deselect all tags + [\#1759](https://github.com/matrix-org/matrix-react-sdk/pull/1759) + * Don't show empty custom tags when filtering tags + [\#1758](https://github.com/matrix-org/matrix-react-sdk/pull/1758) + * Do not assume that tags have been removed + [\#1757](https://github.com/matrix-org/matrix-react-sdk/pull/1757) + * Change CSS class for message panel spinner + [\#1747](https://github.com/matrix-org/matrix-react-sdk/pull/1747) + * Remove RoomListStore listener + [\#1752](https://github.com/matrix-org/matrix-react-sdk/pull/1752) + * Implement GroupTile avatar dragging to TagPanel + [\#1751](https://github.com/matrix-org/matrix-react-sdk/pull/1751) + * Fix custom tags not being ordered manually + [\#1750](https://github.com/matrix-org/matrix-react-sdk/pull/1750) + * Store component state for editors + [\#1746](https://github.com/matrix-org/matrix-react-sdk/pull/1746) + * Give the login page its spinner back + [\#1745](https://github.com/matrix-org/matrix-react-sdk/pull/1745) + * Add context menu to TagTile + [\#1743](https://github.com/matrix-org/matrix-react-sdk/pull/1743) + * If a tag is unrecognised, assume manual ordering + [\#1748](https://github.com/matrix-org/matrix-react-sdk/pull/1748) + * Move RoomList state to RoomListStore + [\#1719](https://github.com/matrix-org/matrix-react-sdk/pull/1719) + * Move groups button to TagPanel + [\#1744](https://github.com/matrix-org/matrix-react-sdk/pull/1744) + * Add seconds to timestamp on hover + [\#1738](https://github.com/matrix-org/matrix-react-sdk/pull/1738) + * Do not truncate autocompleted users in composer + [\#1739](https://github.com/matrix-org/matrix-react-sdk/pull/1739) + * RoomView: guard against unmounting during peeking + [\#1737](https://github.com/matrix-org/matrix-react-sdk/pull/1737) + * Fix HS/IS URL reset when switching to Registration + [\#1736](https://github.com/matrix-org/matrix-react-sdk/pull/1736) + * Fix the reject/accept call buttons in canary (mk2) + [\#1734](https://github.com/matrix-org/matrix-react-sdk/pull/1734) + * Make ratelimitedfunc time from the function's end + [\#1731](https://github.com/matrix-org/matrix-react-sdk/pull/1731) + * Give dialogs a matrixClient context + [\#1735](https://github.com/matrix-org/matrix-react-sdk/pull/1735) + * Fix key bindings in address picker dialog + [\#1732](https://github.com/matrix-org/matrix-react-sdk/pull/1732) + * Try upgrading eslint-plugin-react + [\#1712](https://github.com/matrix-org/matrix-react-sdk/pull/1712) + * Fix display name change text + [\#1730](https://github.com/matrix-org/matrix-react-sdk/pull/1730) + * Persist contentState when sending SlashCommand via MessageComposerInput + [\#1721](https://github.com/matrix-org/matrix-react-sdk/pull/1721) + * This is actually MFileBody not MImageBody, change classname + [\#1726](https://github.com/matrix-org/matrix-react-sdk/pull/1726) + * Use invite_3pid prop of createRoom instead of manual invite after create + [\#1717](https://github.com/matrix-org/matrix-react-sdk/pull/1717) + * guard against m.room.aliases events with no keys (redaction?) + [\#1729](https://github.com/matrix-org/matrix-react-sdk/pull/1729) + * Fix not showing Invited section if all invites are 3PID + [\#1718](https://github.com/matrix-org/matrix-react-sdk/pull/1718) + * Fix Rich Replies on files + [\#1720](https://github.com/matrix-org/matrix-react-sdk/pull/1720) + * Update from Weblate. + [\#1728](https://github.com/matrix-org/matrix-react-sdk/pull/1728) + * Null guard against falsey (non-null) props.node, to make react happy + [\#1724](https://github.com/matrix-org/matrix-react-sdk/pull/1724) + * Use correct condition for getting account data after first sync + [\#1722](https://github.com/matrix-org/matrix-react-sdk/pull/1722) + * Fix order calculation logic when reordering a room + [\#1725](https://github.com/matrix-org/matrix-react-sdk/pull/1725) + * Linear Rich Quoting + [\#1715](https://github.com/matrix-org/matrix-react-sdk/pull/1715) + * Fix CreateGroupDialog issues + [\#1714](https://github.com/matrix-org/matrix-react-sdk/pull/1714) + * Show a warning if the user attempts to leave a room that is invite only + [\#1713](https://github.com/matrix-org/matrix-react-sdk/pull/1713) + * Swap RoomList to react-beautiful-dnd + [\#1711](https://github.com/matrix-org/matrix-react-sdk/pull/1711) + * don't pass back {} when we have no `org.matrix.room.color_scheme` + [\#1710](https://github.com/matrix-org/matrix-react-sdk/pull/1710) + * Don't paginate whilst decrypting events + [\#1700](https://github.com/matrix-org/matrix-react-sdk/pull/1700) + * Fall back for missing i18n plurals + [\#1699](https://github.com/matrix-org/matrix-react-sdk/pull/1699) + * Fix group store redundant requests + [\#1709](https://github.com/matrix-org/matrix-react-sdk/pull/1709) + * Ignore remote echos caused by this client + [\#1708](https://github.com/matrix-org/matrix-react-sdk/pull/1708) + * Replace TagPanel react-dnd with react-beautiful-dnd + [\#1705](https://github.com/matrix-org/matrix-react-sdk/pull/1705) + * Only set selected tags state when updating rooms + [\#1704](https://github.com/matrix-org/matrix-react-sdk/pull/1704) + * Add formatFullDateNoTime to DateUtils and stop passing 12/24h to DateSep + [\#1702](https://github.com/matrix-org/matrix-react-sdk/pull/1702) + * Fix autofocus on QuestionDialog + [\#1698](https://github.com/matrix-org/matrix-react-sdk/pull/1698) + * Iterative fixes on Rich Quoting + [\#1697](https://github.com/matrix-org/matrix-react-sdk/pull/1697) + * Fix missing negation + [\#1696](https://github.com/matrix-org/matrix-react-sdk/pull/1696) + * Add Analytics Info and add Piwik to SdkConfig.DEFAULTS + [\#1625](https://github.com/matrix-org/matrix-react-sdk/pull/1625) + * Attempt to re-register for a scalar token if ours is invalid + [\#1668](https://github.com/matrix-org/matrix-react-sdk/pull/1668) + * Normalise dialogs + [\#1674](https://github.com/matrix-org/matrix-react-sdk/pull/1674) + * Add 'send without verifying' to status bar + [\#1695](https://github.com/matrix-org/matrix-react-sdk/pull/1695) + * Implement Rich Quoting/Replies + [\#1660](https://github.com/matrix-org/matrix-react-sdk/pull/1660) + * Revert "MD-escape URLs/alises/user IDs prior to parsing markdown" + [\#1694](https://github.com/matrix-org/matrix-react-sdk/pull/1694) + * Cache isConfCallRoom + [\#1693](https://github.com/matrix-org/matrix-react-sdk/pull/1693) + * Improve performance of tag panel selection (when tags are selected) + [\#1687](https://github.com/matrix-org/matrix-react-sdk/pull/1687) + * Hide status bar on visible->hidden transition + [\#1680](https://github.com/matrix-org/matrix-react-sdk/pull/1680) + * [revived] Singularise unsent message prompt, if applicable + [\#1692](https://github.com/matrix-org/matrix-react-sdk/pull/1692) + * small refactor && warn on self-demotion + [\#1683](https://github.com/matrix-org/matrix-react-sdk/pull/1683) + * Remove use of deprecated React.PropTypes + [\#1677](https://github.com/matrix-org/matrix-react-sdk/pull/1677) + * only save RelatedGroupSettings if it was modified. Otherwise perms issue + [\#1691](https://github.com/matrix-org/matrix-react-sdk/pull/1691) + * Fix a couple more issues with granular settings + [\#1675](https://github.com/matrix-org/matrix-react-sdk/pull/1675) + * Allow argument to op slashcommand to be negative as PLs can be -ve + [\#1673](https://github.com/matrix-org/matrix-react-sdk/pull/1673) + * Update from Weblate. + [\#1645](https://github.com/matrix-org/matrix-react-sdk/pull/1645) + * make RoomDetailRow reusable for the Room Directory + [\#1624](https://github.com/matrix-org/matrix-react-sdk/pull/1624) + * Prefetch group data for all joined groups when RoomList mounts + [\#1686](https://github.com/matrix-org/matrix-react-sdk/pull/1686) + * Remove unused selectedRoom prop + [\#1690](https://github.com/matrix-org/matrix-react-sdk/pull/1690) + * Fix shift and shift-ctrl click in TagPanel + [\#1684](https://github.com/matrix-org/matrix-react-sdk/pull/1684) + * skip direct chats which either you or the target have left + [\#1344](https://github.com/matrix-org/matrix-react-sdk/pull/1344) + * Make scroll on paste in RTE compatible with https://github.com/vector-im + /riot-web/pull/5900 + [\#1682](https://github.com/matrix-org/matrix-react-sdk/pull/1682) + * Remove extra full stop + [\#1685](https://github.com/matrix-org/matrix-react-sdk/pull/1685) + * Dedupe requests to fetch group profile data + [\#1666](https://github.com/matrix-org/matrix-react-sdk/pull/1666) + * Get Group profile from TagTile instead of TagPanel + [\#1667](https://github.com/matrix-org/matrix-react-sdk/pull/1667) + * Fix leaking of GroupStore listeners in RoomList + [\#1664](https://github.com/matrix-org/matrix-react-sdk/pull/1664) + * Add option to also output untranslated string + [\#1658](https://github.com/matrix-org/matrix-react-sdk/pull/1658) + * Give the current theme to widgets and the integration manager + [\#1669](https://github.com/matrix-org/matrix-react-sdk/pull/1669) + * Fixes #1953 Allow multiple file uploads using drag & drop for RoomView + [\#1671](https://github.com/matrix-org/matrix-react-sdk/pull/1671) + * Fix issue with preview of phone number on register and waiting for sms code + confirmation code + [\#1670](https://github.com/matrix-org/matrix-react-sdk/pull/1670) + * Attempt to improve TagPanel performance + [\#1647](https://github.com/matrix-org/matrix-react-sdk/pull/1647) + * Fix one variant of a scroll jump that occurs when decrypting an m.text + [\#1656](https://github.com/matrix-org/matrix-react-sdk/pull/1656) + * Avoid NPEs by using ref method for collecting loggedInView in MatrixChat + [\#1665](https://github.com/matrix-org/matrix-react-sdk/pull/1665) + * DnD Ordered TagPanel + [\#1653](https://github.com/matrix-org/matrix-react-sdk/pull/1653) + * Update widget title on edit. + [\#1663](https://github.com/matrix-org/matrix-react-sdk/pull/1663) + * Set widget title + [\#1661](https://github.com/matrix-org/matrix-react-sdk/pull/1661) + * Display custom widget content titles + [\#1650](https://github.com/matrix-org/matrix-react-sdk/pull/1650) + * Add maximize / minimize apps drawer icons. + [\#1649](https://github.com/matrix-org/matrix-react-sdk/pull/1649) + * Warn when migrating e2e data to indexeddb + [\#1654](https://github.com/matrix-org/matrix-react-sdk/pull/1654) + * Don't Auto-show UnknownDeviceDialog + [\#1600](https://github.com/matrix-org/matrix-react-sdk/pull/1600) + * Remove logging. + [\#1655](https://github.com/matrix-org/matrix-react-sdk/pull/1655) + * Add messaging endpoint for room encryption status. + [\#1648](https://github.com/matrix-org/matrix-react-sdk/pull/1648) + * Add some missing translatable strings + [\#1588](https://github.com/matrix-org/matrix-react-sdk/pull/1588) + * Add widget -> riot postMessage API + [\#1640](https://github.com/matrix-org/matrix-react-sdk/pull/1640) + * Add some null checks + [\#1646](https://github.com/matrix-org/matrix-react-sdk/pull/1646) + * Implement shift-click and ctrl-click semantics for TP + [\#1641](https://github.com/matrix-org/matrix-react-sdk/pull/1641) + * Don't show group when clicking tag panel + [\#1642](https://github.com/matrix-org/matrix-react-sdk/pull/1642) + * Implement TagPanel (or LeftLeftPanel) for group filtering + [\#1639](https://github.com/matrix-org/matrix-react-sdk/pull/1639) + * Implement UI for using bulk device deletion API + [\#1638](https://github.com/matrix-org/matrix-react-sdk/pull/1638) + * Replace (IRC) with flair + [\#1637](https://github.com/matrix-org/matrix-react-sdk/pull/1637) + * Allow guests to view individual groups + [\#1635](https://github.com/matrix-org/matrix-react-sdk/pull/1635) + * Allow guest to see MyGroups, show ILAG when creating a group + [\#1636](https://github.com/matrix-org/matrix-react-sdk/pull/1636) + * Move group publication toggles to UserSettings + [\#1634](https://github.com/matrix-org/matrix-react-sdk/pull/1634) + * Pull the theme through the default process + [\#1617](https://github.com/matrix-org/matrix-react-sdk/pull/1617) + * Rebase ConfirmRedactDialog on QuestionDialog + [\#1630](https://github.com/matrix-org/matrix-react-sdk/pull/1630) + * Fix logging of missing substitution variables + [\#1629](https://github.com/matrix-org/matrix-react-sdk/pull/1629) + * Rename Related Groups to improve readability + [\#1632](https://github.com/matrix-org/matrix-react-sdk/pull/1632) + * Make PresenceLabel more easily translatable + [\#1616](https://github.com/matrix-org/matrix-react-sdk/pull/1616) + * Perform substitution on all parts, not just the last one + [\#1618](https://github.com/matrix-org/matrix-react-sdk/pull/1618) + * Send Access Token in Headers to help prevent it being spit out in errors + [\#1552](https://github.com/matrix-org/matrix-react-sdk/pull/1552) + * Add aria-labels to ActionButtons + [\#1628](https://github.com/matrix-org/matrix-react-sdk/pull/1628) + * MemberPresenceAvatar: fix null references + [\#1620](https://github.com/matrix-org/matrix-react-sdk/pull/1620) + * Disable presence controls if there's no presence + [\#1623](https://github.com/matrix-org/matrix-react-sdk/pull/1623) + * Fix GroupMemberList search for users without displayname + [\#1627](https://github.com/matrix-org/matrix-react-sdk/pull/1627) + * Remove redundant super class EventEmitter for FlairStore + [\#1626](https://github.com/matrix-org/matrix-react-sdk/pull/1626) + * Fix granular URL previews + [\#1622](https://github.com/matrix-org/matrix-react-sdk/pull/1622) + * Flairstore: Fix broken reference + [\#1619](https://github.com/matrix-org/matrix-react-sdk/pull/1619) + * Do something more sensible for sender profile name/aux opacity + [\#1615](https://github.com/matrix-org/matrix-react-sdk/pull/1615) + * Add eslint rule keyword-spacing + [\#1614](https://github.com/matrix-org/matrix-react-sdk/pull/1614) + * Fix various issues surrounding granular settings to date + [\#1613](https://github.com/matrix-org/matrix-react-sdk/pull/1613) + * differentiate between state events and message events + [\#1612](https://github.com/matrix-org/matrix-react-sdk/pull/1612) + * Refactor translations + [\#1608](https://github.com/matrix-org/matrix-react-sdk/pull/1608) + * Make TintableSvg links behave like normal image links + [\#1611](https://github.com/matrix-org/matrix-react-sdk/pull/1611) + * Fix linting errors. + [\#1610](https://github.com/matrix-org/matrix-react-sdk/pull/1610) + * Granular settings + [\#1516](https://github.com/matrix-org/matrix-react-sdk/pull/1516) + * Implement user-controlled presence + [\#1482](https://github.com/matrix-org/matrix-react-sdk/pull/1482) + * Edit widget icon styling + [\#1609](https://github.com/matrix-org/matrix-react-sdk/pull/1609) + * Attempt to improve textual power levels + [\#1607](https://github.com/matrix-org/matrix-react-sdk/pull/1607) + * Determine whether power level is custom once Roles have been determined + [\#1606](https://github.com/matrix-org/matrix-react-sdk/pull/1606) + * Status.im theme + [\#1605](https://github.com/matrix-org/matrix-react-sdk/pull/1605) + * Revert "Lowercase all usernames" + [\#1604](https://github.com/matrix-org/matrix-react-sdk/pull/1604) + +Changes in [0.11.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.11.4) (2018-02-09) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.11.3...v0.11.4) + + * Add isUrlPermitted function to sanity check URLs + Changes in [0.11.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.11.3) (2017-12-04) ===================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.11.2...v0.11.3) 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/jenkins.sh b/jenkins.sh index 3a2d66739e..8cf5ee4a1f 100755 --- a/jenkins.sh +++ b/jenkins.sh @@ -11,8 +11,10 @@ set -x # install the other dependencies npm install -# we may be using a dev branch of js-sdk in which case we need to build it -(cd node_modules/matrix-js-sdk && npm install) +scripts/fetchdep.sh matrix-org matrix-js-sdk +rm -r node_modules/matrix-js-sdk || true +ln -s ../matrix-js-sdk node_modules/matrix-js-sdk +(cd matrix-js-sdk && npm install) # run the mocha tests npm run test -- --no-colors diff --git a/package-lock.json b/package-lock.json index 6dd02674be..f183f1635d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.10.7", + "version": "0.12.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -268,7 +268,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -1203,10 +1203,7 @@ "boom": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.2.0" - } + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=" }, "brace-expansion": { "version": "1.1.8", @@ -1238,6 +1235,12 @@ "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", "integrity": "sha1-ns5bWsqJopkyJC4Yv5M975h2zBc=" }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "browserify-aes": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", @@ -1254,6 +1257,14 @@ "dev": true, "requires": { "pako": "0.2.9" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + } } }, "buffer": { @@ -1449,9 +1460,9 @@ "dev": true }, "commonmark": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.27.0.tgz", - "integrity": "sha1-2GwmK5YoIelIPGnFR7xYhAwEezQ=", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.28.1.tgz", + "integrity": "sha1-Buq41SM4uDn6Gi11rwCF7tGxvq4=", "requires": { "entities": "1.1.1", "mdurl": "1.0.1", @@ -1580,10 +1591,7 @@ "boom": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.2.0" - } + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==" } } }, @@ -1705,12 +1713,6 @@ "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, "doctrine": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", @@ -2139,7 +2141,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -2183,15 +2185,26 @@ } }, "eslint-plugin-react": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz", - "integrity": "sha512-tvjU9u3VqmW2vVuYnE8Qptq+6ji4JltjOjJ9u7VAOxVYkUkyBZWRvNYKbDv5fN+L6wiA+4we9+qQahZ0m63XEA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz", + "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", "dev": true, "requires": { - "doctrine": "2.0.0", + "doctrine": "2.1.0", "has": "1.0.1", "jsx-ast-utils": "2.0.1", "prop-types": "15.6.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + } } }, "espree": { @@ -2238,7 +2251,7 @@ "estree-walker": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.0.tgz", - "integrity": "sha512-/bEAy+yKAZQrEWUhGmS3H9XpGqSDBtRzX0I2PgMw9kA2n1jN22uV5B5p7MFdZdvWdXCRJztXAfx6ZeRfgkEETg==", + "integrity": "sha1-quO1fELeuAEONJyJJGLw5xxd0ao=", "dev": true }, "esutils": { @@ -2554,6 +2567,22 @@ } } }, + "focus-trap": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-2.4.3.tgz", + "integrity": "sha512-sT5Ip9nyAIxWq8Apt1Fdv6yTci5GotaOtO5Ro1/+F3PizttNBcCYz8j/Qze54PPFK73KUbOqh++HUCiyNPqvhA==", + "requires": { + "tabbable": "1.1.2" + } + }, + "focus-trap-react": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-3.1.2.tgz", + "integrity": "sha512-MoQmONoy9gRPyrC5DGezkcOMGgx7MtIOAQDHe098UtL2sA2vmucJwEmQisb+8LRXNYFHxuw5zJ1oLFeKu4Mteg==", + "requires": { + "focus-trap": "2.4.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2629,7 +2658,7 @@ "fsevents": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "integrity": "sha1-MoK3E/s62A7eDp/PRhG1qm/AM/Q=", "dev": true, "optional": true, "requires": { @@ -3562,6 +3591,11 @@ "assert-plus": "1.0.0" } }, + "gfm.css": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gfm.css/-/gfm.css-1.1.2.tgz", + "integrity": "sha512-KhK3rqxMj+UTLRxWnfUA5n8XZYMWfHrrcCxtWResYR2B3hWIqBM6v9FPGZSlVuX+ScLewizOvNkjYXuPs95ThQ==" + }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -3596,7 +3630,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", "dev": true }, "globby": { @@ -3616,7 +3650,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -3635,12 +3669,6 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3709,19 +3737,24 @@ "requires": { "boom": "4.3.1", "cryptiles": "3.1.2", - "hoek": "4.2.0", "sntp": "2.0.2" } }, - "highlight.js": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-8.9.1.tgz", - "integrity": "sha1-uKnFSTISqTkvAiK2SclhFJfr+4g=" + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=" + }, + "hoist-non-react-statics": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz", + "integrity": "sha512-6Bl6XsDT1ntE0lHbIhr4Kp2PGcleGZ66qu5Jqk8lc0Xc/IeG6gVLmwUGs/K0Us+L8VWoKgj0uWdPMataOsm31w==" }, "home-or-tmp": { "version": "2.0.0", @@ -3862,7 +3895,6 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, "requires": { "loose-envify": "1.3.1" } @@ -4137,30 +4169,6 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "dev": true, - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", - "dev": true - }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", - "dev": true - } - } - }, "jquery": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", @@ -4303,7 +4311,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -4472,6 +4480,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" }, + "lodash-es": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz", + "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==" + }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", @@ -4547,17 +4560,28 @@ "dev": true }, "matrix-js-sdk": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-0.8.5.tgz", - "integrity": "sha1-1ZAVTx53ADVyZw+p28rH5APnbk8=", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-0.10.1.tgz", + "integrity": "sha512-BLo+Okn2o///TyWBKtjFXvhlD32vGfr10eTE51hHx/jwaXO82VyGMzMi+IDPS4SDYUbvXI7PpamECeh9TXnV2w==", "requires": { "another-json": "0.2.0", + "babel-runtime": "6.26.0", "bluebird": "3.5.1", "browser-request": "0.3.3", "content-type": "1.0.4", "request": "2.83.0" } }, + "matrix-mock-request": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/matrix-mock-request/-/matrix-mock-request-1.2.1.tgz", + "integrity": "sha1-2aWrqNPYJG6I/3YyWYuZwUE/QjI=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "expect": "1.20.2" + } + }, "matrix-react-test-utils": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/matrix-react-test-utils/-/matrix-react-test-utils-0.1.1.tgz", @@ -4579,6 +4603,11 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, + "memoize-one": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-3.1.1.tgz", + "integrity": "sha512-YqVh744GsMlZu6xkhGslPSqSurOv6P+kLN2J3ysBZfagLcL5FdRK/0UpgLoL8hwjjEvvAVkjJZyFP+1T6p1vgA==" + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -4632,7 +4661,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { "brace-expansion": "1.1.8" } @@ -4660,75 +4689,73 @@ } }, "mocha": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", - "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.1.tgz", + "integrity": "sha512-kKKs/H1KrMMQIEsWNxGmb4/BGsmj0dkeyotEvbrAuQ01FcWRLssUNXCEUZk6SZtyJBi6EE7SL0zDDtItw1rGhw==", "dev": true, "requires": { - "commander": "2.3.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "3.2.11", - "growl": "1.9.2", - "jade": "0.26.3", + "browser-stdout": "1.3.1", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "minimatch": "3.0.4", "mkdirp": "0.5.1", - "supports-color": "1.2.0", - "to-iso-string": "0.0.2" + "supports-color": "4.4.0" }, "dependencies": { - "commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", - "dev": true - }, "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "0.7.1" + "ms": "2.0.0" } }, - "escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", "inherits": "2.0.3", - "minimatch": "0.3.0" + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2.2.4", - "sigmund": "1.0.1" - } + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, "supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", - "dev": true + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } } } }, @@ -4979,10 +5006,9 @@ } }, "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" }, "parallelshell": { "version": "3.0.2", @@ -5205,10 +5231,23 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "requires": { + "performance-now": "2.1.0" + } + }, + "raf-schd": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-2.1.1.tgz", + "integrity": "sha512-ngcBQygUeE3kHlOaBSqgWKv7BT9kx5kQ6fAwFJRNRT7TD54M+hx1kpNHb8sONRskcYQedJg2RC2xKlAHRUQBig==" + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", "dev": true, "requires": { "is-number": "3.0.0", @@ -5287,6 +5326,23 @@ "integrity": "sha1-wStu/cIkfBDae4dw0YUICnsEcVY=", "dev": true }, + "react-beautiful-dnd": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-4.0.1.tgz", + "integrity": "sha512-d73RMu4QOFCyjUELLWFyY/EuclnfqulI9pECx+2gIuJvV0ycf1uR88o+1x0RSB9ILD70inHMzCBKNkWVbbt+vA==", + "requires": { + "babel-runtime": "6.26.0", + "invariant": "2.2.2", + "memoize-one": "3.1.1", + "prop-types": "15.6.0", + "raf-schd": "2.1.1", + "react-motion": "0.5.2", + "react-redux": "5.0.7", + "redux": "3.7.2", + "redux-thunk": "2.2.0", + "reselect": "3.0.1" + } + }, "react-dom": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", @@ -5304,6 +5360,43 @@ "gemini-scrollbar": "github:matrix-org/gemini-scrollbar#b302279810d05319ac5ff1bd34910bff32325c7b" } }, + "react-motion": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", + "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", + "requires": { + "performance-now": "0.2.0", + "prop-types": "15.6.0", + "raf": "3.4.0" + }, + "dependencies": { + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + } + } + }, + "react-redux": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", + "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", + "requires": { + "hoist-non-react-statics": "2.5.0", + "invariant": "2.2.2", + "lodash": "4.17.10", + "lodash-es": "4.17.10", + "loose-envify": "1.3.1", + "prop-types": "15.6.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + } + } + }, "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", @@ -5350,6 +5443,22 @@ "resolve": "1.4.0" } }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "4.17.4", + "lodash-es": "4.17.10", + "loose-envify": "1.3.1", + "symbol-observable": "1.2.0" + } + }, + "redux-thunk": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.2.0.tgz", + "integrity": "sha1-5hWhbha0ehmlFXZhM9Hj6Zt4UuU=" + }, "regenerate": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", @@ -5498,6 +5607,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, + "reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=" + }, "resolve": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", @@ -5544,7 +5658,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -5642,7 +5756,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -5655,12 +5769,6 @@ } } }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, "sinon": { "version": "1.17.7", "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", @@ -5688,10 +5796,7 @@ "sntp": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", - "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", - "requires": { - "hoek": "4.2.0" - } + "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=" }, "socket.io": { "version": "1.7.3", @@ -5848,24 +5953,30 @@ "dev": true }, "source-map-loader": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.1.6.tgz", - "integrity": "sha1-wJkD2m1zueU7ftjuUkVZcFHpjpE=", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.3.tgz", + "integrity": "sha512-MYbFX9DYxmTQFfy2v8FC1XZwpwHKYxg3SK8Wb7VPBKuhDjz8gi9re2819MsG4p49HDyiOSUKlmZ+nQBArW5CGw==", "dev": true, "requires": { - "async": "0.9.2", + "async": "2.6.0", "loader-utils": "0.2.17", - "source-map": "0.1.43" + "source-map": "0.6.1" }, "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "amdefine": "1.0.1" + "lodash": "4.17.4" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -5917,7 +6028,7 @@ "stream-http": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", "dev": true, "requires": { "builtin-status-codes": "3.0.0", @@ -5983,6 +6094,16 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, + "tabbable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-1.1.2.tgz", + "integrity": "sha512-77oqsKEPrxIwgRcXUwipkj9W5ItO97L6eUT1Ar7vh+El16Zm4M6V+YU1cbipHEa6q0Yjw8O3Hoh8oRgatV5s7A==" + }, "table": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", @@ -6111,12 +6232,6 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "to-iso-string": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", - "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", - "dev": true - }, "tough-cookie": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", diff --git a/package.json b/package.json index eb2cabf854..6c34979c43 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.11.3", + "version": "0.12.5", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { @@ -25,7 +25,8 @@ "release.sh", "scripts", "src", - "test" + "test", + "res" ], "bin": { "reskindex": "scripts/reskindex.js", @@ -43,7 +44,7 @@ "start": "parallelshell \"npm run build:watch\" \"npm run reskindex:watch\"", "lint": "eslint src/", "lintall": "eslint src/ test/", - "lintwithexclusions": "eslint --max-warnings 0 --ignore-path .eslintignore.errorfiles src test", + "lintwithexclusions": "eslint --max-warnings 20 --ignore-path .eslintignore.errorfiles src test", "clean": "rimraf lib", "prepublish": "npm run clean && npm run build && git rev-parse HEAD > git-revision.txt", "test": "karma start --single-run=true --browsers ChromeHeadless", @@ -65,21 +66,25 @@ "file-saver": "^1.3.3", "filesize": "3.5.6", "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.9.2", + "lolex": "2.3.2", + "matrix-js-sdk": "0.10.2", "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-dnd": "^2.1.4", - "react-dnd-html5-backend": "^2.1.2", - "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", @@ -107,7 +112,7 @@ "eslint-config-google": "^0.7.1", "eslint-plugin-babel": "^4.0.1", "eslint-plugin-flowtype": "^2.30.0", - "eslint-plugin-react": "^7.4.0", + "eslint-plugin-react": "^7.7.0", "estree-walker": "^0.5.0", "expect": "^1.16.0", "flow-parser": "^0.57.3", @@ -122,14 +127,15 @@ "karma-spec-reporter": "^0.0.31", "karma-summary-reporter": "^1.3.3", "karma-webpack": "^1.7.0", + "matrix-mock-request": "^1.2.1", "matrix-react-test-utils": "^0.1.1", - "mocha": "^2.4.5", + "mocha": "^5.0.5", "parallelshell": "^3.0.2", "react-addons-test-utils": "^15.4.0", "require-json": "0.0.1", "rimraf": "^2.4.3", "sinon": "^1.17.3", - "source-map-loader": "^0.1.5", + "source-map-loader": "^0.2.3", "walk": "^2.3.9", "webpack": "^1.12.14" } diff --git a/res/css/_common.scss b/res/css/_common.scss new file mode 100644 index 0000000000..c4cda6821e --- /dev/null +++ b/res/css/_common.scss @@ -0,0 +1,362 @@ +/* +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; + color: $accent-fg-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..2734939ae3 --- /dev/null +++ b/res/css/_components.scss @@ -0,0 +1,110 @@ +// 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/_DeactivateAccountDialog.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/_ReplyThread.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/_ReplyPreview.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..87dc0aa756 --- /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_MFileBody_download { + display: flex; + font-size: 14px; + color: $event-timestamp-color; +} + +.mx_FilePanel .mx_EventTile .mx_MFileBody_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..6fae8d6c1a --- /dev/null +++ b/res/css/structures/_UserSettings.scss @@ -0,0 +1,257 @@ +/* +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; +} + +.mx_UserSettings_analyticsModal table { + margin: 10px 0px; +} 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/_DeactivateAccountDialog.scss b/res/css/views/dialogs/_DeactivateAccountDialog.scss new file mode 100644 index 0000000000..dc76da5b15 --- /dev/null +++ b/res/css/views/dialogs/_DeactivateAccountDialog.scss @@ -0,0 +1,23 @@ +/* +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_DeactivateAccountDialog .mx_Dialog_content { + margin-bottom: 30px; +} + +.mx_DeactivateAccountDialog .mx_DeactivateAccountDialog_input_section { + margin-top: 60px; +} 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/_ReplyThread.scss b/res/css/views/elements/_ReplyThread.scss new file mode 100644 index 0000000000..bf44a11728 --- /dev/null +++ b/res/css/views/elements/_ReplyThread.scss @@ -0,0 +1,37 @@ +/* +Copyright 2018 Vector Creations Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT 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_ReplyThread { + margin-top: 0; +} + +.mx_ReplyThread .mx_DateSeparator { + font-size: 1em !important; + margin-top: 0; + margin-bottom: 0; + padding-bottom: 1px; + bottom: -5px; +} + +.mx_ReplyThread_show { + cursor: pointer; +} + +blockquote.mx_ReplyThread { + margin-left: 0; + padding-left: 10px; + border-left: 4px solid $blockquote-bar-color; +} 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..1c809f0743 --- /dev/null +++ b/res/css/views/messages/_MImageBody.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_MImageBody { + display: block; + margin-right: 34px; +} + +.mx_MImageBody_thumbnail { + max-width: 100%; +} \ No newline at end of file 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..28d432686d --- /dev/null +++ b/res/css/views/rooms/_AppsDrawer.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_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_spinner_fadeIn { + animation-fill-mode: backwards; + animation-duration: 200ms; + animation-delay: 500ms; + animation-name: mx_AppLoading_spinner_fadeIn_animation; +} + +@keyframes mx_AppLoading_spinner_fadeIn_animation { + from { opacity: 0 } + to { opacity: 1 } +} + + +.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..ce2bf9c8a4 --- /dev/null +++ b/res/css/views/rooms/_EventTile.scss @@ -0,0 +1,538 @@ +/* +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, .mx_EventTile_reply { + 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_reply { + 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, +.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, +.mx_EventTile_redacted .mx_EventTile_reply .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; +} + +// Explicit relationships so that it doesn't apply to nested EventTile components (e.g in Replies) +.mx_EventTile_last > div > a > .mx_MessageTimestamp, +.mx_EventTile:hover > div > a > .mx_MessageTimestamp, +.mx_EventTile.menu > div > a > .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_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_e2eIcon_hidden { + display: none; +} + +/* always override hidden attribute for blocked and warning */ +.mx_EventTile_e2eIcon_hidden[src="img/e2e-blocked.svg"], +.mx_EventTile_e2eIcon_hidden[src="img/e2e-warning.svg"] { + display: block; +} + +.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; +} + +// Explicit relationships so that it doesn't apply to nested EventTile components (e.g in Replies) +.mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line > a > .mx_MessageTimestamp, +.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line > a > .mx_MessageTimestamp { + left: 3px; + width: auto; +} + +/* +.mx_EventTile_verified .mx_EventTile_e2eIcon { + display: none; +} +*/ + +// Explicit relationships so that it doesn't apply to nested EventTile components (e.g in Replies) +.mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line > .mx_EventTile_e2eIcon, +.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line > .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, .mx_EventTile_reply { + 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, .mx_EventTile_reply { + padding-top: 0px; + padding-bottom: 1px; + } + } + + .mx_EventTile.mx_EventTile_emote.mx_EventTile_continuation { + padding-top: 0; + .mx_EventTile_line, .mx_EventTile_reply { + padding-top: 0px; + padding-bottom: 0px; + } + } + + .mx_EventTile_line, .mx_EventTile_reply { + padding-top: 0px; + padding-bottom: 0px; + } + + .mx_EventTile_avatar { + top: 2px; + } + + .mx_EventTile_e2eIcon { + top: 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..0a708a8edc --- /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/_ReplyPreview.scss b/res/css/views/rooms/_ReplyPreview.scss new file mode 100644 index 0000000000..5bf4adff27 --- /dev/null +++ b/res/css/views/rooms/_ReplyPreview.scss @@ -0,0 +1,52 @@ +/* +Copyright 2018 Vector Creations Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT 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_ReplyPreview { + 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_ReplyPreview_section { + border-bottom: 1px solid $primary-hairline-color; +} + +.mx_ReplyPreview_header { + margin: 12px; + color: $primary-fg-color; + font-weight: 400; + opacity: 0.4; +} + +.mx_ReplyPreview_title { + float: left; +} + +.mx_ReplyPreview_cancel { + float: right; + cursor: pointer; +} + +.mx_ReplyPreview_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 @@ + + + + icons_owner + Created with sketchtool. + + + + + + + + + + + + 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 @@ + + + + 5EF602F6-A36C-41EE-BAEC-50801DFD5492 + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + D335F9E8-C813-47D7-B1BE-C8DEF2C8214F + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + 2A63B135-4281-4FBB-A88C-012AE22E9594 + Created with sketchtool. + + + + + + + + + \ 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-new-window.svg b/res/img/button-new-window.svg new file mode 100644 index 0000000000..dd1225e798 --- /dev/null +++ b/res/img/button-new-window.svg @@ -0,0 +1,12 @@ + + + + + + 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 @@ + + + + 01F3F9B2-8F38-4BAF-A345-AECAC3D88E79 + Created with sketchtool. + + + + + + + + + + + + \ 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 @@ + + + + 9BC64A5B-F157-43FF-BCC4-02D30CDF520B + Created with sketchtool. + + + + + + + + + + + + \ 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 @@ + + + + 654917CF-20A4-49B6-B0A1-9875D7B733C8 + Created with sketchtool. + + + + + + + + + + + + + + + \ 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 @@ + + + + B7D94619-44BC-4184-A60A-DBC5BB54E5F9 + Created with sketchtool. + + + + + + + + + + + + + + + \ 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 @@ + + + + B76754AB-42E6-48D2-9443-80CBC0DE02ED + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + 4CAFF494-61AE-4916-AFE8-D1E62F7CF0DE + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + + + + + + + + + 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 @@ + + + + 116426C2-0B55-480E-92B3-57D4B3ABAB90 + Created with sketchtool. + + + + + + + + + + + + \ 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 @@ + + + + 9FBC844D-96CF-4DCB-B545-FCD23727218B + Created with sketchtool. + + + + + + + + + + + + \ 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 @@ + + + + 294F929B-31AA-4D0C-98B3-9CA96764060D + Created with sketchtool. + + + + + + + + + + + + + + + \ 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 @@ + + + + F0F58459-A13A-48C5-9332-ABFB96726F05 + Created with sketchtool. + + + + + + + + + + + + + + + \ 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 @@ + + + + 3B24B8C7-64BE-4B3E-A748-94DB72E1210F + Created with sketchtool. + + + + + + + + + + + + \ 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 @@ + + + + BFC0418B-9081-4789-A231-B75953157748 + Created with sketchtool. + + + + + + + + + + + + \ 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 @@ + + + + 69B11088-0F3A-4E14-BD9F-4FEF4115E99B + Created with sketchtool. + + + + + + + + + + + + + \ 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 @@ + + + + A34F2223-34C6-46AE-AA47-38EC8984E9B3 + Created with sketchtool. + + + + + + + + + + + + + \ 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 @@ + + + + FD84FF7C-43E4-4312-90AB-5A59AD018377 + Created with sketchtool. + + + + + + + + + + + + + \ 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 @@ + + + + 13E7EE68-9B16-4A3D-8F9F-31E4BAB7E438 + Created with sketchtool. + + + + + + + + + + + + + \ 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 @@ + + + + icons_video + Created with bin/sketchtool. + + + + + + + + + + + + \ 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 @@ + + + + icon_camera + Created with Sketch. + + + + + + + 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 @@ + + + + + + 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 @@ + + + + Slice 1 + Created with Sketch. + + + + + 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 @@ + + + + Line + Line + Created with Sketch. + + + + + + + + \ 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 @@ + + + + Slice 1 + Created with Sketch. + + + + + \ 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 @@ + + + + Slice 1 + Created with Sketch. + + + + + \ 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 @@ + + + + Slice 1 + Created with Sketch. + + + + + \ 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 @@ + + + + icons_create_room + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + icons_directory + Created with sketchtool. + + + + + + + + + + + + + + + + + \ 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 @@ + + + + Fill 75 + Created with Sketch. + + + + + + + + + + + + + \ 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 @@ + + + + 2805649B-D39D-43EA-A357-659EF9B97BA4 + Created with sketchtool. + + + + + + + \ 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 @@ + + + + 16F5F38E-A6A3-472A-BC13-13F0F12876CF + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + 48BF5D32-306C-4B20-88EB-24B1F743CAC9 + Created with sketchtool. + + + + + + + \ 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 @@ + + + + CCDDE6F6-B552-48FD-AD54-6939841CA2DD + Created with sketchtool. + + + + + + + \ 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 @@ + + + + + + + + + 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 @@ + + + + + + + + + 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 @@ + + + + icons_archive + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + icon_eol + Created with sketchtool. + + + + + + + + + + + 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 @@ + + + + icons_browse_files + Created with bin/sketchtool. + + + + + + + + + + + + + \ 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 @@ + + + + Zoom + Created with Sketch. + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + Fill 72 + Path 98 + Created with Sketch. + + + + + + + + + + \ 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 @@ + + + + 943783E9-DBD7-4D4E-BAC9-35437C17C2C4 + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + + + + + 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 @@ + + + + + + + + + + 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 @@ + + + + DAE17B64-40B5-478A-8E8D-97AD1A6E25C8 + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + 8A6E1837-F0F1-432E-A0DA-6F3741F71EBF + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + CD51482C-F2D4-4F63-AF9E-86513F9AF87F + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + B160345F-40D3-4BE6-A860-6D04BF223EF7 + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + + + + + + + + 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 @@ + + + + + + + + + + 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 @@ + + + + + + + + + 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 @@ + + + + + + + + + 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 @@ + + + + + + + + + + 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 @@ + + + + 6F488856-F8EF-479C-9747-AB6E0945C7DE + Created with sketchtool. + + + + + + + + + + + + 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 @@ + + + + 9BA71BF4-DC4F-42D2-B2D0-9EAE0F7F8D45 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + 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 @@ + + + + B542A09B-DBBF-41D4-A5FD-D05EE1E6BBC4 + Created with sketchtool. + + + + + + + + + + + + + \ 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 @@ + + + + 28D80248-63BA-4A5F-9216-4CFE72784BAC + Created with sketchtool. + + + + + + + + + + \ 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 @@ + + + + + + + + + + + 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 @@ + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + ED5D3E59-2561-4AC1-9B43-82FBC51767FC + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + ED5D3E59-2561-4AC1-9B43-82FBC51767FC + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + + + image/svg+xml + + 81230A28-D944-4572-B5DB-C03CAA2B1FCA + + + + + + 81230A28-D944-4572-B5DB-C03CAA2B1FCA + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + + + image/svg+xml + + 81230A28-D944-4572-B5DB-C03CAA2B1FCA + + + + + + 81230A28-D944-4572-B5DB-C03CAA2B1FCA + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + + + image/svg+xml + + ED5D3E59-2561-4AC1-9B43-82FBC51767FC + + + + + + ED5D3E59-2561-4AC1-9B43-82FBC51767FC + Created with sketchtool. + + + + + + + + + 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 @@ + + + + + + image/svg+xml + + ED5D3E59-2561-4AC1-9B43-82FBC51767FC + + + + + + ED5D3E59-2561-4AC1-9B43-82FBC51767FC + Created with sketchtool. + + + + + + + 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 @@ + + + + 815EF7DE-169A-4322-AE2A-B65CBE91DCED + Created with sketchtool. + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + 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 @@ + + + + 206C270A-EB00-48E4-8CC3-5D403C59177C + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + +icons_create_room +Created with sketchtool. + + + + + + + + + + + + + + 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 @@ + + + + 0F9BCC43-B3A7-4C9F-8E34-1F38194362C2 + Created with sketchtool. + + + + + + + + + + + + + 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 @@ + + + + icons_directory + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + 7C98C075-AB4D-45A3-85F9-CCD46F84DA7F + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + 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 @@ + + + + + + 81230A28-D944-4572-B5DB-C03CAA2B1FCA + Created with sketchtool. + + + + + + + + + + + + + + + + + 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 @@ + + + + 5E723325-BD0B-454D-BE25-638AF09A97AC + Created with sketchtool. + + + + + + + + + + + + + + \ 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 @@ + + + + 81230A28-D944-4572-B5DB-C03CAA2B1FCA + Created with sketchtool. + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + \ 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 @@ + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + 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 @@ + + + + + + + + + + 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 @@ + + + + + + + + + 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 @@ + + + + 69011392-CE9D-4404-A85C-A8548C5D850B + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + 4D42A2A7-7430-4D4F-A0A2-E19278CF66E3 + Created with sketchtool. + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + 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 @@ + + + + + + + + + + + + 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 @@ + + + + 05D354CE-86A7-4B6F-B9BE-F1CEBBD81B21 + Created with sketchtool. + + + + + + + + + + + + + + + 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 @@ + 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 @@ + + + + icons_global copy 4 + Created with Sketch. + + + + + + + + + + + + + + \ 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 @@ + + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Slice 1 +Created with Sketch. + + + + 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 @@ + + + + +Slice 1 +Created with Sketch. + + + + 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 @@ + + + +minimise +Created with sketchtool. + + + + + + + + + + + + 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 @@ + + + + + + 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 @@ + + + + minimise + Created with sketchtool. + + + + + + + + + + + + + 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 @@ + + + + + + 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 @@ + + + + icons_admin + Created with sketchtool. + + + + + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + icon_newmessages + Created with Sketch. + + + + + + + + + + \ 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 @@ + + + + E15782FC-B5FA-472A-AE12-CFFF484E7253 + Created with sketchtool. + + + + + + + + + + + + + + + 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 @@ + + + + 16CB4618-0BD3-4568-BB20-FC56EBC46046 + Created with sketchtool. + + + + + + + + + + + + + + + + + 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 @@ + + + + Line + Line + Created with Sketch. + + + + + + + + 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 @@ + + + + right_search + Created with Sketch. + + + + + + + + + + + + \ 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 @@ + + + + icon_newmessages + Created with Sketch. + + + + + + + + + + \ 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 @@ + + + + Slice 1 + Created with Sketch. + + + + + + + + + + + + + + + + \ 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 @@ + + + + + + image/svg+xml + + + + + + + icon_newmessages + Created with Sketch. + + + + + + + + + + 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 @@ + + + + icon_search + Created with Sketch. + + + + + + + + + + \ 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 @@ + + + + + + + + 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 @@ + + + + icons_search + Created with bin/sketchtool. + + + + + + + + + + + + \ 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 @@ + + + + icons_settings + Created with sketchtool. + + + + + + + + + + + + + \ 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 @@ + + + + icon_settings_small + Created with bin/sketchtool. + + + + + + + \ 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 @@ + + + + sound_indicator + Created with Sketch. + + + + + + + + + + + + \ 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 @@ + + + + icon_tick + Created with sketchtool. + + + + + + + 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 @@ + + + + icons_upload_drop + Created with bin/sketchtool. + + + + + + + + + + + + + + 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 @@ + + + + icons_upload + Created with bin/sketchtool. + + + + + + + + + + + + + + \ 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 @@ + + + + icons_video copy + Created with Sketch. + + + + + + + + + + + + \ 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 @@ + + + + icons_video copy + Created with Sketch. + + + + + + + + + + + + + \ 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 @@ + + + + Audio + Created with Sketch. + + + + + + + + + \ 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 @@ + + + + Audio + Created with Sketch. + + + + + + + + + + \ 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 @@ + + + + icon_voice + Created with Sketch. + + + + + + + + \ 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 @@ + + + + Triangle 1 + Created with Sketch. + + + + + + + \ 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/fetchdep.sh b/scripts/fetchdep.sh new file mode 100755 index 0000000000..73c622133b --- /dev/null +++ b/scripts/fetchdep.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +set -e + +org="$1" +repo="$2" + +rm -r "$repo" || true + +curbranch="$TRAVIS_PULL_REQUEST_BRANCH" +[ -z "$curbranch" ] && curbranch="$TRAVIS_BRANCH" +[ -z "$curbranch" ] && curbranch=`"echo $GIT_BRANCH" | sed -e 's/^origin\///'` # jenkins + +if [ -n "$curbranch" ] +then + echo "Determined branch to be $curbranch" + + git clone https://github.com/$org/$repo.git $repo --branch "$curbranch" && exit 0 +fi + +echo "Checking out develop branch" +git clone https://github.com/$org/$repo.git $repo --branch develop 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/scripts/travis.sh b/scripts/travis.sh index c4a06c1bd1..48410ea904 100755 --- a/scripts/travis.sh +++ b/scripts/travis.sh @@ -2,6 +2,14 @@ set -ex +scripts/fetchdep.sh matrix-org matrix-js-sdk +rm -r node_modules/matrix-js-sdk || true +ln -s ../matrix-js-sdk node_modules/matrix-js-sdk + +cd matrix-js-sdk +npm install +cd .. + npm run test ./.travis-test-riot.sh diff --git a/src/Analytics.js b/src/Analytics.js index 5c39b48a35..8ffce7077f 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -16,51 +16,75 @@ import { getCurrentLanguage, _t, _td } from './languageHandler'; import PlatformPeg from './PlatformPeg'; -import SdkConfig, { DEFAULTS } from './SdkConfig'; +import SdkConfig from './SdkConfig'; import Modal from './Modal'; import sdk from './index'; -function getRedactedHash() { - return window.location.hash.replace(/#\/(group|room|user)\/(.+)/, "#/$1/"); +const hashRegex = /#\/(groups?|room|user|settings|register|login|forgot_password|home|directory)/; +const hashVarRegex = /#\/(group|room|user)\/.*$/; + +// Remove all but the first item in the hash path. Redact unexpected hashes. +function getRedactedHash(hash) { + // Don't leak URLs we aren't expecting - they could contain tokens/PII + const match = hashRegex.exec(hash); + if (!match) { + console.warn(`Unexpected hash location "${hash}"`); + return '#/'; + } + + if (hashVarRegex.test(hash)) { + return hash.replace(hashVarRegex, "#/$1/"); + } + + return hash.replace(hashRegex, "#/$1"); } +// Return the current origin and hash separated with a `/`. This does not include query parameters. function getRedactedUrl() { - // hardcoded url to make piwik happy - return 'https://riot.im/app/' + getRedactedHash(); + const { origin, pathname, hash } = window.location; + return origin + pathname + getRedactedHash(hash); } const customVariables = { 'App Platform': { id: 1, expl: _td('The platform you\'re on'), + example: 'Electron Platform', }, 'App Version': { id: 2, expl: _td('The version of Riot.im'), + example: '15.0.0', }, 'User Type': { id: 3, expl: _td('Whether or not you\'re logged in (we don\'t record your user name)'), + example: 'Logged In', }, 'Chosen Language': { id: 4, expl: _td('Your language of choice'), + example: 'en', }, 'Instance': { id: 5, expl: _td('Which officially provided instance you are using, if any'), + example: 'app', }, 'RTE: Uses Richtext Mode': { id: 6, expl: _td('Whether or not you\'re using the Richtext mode of the Rich Text Editor'), + example: 'off', }, 'Homeserver URL': { id: 7, expl: _td('Your homeserver\'s URL'), + example: 'https://matrix.org', }, 'Identity Server URL': { id: 8, expl: _td('Your identity server\'s URL'), + example: 'https://vector.im', }, }; @@ -92,6 +116,10 @@ class Analytics { */ disable() { this.trackEvent('Analytics', 'opt-out'); + // disableHeartBeatTimer is undocumented but exists in the piwik code + // the _paq.push method will result in an error being printed in the console + // if an unknown method signature is passed + this._paq.push(['disableHeartBeatTimer']); this.disabled = true; } @@ -143,7 +171,7 @@ class Analytics { return true; } - trackPageChange() { + trackPageChange(generationTimeMs) { if (this.disabled) return; if (this.firstPage) { // De-duplicate first page @@ -151,6 +179,14 @@ class Analytics { this.firstPage = false; return; } + + if (typeof generationTimeMs === 'number') { + this._paq.push(['setGenerationTimeMs', generationTimeMs]); + } else { + console.warn('Analytics.trackPageChange: expected generationTimeMs to be a number'); + // But continue anyway because we still want to track the change + } + this._paq.push(['setCustomUrl', getRedactedUrl()]); this._paq.push(['trackPageView']); } @@ -166,6 +202,7 @@ class Analytics { } _setVisitVariable(key, value) { + if (this.disabled) return; this._paq.push(['setCustomVariable', customVariables[key].id, key, value, 'visit']); } @@ -173,8 +210,10 @@ class Analytics { if (this.disabled) return; const config = SdkConfig.get(); - const whitelistedHSUrls = config.piwik.whitelistedHSUrls || DEFAULTS.piwik.whitelistedHSUrls; - const whitelistedISUrls = config.piwik.whitelistedISUrls || DEFAULTS.piwik.whitelistedISUrls; + if (!config.piwik) return; + + const whitelistedHSUrls = config.piwik.whitelistedHSUrls || []; + const whitelistedISUrls = config.piwik.whitelistedISUrls || []; this._setVisitVariable('User Type', isGuest ? 'Guest' : 'Logged In'); this._setVisitVariable('Homeserver URL', whitelistRedact(whitelistedHSUrls, homeserverUrl)); @@ -187,36 +226,56 @@ class Analytics { } showDetailsModal() { - const Tracker = window.Piwik.getAsyncTracker(); - const rows = Object.values(customVariables).map((v) => Tracker.getCustomVariable(v.id)).filter(Boolean); + let rows = []; + if (window.Piwik) { + const Tracker = window.Piwik.getAsyncTracker(); + rows = Object.values(customVariables).map((v) => Tracker.getCustomVariable(v.id)).filter(Boolean); + } else { + // Piwik may not have been enabled, so show example values + rows = Object.keys(customVariables).map( + (k) => [ + k, + _t('e.g. %(exampleValue)s', { exampleValue: customVariables[k].example }), + ], + ); + } const resolution = `${window.screen.width}x${window.screen.height}`; + const otherVariables = [ + { + expl: _td('Every page you use in the app'), + value: _t( + 'e.g. ', + {}, + { + CurrentPageURL: getRedactedUrl(), + }, + ), + }, + { expl: _td('Your User Agent'), value: navigator.userAgent }, + { expl: _td('Your device resolution'), value: resolution }, + ]; const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); Modal.createTrackedDialog('Analytics Details', '', ErrorDialog, { title: _t('Analytics'), - description:
+ description:
{ _t('The information being sent to us to help make Riot.im better includes:') }
{ rows.map((row) => - + { row[1] !== undefined && } ) } -
{ _t(customVariables[row[0]].expl) }{ row[1] }{ row[1] }
-
-
- { _t('We also record each page you use in the app (currently ), your User Agent' - + ' () and your device resolution ().', - {}, - { - CurrentPageHash: { getRedactedHash() }, - CurrentUserAgent: { navigator.userAgent }, - CurrentDeviceResolution: { resolution }, - }, + { otherVariables.map((item, index) => + + { _t(item.expl) } + { item.value } + , ) } - + +
{ _t('Where this page includes identifiable information, such as a room, ' + 'user or group ID, that data is removed before being sent to the server.') }
diff --git a/src/ContentMessages.js b/src/ContentMessages.js index 8d40b65124..7fe625f8b9 100644 --- a/src/ContentMessages.js +++ b/src/ContentMessages.js @@ -275,6 +275,13 @@ class ContentMessages { this.nextId = 0; } + sendStickerContentToRoom(url, roomId, info, text, matrixClient) { + return MatrixClientPeg.get().sendStickerMessage(roomId, url, info, text).catch((e) => { + console.warn(`Failed to send content with URL ${url} to room ${roomId}`, e); + throw e; + }); + } + sendContentToRoom(file, roomId, matrixClient) { const content = { body: file.name || 'Attachment', diff --git a/src/DateUtils.js b/src/DateUtils.js index 91df1e46d5..108697238c 100644 --- a/src/DateUtils.js +++ b/src/DateUtils.js @@ -50,11 +50,15 @@ function pad(n) { return (n < 10 ? '0' : '') + n; } -function twelveHourTime(date) { +function twelveHourTime(date, showSeconds=false) { let hours = date.getHours() % 12; const minutes = pad(date.getMinutes()); const ampm = date.getHours() >= 12 ? _t('PM') : _t('AM'); hours = hours ? hours : 12; // convert 0 -> 12 + if (showSeconds) { + const seconds = pad(date.getSeconds()); + return `${hours}:${minutes}:${seconds}${ampm}`; + } return `${hours}:${minutes}${ampm}`; } @@ -82,6 +86,17 @@ export function formatDate(date, showTwelveHour=false) { return formatFullDate(date, showTwelveHour); } +export function formatFullDateNoTime(date) { + const days = getDaysArray(); + const months = getMonthsArray(); + return _t('%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s', { + weekDayName: days[date.getDay()], + monthName: months[date.getMonth()], + day: date.getDate(), + fullYear: date.getFullYear(), + }); +} + export function formatFullDate(date, showTwelveHour=false) { const days = getDaysArray(); const months = getMonthsArray(); @@ -90,10 +105,17 @@ export function formatFullDate(date, showTwelveHour=false) { monthName: months[date.getMonth()], day: date.getDate(), fullYear: date.getFullYear(), - time: formatTime(date, showTwelveHour), + time: formatFullTime(date, showTwelveHour), }); } +export function formatFullTime(date, showTwelveHour=false) { + if (showTwelveHour) { + return twelveHourTime(date, true); + } + return pad(date.getHours()) + ':' + pad(date.getMinutes()) + ':' + pad(date.getSeconds()); +} + export function formatTime(date, showTwelveHour=false) { if (showTwelveHour) { return twelveHourTime(date); diff --git a/src/FromWidgetPostMessageApi.js b/src/FromWidgetPostMessageApi.js new file mode 100644 index 0000000000..792fd73733 --- /dev/null +++ b/src/FromWidgetPostMessageApi.js @@ -0,0 +1,210 @@ +/* +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 URL from 'url'; +import dis from './dispatcher'; +import IntegrationManager from './IntegrationManager'; +import WidgetMessagingEndpoint from './WidgetMessagingEndpoint'; + +const WIDGET_API_VERSION = '0.0.1'; // Current API version +const SUPPORTED_WIDGET_API_VERSIONS = [ + '0.0.1', +]; +const INBOUND_API_NAME = 'fromWidget'; + +// Listen for and handle incomming requests using the 'fromWidget' postMessage +// API and initiate responses +export default class FromWidgetPostMessageApi { + constructor() { + this.widgetMessagingEndpoints = []; + + this.start = this.start.bind(this); + this.stop = this.stop.bind(this); + this.onPostMessage = this.onPostMessage.bind(this); + } + + start() { + window.addEventListener('message', this.onPostMessage); + } + + stop() { + window.removeEventListener('message', this.onPostMessage); + } + + /** + * Register a widget endpoint for trusted postMessage communication + * @param {string} widgetId Unique widget identifier + * @param {string} endpointUrl Widget wurl origin (protocol + (optional port) + host) + */ + addEndpoint(widgetId, endpointUrl) { + const u = URL.parse(endpointUrl); + if (!u || !u.protocol || !u.host) { + console.warn('Add FromWidgetPostMessageApi endpoint - Invalid origin:', endpointUrl); + return; + } + + const origin = u.protocol + '//' + u.host; + const endpoint = new WidgetMessagingEndpoint(widgetId, origin); + if (this.widgetMessagingEndpoints.some(function(ep) { + return (ep.widgetId === widgetId && ep.endpointUrl === endpointUrl); + })) { + // Message endpoint already registered + console.warn('Add FromWidgetPostMessageApi - Endpoint already registered'); + return; + } else { + console.warn(`Adding fromWidget messaging endpoint for ${widgetId}`, endpoint); + this.widgetMessagingEndpoints.push(endpoint); + } + } + + /** + * De-register a widget endpoint from trusted communication sources + * @param {string} widgetId Unique widget identifier + * @param {string} endpointUrl Widget wurl origin (protocol + (optional port) + host) + * @return {boolean} True if endpoint was successfully removed + */ + removeEndpoint(widgetId, endpointUrl) { + const u = URL.parse(endpointUrl); + if (!u || !u.protocol || !u.host) { + console.warn('Remove widget messaging endpoint - Invalid origin'); + return; + } + + const origin = u.protocol + '//' + u.host; + if (this.widgetMessagingEndpoints && this.widgetMessagingEndpoints.length > 0) { + const length = this.widgetMessagingEndpoints.length; + this.widgetMessagingEndpoints = this.widgetMessagingEndpoints. + filter(function(endpoint) { + return (endpoint.widgetId != widgetId || endpoint.endpointUrl != origin); + }); + return (length > this.widgetMessagingEndpoints.length); + } + return false; + } + + /** + * Handle widget postMessage events + * Messages are only handled where a valid, registered messaging endpoints + * @param {Event} event Event to handle + * @return {undefined} + */ + onPostMessage(event) { + if (!event.origin) { // Handle chrome + event.origin = event.originalEvent.origin; + } + + // Event origin is empty string if undefined + if ( + event.origin.length === 0 || + !this.trustedEndpoint(event.origin) || + event.data.api !== INBOUND_API_NAME || + !event.data.widgetId + ) { + return; // don't log this - debugging APIs like to spam postMessage which floods the log otherwise + } + + // Although the requestId is required, we don't use it. We'll be nice and process the message + // if the property is missing, but with a warning for widget developers. + if (!event.data.requestId) { + console.warn("fromWidget action '" + event.data.action + "' does not have a requestId"); + } + + const action = event.data.action; + const widgetId = event.data.widgetId; + if (action === 'content_loaded') { + console.warn('Widget reported content loaded for', widgetId); + dis.dispatch({ + action: 'widget_content_loaded', + widgetId: widgetId, + }); + this.sendResponse(event, {success: true}); + } else if (action === 'supported_api_versions') { + this.sendResponse(event, { + api: INBOUND_API_NAME, + supported_versions: SUPPORTED_WIDGET_API_VERSIONS, + }); + } else if (action === 'api_version') { + this.sendResponse(event, { + api: INBOUND_API_NAME, + version: WIDGET_API_VERSION, + }); + } else if (action === 'm.sticker') { + // console.warn('Got sticker message from widget', widgetId); + // NOTE -- The widgetData field is deprecated (in favour of the 'data' field) and will be removed eventually + const data = event.data.data || event.data.widgetData; + dis.dispatch({action: 'm.sticker', data: data, widgetId: event.data.widgetId}); + } else if (action === 'integration_manager_open') { + // Close the stickerpicker + dis.dispatch({action: 'stickerpicker_close'}); + // Open the integration manager + // NOTE -- The widgetData field is deprecated (in favour of the 'data' field) and will be removed eventually + const data = event.data.data || event.data.widgetData; + const integType = (data && data.integType) ? data.integType : null; + const integId = (data && data.integId) ? data.integId : null; + IntegrationManager.open(integType, integId); + } else { + console.warn('Widget postMessage event unhandled'); + this.sendError(event, {message: 'The postMessage was unhandled'}); + } + } + + /** + * Check if message origin is registered as trusted + * @param {string} origin PostMessage origin to check + * @return {boolean} True if trusted + */ + trustedEndpoint(origin) { + if (!origin) { + return false; + } + + return this.widgetMessagingEndpoints.some((endpoint) => { + // TODO / FIXME -- Should this also check the widgetId? + return endpoint.endpointUrl === origin; + }); + } + + /** + * Send a postmessage response to a postMessage request + * @param {Event} event The original postMessage request event + * @param {Object} res Response data + */ + sendResponse(event, res) { + const data = JSON.parse(JSON.stringify(event.data)); + data.response = res; + event.source.postMessage(data, event.origin); + } + + /** + * Send an error response to a postMessage request + * @param {Event} event The original postMessage request event + * @param {string} msg Error message + * @param {Error} nestedError Nested error event (optional) + */ + sendError(event, msg, nestedError) { + console.error('Action:' + event.data.action + ' failed with message: ' + msg); + const data = JSON.parse(JSON.stringify(event.data)); + data.response = { + error: { + message: msg, + }, + }; + if (nestedError) { + data.response.error._error = nestedError; + } + event.source.postMessage(data, event.origin); + } +} diff --git a/src/GroupAddressPicker.js b/src/GroupAddressPicker.js index ef9010cbf2..91380b6eed 100644 --- a/src/GroupAddressPicker.js +++ b/src/GroupAddressPicker.js @@ -19,31 +19,33 @@ import sdk from './'; import MultiInviter from './utils/MultiInviter'; import { _t } from './languageHandler'; import MatrixClientPeg from './MatrixClientPeg'; -import GroupStoreCache from './stores/GroupStoreCache'; +import GroupStore from './stores/GroupStore'; export function showGroupInviteDialog(groupId) { - const description =
-
{ _t("Who would you like to add to this community?") }
-
- { _t( - "Warning: any person you add to a community will be publicly "+ - "visible to anyone who knows the community ID", - ) } -
-
; + return new Promise((resolve, reject) => { + const description =
+
{ _t("Who would you like to add to this community?") }
+
+ { _t( + "Warning: any person you add to a community will be publicly "+ + "visible to anyone who knows the community ID", + ) } +
+
; - const AddressPickerDialog = sdk.getComponent("dialogs.AddressPickerDialog"); - Modal.createTrackedDialog('Group Invite', '', AddressPickerDialog, { - title: _t("Invite new community members"), - description: description, - placeholder: _t("Name or matrix ID"), - button: _t("Invite to Community"), - validAddressTypes: ['mx-user-id'], - onFinished: (success, addrs) => { - if (!success) return; + const AddressPickerDialog = sdk.getComponent("dialogs.AddressPickerDialog"); + Modal.createTrackedDialog('Group Invite', '', AddressPickerDialog, { + title: _t("Invite new community members"), + description: description, + placeholder: _t("Name or matrix ID"), + button: _t("Invite to Community"), + validAddressTypes: ['mx-user-id'], + onFinished: (success, addrs) => { + if (!success) return; - _onGroupInviteFinished(groupId, addrs); - }, + _onGroupInviteFinished(groupId, addrs).then(resolve, reject); + }, + }); }); } @@ -87,7 +89,7 @@ function _onGroupInviteFinished(groupId, addrs) { const addrTexts = addrs.map((addr) => addr.address); - multiInviter.invite(addrTexts).then((completionStates) => { + return multiInviter.invite(addrTexts).then((completionStates) => { // Show user any errors const errorList = []; for (const addr of Object.keys(completionStates)) { @@ -114,11 +116,10 @@ function _onGroupInviteFinished(groupId, addrs) { function _onGroupAddRoomFinished(groupId, addrs, addRoomsPublicly) { const matrixClient = MatrixClientPeg.get(); - const groupStore = GroupStoreCache.getGroupStore(groupId); const errorList = []; return Promise.all(addrs.map((addr) => { - return groupStore - .addRoomToGroup(addr.address, addRoomsPublicly) + return GroupStore + .addRoomToGroup(groupId, addr.address, addRoomsPublicly) .catch(() => { errorList.push(addr.address); }) .then(() => { const roomId = addr.address; diff --git a/src/HtmlUtils.js b/src/HtmlUtils.js index 0c262fe89a..7ca404be31 100644 --- a/src/HtmlUtils.js +++ b/src/HtmlUtils.js @@ -1,6 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ limitations under the License. 'use strict'; +import ReplyThread from "./components/views/elements/ReplyThread"; + const React = require('react'); const sanitizeHtml = require('sanitize-html'); const highlight = require('highlight.js'); @@ -25,6 +27,7 @@ import escape from 'lodash/escape'; import emojione from 'emojione'; import classNames from 'classnames'; import MatrixClientPeg from './MatrixClientPeg'; +import url from 'url'; emojione.imagePathSVG = 'emojione/svg/'; // Store PNG path for displaying many flags at once (for increased performance over SVG) @@ -44,6 +47,8 @@ const SYMBOL_PATTERN = /([\u2100-\u2bff])/; const EMOJI_REGEX = new RegExp(emojione.unicodeRegexp+"+", "gi"); const COLOR_REGEX = /^#[0-9a-fA-F]{6}$/; +const PERMITTED_URL_SCHEMES = ['http', 'https', 'ftp', 'mailto', 'magnet']; + /* * Return true if the given string contains emoji * Uses a much, much simpler regex than emojione's so will give false @@ -152,6 +157,25 @@ export function sanitizedHtmlNode(insaneHtml) { return
; } +/** + * Tests if a URL from an untrusted source may be safely put into the DOM + * The biggest threat here is javascript: URIs. + * Note that the HTML sanitiser library has its own internal logic for + * doing this, to which we pass the same list of schemes. This is used in + * other places we need to sanitise URLs. + * @return true if permitted, otherwise false + */ +export function isUrlPermitted(inputUrl) { + try { + const parsed = url.parse(inputUrl); + if (!parsed.protocol) return false; + // URL parser protocol includes the trailing colon + return PERMITTED_URL_SCHEMES.includes(parsed.protocol.slice(0, -1)); + } catch (e) { + return false; + } +} + const sanitizeHtmlParams = { allowedTags: [ 'font', // custom to matrix for IRC-style font coloring @@ -172,7 +196,7 @@ const sanitizeHtmlParams = { // Lots of these won't come up by default because we don't allow them selfClosing: ['img', 'br', 'hr', 'area', 'base', 'basefont', 'input', 'link', 'meta'], // URL schemes we permit - allowedSchemes: ['http', 'https', 'ftp', 'mailto', 'magnet'], + allowedSchemes: PERMITTED_URL_SCHEMES, allowProtocolRelative: false, @@ -386,14 +410,16 @@ class TextHighlighter extends BaseHighlighter { * * opts.highlightLink: optional href to add to highlighted words * opts.disableBigEmoji: optional argument to disable the big emoji class. + * opts.stripReplyFallback: optional argument specifying the event is a reply and so fallback needs removing */ export function bodyToHtml(content, highlights, opts={}) { - const isHtml = (content.format === "org.matrix.custom.html"); - const body = isHtml ? content.formatted_body : escape(content.body); + const isHtmlMessage = content.format === "org.matrix.custom.html" && content.formatted_body; let bodyHasEmoji = false; + let strippedBody; let safeBody; + let isDisplayedWithHtml; // XXX: We sanitize the HTML whilst also highlighting its text nodes, to avoid accidentally trying // to highlight HTML tags themselves. However, this does mean that we don't highlight textnodes which // are interrupted by HTML tags (not that we did before) - e.g. foobar won't get highlighted @@ -409,9 +435,33 @@ export function bodyToHtml(content, highlights, opts={}) { return highlighter.applyHighlights(safeText, safeHighlights).join(''); }; } - safeBody = sanitizeHtml(body, sanitizeHtmlParams); - bodyHasEmoji = containsEmoji(body); - if (bodyHasEmoji) safeBody = unicodeToImage(safeBody); + + let formattedBody = content.formatted_body; + if (opts.stripReplyFallback && formattedBody) formattedBody = ReplyThread.stripHTMLReply(formattedBody); + strippedBody = opts.stripReplyFallback ? ReplyThread.stripPlainReply(content.body) : content.body; + + bodyHasEmoji = containsEmoji(isHtmlMessage ? formattedBody : content.body); + + + // Only generate safeBody if the message was sent as org.matrix.custom.html + if (isHtmlMessage) { + isDisplayedWithHtml = true; + safeBody = sanitizeHtml(formattedBody, sanitizeHtmlParams); + } else { + // ... or if there are emoji, which we insert as HTML alongside the + // escaped plaintext body. + if (bodyHasEmoji) { + isDisplayedWithHtml = true; + safeBody = sanitizeHtml(escape(strippedBody), sanitizeHtmlParams); + } + } + + // An HTML message with emoji + // or a plaintext message with emoji that was escaped and sanitized into + // HTML. + if (bodyHasEmoji) { + safeBody = unicodeToImage(safeBody); + } } finally { delete sanitizeHtmlParams.textFilter; } @@ -419,7 +469,7 @@ export function bodyToHtml(content, highlights, opts={}) { let emojiBody = false; if (!opts.disableBigEmoji && bodyHasEmoji) { EMOJI_REGEX.lastIndex = 0; - const contentBodyTrimmed = content.body !== undefined ? content.body.trim() : ''; + const contentBodyTrimmed = strippedBody !== undefined ? strippedBody.trim() : ''; const match = EMOJI_REGEX.exec(contentBodyTrimmed); emojiBody = match && match[0] && match[0].length === contentBodyTrimmed.length; } @@ -427,9 +477,12 @@ export function bodyToHtml(content, highlights, opts={}) { const className = classNames({ 'mx_EventTile_body': true, 'mx_EventTile_bigEmoji': emojiBody, - 'markdown-body': isHtml, + 'markdown-body': isHtmlMessage, }); - return ; + + return isDisplayedWithHtml ? + : + { strippedBody }; } export function emojifyText(text) { diff --git a/src/IntegrationManager.js b/src/IntegrationManager.js new file mode 100644 index 0000000000..eb45a1f425 --- /dev/null +++ b/src/IntegrationManager.js @@ -0,0 +1,73 @@ +/* +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 Modal from './Modal'; +import sdk from './index'; +import SdkConfig from './SdkConfig'; +import ScalarMessaging from './ScalarMessaging'; +import ScalarAuthClient from './ScalarAuthClient'; +import RoomViewStore from './stores/RoomViewStore'; + +if (!global.mxIntegrationManager) { + global.mxIntegrationManager = {}; +} + +export default class IntegrationManager { + static _init() { + if (!global.mxIntegrationManager.client || !global.mxIntegrationManager.connected) { + if (SdkConfig.get().integrations_ui_url && SdkConfig.get().integrations_rest_url) { + ScalarMessaging.startListening(); + global.mxIntegrationManager.client = new ScalarAuthClient(); + + return global.mxIntegrationManager.client.connect().then(() => { + global.mxIntegrationManager.connected = true; + }).catch((e) => { + console.error("Failed to connect to integrations server", e); + global.mxIntegrationManager.error = e; + }); + } else { + console.error('Invalid integration manager config', SdkConfig.get()); + } + } + } + + /** + * Launch the integrations manager on the stickers integration page + * @param {string} integName integration / widget type + * @param {string} integId integration / widget ID + * @param {function} onFinished Callback to invoke on integration manager close + */ + static async open(integName, integId, onFinished) { + await IntegrationManager._init(); + const IntegrationsManager = sdk.getComponent("views.settings.IntegrationsManager"); + if (global.mxIntegrationManager.error || + !(global.mxIntegrationManager.client && global.mxIntegrationManager.client.hasCredentials())) { + console.error("Scalar error", global.mxIntegrationManager); + return; + } + const integType = 'type_' + integName; + const src = (global.mxIntegrationManager.client && global.mxIntegrationManager.client.hasCredentials()) ? + global.mxIntegrationManager.client.getScalarInterfaceUrlForRoom( + {roomId: RoomViewStore.getRoomId()}, + integType, + integId, + ) : + null; + Modal.createTrackedDialog('Integrations Manager', '', IntegrationsManager, { + src: src, + onFinished: onFinished, + }, "mx_IntegrationsManager"); + } +} diff --git a/src/Lifecycle.js b/src/Lifecycle.js index efd5c20d5c..7378e982ef 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -1,6 +1,7 @@ /* Copyright 2015, 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd +Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -64,33 +65,33 @@ import sdk from './index'; * Resolves to `true` if we ended up starting a session, or `false` if we * failed. */ -export function loadSession(opts) { - const fragmentQueryParams = opts.fragmentQueryParams || {}; - let enableGuest = opts.enableGuest || false; - const guestHsUrl = opts.guestHsUrl; - const guestIsUrl = opts.guestIsUrl; - const defaultDeviceDisplayName = opts.defaultDeviceDisplayName; +export async function loadSession(opts) { + try { + let enableGuest = opts.enableGuest || false; + const guestHsUrl = opts.guestHsUrl; + const guestIsUrl = opts.guestIsUrl; + const fragmentQueryParams = opts.fragmentQueryParams || {}; + const defaultDeviceDisplayName = opts.defaultDeviceDisplayName; - if (!guestHsUrl) { - console.warn("Cannot enable guest access: can't determine HS URL to use"); - enableGuest = false; - } + if (!guestHsUrl) { + console.warn("Cannot enable guest access: can't determine HS URL to use"); + enableGuest = false; + } - if (enableGuest && - fragmentQueryParams.guest_user_id && - fragmentQueryParams.guest_access_token - ) { - console.log("Using guest access credentials"); - return _doSetLoggedIn({ - userId: fragmentQueryParams.guest_user_id, - accessToken: fragmentQueryParams.guest_access_token, - homeserverUrl: guestHsUrl, - identityServerUrl: guestIsUrl, - guest: true, - }, true).then(() => true); - } - - return _restoreFromLocalStorage().then((success) => { + if (enableGuest && + fragmentQueryParams.guest_user_id && + fragmentQueryParams.guest_access_token + ) { + console.log("Using guest access credentials"); + return _doSetLoggedIn({ + userId: fragmentQueryParams.guest_user_id, + accessToken: fragmentQueryParams.guest_access_token, + homeserverUrl: guestHsUrl, + identityServerUrl: guestIsUrl, + guest: true, + }, true).then(() => true); + } + const success = await _restoreFromLocalStorage(); if (success) { return true; } @@ -101,7 +102,9 @@ export function loadSession(opts) { // fall back to login screen return false; - }); + } catch (e) { + return _handleLoadSessionFailure(e); + } } /** @@ -195,9 +198,9 @@ function _registerAsGuest(hsUrl, isUrl, defaultDeviceDisplayName) { // The plan is to gradually move the localStorage access done here into // SessionStore to avoid bugs where the view becomes out-of-sync with // localStorage (e.g. teamToken, isGuest etc.) -function _restoreFromLocalStorage() { +async function _restoreFromLocalStorage() { if (!localStorage) { - return Promise.resolve(false); + return false; } const hsUrl = localStorage.getItem("mx_hs_url"); const isUrl = localStorage.getItem("mx_is_url") || 'https://matrix.org'; @@ -215,26 +218,23 @@ function _restoreFromLocalStorage() { if (accessToken && userId && hsUrl) { console.log(`Restoring session for ${userId}`); - try { - return _doSetLoggedIn({ - userId: userId, - deviceId: deviceId, - accessToken: accessToken, - homeserverUrl: hsUrl, - identityServerUrl: isUrl, - guest: isGuest, - }, false).then(() => true); - } catch (e) { - return _handleRestoreFailure(e); - } + await _doSetLoggedIn({ + userId: userId, + deviceId: deviceId, + accessToken: accessToken, + homeserverUrl: hsUrl, + identityServerUrl: isUrl, + guest: isGuest, + }, false); + return true; } else { console.log("No previous session found."); - return Promise.resolve(false); + return false; } } -function _handleRestoreFailure(e) { - console.log("Unable to restore session", e); +function _handleLoadSessionFailure(e) { + console.log("Unable to load session", e); const def = Promise.defer(); const SessionRestoreErrorDialog = @@ -255,7 +255,7 @@ function _handleRestoreFailure(e) { } // try, try again - return _restoreFromLocalStorage(); + return loadSession(); }); } @@ -362,7 +362,7 @@ async function _doSetLoggedIn(credentials, clearStorage) { dis.dispatch({action: 'on_logged_in', teamToken: teamToken}); }); - startMatrixClient(); + await startMatrixClient(); return MatrixClientPeg.get(); } @@ -423,7 +423,7 @@ export function logout() { * Starts the matrix client and all other react-sdk services that * listen for events while a session is logged in. */ -function startMatrixClient() { +async function startMatrixClient() { console.log(`Lifecycle: Starting MatrixClient`); // dispatch this before starting the matrix client: it's used @@ -437,7 +437,7 @@ function startMatrixClient() { Presence.start(); DMRoomMap.makeShared().start(); - MatrixClientPeg.start(); + await MatrixClientPeg.start(); // dispatch that we finished starting up to wire up any other bits // of the matrix client that cannot be set prior to starting up. diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js index 14dfa91fa4..9d86a62de4 100644 --- a/src/MatrixClientPeg.js +++ b/src/MatrixClientPeg.js @@ -98,7 +98,6 @@ class MatrixClientPeg { const opts = utils.deepCopy(this.opts); // the react sdk doesn't work without this, so don't allow opts.pendingEventOrdering = "detached"; - opts.disablePresence = true; // we do this manually try { const promise = this.matrixClient.store.startup(); @@ -175,4 +174,4 @@ class MatrixClientPeg { if (!global.mxMatrixClientPeg) { global.mxMatrixClientPeg = new MatrixClientPeg(); } -module.exports = global.mxMatrixClientPeg; +export default global.mxMatrixClientPeg; diff --git a/src/Modal.js b/src/Modal.js index c9f08772e7..06a96824a7 100644 --- a/src/Modal.js +++ b/src/Modal.js @@ -22,6 +22,7 @@ const ReactDOM = require('react-dom'); import PropTypes from 'prop-types'; import Analytics from './Analytics'; import sdk from './index'; +import dis from './dispatcher'; const DIALOG_CONTAINER_ID = "mx_Dialog_Container"; @@ -80,7 +81,11 @@ class ModalManager { constructor() { this._counter = 0; - /** list of the modals we have stacked up, with the most recent at [0] */ + // The modal to prioritise over all others. If this is set, only show + // this modal. Remove all other modals from the stack when this modal + // is closed. + this._priorityModal = null; + // A list of the modals we have stacked up, with the most recent at [0] this._modals = [ /* { elem: React component for this dialog @@ -104,18 +109,18 @@ class ModalManager { return container; } - createTrackedDialog(analyticsAction, analyticsInfo, Element, props, className) { + createTrackedDialog(analyticsAction, analyticsInfo, ...rest) { Analytics.trackEvent('Modal', analyticsAction, analyticsInfo); - return this.createDialog(Element, props, className); + return this.createDialog(...rest); } - createDialog(Element, props, className) { - return this.createDialogAsync((cb) => {cb(Element);}, props, className); + createDialog(Element, ...rest) { + return this.createDialogAsync((cb) => {cb(Element);}, ...rest); } - createTrackedDialogAsync(analyticsAction, analyticsInfo, loader, props, className) { + createTrackedDialogAsync(analyticsAction, analyticsInfo, ...rest) { Analytics.trackEvent('Modal', analyticsAction, analyticsInfo); - return this.createDialogAsync(loader, props, className); + return this.createDialogAsync(...rest); } /** @@ -136,8 +141,13 @@ class ModalManager { * component. (We will also pass an 'onFinished' property.) * * @param {String} className CSS class to apply to the modal wrapper + * + * @param {boolean} isPriorityModal if true, this modal will be displayed regardless + * of other modals that are currently in the stack. + * Also, when closed, all modals will be removed + * from the stack. */ - createDialogAsync(loader, props, className) { + createDialogAsync(loader, props, className, isPriorityModal) { const self = this; const modal = {}; @@ -150,6 +160,14 @@ class ModalManager { if (i >= 0) { self._modals.splice(i, 1); } + + if (self._priorityModal === modal) { + self._priorityModal = null; + + // XXX: This is destructive + self._modals = []; + } + self._reRender(); }; @@ -166,7 +184,12 @@ class ModalManager { modal.onFinished = props ? props.onFinished : null; modal.className = className; - this._modals.unshift(modal); + if (isPriorityModal) { + // XXX: This is destructive + this._priorityModal = modal; + } else { + this._modals.unshift(modal); + } this._reRender(); return {close: closeDialog}; @@ -187,12 +210,24 @@ class ModalManager { } _reRender() { - if (this._modals.length == 0) { + if (this._modals.length == 0 && !this._priorityModal) { + // If there is no modal to render, make all of Riot available + // to screen reader users again + dis.dispatch({ + action: 'aria_unhide_main_app', + }); ReactDOM.unmountComponentAtNode(this.getOrCreateContainer()); return; } - const modal = this._modals[0]; + // Hide the content outside the modal to screen reader users + // so they won't be able to navigate into it and act on it using + // screen reader specific features + dis.dispatch({ + action: 'aria_hide_main_app', + }); + + const modal = this._priorityModal ? this._priorityModal : this._modals[0]; const dialog = (
diff --git a/src/Notifier.js b/src/Notifier.js index e69bdf4461..b823c4df05 100644 --- a/src/Notifier.js +++ b/src/Notifier.js @@ -256,6 +256,10 @@ const Notifier = { }, onEventDecrypted: function(ev) { + // 'decrypted' means the decryption process has finished: it may have failed, + // in which case it might decrypt soon if the keys arrive + if (ev.isDecryptionFailure()) return; + const idx = this.pendingEncryptedEventIds.indexOf(ev.getId()); if (idx === -1) return; diff --git a/src/Presence.js b/src/Presence.js index 2652c64c96..9367fe35cd 100644 --- a/src/Presence.js +++ b/src/Presence.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -31,7 +32,7 @@ class Presence { this.running = true; if (undefined === this.state) { this._resetTimer(); - this.dispatcherRef = dis.register(this._onUserActivity.bind(this)); + this.dispatcherRef = dis.register(this._onAction.bind(this)); } } @@ -56,27 +57,13 @@ class Presence { return this.state; } - /** - * Get the current status message. - * @returns {String} the status message, may be null - */ - getStatusMessage() { - return this.statusMessage; - } - /** * Set the presence state. * If the state has changed, the Home Server will be notified. * @param {string} newState the new presence state (see PRESENCE enum) - * @param {String} statusMessage an optional status message for the presence - * @param {boolean} maintain true to have this status maintained by this tracker */ - setState(newState, statusMessage=null, maintain=false) { - if (this.maintain) { - // Don't update presence if we're maintaining a particular status - return; - } - if (newState === this.state && statusMessage === this.statusMessage) { + setState(newState) { + if (newState === this.state) { return; } if (PRESENCE_STATES.indexOf(newState) === -1) { @@ -86,37 +73,21 @@ class Presence { return; } const old_state = this.state; - const old_message = this.statusMessage; this.state = newState; - this.statusMessage = statusMessage; - this.maintain = maintain; if (MatrixClientPeg.get().isGuest()) { return; // don't try to set presence when a guest; it won't work. } - const updateContent = { - presence: this.state, - status_msg: this.statusMessage ? this.statusMessage : '', - }; - const self = this; - MatrixClientPeg.get().setPresence(updateContent).done(function() { + MatrixClientPeg.get().setPresence(this.state).done(function() { console.log("Presence: %s", newState); - - // We have to dispatch because the js-sdk is unreliable at telling us about our own presence - dis.dispatch({action: "self_presence_updated", statusInfo: updateContent}); }, function(err) { console.error("Failed to set presence: %s", err); self.state = old_state; - self.statusMessage = old_message; }); } - stopMaintainingStatus() { - this.maintain = false; - } - /** * Callback called when the user made no action on the page for UNAVAILABLE_TIME ms. * @private @@ -125,9 +96,10 @@ class Presence { this.setState("unavailable"); } - _onUserActivity(payload) { - if (payload.action === "sync_state" || payload.action === "self_presence_updated") return; - this._resetTimer(); + _onAction(payload) { + if (payload.action === "user_activity") { + this._resetTimer(); + } } /** diff --git a/src/RoomInvite.js b/src/RoomInvite.js index 1979c6d111..0bcc08eb06 100644 --- a/src/RoomInvite.js +++ b/src/RoomInvite.js @@ -57,6 +57,7 @@ export function showStartChatInviteDialog() { title: _t('Start a chat'), description: _t("Who would you like to communicate with?"), placeholder: _t("Email, name or matrix ID"), + validAddressTypes: ['mx-user-id', 'email'], button: _t("Start Chat"), onFinished: _onStartChatFinished, }); @@ -85,9 +86,7 @@ function _onStartChatFinished(shouldInvite, addrs) { if (rooms.length > 0) { // A Direct Message room already exists for this user, so select a // room from a list that is similar to the one in MemberInfo panel - const ChatCreateOrReuseDialog = sdk.getComponent( - "views.dialogs.ChatCreateOrReuseDialog", - ); + const ChatCreateOrReuseDialog = sdk.getComponent("views.dialogs.ChatCreateOrReuseDialog"); const close = Modal.createTrackedDialog('Create or Reuse', '', ChatCreateOrReuseDialog, { userId: addrTexts[0], onNewDMClick: () => { @@ -115,6 +114,15 @@ function _onStartChatFinished(shouldInvite, addrs) { }); }); } + } else if (addrTexts.length === 1) { + // Start a new DM chat + createRoom({dmUserId: addrTexts[0]}).catch((err) => { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Failed to invite user', '', ErrorDialog, { + title: _t("Failed to invite user"), + description: ((err && err.message) ? err.message : _t("Operation failed")), + }); + }); } else { // Start multi user chat let room; diff --git a/src/RoomNotifs.js b/src/RoomNotifs.js index 5cc078dc59..91e49fe09b 100644 --- a/src/RoomNotifs.js +++ b/src/RoomNotifs.js @@ -34,7 +34,14 @@ export function getRoomNotifsState(roomId) { } // for everything else, look at the room rule. - const roomRule = MatrixClientPeg.get().getRoomPushRule('global', roomId); + let roomRule = null; + try { + roomRule = MatrixClientPeg.get().getRoomPushRule('global', roomId); + } catch (err) { + // Possible that the client doesn't have pushRules yet. If so, it + // hasn't started eiher, so indicate that this room is not notifying. + return null; + } // XXX: We have to assume the default is to notify for all messages // (in particular this will be 'wrong' for one to one rooms because @@ -130,6 +137,11 @@ function setRoomNotifsStateUnmuted(roomId, newState) { } function findOverrideMuteRule(roomId) { + if (!MatrixClientPeg.get().pushRules || + !MatrixClientPeg.get().pushRules['global'] || + !MatrixClientPeg.get().pushRules['global'].override) { + return null; + } for (const rule of MatrixClientPeg.get().pushRules['global'].override) { if (isRuleForRoom(roomId, rule)) { if (isMuteRule(rule) && rule.enabled) { diff --git a/src/ScalarAuthClient.js b/src/ScalarAuthClient.js index 568dd6d185..c7e439bf2e 100644 --- a/src/ScalarAuthClient.js +++ b/src/ScalarAuthClient.js @@ -148,10 +148,48 @@ class ScalarAuthClient { return defer.promise; } - getScalarInterfaceUrlForRoom(roomId, screen, id) { + /** + * Mark all assets associated with the specified widget as "disabled" in the + * integration manager database. + * This can be useful to temporarily prevent purchased assets from being displayed. + * @param {string} widgetType [description] + * @param {string} widgetId [description] + * @return {Promise} Resolves on completion + */ + disableWidgetAssets(widgetType, widgetId) { + let url = SdkConfig.get().integrations_rest_url + '/widgets/set_assets_state'; + url = this.getStarterLink(url); + return new Promise((resolve, reject) => { + request({ + method: 'GET', + uri: url, + json: true, + qs: { + 'widget_type': widgetType, + 'widget_id': widgetId, + 'state': 'disable', + }, + }, (err, response, body) => { + if (err) { + reject(err); + } else if (response.statusCode / 100 !== 2) { + reject({statusCode: response.statusCode}); + } else if (!body) { + reject(new Error("Failed to set widget assets state")); + } else { + resolve(); + } + }); + }); + } + + getScalarInterfaceUrlForRoom(room, screen, id) { + const roomId = room.roomId; + const roomName = room.name; let url = SdkConfig.get().integrations_ui_url; url += "?scalar_token=" + encodeURIComponent(this.scalarToken); url += "&room_id=" + encodeURIComponent(roomId); + url += "&room_name=" + encodeURIComponent(roomName); url += "&theme=" + encodeURIComponent(SettingsStore.getValue("theme")); if (id) { url += '&integ_id=' + encodeURIComponent(id); diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 3c164c6551..9457e6ccfb 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -235,6 +235,7 @@ const SdkConfig = require('./SdkConfig'); const MatrixClientPeg = require("./MatrixClientPeg"); const MatrixEvent = require("matrix-js-sdk").MatrixEvent; const dis = require("./dispatcher"); +const Widgets = require('./utils/widgets'); import { _t } from './languageHandler'; function sendResponse(event, res) { @@ -285,12 +286,58 @@ function inviteUser(event, roomId, userId) { }); } +/** + * Returns a promise that resolves when a widget with the given + * ID has been added as a user widget (ie. the accountData event + * arrives) or rejects after a timeout + * + * @param {string} widgetId The ID of the widget to wait for + * @param {boolean} add True to wait for the widget to be added, + * false to wait for it to be deleted. + * @returns {Promise} that resolves when the widget is available + */ +function waitForUserWidget(widgetId, add) { + return new Promise((resolve, reject) => { + const currentAccountDataEvent = MatrixClientPeg.get().getAccountData('m.widgets'); + + // Tests an account data event, returning true if it's in the state + // we're waiting for it to be in + function eventInIntendedState(ev) { + if (!ev || !currentAccountDataEvent.getContent()) return false; + if (add) { + return ev.getContent()[widgetId] !== undefined; + } else { + return ev.getContent()[widgetId] === undefined; + } + } + + if (eventInIntendedState(currentAccountDataEvent)) { + resolve(); + return; + } + + function onAccountData(ev) { + if (eventInIntendedState(currentAccountDataEvent)) { + MatrixClientPeg.get().removeListener('accountData', onAccountData); + clearTimeout(timerId); + resolve(); + } + } + const timerId = setTimeout(() => { + MatrixClientPeg.get().removeListener('accountData', onAccountData); + reject(new Error("Timed out waiting for widget ID " + widgetId + " to appear")); + }, 10000); + MatrixClientPeg.get().on('accountData', onAccountData); + }); +} + function setWidget(event, roomId) { const widgetId = event.data.widget_id; const widgetType = event.data.type; const widgetUrl = event.data.url; const widgetName = event.data.name; // optional const widgetData = event.data.data; // optional + const userWidget = event.data.userWidget; const client = MatrixClientPeg.get(); if (!client) { @@ -330,17 +377,64 @@ function setWidget(event, roomId) { name: widgetName, data: widgetData, }; - if (widgetUrl === null) { // widget is being deleted - content = {}; - } - client.sendStateEvent(roomId, "im.vector.modular.widgets", content, widgetId).done(() => { - sendResponse(event, { - success: true, + if (userWidget) { + const client = MatrixClientPeg.get(); + const userWidgets = Widgets.getUserWidgets(); + + // Delete existing widget with ID + try { + delete userWidgets[widgetId]; + } catch (e) { + console.error(`$widgetId is non-configurable`); + } + + // Add new widget / update + if (widgetUrl !== null) { + userWidgets[widgetId] = { + content: content, + sender: client.getUserId(), + state_key: widgetId, + type: 'm.widget', + id: widgetId, + }; + } + + // This starts listening for when the echo comes back from the server + // since the widget won't appear added until this happens. If we don't + // wait for this, the action will complete but if the user is fast enough, + // the widget still won't actually be there. + client.setAccountData('m.widgets', userWidgets).then(() => { + return waitForUserWidget(widgetId, widgetUrl !== null); + }).then(() => { + sendResponse(event, { + success: true, + }); + + dis.dispatch({ action: "user_widget_updated" }); + }).catch((e) => { + sendError(event, _t('Unable to create widget.'), e); }); - }, (err) => { - sendError(event, _t('Failed to send request.'), err); - }); + } else { // Room widget + if (!roomId) { + sendError(event, _t('Missing roomId.'), null); + } + + if (widgetUrl === null) { // widget is being deleted + content = {}; + } + // TODO - Room widgets need to be moved to 'm.widget' state events + // https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit?usp=sharing + client.sendStateEvent(roomId, "im.vector.modular.widgets", content, widgetId).done(() => { + // XXX: We should probably wait for the echo of the state event to come back from the server, + // as we do with user widgets. + sendResponse(event, { + success: true, + }); + }, (err) => { + sendError(event, _t('Failed to send request.'), err); + }); + } } function getWidgets(event, roomId) { @@ -349,19 +443,30 @@ function getWidgets(event, roomId) { sendError(event, _t('You need to be logged in.')); return; } - const room = client.getRoom(roomId); - if (!room) { - sendError(event, _t('This room is not recognised.')); - return; - } - const stateEvents = room.currentState.getStateEvents("im.vector.modular.widgets"); - // Only return widgets which have required fields - const widgetStateEvents = []; - stateEvents.forEach((ev) => { - if (ev.getContent().type && ev.getContent().url) { - widgetStateEvents.push(ev.event); // return the raw event + let widgetStateEvents = []; + + if (roomId) { + const room = client.getRoom(roomId); + if (!room) { + sendError(event, _t('This room is not recognised.')); + return; } - }); + // TODO - Room widgets need to be moved to 'm.widget' state events + // https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit?usp=sharing + const stateEvents = room.currentState.getStateEvents("im.vector.modular.widgets"); + // Only return widgets which have required fields + if (room) { + stateEvents.forEach((ev) => { + if (ev.getContent().type && ev.getContent().url) { + widgetStateEvents.push(ev.event); // return the raw event + } + }); + } + } + + // Add user widgets (not linked to a specific room) + const userWidgets = Widgets.getUserWidgetsArray(); + widgetStateEvents = widgetStateEvents.concat(userWidgets); sendResponse(event, widgetStateEvents); } @@ -563,7 +668,7 @@ const onMessage = function(event) { const url = SdkConfig.get().integrations_ui_url; if ( event.origin.length === 0 || - !url.startsWith(event.origin) || + !url.startsWith(event.origin + '/') || !event.data.action || event.data.api // Ignore messages with specific API set ) { @@ -578,9 +683,22 @@ const onMessage = function(event) { const roomId = event.data.room_id; const userId = event.data.user_id; + if (!roomId) { - sendError(event, _t('Missing room_id in request')); - return; + // These APIs don't require roomId + // Get and set user widgets (not associated with a specific room) + // If roomId is specified, it must be validated, so room-based widgets agreed + // handled further down. + if (event.data.action === "get_widgets") { + getWidgets(event, null); + return; + } else if (event.data.action === "set_widget") { + setWidget(event, null); + return; + } else { + sendError(event, _t('Missing room_id in request')); + return; + } } let promise = Promise.resolve(currentRoomId); if (!currentRoomId) { @@ -601,6 +719,15 @@ const onMessage = function(event) { return; } + // Get and set room-based widgets + if (event.data.action === "get_widgets") { + getWidgets(event, roomId); + return; + } else if (event.data.action === "set_widget") { + setWidget(event, roomId); + return; + } + // These APIs don't require userId if (event.data.action === "join_rules_state") { getJoinRules(event, roomId); @@ -611,12 +738,6 @@ const onMessage = function(event) { } else if (event.data.action === "get_membership_count") { getMembershipCount(event, roomId); return; - } else if (event.data.action === "set_widget") { - setWidget(event, roomId); - return; - } else if (event.data.action === "get_widgets") { - getWidgets(event, roomId); - return; } else if (event.data.action === "get_room_enc_state") { getRoomEncState(event, roomId); return; diff --git a/src/SdkConfig.js b/src/SdkConfig.js index 64bf21ecf8..8df725a913 100644 --- a/src/SdkConfig.js +++ b/src/SdkConfig.js @@ -21,13 +21,6 @@ const DEFAULTS = { integrations_rest_url: "https://scalar.vector.im/api", // Where to send bug reports. If not specified, bugs cannot be sent. bug_report_endpoint_url: null, - - piwik: { - url: "https://piwik.riot.im/", - whitelistedHSUrls: ["https://matrix.org"], - whitelistedISUrls: ["https://vector.im", "https://matrix.org"], - siteId: 1, - }, }; class SdkConfig { @@ -52,4 +45,3 @@ class SdkConfig { } module.exports = SdkConfig; -module.exports.DEFAULTS = DEFAULTS; diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 1bdf5ad90c..712150af4d 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -52,14 +52,13 @@ function textForMemberEvent(ev) { case 'join': if (prevContent && prevContent.membership === 'join') { if (prevContent.displayname && content.displayname && prevContent.displayname !== content.displayname) { - return _t('%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.', { - senderName, + return _t('%(oldDisplayName)s changed their display name to %(displayName)s.', { oldDisplayName: prevContent.displayname, displayName: content.displayname, }); } else if (!prevContent.displayname && content.displayname) { return _t('%(senderName)s set their display name to %(displayName)s.', { - senderName, + senderName: ev.getSender(), displayName: content.displayname, }); } else if (prevContent.displayname && !content.displayname) { diff --git a/src/Tinter.js b/src/Tinter.js index c7402c15be..d24a4c3e74 100644 --- a/src/Tinter.js +++ b/src/Tinter.js @@ -252,7 +252,6 @@ class Tinter { setTheme(theme) { - console.trace("setTheme " + theme); this.theme = theme; // update keyRgb from the current theme CSS itself, if it defines it @@ -299,56 +298,66 @@ class Tinter { for (let i = 0; i < document.styleSheets.length; i++) { const ss = document.styleSheets[i]; - if (!ss) continue; // well done safari >:( - // Chromium apparently sometimes returns null here; unsure why. - // see $14534907369972FRXBx:matrix.org in HQ - // ...ah, it's because there's a third party extension like - // privacybadger inserting its own stylesheet in there with a - // resource:// URI or something which results in a XSS error. - // See also #vector:matrix.org/$145357669685386ebCfr:matrix.org - // ...except some browsers apparently return stylesheets without - // hrefs, which we have no choice but ignore right now + try { + if (!ss) continue; // well done safari >:( + // Chromium apparently sometimes returns null here; unsure why. + // see $14534907369972FRXBx:matrix.org in HQ + // ...ah, it's because there's a third party extension like + // privacybadger inserting its own stylesheet in there with a + // resource:// URI or something which results in a XSS error. + // See also #vector:matrix.org/$145357669685386ebCfr:matrix.org + // ...except some browsers apparently return stylesheets without + // hrefs, which we have no choice but ignore right now - // XXX seriously? we are hardcoding the name of vector's CSS file in - // here? - // - // Why do we need to limit it to vector's CSS file anyway - if there - // are other CSS files affecting the doc don't we want to apply the - // same transformations to them? - // - // Iterating through the CSS looking for matches to hack on feels - // pretty horrible anyway. And what if the application skin doesn't use - // Vector Green as its primary color? - // --richvdh + // XXX seriously? we are hardcoding the name of vector's CSS file in + // here? + // + // Why do we need to limit it to vector's CSS file anyway - if there + // are other CSS files affecting the doc don't we want to apply the + // same transformations to them? + // + // Iterating through the CSS looking for matches to hack on feels + // pretty horrible anyway. And what if the application skin doesn't use + // Vector Green as its primary color? + // --richvdh - // Yes, tinting assumes that you are using the Riot skin for now. - // The right solution will be to move the CSS over to react-sdk. - // And yes, the default assets for the base skin might as well use - // Vector Green as any other colour. - // --matthew + // Yes, tinting assumes that you are using the Riot skin for now. + // The right solution will be to move the CSS over to react-sdk. + // And yes, the default assets for the base skin might as well use + // Vector Green as any other colour. + // --matthew - if (ss.href && !ss.href.match(new RegExp('/theme-' + this.theme + '.css$'))) continue; - if (ss.disabled) continue; - if (!ss.cssRules) continue; + // stylesheets we don't have permission to access (eg. ones from extensions) have a null + // href and will throw exceptions if we try to access their rules. + if (!ss.href || !ss.href.match(new RegExp('/theme-' + this.theme + '.css$'))) continue; + if (ss.disabled) continue; + if (!ss.cssRules) continue; - if (DEBUG) console.debug("calcCssFixups checking " + ss.cssRules.length + " rules for " + ss.href); + if (DEBUG) console.debug("calcCssFixups checking " + ss.cssRules.length + " rules for " + ss.href); - for (let j = 0; j < ss.cssRules.length; j++) { - const rule = ss.cssRules[j]; - if (!rule.style) continue; - if (rule.selectorText && rule.selectorText.match(/#mx_theme/)) continue; - for (let k = 0; k < this.cssAttrs.length; k++) { - const attr = this.cssAttrs[k]; - for (let l = 0; l < this.keyRgb.length; l++) { - if (rule.style[attr] === this.keyRgb[l]) { - this.cssFixups[this.theme].push({ - style: rule.style, - attr: attr, - index: l, - }); + for (let j = 0; j < ss.cssRules.length; j++) { + const rule = ss.cssRules[j]; + if (!rule.style) continue; + if (rule.selectorText && rule.selectorText.match(/#mx_theme/)) continue; + for (let k = 0; k < this.cssAttrs.length; k++) { + const attr = this.cssAttrs[k]; + for (let l = 0; l < this.keyRgb.length; l++) { + if (rule.style[attr] === this.keyRgb[l]) { + this.cssFixups[this.theme].push({ + style: rule.style, + attr: attr, + index: l, + }); + } } } } + } catch (e) { + // Catch any random exceptions that happen here: all sorts of things can go + // wrong with this (nulls, SecurityErrors) and mostly it's for other + // stylesheets that we don't want to proces anyway. We should not propagate an + // exception out since this will cause the app to fail to start. + console.log("Failed to calculate CSS fixups for a stylesheet: " + ss.href, e); } } if (DEBUG) { diff --git a/src/ToWidgetPostMessageApi.js b/src/ToWidgetPostMessageApi.js new file mode 100644 index 0000000000..def4af56ae --- /dev/null +++ b/src/ToWidgetPostMessageApi.js @@ -0,0 +1,86 @@ +/* +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"; + +// const OUTBOUND_API_NAME = 'toWidget'; + +// Initiate requests using the "toWidget" postMessage API and handle responses +// NOTE: ToWidgetPostMessageApi only handles message events with a data payload with a +// response field +export default class ToWidgetPostMessageApi { + constructor(timeoutMs) { + this._timeoutMs = timeoutMs || 5000; // default to 5s timer + this._counter = 0; + this._requestMap = { + // $ID: {resolve, reject} + }; + this.start = this.start.bind(this); + this.stop = this.stop.bind(this); + this.onPostMessage = this.onPostMessage.bind(this); + } + + start() { + window.addEventListener('message', this.onPostMessage); + } + + stop() { + window.removeEventListener('message', this.onPostMessage); + } + + onPostMessage(ev) { + // THIS IS ALL UNSAFE EXECUTION. + // We do not verify who the sender of `ev` is! + const payload = ev.data; + // NOTE: Workaround for running in a mobile WebView where a + // postMessage immediately triggers this callback even though it is + // not the response. + if (payload.response === undefined) { + return; + } + const promise = this._requestMap[payload.requestId]; + if (!promise) { + return; + } + delete this._requestMap[payload.requestId]; + promise.resolve(payload); + } + + // Initiate outbound requests (toWidget) + exec(action, targetWindow, targetOrigin) { + targetWindow = targetWindow || window.parent; // default to parent window + targetOrigin = targetOrigin || "*"; + this._counter += 1; + action.requestId = Date.now() + "-" + Math.random().toString(36) + "-" + this._counter; + + return new Promise((resolve, reject) => { + this._requestMap[action.requestId] = {resolve, reject}; + targetWindow.postMessage(action, targetOrigin); + + if (this._timeoutMs > 0) { + setTimeout(() => { + if (!this._requestMap[action.requestId]) { + return; + } + console.error("postMessage request timed out. Sent object: " + JSON.stringify(action), + this._requestMap); + this._requestMap[action.requestId].reject(new Error("Timed out")); + delete this._requestMap[action.requestId]; + }, this._timeoutMs); + } + }); + } +} diff --git a/src/Unread.js b/src/Unread.js index 383b5c2e5a..55e60f2a9a 100644 --- a/src/Unread.js +++ b/src/Unread.js @@ -28,6 +28,8 @@ module.exports = { return false; } else if (ev.getType() == 'm.room.member') { return false; + } else if (ev.getType() == 'm.room.third_party_invite') { + return false; } else if (ev.getType() == 'm.call.answer' || ev.getType() == 'm.call.hangup') { return false; } else if (ev.getType == 'm.room.message' && ev.getContent().msgtype == 'm.notify') { 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/Velociraptor.js b/src/Velociraptor.js index af4e6dcb60..6a4666305c 100644 --- a/src/Velociraptor.js +++ b/src/Velociraptor.js @@ -147,7 +147,7 @@ module.exports = React.createClass({ // creating/destroying large numbers of elements" // (https://github.com/julianshapiro/velocity/issues/47) const domNode = ReactDom.findDOMNode(this.nodes[k]); - Velocity.Utilities.removeData(domNode); + if (domNode) Velocity.Utilities.removeData(domNode); } this.nodes[k] = node; }, diff --git a/src/WidgetMessaging.js b/src/WidgetMessaging.js index 0f23413b5f..5b722df65f 100644 --- a/src/WidgetMessaging.js +++ b/src/WidgetMessaging.js @@ -15,312 +15,103 @@ limitations under the License. */ /* -Listens for incoming postMessage requests from embedded widgets. The following API is exposed: -{ - api: "widget", - action: "content_loaded", - widgetId: $WIDGET_ID, - data: {} - // additional request fields -} - -The complete request object is returned to the caller with an additional "response" key like so: -{ - api: "widget", - action: "content_loaded", - widgetId: $WIDGET_ID, - data: {}, - // additional request fields - response: { ... } -} - -The "api" field is required to use this API, and must be set to "widget" in all requests. - -The "action" determines the format of the request and response. All actions can return an error response. - -Additional data can be sent as additional, abritrary fields. However, typically the data object should be used. - -A success response is an object with zero or more keys. - -An error response is a "response" object which consists of a sole "error" key to indicate an error. -They look like: -{ - error: { - message: "Unable to invite user into room.", - _error: - } -} -The "message" key should be a human-friendly string. - -ACTIONS -======= -** All actions must include an "api" field with valie "widget".** -All actions can return an error response instead of the response outlined below. - -content_loaded --------------- -Indicates that widget contet has fully loaded - -Request: - - widgetId is the unique ID of the widget instance in riot / matrix state. - - No additional fields. -Response: -{ - success: true -} -Example: -{ - api: "widget", - action: "content_loaded", - widgetId: $WIDGET_ID -} - - -api_version ------------ -Get the current version of the widget postMessage API - -Request: - - No additional fields. -Response: -{ - api_version: "0.0.1" -} -Example: -{ - api: "widget", - action: "api_version", -} - -supported_api_versions ----------------------- -Get versions of the widget postMessage API that are currently supported - -Request: - - No additional fields. -Response: -{ - api: "widget" - supported_versions: ["0.0.1"] -} -Example: -{ - api: "widget", - action: "supported_api_versions", -} - +* See - https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit?usp=sharing for +* spec. details / documentation. */ -import URL from 'url'; +import FromWidgetPostMessageApi from './FromWidgetPostMessageApi'; +import ToWidgetPostMessageApi from './ToWidgetPostMessageApi'; -const WIDGET_API_VERSION = '0.0.1'; // Current API version -const SUPPORTED_WIDGET_API_VERSIONS = [ - '0.0.1', -]; - -import dis from './dispatcher'; - -if (!global.mxWidgetMessagingListenerCount) { - global.mxWidgetMessagingListenerCount = 0; +if (!global.mxFromWidgetMessaging) { + global.mxFromWidgetMessaging = new FromWidgetPostMessageApi(); + global.mxFromWidgetMessaging.start(); } -if (!global.mxWidgetMessagingMessageEndpoints) { - global.mxWidgetMessagingMessageEndpoints = []; +if (!global.mxToWidgetMessaging) { + global.mxToWidgetMessaging = new ToWidgetPostMessageApi(); + global.mxToWidgetMessaging.start(); } +const OUTBOUND_API_NAME = 'toWidget'; -/** - * Register widget message event listeners - */ -function startListening() { - if (global.mxWidgetMessagingListenerCount === 0) { - window.addEventListener("message", onMessage, false); - } - global.mxWidgetMessagingListenerCount += 1; -} - -/** - * De-register widget message event listeners - */ -function stopListening() { - global.mxWidgetMessagingListenerCount -= 1; - if (global.mxWidgetMessagingListenerCount === 0) { - window.removeEventListener("message", onMessage); - } - if (global.mxWidgetMessagingListenerCount < 0) { - // Make an error so we get a stack trace - const e = new Error( - "WidgetMessaging: mismatched startListening / stopListening detected." + - " Negative count", - ); - console.error(e); - } -} - -/** - * Register a widget endpoint for trusted postMessage communication - * @param {string} widgetId Unique widget identifier - * @param {string} endpointUrl Widget wurl origin (protocol + (optional port) + host) - */ -function addEndpoint(widgetId, endpointUrl) { - const u = URL.parse(endpointUrl); - if (!u || !u.protocol || !u.host) { - console.warn("Invalid origin:", endpointUrl); - return; - } - - const origin = u.protocol + '//' + u.host; - const endpoint = new WidgetMessageEndpoint(widgetId, origin); - if (global.mxWidgetMessagingMessageEndpoints) { - if (global.mxWidgetMessagingMessageEndpoints.some(function(ep) { - return (ep.widgetId === widgetId && ep.endpointUrl === endpointUrl); - })) { - // Message endpoint already registered - console.warn("Endpoint already registered"); - return; - } - global.mxWidgetMessagingMessageEndpoints.push(endpoint); - } -} - -/** - * De-register a widget endpoint from trusted communication sources - * @param {string} widgetId Unique widget identifier - * @param {string} endpointUrl Widget wurl origin (protocol + (optional port) + host) - * @return {boolean} True if endpoint was successfully removed - */ -function removeEndpoint(widgetId, endpointUrl) { - const u = URL.parse(endpointUrl); - if (!u || !u.protocol || !u.host) { - console.warn("Invalid origin"); - return; - } - - const origin = u.protocol + '//' + u.host; - if (global.mxWidgetMessagingMessageEndpoints && global.mxWidgetMessagingMessageEndpoints.length > 0) { - const length = global.mxWidgetMessagingMessageEndpoints.length; - global.mxWidgetMessagingMessageEndpoints = global.mxWidgetMessagingMessageEndpoints.filter(function(endpoint) { - return (endpoint.widgetId != widgetId || endpoint.endpointUrl != origin); - }); - return (length > global.mxWidgetMessagingMessageEndpoints.length); - } - return false; -} - - -/** - * Handle widget postMessage events - * @param {Event} event Event to handle - * @return {undefined} - */ -function onMessage(event) { - if (!event.origin) { // Handle chrome - event.origin = event.originalEvent.origin; - } - - // Event origin is empty string if undefined - if ( - event.origin.length === 0 || - !trustedEndpoint(event.origin) || - event.data.api !== "widget" || - !event.data.widgetId - ) { - return; // don't log this - debugging APIs like to spam postMessage which floods the log otherwise - } - - const action = event.data.action; - const widgetId = event.data.widgetId; - if (action === 'content_loaded') { - dis.dispatch({ - action: 'widget_content_loaded', - widgetId: widgetId, - }); - sendResponse(event, {success: true}); - } else if (action === 'supported_api_versions') { - sendResponse(event, { - api: "widget", - supported_versions: SUPPORTED_WIDGET_API_VERSIONS, - }); - } else if (action === 'api_version') { - sendResponse(event, { - api: "widget", - version: WIDGET_API_VERSION, - }); - } else { - console.warn("Widget postMessage event unhandled"); - sendError(event, {message: "The postMessage was unhandled"}); - } -} - -/** - * Check if message origin is registered as trusted - * @param {string} origin PostMessage origin to check - * @return {boolean} True if trusted - */ -function trustedEndpoint(origin) { - if (!origin) { - return false; - } - - return global.mxWidgetMessagingMessageEndpoints.some((endpoint) => { - return endpoint.endpointUrl === origin; - }); -} - -/** - * Send a postmessage response to a postMessage request - * @param {Event} event The original postMessage request event - * @param {Object} res Response data - */ -function sendResponse(event, res) { - const data = JSON.parse(JSON.stringify(event.data)); - data.response = res; - event.source.postMessage(data, event.origin); -} - -/** - * Send an error response to a postMessage request - * @param {Event} event The original postMessage request event - * @param {string} msg Error message - * @param {Error} nestedError Nested error event (optional) - */ -function sendError(event, msg, nestedError) { - console.error("Action:" + event.data.action + " failed with message: " + msg); - const data = JSON.parse(JSON.stringify(event.data)); - data.response = { - error: { - message: msg, - }, - }; - if (nestedError) { - data.response.error._error = nestedError; - } - event.source.postMessage(data, event.origin); -} - -/** - * Represents mapping of widget instance to URLs for trusted postMessage communication. - */ -class WidgetMessageEndpoint { - /** - * Mapping of widget instance to URL for trusted postMessage communication. - * @param {string} widgetId Unique widget identifier - * @param {string} endpointUrl Widget wurl origin. - */ - constructor(widgetId, endpointUrl) { - if (!widgetId) { - throw new Error("No widgetId specified in widgetMessageEndpoint constructor"); - } - if (!endpointUrl) { - throw new Error("No endpoint specified in widgetMessageEndpoint constructor"); - } +export default class WidgetMessaging { + constructor(widgetId, widgetUrl, target) { this.widgetId = widgetId; - this.endpointUrl = endpointUrl; + this.widgetUrl = widgetUrl; + this.target = target; + this.fromWidget = global.mxFromWidgetMessaging; + this.toWidget = global.mxToWidgetMessaging; + this.start(); + } + + messageToWidget(action) { + action.widgetId = this.widgetId; // Required to be sent for all outbound requests + + return this.toWidget.exec(action, this.target).then((data) => { + // Check for errors and reject if found + if (data.response === undefined) { // null is valid + throw new Error("Missing 'response' field"); + } + if (data.response && data.response.error) { + const err = data.response.error; + const msg = String(err.message ? err.message : "An error was returned"); + if (err._error) { + console.error(err._error); + } + // Potential XSS attack if 'msg' is not appropriately sanitized, + // as it is untrusted input by our parent window (which we assume is Riot). + // We can't aggressively sanitize [A-z0-9] since it might be a translation. + throw new Error(msg); + } + // Return the response field for the request + return data.response; + }); + } + + /** + * Request a screenshot from a widget + * @return {Promise} To be resolved with screenshot data when it has been generated + */ + getScreenshot() { + console.warn('Requesting screenshot for', this.widgetId); + return this.messageToWidget({ + api: OUTBOUND_API_NAME, + action: "screenshot", + }) + .catch((error) => new Error("Failed to get screenshot: " + error.message)) + .then((response) => response.screenshot); + } + + /** + * Request capabilities required by the widget + * @return {Promise} To be resolved with an array of requested widget capabilities + */ + getCapabilities() { + console.warn('Requesting capabilities for', this.widgetId); + return this.messageToWidget({ + api: OUTBOUND_API_NAME, + action: "capabilities", + }).then((response) => { + console.warn('Got capabilities for', this.widgetId, response.capabilities); + return response.capabilities; + }); + } + + sendVisibility(visible) { + return this.messageToWidget({ + api: OUTBOUND_API_NAME, + action: "visibility", + visible, + }) + .catch((error) => { + console.error("Failed to send visibility: ", error); + }); + } + + start() { + this.fromWidget.addEndpoint(this.widgetId, this.widgetUrl); + } + + stop() { + this.fromWidget.removeEndpoint(this.widgetId, this.widgetUrl); } } - -export default { - startListening: startListening, - stopListening: stopListening, - addEndpoint: addEndpoint, - removeEndpoint: removeEndpoint, -}; diff --git a/src/WidgetMessagingEndpoint.js b/src/WidgetMessagingEndpoint.js new file mode 100644 index 0000000000..9114e12137 --- /dev/null +++ b/src/WidgetMessagingEndpoint.js @@ -0,0 +1,37 @@ +/* +Copyright 2018 New Vector Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + + +/** + * Represents mapping of widget instance to URLs for trusted postMessage communication. + */ +export default class WidgetMessageEndpoint { + /** + * Mapping of widget instance to URL for trusted postMessage communication. + * @param {string} widgetId Unique widget identifier + * @param {string} endpointUrl Widget wurl origin. + */ + constructor(widgetId, endpointUrl) { + if (!widgetId) { + throw new Error("No widgetId specified in widgetMessageEndpoint constructor"); + } + if (!endpointUrl) { + throw new Error("No endpoint specified in widgetMessageEndpoint constructor"); + } + this.widgetId = widgetId; + this.endpointUrl = endpointUrl; + } +} diff --git a/src/WidgetUtils.js b/src/WidgetUtils.js index 34c998978d..5f45a8c58c 100644 --- a/src/WidgetUtils.js +++ b/src/WidgetUtils.js @@ -17,8 +17,8 @@ limitations under the License. import MatrixClientPeg from './MatrixClientPeg'; export default class WidgetUtils { - /* Returns true if user is able to send state events to modify widgets in this room + * (Does not apply to non-room-based / user widgets) * @param roomId -- The ID of the room to check * @return Boolean -- true if the user can modify widgets in this room * @throws Error -- specifies the error reason diff --git a/src/actions/MatrixActionCreators.js b/src/actions/MatrixActionCreators.js index 33bdb53799..6e1d52a88f 100644 --- a/src/actions/MatrixActionCreators.js +++ b/src/actions/MatrixActionCreators.js @@ -62,6 +62,127 @@ function createAccountDataAction(matrixClient, accountDataEvent) { }; } +/** + * @typedef RoomAction + * @type {Object} + * @property {string} action 'MatrixActions.Room'. + * @property {Room} room the Room that was stored. + */ + +/** + * Create a MatrixActions.Room action that represents a MatrixClient `Room` + * matrix event, emitted when a Room is stored in the client. + * + * @param {MatrixClient} matrixClient the matrix client. + * @param {Room} room the Room that was stored. + * @returns {RoomAction} an action of type `MatrixActions.Room`. + */ +function createRoomAction(matrixClient, room) { + return { action: 'MatrixActions.Room', room }; +} + +/** + * @typedef RoomTagsAction + * @type {Object} + * @property {string} action 'MatrixActions.Room.tags'. + * @property {Room} room the Room whose tags changed. + */ + +/** + * Create a MatrixActions.Room.tags action that represents a MatrixClient + * `Room.tags` matrix event, emitted when the m.tag room account data + * event is updated. + * + * @param {MatrixClient} matrixClient the matrix client. + * @param {MatrixEvent} roomTagsEvent the m.tag event. + * @param {Room} room the Room whose tags were changed. + * @returns {RoomTagsAction} an action of type `MatrixActions.Room.tags`. + */ +function createRoomTagsAction(matrixClient, roomTagsEvent, room) { + return { action: 'MatrixActions.Room.tags', room }; +} + +/** + * @typedef RoomTimelineAction + * @type {Object} + * @property {string} action 'MatrixActions.Room.timeline'. + * @property {boolean} isLiveEvent whether the event was attached to a + * live timeline. + * @property {boolean} isLiveUnfilteredRoomTimelineEvent whether the + * event was attached to a timeline in the set of unfiltered timelines. + * @property {Room} room the Room whose tags changed. + */ + +/** + * Create a MatrixActions.Room.timeline action that represents a + * MatrixClient `Room.timeline` matrix event, emitted when an event + * is added to or removed from a timeline of a room. + * + * @param {MatrixClient} matrixClient the matrix client. + * @param {MatrixEvent} timelineEvent the event that was added/removed. + * @param {Room} room the Room that was stored. + * @param {boolean} toStartOfTimeline whether the event is being added + * to the start (and not the end) of the timeline. + * @param {boolean} removed whether the event was removed from the + * timeline. + * @param {Object} data + * @param {boolean} data.liveEvent whether the event is a live event, + * belonging to a live timeline. + * @param {EventTimeline} data.timeline the timeline being altered. + * @returns {RoomTimelineAction} an action of type `MatrixActions.Room.timeline`. + */ +function createRoomTimelineAction(matrixClient, timelineEvent, room, toStartOfTimeline, removed, data) { + return { + action: 'MatrixActions.Room.timeline', + event: timelineEvent, + isLiveEvent: data.liveEvent, + isLiveUnfilteredRoomTimelineEvent: + room && data.timeline.getTimelineSet() === room.getUnfilteredTimelineSet(), + }; +} + +/** + * @typedef RoomMembershipAction + * @type {Object} + * @property {string} action 'MatrixActions.RoomMember.membership'. + * @property {RoomMember} member the member whose membership was updated. + */ + +/** + * Create a MatrixActions.RoomMember.membership action that represents + * a MatrixClient `RoomMember.membership` matrix event, emitted when a + * member's membership is updated. + * + * @param {MatrixClient} matrixClient the matrix client. + * @param {MatrixEvent} membershipEvent the m.room.member event. + * @param {RoomMember} member the member whose membership was updated. + * @param {string} oldMembership the member's previous membership. + * @returns {RoomMembershipAction} an action of type `MatrixActions.RoomMember.membership`. + */ +function createRoomMembershipAction(matrixClient, membershipEvent, member, oldMembership) { + return { action: 'MatrixActions.RoomMember.membership', member }; +} + +/** + * @typedef EventDecryptedAction + * @type {Object} + * @property {string} action 'MatrixActions.Event.decrypted'. + * @property {MatrixEvent} event the matrix event that was decrypted. + */ + +/** + * Create a MatrixActions.Event.decrypted action that represents + * a MatrixClient `Event.decrypted` matrix event, emitted when a + * matrix event is decrypted. + * + * @param {MatrixClient} matrixClient the matrix client. + * @param {MatrixEvent} event the matrix event that was decrypted. + * @returns {EventDecryptedAction} an action of type `MatrixActions.Event.decrypted`. + */ +function createEventDecryptedAction(matrixClient, event) { + return { action: 'MatrixActions.Event.decrypted', event }; +} + /** * This object is responsible for dispatching actions when certain events are emitted by * the given MatrixClient. @@ -78,6 +199,11 @@ export default { start(matrixClient) { this._addMatrixClientListener(matrixClient, 'sync', createSyncAction); this._addMatrixClientListener(matrixClient, 'accountData', createAccountDataAction); + this._addMatrixClientListener(matrixClient, 'Room', createRoomAction); + this._addMatrixClientListener(matrixClient, 'Room.tags', createRoomTagsAction); + this._addMatrixClientListener(matrixClient, 'Room.timeline', createRoomTimelineAction); + this._addMatrixClientListener(matrixClient, 'RoomMember.membership', createRoomMembershipAction); + this._addMatrixClientListener(matrixClient, 'Event.decrypted', createEventDecryptedAction); }, /** @@ -91,7 +217,7 @@ export default { */ _addMatrixClientListener(matrixClient, eventName, actionCreator) { const listener = (...args) => { - dis.dispatch(actionCreator(matrixClient, ...args)); + dis.dispatch(actionCreator(matrixClient, ...args), true); }; matrixClient.on(eventName, listener); this._matrixClientListenersStop.push(() => { diff --git a/src/actions/RoomListActions.js b/src/actions/RoomListActions.js new file mode 100644 index 0000000000..e5911c4e32 --- /dev/null +++ b/src/actions/RoomListActions.js @@ -0,0 +1,146 @@ +/* +Copyright 2018 New Vector Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { asyncAction } from './actionCreators'; +import RoomListStore from '../stores/RoomListStore'; + +import Modal from '../Modal'; +import * as Rooms from '../Rooms'; +import { _t } from '../languageHandler'; +import sdk from '../index'; + +const RoomListActions = {}; + +/** + * Creates an action thunk that will do an asynchronous request to + * tag room. + * + * @param {MatrixClient} matrixClient the matrix client to set the + * account data on. + * @param {Room} room the room to tag. + * @param {string} oldTag the tag to remove (unless oldTag ==== newTag) + * @param {string} newTag the tag with which to tag the room. + * @param {?number} oldIndex the previous position of the room in the + * list of rooms. + * @param {?number} newIndex the new position of the room in the list + * of rooms. + * @returns {function} an action thunk. + * @see asyncAction + */ +RoomListActions.tagRoom = function(matrixClient, room, oldTag, newTag, oldIndex, newIndex) { + let metaData = null; + + // Is the tag ordered manually? + if (newTag && !newTag.match(/^(m\.lowpriority|im\.vector\.fake\.(invite|recent|direct|archived))$/)) { + const lists = RoomListStore.getRoomLists(); + const newList = [...lists[newTag]]; + + newList.sort((a, b) => a.tags[newTag].order - b.tags[newTag].order); + + // If the room was moved "down" (increasing index) in the same list we + // need to use the orders of the tiles with indices shifted by +1 + const offset = ( + newTag === oldTag && oldIndex < newIndex + ) ? 1 : 0; + + const indexBefore = offset + newIndex - 1; + const indexAfter = offset + newIndex; + + const prevOrder = indexBefore <= 0 ? + 0 : newList[indexBefore].tags[newTag].order; + const nextOrder = indexAfter >= newList.length ? + 1 : newList[indexAfter].tags[newTag].order; + + metaData = { + order: (prevOrder + nextOrder) / 2.0, + }; + } + + return asyncAction('RoomListActions.tagRoom', () => { + const promises = []; + const roomId = room.roomId; + + // Evil hack to get DMs behaving + if ((oldTag === undefined && newTag === 'im.vector.fake.direct') || + (oldTag === 'im.vector.fake.direct' && newTag === undefined) + ) { + return Rooms.guessAndSetDMRoom( + room, newTag === 'im.vector.fake.direct', + ).catch((err) => { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + console.error("Failed to set direct chat tag " + err); + Modal.createTrackedDialog('Failed to set direct chat tag', '', ErrorDialog, { + title: _t('Failed to set direct chat tag'), + description: ((err && err.message) ? err.message : _t('Operation failed')), + }); + }); + } + + const hasChangedSubLists = oldTag !== newTag; + + // More evilness: We will still be dealing with moving to favourites/low prio, + // but we avoid ever doing a request with 'im.vector.fake.direct`. + // + // if we moved lists, remove the old tag + if (oldTag && oldTag !== 'im.vector.fake.direct' && + hasChangedSubLists + ) { + const promiseToDelete = matrixClient.deleteRoomTag( + roomId, oldTag, + ).catch(function(err) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + console.error("Failed to remove tag " + oldTag + " from room: " + err); + Modal.createTrackedDialog('Failed to remove tag from room', '', ErrorDialog, { + title: _t('Failed to remove tag %(tagName)s from room', {tagName: oldTag}), + description: ((err && err.message) ? err.message : _t('Operation failed')), + }); + }); + + promises.push(promiseToDelete); + } + + // if we moved lists or the ordering changed, add the new tag + if (newTag && newTag !== 'im.vector.fake.direct' && + (hasChangedSubLists || metaData) + ) { + // metaData is the body of the PUT to set the tag, so it must + // at least be an empty object. + metaData = metaData || {}; + + const promiseToAdd = matrixClient.setRoomTag(roomId, newTag, metaData).catch(function(err) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + console.error("Failed to add tag " + newTag + " to room: " + err); + Modal.createTrackedDialog('Failed to add tag to room', '', ErrorDialog, { + title: _t('Failed to add tag %(tagName)s to room', {tagName: newTag}), + description: ((err && err.message) ? err.message : _t('Operation failed')), + }); + + throw err; + }); + + promises.push(promiseToAdd); + } + + return Promise.all(promises); + }, () => { + // For an optimistic update + return { + room, oldTag, newTag, metaData, + }; + }); +}; + +export default RoomListActions; diff --git a/src/actions/TagOrderActions.js b/src/actions/TagOrderActions.js index 60946ea7f1..a257ff16d8 100644 --- a/src/actions/TagOrderActions.js +++ b/src/actions/TagOrderActions.js @@ -22,25 +22,87 @@ const TagOrderActions = {}; /** * Creates an action thunk that will do an asynchronous request to - * commit TagOrderStore.getOrderedTags() to account data and dispatch - * actions to indicate the status of the request. + * move a tag in TagOrderStore to destinationIx. * * @param {MatrixClient} matrixClient the matrix client to set the * account data on. + * @param {string} tag the tag to move. + * @param {number} destinationIx the new position of the tag. * @returns {function} an action thunk that will dispatch actions * indicating the status of the request. * @see asyncAction */ -TagOrderActions.commitTagOrdering = function(matrixClient) { - return asyncAction('TagOrderActions.commitTagOrdering', () => { - // Only commit tags if the state is ready, i.e. not null - const tags = TagOrderStore.getOrderedTags(); - if (!tags) { - return; - } +TagOrderActions.moveTag = function(matrixClient, tag, destinationIx) { + // Only commit tags if the state is ready, i.e. not null + let tags = TagOrderStore.getOrderedTags(); + let removedTags = TagOrderStore.getRemovedTagsAccountData() || []; + if (!tags) { + return; + } + tags = tags.filter((t) => t !== tag); + tags = [...tags.slice(0, destinationIx), tag, ...tags.slice(destinationIx)]; + + removedTags = removedTags.filter((t) => t !== tag); + + const storeId = TagOrderStore.getStoreId(); + + return asyncAction('TagOrderActions.moveTag', () => { Analytics.trackEvent('TagOrderActions', 'commitTagOrdering'); - return matrixClient.setAccountData('im.vector.web.tag_ordering', {tags}); + return matrixClient.setAccountData( + 'im.vector.web.tag_ordering', + {tags, removedTags, _storeId: storeId}, + ); + }, () => { + // For an optimistic update + return {tags, removedTags}; + }); +}; + +/** + * Creates an action thunk that will do an asynchronous request to + * label a tag as removed in im.vector.web.tag_ordering account data. + * + * The reason this is implemented with new state `removedTags` is that + * we incrementally and initially populate `tags` with groups that + * have been joined. If we remove a group from `tags`, it will just + * get added (as it looks like a group we've recently joined). + * + * NB: If we ever support adding of tags (which is planned), we should + * take special care to remove the tag from `removedTags` when we add + * it. + * + * @param {MatrixClient} matrixClient the matrix client to set the + * account data on. + * @param {string} tag the tag to remove. + * @returns {function} an action thunk that will dispatch actions + * indicating the status of the request. + * @see asyncAction + */ +TagOrderActions.removeTag = function(matrixClient, tag) { + // Don't change tags, just removedTags + const tags = TagOrderStore.getOrderedTags(); + const removedTags = TagOrderStore.getRemovedTagsAccountData() || []; + + if (removedTags.includes(tag)) { + // Return a thunk that doesn't do anything, we don't even need + // an asynchronous action here, the tag is already removed. + return () => {}; + } + + removedTags.push(tag); + + const storeId = TagOrderStore.getStoreId(); + + return asyncAction('TagOrderActions.removeTag', () => { + Analytics.trackEvent('TagOrderActions', 'removeTag'); + return matrixClient.setAccountData( + 'im.vector.web.tag_ordering', + {tags, removedTags, _storeId: storeId}, + ); + }, () => { + // For an optimistic update + return {removedTags}; }); }; diff --git a/src/actions/actionCreators.js b/src/actions/actionCreators.js index bddfbc7c63..967ce609e7 100644 --- a/src/actions/actionCreators.js +++ b/src/actions/actionCreators.js @@ -22,16 +22,32 @@ limitations under the License. * suffix determining whether it is pending, successful or * a failure. * @param {function} fn a function that returns a Promise. + * @param {function?} pendingFn a function that returns an object to assign + * to the `request` key of the ${id}.pending + * payload. * @returns {function} an action thunk - a function that uses its single * argument as a dispatch function to dispatch the * following actions: * `${id}.pending` and either * `${id}.success` or * `${id}.failure`. + * + * The shape of each are: + * { action: '${id}.pending', request } + * { action: '${id}.success', result } + * { action: '${id}.failure', err } + * + * where `request` is returned by `pendingFn` and + * result is the result of the promise returned by + * `fn`. */ -export function asyncAction(id, fn) { +export function asyncAction(id, fn, pendingFn) { return (dispatch) => { - dispatch({action: id + '.pending'}); + dispatch({ + action: id + '.pending', + request: + typeof pendingFn === 'function' ? pendingFn() : undefined, + }); fn().then((result) => { dispatch({action: id + '.success', result}); }).catch((err) => { diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index d47f1a161a..e33fa7861f 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -105,6 +105,11 @@ const COMMANDS = [ args: '', description: _td('Stops ignoring a user, showing their messages going forward'), }, + { + command: '/devtools', + args: '', + description: _td('Opens the Developer Tools dialog'), + }, // Omitting `/markdown` as it only seems to apply to OldComposer ]; diff --git a/src/autocomplete/UserProvider.js b/src/autocomplete/UserProvider.js index fefe77f6cd..ce8f1020a1 100644 --- a/src/autocomplete/UserProvider.js +++ b/src/autocomplete/UserProvider.js @@ -44,6 +44,7 @@ export default class UserProvider extends AutocompleteProvider { this.matcher = new FuzzyMatcher([], { keys: ['name', 'userId'], shouldMatchPrefix: true, + shouldMatchWordsOnly: false }); this._onRoomTimelineBound = this._onRoomTimeline.bind(this); @@ -72,6 +73,7 @@ export default class UserProvider extends AutocompleteProvider { // updates from pagination will happen when the paginate completes. if (toStartOfTimeline || !data || !data.liveEvent) return; + // TODO: lazyload if we have no ev.sender room member? this.onUserSpoke(ev.sender); } @@ -99,8 +101,13 @@ export default class UserProvider extends AutocompleteProvider { let completions = []; const {command, range} = this.getCurrentCommand(query, selection, force); - if (command) { - completions = this.matcher.match(command[0]).map((user) => { + + if (!command) return completions; + + const fullMatch = command[0]; + // Don't search if the query is a single "@" + if (fullMatch && fullMatch !== '@') { + completions = this.matcher.match(fullMatch).map((user) => { const displayName = (user.name || user.userId || '').replace(' (IRC)', ''); // FIXME when groups are done return { // Length of completion should equal length of text in decorator. draft-js @@ -147,6 +154,7 @@ export default class UserProvider extends AutocompleteProvider { onUserSpoke(user: RoomMember) { if (this.users === null) return; + if (!user) return; if (user.userId === MatrixClientPeg.get().credentials.userId) return; // Move the user that spoke to the front of the array @@ -158,7 +166,7 @@ export default class UserProvider extends AutocompleteProvider { } renderCompletions(completions: [React.Component]): ?React.Component { - return
+ return
{ completions }
; } 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 ; + } + }, + + _collectPeopleButton: function(e) { + this._peopleButton = e; + }, + + _collectDirectoryButton: function(e) { + this._directoryButton = e; + }, + + _collectCreateRoomButton: function(e) { + this._createRoomButton = e; + }, + + render: function() { + const HomeButton = sdk.getComponent('elements.HomeButton'); + const StartChatButton = sdk.getComponent('elements.StartChatButton'); + const RoomDirectoryButton = sdk.getComponent('elements.RoomDirectoryButton'); + const CreateRoomButton = sdk.getComponent('elements.CreateRoomButton'); + const SettingsButton = sdk.getComponent('elements.SettingsButton'); + const GroupsButton = sdk.getComponent('elements.GroupsButton'); + + const groupsButton = SettingsStore.getValue("TagPanel.disableTagPanel") ? + : null; + + return ( +
+
+ +
+ +
+
+ +
+
+ +
+ { groupsButton } + + + +
+
+ ); + }, +}); diff --git a/src/components/structures/CompatibilityPage.js b/src/components/structures/CompatibilityPage.js new file mode 100644 index 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 ( +
+
+

{ _t("Sorry, your browser is not able to run Riot.", {}, { 'b': (sub) => {sub} }) }

+

+ { _t("Riot uses many advanced browser features, some of which are not available or experimental in your current browser.") } +

+

+ { _t('Please install Chrome or Firefox for the best experience.', + {}, + { + 'chromeLink': (sub) => {sub}, + 'firefoxLink': (sub) => {sub}, + }, + )} + { _t('Safari and Opera work too.', + {}, + { + 'safariLink': (sub) => {sub}, + 'operaLink': (sub) => {sub}, + }, + )} +

+

+ { _t("With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!") } +

+ +
+
+ ); + } +}); diff --git a/src/components/structures/ContextualMenu.js b/src/components/structures/ContextualMenu.js index 94f5713a79..daac294d12 100644 --- a/src/components/structures/ContextualMenu.js +++ b/src/components/structures/ContextualMenu.js @@ -26,43 +26,49 @@ import PropTypes from 'prop-types'; // of doing reusable widgets like dialog boxes & menus where we go and // pass in a custom control as the actual body. -module.exports = { - ContextualMenuContainerId: "mx_ContextualMenu_Container", +const ContextualMenuContainerId = "mx_ContextualMenu_Container"; +function getOrCreateContainer() { + let container = document.getElementById(ContextualMenuContainerId); + + if (!container) { + container = document.createElement("div"); + container.id = ContextualMenuContainerId; + document.body.appendChild(container); + } + + return container; +} + +export default class ContextualMenu extends React.Component { propTypes: { + top: PropTypes.number, + bottom: PropTypes.number, + left: PropTypes.number, + right: PropTypes.number, menuWidth: PropTypes.number, menuHeight: PropTypes.number, chevronOffset: PropTypes.number, menuColour: PropTypes.string, chevronFace: PropTypes.string, // top, bottom, left, right - }, + // Function to be called on menu close + onFinished: PropTypes.func, + menuPaddingTop: PropTypes.number, + menuPaddingRight: PropTypes.number, + menuPaddingBottom: PropTypes.number, + menuPaddingLeft: PropTypes.number, - getOrCreateContainer: function() { - let container = document.getElementById(this.ContextualMenuContainerId); - - if (!container) { - container = document.createElement("div"); - container.id = this.ContextualMenuContainerId; - document.body.appendChild(container); - } - - return container; - }, - - createMenu: function(Element, props) { - const self = this; - - const closeMenu = function() { - ReactDOM.unmountComponentAtNode(self.getOrCreateContainer()); - - if (props && props.onFinished) { - props.onFinished.apply(null, arguments); - } - }; + // If true, insert an invisible screen-sized element behind the + // menu that when clicked will close it. + hasBackground: PropTypes.bool, + } + render() { const position = {}; let chevronFace = null; + const props = this.props; + if (props.top) { position.top = props.top; } else { @@ -130,21 +136,53 @@ module.exports = { menuStyle["backgroundColor"] = props.menuColour; } + if (!isNaN(Number(props.menuPaddingTop))) { + menuStyle["paddingTop"] = props.menuPaddingTop; + } + if (!isNaN(Number(props.menuPaddingLeft))) { + menuStyle["paddingLeft"] = props.menuPaddingLeft; + } + if (!isNaN(Number(props.menuPaddingBottom))) { + menuStyle["paddingBottom"] = props.menuPaddingBottom; + } + if (!isNaN(Number(props.menuPaddingRight))) { + menuStyle["paddingRight"] = props.menuPaddingRight; + } + + const ElementClass = props.elementClass; + // FIXME: If a menu uses getDefaultProps it clobbers the onFinished // property set here so you can't close the menu from a button click! - const menu = ( -
-
- { chevron } - -
-
- + return
+
+ { chevron } +
- ); + { props.hasBackground &&
} + +
; + } +} - ReactDOM.render(menu, this.getOrCreateContainer()); +export function createMenu(ElementClass, props) { + const closeMenu = function(...args) { + ReactDOM.unmountComponentAtNode(getOrCreateContainer()); - return {close: closeMenu}; - }, -}; + if (props && props.onFinished) { + props.onFinished.apply(null, args); + } + }; + + // We only reference closeMenu once per call to createMenu + const menu = ; + + ReactDOM.render(menu, getOrCreateContainer()); + + return {close: closeMenu}; +} diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index e86b76333d..3249cae22c 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -68,6 +68,9 @@ const FilePanel = React.createClass({ "room": { "timeline": { "contains_url": true, + "not_types": [ + "m.sticker", + ], }, }, }, diff --git a/src/components/structures/GroupView.js b/src/components/structures/GroupView.js index de96935838..ce79ccadfa 100644 --- a/src/components/structures/GroupView.js +++ b/src/components/structures/GroupView.js @@ -1,6 +1,6 @@ /* Copyright 2017 Vector Creations Ltd. -Copyright 2017 New Vector Ltd. +Copyright 2017, 2018 New Vector Ltd. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -27,10 +27,9 @@ import AccessibleButton from '../views/elements/AccessibleButton'; import Modal from '../../Modal'; import classnames from 'classnames'; -import GroupStoreCache from '../../stores/GroupStoreCache'; import GroupStore from '../../stores/GroupStore'; +import FlairStore from '../../stores/FlairStore'; import { showGroupAddRoomDialog } from '../../GroupAddressPicker'; -import GeminiScrollbar from 'react-gemini-scrollbar'; import {makeGroupPermalink, makeUserPermalink} from "../../matrix-to"; const LONG_DESC_PLACEHOLDER = _td( @@ -93,8 +92,8 @@ const CategoryRoomList = React.createClass({ if (!success) return; const errorList = []; Promise.all(addrs.map((addr) => { - return this.context.groupStore - .addRoomToGroupSummary(addr.address) + return GroupStore + .addRoomToGroupSummary(this.props.groupId, addr.address) .catch(() => { errorList.push(addr.address); }) .reflect(); })).then(() => { @@ -174,7 +173,8 @@ const FeaturedRoom = React.createClass({ onDeleteClicked: function(e) { e.preventDefault(); e.stopPropagation(); - this.context.groupStore.removeRoomFromGroupSummary( + GroupStore.removeRoomFromGroupSummary( + this.props.groupId, this.props.summaryInfo.room_id, ).catch((err) => { console.error('Error whilst removing room from group summary', err); @@ -269,7 +269,7 @@ const RoleUserList = React.createClass({ if (!success) return; const errorList = []; Promise.all(addrs.map((addr) => { - return this.context.groupStore + return GroupStore .addUserToGroupSummary(addr.address) .catch(() => { errorList.push(addr.address); }) .reflect(); @@ -344,7 +344,8 @@ const FeaturedUser = React.createClass({ onDeleteClicked: function(e) { e.preventDefault(); e.stopPropagation(); - this.context.groupStore.removeUserFromGroupSummary( + GroupStore.removeUserFromGroupSummary( + this.props.groupId, this.props.summaryInfo.user_id, ).catch((err) => { console.error('Error whilst removing user from group summary', err); @@ -390,14 +391,8 @@ const FeaturedUser = React.createClass({ }, }); -const GroupContext = { - groupStore: PropTypes.instanceOf(GroupStore).isRequired, -}; - -CategoryRoomList.contextTypes = GroupContext; -FeaturedRoom.contextTypes = GroupContext; -RoleUserList.contextTypes = GroupContext; -FeaturedUser.contextTypes = GroupContext; +const GROUP_JOINPOLICY_OPEN = "open"; +const GROUP_JOINPOLICY_INVITE = "invite"; export default React.createClass({ displayName: 'GroupView', @@ -412,12 +407,6 @@ export default React.createClass({ groupStore: PropTypes.instanceOf(GroupStore), }, - getChildContext: function() { - return { - groupStore: this._groupStore, - }; - }, - getInitialState: function() { return { summary: null, @@ -429,6 +418,7 @@ export default React.createClass({ editing: false, saving: false, uploadingAvatar: false, + avatarChanged: false, membershipBusy: false, publicityBusy: false, inviterProfile: null, @@ -436,6 +426,7 @@ export default React.createClass({ }, componentWillMount: function() { + this._unmounted = false; this._matrixClient = MatrixClientPeg.get(); this._matrixClient.on("Group.myMembership", this._onGroupMyMembership); @@ -444,8 +435,8 @@ export default React.createClass({ }, componentWillUnmount: function() { + this._unmounted = true; this._matrixClient.removeListener("Group.myMembership", this._onGroupMyMembership); - this._groupStore.removeAllListeners(); }, componentWillReceiveProps: function(newProps) { @@ -460,8 +451,11 @@ export default React.createClass({ }, _onGroupMyMembership: function(group) { - if (group.groupId !== this.props.groupId) return; - + if (this._unmounted || group.groupId !== this.props.groupId) return; + if (group.myMembership === 'leave') { + // Leave settings - the user might have clicked the "Leave" button + this._closeSettings(); + } this.setState({membershipBusy: false}); }, @@ -470,34 +464,11 @@ export default React.createClass({ if (group && group.inviter && group.inviter.userId) { this._fetchInviterProfile(group.inviter.userId); } - this._groupStore = GroupStoreCache.getGroupStore(groupId); - this._groupStore.registerListener(() => { - const summary = this._groupStore.getSummary(); - if (summary.profile) { - // Default profile fields should be "" for later sending to the server (which - // requires that the fields are strings, not null) - ["avatar_url", "long_description", "name", "short_description"].forEach((k) => { - summary.profile[k] = summary.profile[k] || ""; - }); - } - this.setState({ - summary, - summaryLoading: !this._groupStore.isStateReady(GroupStore.STATE_KEY.Summary), - isGroupPublicised: this._groupStore.getGroupPublicity(), - isUserPrivileged: this._groupStore.isUserPrivileged(), - groupRooms: this._groupStore.getGroupRooms(), - groupRoomsLoading: !this._groupStore.isStateReady(GroupStore.STATE_KEY.GroupRooms), - isUserMember: this._groupStore.getGroupMembers().some( - (m) => m.userId === this._matrixClient.credentials.userId, - ), - error: null, - }); - if (this.props.groupIsNew && firstInit) { - this._onEditClick(); - } - }); + GroupStore.registerListener(groupId, this.onGroupStoreUpdated.bind(this, firstInit)); let willDoOnboarding = false; - this._groupStore.on('error', (err) => { + // XXX: This should be more fluxy - let's get the error from GroupStore .getError or something + GroupStore.on('error', (err, errorGroupId) => { + if (this._unmounted || groupId !== errorGroupId) return; if (err.errcode === 'M_GUEST_ACCESS_FORBIDDEN' && !willDoOnboarding) { dis.dispatch({ action: 'do_after_sync_prepared', @@ -512,15 +483,45 @@ export default React.createClass({ this.setState({ summary: null, error: err, + editing: false, }); }); }, + onGroupStoreUpdated(firstInit) { + if (this._unmounted) return; + const summary = GroupStore.getSummary(this.props.groupId); + if (summary.profile) { + // Default profile fields should be "" for later sending to the server (which + // requires that the fields are strings, not null) + ["avatar_url", "long_description", "name", "short_description"].forEach((k) => { + summary.profile[k] = summary.profile[k] || ""; + }); + } + this.setState({ + summary, + summaryLoading: !GroupStore.isStateReady(this.props.groupId, GroupStore.STATE_KEY.Summary), + isGroupPublicised: GroupStore.getGroupPublicity(this.props.groupId), + isUserPrivileged: GroupStore.isUserPrivileged(this.props.groupId), + groupRooms: GroupStore.getGroupRooms(this.props.groupId), + groupRoomsLoading: !GroupStore.isStateReady(this.props.groupId, GroupStore.STATE_KEY.GroupRooms), + isUserMember: GroupStore.getGroupMembers(this.props.groupId).some( + (m) => m.userId === this._matrixClient.credentials.userId, + ), + error: null, + }); + // XXX: This might not work but this.props.groupIsNew unused anyway + if (this.props.groupIsNew && firstInit) { + this._onEditClick(); + } + }, + _fetchInviterProfile(userId) { this.setState({ inviterProfileBusy: true, }); this._matrixClient.getProfileInfo(userId).then((resp) => { + if (this._unmounted) return; this.setState({ inviterProfile: { avatarUrl: resp.avatar_url, @@ -530,6 +531,7 @@ export default React.createClass({ }).catch((e) => { console.error('Error getting group inviter profile', e); }).finally(() => { + if (this._unmounted) return; this.setState({ inviterProfileBusy: false, }); @@ -544,6 +546,12 @@ export default React.createClass({ this.setState({ editing: true, profileForm: Object.assign({}, this.state.summary.profile), + joinableForm: { + policyType: + this.state.summary.profile.is_openly_joinable ? + GROUP_JOINPOLICY_OPEN : + GROUP_JOINPOLICY_INVITE, + }, }); dis.dispatch({ action: 'panel_disable', @@ -552,6 +560,10 @@ export default React.createClass({ }, _onCancelClick: function() { + this._closeSettings(); + }, + + _closeSettings() { this.setState({ editing: false, profileForm: null, @@ -590,6 +602,10 @@ export default React.createClass({ this.setState({ uploadingAvatar: false, profileForm: newProfileForm, + + // Indicate that FlairStore needs to be poked to show this change + // in TagTile (TagPanel), Flair and GroupTile (MyGroups). + avatarChanged: true, }); }).catch((e) => { this.setState({uploadingAvatar: false}); @@ -602,11 +618,15 @@ export default React.createClass({ }).done(); }, + _onJoinableChange: function(ev) { + this.setState({ + joinableForm: { policyType: ev.target.value }, + }); + }, + _onSaveClick: function() { this.setState({saving: true}); - const savePromise = this.state.isUserPrivileged ? - this._matrixClient.setGroupProfile(this.props.groupId, this.state.profileForm) : - Promise.resolve(); + const savePromise = this.state.isUserPrivileged ? this._saveGroup() : Promise.resolve(); savePromise.then((result) => { this.setState({ saving: false, @@ -615,6 +635,11 @@ export default React.createClass({ }); dis.dispatch({action: 'panel_disable'}); this._initGroupStore(this.props.groupId); + + if (this.state.avatarChanged) { + // XXX: Evil - poking a store should be done from an async action + FlairStore.refreshGroupProfile(this._matrixClient, this.props.groupId); + } }).catch((e) => { this.setState({ saving: false, @@ -625,12 +650,28 @@ export default React.createClass({ title: _t('Error'), description: _t('Failed to update community'), }); + }).finally(() => { + this.setState({ + avatarChanged: false, + }); }).done(); }, - _onAcceptInviteClick: function() { + _saveGroup: async function() { + await this._matrixClient.setGroupProfile(this.props.groupId, this.state.profileForm); + await this._matrixClient.setGroupJoinPolicy(this.props.groupId, { + type: this.state.joinableForm.policyType, + }); + }, + + _onAcceptInviteClick: async function() { this.setState({membershipBusy: true}); - this._groupStore.acceptGroupInvite().then(() => { + + // Wait 500ms to prevent flashing. Do this before sending a request otherwise we risk the + // spinner disappearing after we have fetched new group data. + await Promise.delay(500); + + GroupStore.acceptGroupInvite(this.props.groupId).then(() => { // don't reset membershipBusy here: wait for the membership change to come down the sync }).catch((e) => { this.setState({membershipBusy: false}); @@ -642,9 +683,14 @@ export default React.createClass({ }); }, - _onRejectInviteClick: function() { + _onRejectInviteClick: async function() { this.setState({membershipBusy: true}); - this._matrixClient.leaveGroup(this.props.groupId).then(() => { + + // Wait 500ms to prevent flashing. Do this before sending a request otherwise we risk the + // spinner disappearing after we have fetched new group data. + await Promise.delay(500); + + GroupStore.leaveGroup(this.props.groupId).then(() => { // don't reset membershipBusy here: wait for the membership change to come down the sync }).catch((e) => { this.setState({membershipBusy: false}); @@ -656,6 +702,25 @@ export default React.createClass({ }); }, + _onJoinClick: async function() { + this.setState({membershipBusy: true}); + + // Wait 500ms to prevent flashing. Do this before sending a request otherwise we risk the + // spinner disappearing after we have fetched new group data. + await Promise.delay(500); + + GroupStore.joinGroup(this.props.groupId).then(() => { + // don't reset membershipBusy here: wait for the membership change to come down the sync + }).catch((e) => { + this.setState({membershipBusy: false}); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Error joining room', '', ErrorDialog, { + title: _t("Error"), + description: _t("Unable to join community"), + }); + }); + }, + _onLeaveClick: function() { const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); Modal.createTrackedDialog('Leave Group', '', QuestionDialog, { @@ -663,18 +728,23 @@ export default React.createClass({ description: _t("Leave %(groupName)s?", {groupName: this.props.groupId}), button: _t("Leave"), danger: true, - onFinished: (confirmed) => { + onFinished: async (confirmed) => { if (!confirmed) return; this.setState({membershipBusy: true}); - this._matrixClient.leaveGroup(this.props.groupId).then(() => { + + // Wait 500ms to prevent flashing. Do this before sending a request otherwise we risk the + // spinner disappearing after we have fetched new group data. + await Promise.delay(500); + + GroupStore.leaveGroup(this.props.groupId).then(() => { // don't reset membershipBusy here: wait for the membership change to come down the sync }).catch((e) => { this.setState({membershipBusy: false}); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Error leaving room', '', ErrorDialog, { + Modal.createTrackedDialog('Error leaving community', '', ErrorDialog, { title: _t("Error"), - description: _t("Unable to leave room"), + description: _t("Unable to leave community"), }); }); }, @@ -692,8 +762,22 @@ export default React.createClass({ }); const header = this.state.editing ?

{ _t('Community Settings') }

:
; + const changeDelayWarning = this.state.editing && this.state.isUserPrivileged ? +
+ { _t( + 'Changes made to your community name and avatar ' + + 'might not be seen by other users for up to 30 minutes.', + {}, + { + 'bold1': (sub) => { sub } , + 'bold2': (sub) => { sub } , + }, + ) } +
:
; return
{ header } + { changeDelayWarning } + { this._getJoinableNode() } { this._getLongDescriptionNode() } { this._getRoomsNode() }
; @@ -832,9 +916,8 @@ export default React.createClass({ const BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); const group = this._matrixClient.getGroup(this.props.groupId); - if (!group) return null; - if (group.myMembership === 'invite') { + if (group && group.myMembership === 'invite') { if (this.state.membershipBusy || this.state.inviterProfileBusy) { return
@@ -875,33 +958,107 @@ export default React.createClass({
; - } else if (group.myMembership === 'join' && this.state.editing) { - const leaveButtonTooltip = this.state.isUserPrivileged ? + } + + let membershipContainerExtraClasses; + let membershipButtonExtraClasses; + let membershipButtonTooltip; + let membershipButtonText; + let membershipButtonOnClick; + + // User is not in the group + if ((!group || group.myMembership === 'leave') && + this.state.summary && + this.state.summary.profile && + Boolean(this.state.summary.profile.is_openly_joinable) + ) { + membershipButtonText = _t("Join this community"); + membershipButtonOnClick = this._onJoinClick; + + membershipButtonExtraClasses = 'mx_GroupView_joinButton'; + membershipContainerExtraClasses = 'mx_GroupView_membershipSection_leave'; + } else if ( + group && + group.myMembership === 'join' && + this.state.editing + ) { + membershipButtonText = _t("Leave this community"); + membershipButtonOnClick = this._onLeaveClick; + membershipButtonTooltip = this.state.isUserPrivileged ? _t("You are an administrator of this community") : _t("You are a member of this community"); - const leaveButtonClasses = classnames({ - "mx_RoomHeader_textButton": true, - "mx_GroupView_textButton": true, - "mx_GroupView_leaveButton": true, - "mx_RoomHeader_textButton_danger": this.state.isUserPrivileged, - }); - return
-
- { /* Empty div for flex alignment */ } -
-
- - { _t("Leave") } - -
-
-
; + + membershipButtonExtraClasses = { + 'mx_GroupView_leaveButton': true, + 'mx_RoomHeader_textButton_danger': this.state.isUserPrivileged, + }; + membershipContainerExtraClasses = 'mx_GroupView_membershipSection_joined'; + } else { + return null; } - return null; + + const membershipButtonClasses = classnames([ + 'mx_RoomHeader_textButton', + 'mx_GroupView_textButton', + ], + membershipButtonExtraClasses, + ); + + const membershipContainerClasses = classnames( + 'mx_GroupView_membershipSection', + membershipContainerExtraClasses, + ); + + return
+
+ { /* The
is for flex alignment */ } + { this.state.membershipBusy ? :
} +
+ + { membershipButtonText } + +
+
+
; + }, + + _getJoinableNode: function() { + return this.state.editing ?
+

+ { _t('Who can join this community?') } + { this.state.groupJoinableLoading ? + :
+ } +

+
+ +
+
+ +
+
: null; }, _getLongDescriptionNode: function() { @@ -947,6 +1104,7 @@ export default React.createClass({ const GroupAvatar = sdk.getComponent("avatars.GroupAvatar"); const Spinner = sdk.getComponent("elements.Spinner"); const TintableSvg = sdk.getComponent("elements.TintableSvg"); + const GeminiScrollbarWrapper = sdk.getComponent("elements.GeminiScrollbarWrapper"); if (this.state.summaryLoading && this.state.error === null || this.state.saving) { return ; @@ -1097,9 +1255,9 @@ export default React.createClass({ { rightButtons }
- + { bodyNodes } - +
); } else if (this.state.error) { 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 ( +
+ + ); + } +}); 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" : ( + + { _t('Messages containing keywords', + {}, + { 'span': (sub) => + {sub} + }, + )} + + ), + "vectorState": self.state.vectorContentRules.vectorState + }); + } + else { + const ruleDefinition = VectorPushRulesDefinitions[vectorRuleId]; + const rule = defaultRules.vector[vectorRuleId]; + + const vectorState = ruleDefinition.ruleToVectorState(rule); + + //console.log("Refreshing vectorPushRules for " + vectorRuleId +", "+ ruleDefinition.description +", " + rule +", " + vectorState); + + self.state.vectorPushRules.push({ + "vectorRuleId": vectorRuleId, + "description" : _t(ruleDefinition.description), // Text from VectorPushRulesDefinitions.js + "rule": rule, + "vectorState": vectorState, + }); + + // if there was a rule which we couldn't parse, add it to the external list + if (rule && !vectorState) { + rule.description = ruleDefinition.description; + self.state.externalPushRules.push(rule); + } + } + } + + // Build the rules not managed by Vector UI + const otherRulesDescriptions = { + '.m.rule.message': _t('Notify for all other messages/rooms'), + '.m.rule.fallback': _t('Notify me for anything else'), + }; + + for (let i in defaultRules.others) { + const rule = defaultRules.others[i]; + const ruleDescription = otherRulesDescriptions[rule.rule_id]; + + // Show enabled default rules that was modified by the user + if (ruleDescription && rule.enabled && !rule.default) { + rule.description = ruleDescription; + self.state.externalPushRules.push(rule); + } + } + }); + + const pushersPromise = MatrixClientPeg.get().getPushers().then(function(resp) { + self.setState({pushers: resp.pushers}); + }); + + Promise.all([pushRulesPromise, pushersPromise]).then(function() { + self.setState({ + phase: self.phases.DISPLAY + }); + }, function(error) { + console.error(error); + self.setState({ + phase: self.phases.ERROR + }); + }).finally(() => { + // actually explicitly update our state having been deep-manipulating it + self.setState({ + masterPushRule: self.state.masterPushRule, + vectorContentRules: self.state.vectorContentRules, + vectorPushRules: self.state.vectorPushRules, + externalContentRules: self.state.externalContentRules, + externalPushRules: self.state.externalPushRules, + }); + }).done(); + }, + + _updatePushRuleActions: function(rule, actions, enabled) { + const cli = MatrixClientPeg.get(); + + return cli.setPushRuleActions( + 'global', rule.kind, rule.rule_id, actions + ).then( function() { + // Then, if requested, enabled or disabled the rule + if (undefined != enabled) { + return cli.setPushRuleEnabled( + 'global', rule.kind, rule.rule_id, enabled + ); + } + }); + }, + + renderNotifRulesTableRow: function(title, className, pushRuleVectorState) { + return ( + + + { title } + + + + + + + + + + + + + + + ); + }, + + 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 (
+
+ +
+
+ +
+
); + }, + + render: function() { + const self = this; + + let spinner; + if (this.state.phase === this.phases.LOADING) { + const Loader = sdk.getComponent("elements.Spinner"); + spinner = ; + } + + let masterPushRuleDiv; + if (this.state.masterPushRule) { + masterPushRuleDiv = ( +
+
+ +
+
+ +
+
+ ); + } + + // When enabled, the master rule inhibits all existing rules + // So do not show all notification settings + if (this.state.masterPushRule && this.state.masterPushRule.enabled) { + return ( +
+ {masterPushRuleDiv} + +
+ { _t('All notifications are currently disabled for all targets.') }. +
+
+ ); + } + + const emailThreepids = this.props.threepids.filter((tp) => tp.medium === "email"); + let emailNotificationsRow; + if (emailThreepids.length === 0) { + emailNotificationsRow =
+ { _t('Add an email address above to configure email notifications') } +
; + } else { + // This only supports the first email address in your profile for now + emailNotificationsRow = this.emailNotificationsRow( + emailThreepids[0].address, + `${_t('Enable email notifications')} (${emailThreepids[0].address})` + ); + } + + // Build external push rules + const externalRules = []; + for (let i in this.state.externalPushRules) { + const rule = this.state.externalPushRules[i]; + externalRules.push(
  • { _t(rule.description) }
  • ); + } + + // Show keywords not displayed by the vector UI as a single external push rule + let externalKeywords = []; + for (let i in this.state.externalContentRules) { + const rule = this.state.externalContentRules[i]; + externalKeywords.push(rule.pattern); + } + if (externalKeywords.length) { + externalKeywords = externalKeywords.join(", "); + externalRules.push(
  • { _t('Notifications on the following keywords follow rules which can’t be displayed here:') } { externalKeywords }
  • ); + } + + let devicesSection; + if (this.state.pushers === undefined) { + devicesSection =
    { _t('Unable to fetch notification target list') }
    + } else if (this.state.pushers.length == 0) { + devicesSection = null; + } else { + // TODO: It would be great to be able to delete pushers from here too, + // and this wouldn't be hard to add. + const rows = []; + for (let i = 0; i < this.state.pushers.length; ++i) { + rows.push( + {this.state.pushers[i].app_display_name} + {this.state.pushers[i].device_display_name} + ); + } + devicesSection = ( + + {rows} + +
    ); + } + if (devicesSection) { + devicesSection = (
    +

    { _t('Notification targets') }

    + { devicesSection } +
    ); + } + + let advancedSettings; + if (externalRules.length) { + advancedSettings = ( +
    +

    { _t('Advanced notification settings') }

    + { _t('There are advanced notifications which are not shown here') }.
    + { _t('You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply') }. +
      + { externalRules } +
    +
    + ); + } + + return ( +
    + + {masterPushRuleDiv} + +
    + + { spinner } + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + { emailNotificationsRow } + +
    + + + + + + + + + + + + { this.renderNotifRulesTableRows() } + + +
    { _t('Off') }{ _t('On') }{ _t('Noisy') }
    +
    + + { advancedSettings } + + { devicesSection } + +
    + +
    + ); + } +}); diff --git a/src/components/views/voip/IncomingCallBox.js b/src/components/views/voip/IncomingCallBox.js index 8d75029baa..6cbaabe602 100644 --- a/src/components/views/voip/IncomingCallBox.js +++ b/src/components/views/voip/IncomingCallBox.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,6 +19,7 @@ import PropTypes from 'prop-types'; import MatrixClientPeg from '../../../MatrixClientPeg'; import dis from '../../../dispatcher'; import { _t } from '../../../languageHandler'; +import sdk from '../../../index'; module.exports = React.createClass({ displayName: 'IncomingCallBox', @@ -26,14 +28,16 @@ module.exports = React.createClass({ incomingCall: PropTypes.object, }, - onAnswerClick: function() { + onAnswerClick: function(e) { + e.stopPropagation(); dis.dispatch({ action: 'answer', room_id: this.props.incomingCall.roomId, }); }, - onRejectClick: function() { + onRejectClick: function(e) { + e.stopPropagation(); dis.dispatch({ action: 'hangup', room_id: this.props.incomingCall.roomId, @@ -59,6 +63,7 @@ module.exports = React.createClass({ } } + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); return (
    @@ -67,14 +72,14 @@ module.exports = React.createClass({
    -
    + { _t("Decline") } -
    +
    -
    + { _t("Accept") } -
    +
    diff --git a/src/createRoom.js b/src/createRoom.js index ffe3a85c4e..a767d09288 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -22,6 +22,7 @@ import dis from "./dispatcher"; import * as Rooms from "./Rooms"; import Promise from 'bluebird'; +import {getAddressType} from "./UserAddress"; /** * Create a new room, and switch to it. @@ -52,7 +53,17 @@ function createRoom(opts) { createOpts.preset = createOpts.preset || defaultPreset; createOpts.visibility = createOpts.visibility || 'private'; if (opts.dmUserId && createOpts.invite === undefined) { - createOpts.invite = [opts.dmUserId]; + switch (getAddressType(opts.dmUserId)) { + case 'mx-user-id': + createOpts.invite = [opts.dmUserId]; + break; + case 'email': + createOpts.invite_3pid = [{ + id_server: MatrixClientPeg.get().getIdentityServerUrl(true), + medium: 'email', + address: opts.dmUserId, + }]; + } } if (opts.dmUserId && createOpts.is_direct === undefined) { createOpts.is_direct = true; diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index 807629ef64..d461240e4b 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -1,11 +1,69 @@ { - "Continue": "استمر", + "Continue": "إستمر", "Username available": "اسم المستخدم متاح", "Username not available": "الإسم المستخدم غير موجود", "Something went wrong!": "هناك خطأ ما!", "Cancel": "إلغاء", "Close": "إغلاق", "Create new room": "إنشاء غرفة جديدة", - "Custom Server Options": "إعدادات السيرفر خاصة", - "Dismiss": "صرف النظر" + "Custom Server Options": "الإعدادات الشخصية للخادوم", + "Dismiss": "تجاهل", + "Failed to change password. Is your password correct?": "فشلت عملية تعديل الكلمة السرية. هل كلمتك السرية صحيحة ؟", + "Warning": "تنبيه", + "Error": "خطأ", + "Remove": "حذف", + "Send": "إرسال", + "Edit": "تعديل", + "This email address is already in use": "عنوان البريد هذا مستخدم بالفعل", + "This phone number is already in use": "رقم الهاتف هذا مستخدم بالفعل", + "Failed to verify email address: make sure you clicked the link in the email": "فشل تأكيد عنوان البريد الإلكتروني: تحقق من نقر الرابط في البريد", + "The version of Riot.im": "إصدارة Riot.im", + "Whether or not you're logged in (we don't record your user name)": "فيما إذا كنت والجا أم لا (لا نسجّل اسم المستخدم)", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "فيما إذا كنت تستخدم وضع النص الغني لمحرر النصوص الغني أم لا", + "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 الآتي:", + "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.": "حدث خطأ ما أثناء عملية حفظ إعدادات الإشعارات عبر البريد الإلكتروني.", + "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 keywords": "Müəyyən açar sözləri özündə saxlayan mesajlar", + "Notify for all other messages/rooms": "Bütün başqa mesajdan/otaqlardan xəbər vermək", + "Notify me for anything else": "Bütün qalan hadisələrdə xəbər vermək", + "Enable notifications for this account": "Bu hesab üçün xəbərdarlıqları qoşmaq", + "All notifications are currently disabled for all targets.": "Bütün qurğular üçün bütün bildirişlər kəsilmişdir.", + "Add an email address above to configure email notifications": "Email-i bildirişlər üçün ünvanı əlavə edin" +} diff --git a/src/i18n/strings/be.json b/src/i18n/strings/be.json index 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 new file mode 100644 index 0000000000..20a0832b38 --- /dev/null +++ b/src/i18n/strings/bg.json @@ -0,0 +1,1161 @@ +{ + "OK": "ОК", + "Operation failed": "Операцията е неуспешна", + "Search": "Търсене", + "Custom Server Options": "Потребителски опции за сървър", + "Dismiss": "Затвори", + "powered by Matrix": "базирано на Matrix", + "Warning": "Предупреждение", + "Error": "Грешка", + "Remove": "Премахни", + "Close": "Затвори", + "Cancel": "Отказ", + "Send": "Изпрати", + "Edit": "Редактирай", + "Continue": "Продължи", + "Failed to change password. Is your password correct?": "Неуспешна промяна. Правилно ли сте въвели Вашата парола?", + "Unpin Message": "Откачи съобщението", + "Sun": "нд.", + "Mon": "пн.", + "Tue": "вт.", + "Wed": "ср.", + "Thu": "чт.", + "Fri": "пт.", + "Sat": "сб.", + "Jan": "ян.", + "Feb": "февр.", + "Mar": "март", + "Apr": "апр.", + "May": "май", + "Jun": "юни", + "Jul": "юли", + "Aug": "авг.", + "Sep": "септ.", + "Oct": "окт.", + "Nov": "ноем.", + "Dec": "дек.", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(day)s %(monthName)s %(fullYear)s, %(weekDayName)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s", + "Online": "Онлайн", + "Failed to remove tag %(tagName)s from room": "Неуспешно премахване на %(tagName)s етикет от стаята", + "unknown error code": "неизвестен код за грешка", + "Failed to forget room %(errCode)s": "Неуспешно забравяне на стаята %(errCode)s", + "Mute": "Заглуши", + "Leave": "Напусни", + "Favourite": "Любим", + "Register": "Регистрация", + "Notifications": "Известия", + "Rooms": "Стаи", + "Add rooms to this community": "Добави стаи в тази общност", + "Unnamed room": "Стая без име", + "World readable": "Четимо за всички", + "Guests can join": "Гости могат да се присъединят", + "No rooms to show": "Няма стаи, които да бъдат показани", + "Failed to add tag %(tagName)s to room": "Неуспешно добавяне на %(tagName)s етикет в стаята", + "This email address is already in use": "Този имейл адрес е вече зает", + "This phone number is already in use": "Този телефонен номер е вече зает", + "Failed to verify email address: make sure you clicked the link in the email": "Неуспешно потвърждаване на имейл адреса: уверете се, че сте кликнали върху връзката в имейла", + "The platform you're on": "Платформата, която използвате", + "The version of Riot.im": "Версията на Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Независимо дали сте влезли с профила си или не (не записваме Вашето потребителско име)", + "Your language of choice": "Вашият език по избор", + "Which officially provided instance you are using, if any": "Кой официално-предоставен сървър използвате, ако има такъв", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Дали използвате Richtext режим на Rich Text Editor", + "Your homeserver's URL": "Адресът на Вашия Home сървър", + "Your identity server's URL": "Адресът на Вашия сървър за самоличност", + "Analytics": "Статистика", + "The information being sent to us to help make Riot.im better includes:": "За да направим Riot по-добър, информацията изпратена до нас включва:", + "Call Failed": "Неуспешно повикване", + "Call": "Позвъни", + "Answer": "Отговори", + "You are already in a call.": "Вече сте в разговор.", + "VoIP is unsupported": "Не се поддържа VoIP", + "You cannot place VoIP calls in this browser.": "Не може да осъществите VoIP разговори в този браузър.", + "You cannot place a call with yourself.": "Не може да осъществите разговор със себе си.", + "Existing Call": "Съществуващ разговор", + "Conference calls are not supported in this client": "Групови разговори не се поддържат в тази програма", + "Conference calls are not supported in encrypted rooms": "Групови разговори не се поддържат в шифровани стаи", + "Warning!": "Внимание!", + "Conference calling is in development and may not be reliable.": "Груповите разговори са в процес на разработка и не са надеждни.", + "Review Devices": "Преглед на устройства", + "Failed to set up conference call": "Неуспешно осъществяване на групов разговор", + "Conference call failed.": "Неуспешен групов разговор.", + "The file '%(fileName)s' failed to upload": "Неуспешно качване на файл '%(fileName)s'", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Файлът '%(fileName)s' надхвърля ограничението на размера за качване на този Home сървър", + "Upload Failed": "Качването е неуспешно", + "PM": "PM", + "AM": "AM", + "Who would you like to add to this community?": "Кого бихте желали да добавите в тaзи общност?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Предупреждение: Всеки човек, който добавяте в дадена общност, ще бъде публично видим за знаещите идентификатора на общността", + "Invite new community members": "Покана на нови членове в общността", + "Name or matrix ID": "Име или matrix ID", + "Invite to Community": "Покани в общността", + "Which rooms would you like to add to this community?": "Кои стаи бихте желали да добавите в тази общност?", + "Show these rooms to non-members on the community page and room list?": "Показване на тези стаи на не-членове в страницата на общността и в списъка със стаи?", + "Add rooms to the community": "Добави стаи в общността", + "Room name or alias": "Име или псевдоним на стая", + "Add to community": "Добави в общност", + "Failed to invite the following users to %(groupId)s:": "Следните потребители не могат да бъдат поканени в %(groupId)s:", + "Failed to invite users to community": "Потребителите не могат да бъдат поканени в общността", + "Failed to invite users to %(groupId)s": "Потребителите не могат да бъдат поканени в %(groupId)s", + "Failed to add the following rooms to %(groupId)s:": "Следните стаи не могат да бъдат добавени в %(groupId)s:", + "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 не е получил разрешение да изпраща известия - моля опитайте отново", + "Unable to enable Notifications": "Неупешно включване на известия", + "This email address was not found": "Този имейл адрес не беше открит", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Изглежда вашият имейл адрес не може да се асоциира с Matrix ID на този Home сървър.", + "Default": "По подразбиране", + "Restricted": "Ограничен", + "Moderator": "Модератор", + "Admin": "Администратор", + "Start a chat": "Започване на чат", + "Who would you like to communicate with?": "С кой бихте желали да си комуникирате?", + "Email, name or matrix ID": "Имейл, име или matrix ID", + "Start Chat": "Започни чат", + "Invite new room members": "Покана на нови членове в стаята", + "Who would you like to add to this room?": "Кого бихте желали да добавите в тази стая?", + "Send Invites": "Изпрати покани", + "Failed to invite user": "Неуспешна покана на потребителя", + "Failed to invite": "Неуспешна покана", + "Failed to invite the following users to the %(roomName)s room:": "Следните потребителите не успяха да бъдат добавени в %(roomName)s:", + "You need to be logged in.": "Трябва да влезете в профила си.", + "You need to be able to invite users to do that.": "За да извършите това, трябва да имате право да добавяте потребители.", + "Unable to create widget.": "Неуспешно създаване на приспособление.", + "Failed to send request.": "Неуспешно изпращане на заявката.", + "This room is not recognised.": "Стаята не е разпозната.", + "Power level must be positive integer.": "Нивото на достъп трябва да бъде позитивно число.", + "Call Anyway": "Позвъни въпреки това", + "Answer Anyway": "Отговори въпреки това", + "Call Timeout": "Изтекло време за повикване", + "The remote side failed to pick up": "Отсрещната страна не успя да отговори", + "Unable to capture screen": "Неуспешно заснемане на екрана", + "You are not in this room.": "Не сте в тази стая.", + "You do not have permission to do that in this room.": "Нямате достъп да направите това в тази стая.", + "Missing room_id in request": "Липсва room_id в заявката", + "Room %(roomId)s not visible": "Стая %(roomId)s не е видима", + "Missing user_id in request": "Липсва user_id в заявката", + "Failed to lookup current room": "Неуспешно намиране на текущата стая", + "/ddg is not a command": "/ddg не е команда", + "To use it, just wait for autocomplete results to load and tab through them.": "За използване, изчакайте зареждането на списъка с предложения и изберете от него.", + "Unrecognised room alias:": "Непознат псевдоним на стая:", + "Ignored user": "Игнориран потребител", + "You are now ignoring %(userId)s": "Вече игнорирате %(userId)s", + "Unignored user": "Неигнориран потребител", + "You are no longer ignoring %(userId)s": "Вече не игнорирате %(userId)s", + "Device already verified!": "Устройството е вече потвърдено!", + "WARNING: Device already verified, but keys do NOT MATCH!": "ВНИМАНИЕ: Устройстовото е потвърдено, но ключовете не съвпадат!", + "Verified key": "Потвърден ключ", + "Unrecognised command:": "Неразпозната команда:", + "Reason": "Причина", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s прие поканата за %(displayName)s.", + "%(targetName)s accepted an invitation.": "%(targetName)s прие поканата.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s заяви VoIP групов разговор.", + "%(senderName)s invited %(targetName)s.": "%(senderName)s покани %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s блокира %(targetName)s.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s смени своето име на %(displayName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s си сложи име %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s премахна своето име (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s премахна своята профилна снимка.", + "%(senderName)s changed their profile picture.": "%(senderName)s промени своята профилна снимка.", + "%(senderName)s set a profile picture.": "%(senderName)s зададе снимка на профила си.", + "VoIP conference started.": "Започна VoIP групов разговор.", + "%(targetName)s joined the room.": "%(targetName)s се присъедини към стаята.", + "VoIP conference finished.": "Груповият разговор приключи.", + "%(targetName)s rejected the invitation.": "%(targetName)s отхвърли поканата.", + "%(targetName)s left the room.": "%(targetName)s напусна стаята.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s отблокира %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s изгони %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s оттегли поканата си за %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s смени темата на \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s премахна името на стаята.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s промени името на стаята на %(roomName)s.", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s изпрати снимка.", + "Someone": "Някой", + "(not supported by this browser)": "(не се поддържа от този браузър)", + "%(senderName)s answered the call.": "%(senderName)s отговори на повикването.", + "(no answer)": "(няма отговор)", + "(unknown failure: %(reason)s)": "(неизвестна грешка: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s прекрати разговора.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s започна %(callType)s разговор.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s изпрати покана на %(targetDisplayName)s да се присъедини към стаята.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s направи бъдещата история на стаята видима за всички членове, от момента на поканването им в нея.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s направи бъдещата история на стаята видима за всички членове, от момента на присъединяването им в нея.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s направи бъдещата история на стаята видима за всички членове в нея.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s направи бъдещата история на стаята видима за всеки.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s направи бъдещата история на стаята видима по непознат начин (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включи шифроване от край до край (алгоритъм %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s от %(fromPowerLevel)s на %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s смени нивото на достъп на %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s смени закачените съобщения за стаята.", + "%(widgetName)s widget modified by %(senderName)s": "Приспособлението %(widgetName)s беше променено от %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "Приспособлението %(widgetName)s беше добавено от %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Приспособлението %(widgetName)s беше премахнато от %(senderName)s", + "%(displayName)s is typing": "%(displayName)s пише", + "%(names)s and %(count)s others are typing|other": "%(names)s и %(count)s други пишат", + "%(names)s and %(count)s others are typing|one": "%(names)s и още един човек пишат", + "%(names)s and %(lastPerson)s are typing": "%(names)s и %(lastPerson)s пишат", + "Failure to create room": "Неуспешно създаване на стая", + "Server may be unavailable, overloaded, or you hit a bug.": "Сървърът може би е претоварен, недостъпен или се натъкнахте на проблем.", + "Send anyway": "Изпрати въпреки това", + "Unnamed Room": "Стая без име", + "Your browser does not support the required cryptography extensions": "Вашият браузър не поддържа необходимите разширения за шифроване", + "Not a valid Riot keyfile": "Невалиден файл с ключ за Riot", + "Authentication check failed: incorrect password?": "Неуспешна автентикация: неправилна парола?", + "Failed to join room": "Неуспешно присъединяване към стаята", + "Message Replies": "Отговори на съобщението", + "Message Pinning": "Функция за закачане на съобщения", + "Tag Panel": "Панел с етикети", + "Disable Emoji suggestions while typing": "Изключване на предложенията за емотиконите при писане", + "Use compact timeline layout": "Използване на компактно оформление за списъка със съобщения", + "Hide removed messages": "Скриване на премахнати съобщения", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Скриване на съобщения за присъединяване/напускане (не засяга покани/изгонвания/блокирания)", + "Hide avatar changes": "Скриване на информацията за промените на аватара", + "Hide display name changes": "Скриване на информацията за промените на името", + "Hide read receipts": "Скриване на потвържденията за прочитане на съобщение", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "Показване на времето в 12-часов формат (напр. 2:30pm)", + "Always show message timestamps": "Винаги показвай часа на съобщението", + "Autoplay GIFs and videos": "Автоматично възпроизвеждане на GIF-файлове и видеа", + "Enable automatic language detection for syntax highlighting": "Включване на автоматично разпознаване на език за подчертаване на синтаксиса", + "Disable big emoji in chat": "Изключване на големи емотикони в чата", + "Don't send typing notifications": "Не показвай на другите, че в момента пиша", + "Automatically replace plain text Emoji": "Автоматично откриване и заместване на емотикони в текста", + "Mirror local video feed": "Показвай ми огледално моя видео образ", + "Disable Peer-to-Peer for 1:1 calls": "Изключване на Peer-to-Peer в 1:1 разговор", + "Never send encrypted messages to unverified devices from this device": "Никога не изпращай шифровани съобщения от това устройство до непотвърдени устройства", + "Never send encrypted messages to unverified devices in this room from this device": "Никога не изпращай шифровани съобщения от това устройство до непотвърдени устройства в тази стая", + "Enable inline URL previews by default": "Включване по подразбиране на URL прегледи", + "Enable URL previews for this room (only affects you)": "Включване на URL прегледи за тази стая (засяга само Вас)", + "Enable URL previews by default for participants in this room": "Включване по подразбиране на URL прегледи за участници в тази стая", + "Room Colour": "Цвят на стая", + "Active call (%(roomName)s)": "Активен разговор (%(roomName)s)", + "unknown caller": "повикване от непознат", + "Incoming voice call from %(name)s": "Входящо гласово повикване от %(name)s", + "Incoming video call from %(name)s": "Входящо видео повикване от %(name)s", + "Incoming call from %(name)s": "Входящо повикване от %(name)s", + "Decline": "Откажи", + "Accept": "Приеми", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Съобщение е изпратено до +%(msisdn)s. Моля, въведете кода за потвърждение, което то съдържа", + "Incorrect verification code": "Неправилен код за потвърждение", + "Enter Code": "Въведи код", + "Submit": "Изпрати", + "Phone": "Телефон", + "Add phone number": "Добави номер", + "Add": "Добави", + "Failed to upload profile picture!": "Неуспешно качване на профилна снимка!", + "Upload new:": "Качи нов:", + "No display name": "Няма име", + "New passwords don't match": "Новите пароли не съвпадат", + "Passwords can't be empty": "Полето с парола не може да е празно", + "Export E2E room keys": "Експортирай E2E ключове за стая", + "Do you want to set an email address?": "Искате ли да зададете имейл адрес?", + "Current password": "Текуща парола", + "Password": "Парола", + "New Password": "Нова парола", + "Confirm password": "Потвърждаване на парола", + "Change Password": "Смяна на парола", + "Your home server does not support device management.": "Вашият Home сървър не поддръжа управление на устройства.", + "Unable to load device list": "Неуспешно зареждане на списък с устройства", + "Authentication": "Автентикация", + "Delete %(count)s devices|other": "Изтрий %(count)s устройства", + "Delete %(count)s devices|one": "Изтрий устройство", + "Device ID": "Идентификатор на устройство", + "Device Name": "Име на устройство", + "Last seen": "Последно видян", + "Select devices": "Избери устройства", + "Failed to set display name": "Неуспешно задаване на име", + "Disable Notifications": "Изключване на известия", + "Enable Notifications": "Включване на известия", + "Cannot add any more widgets": "Не могат да се добавят повече приспособления", + "The maximum permitted number of widgets have already been added to this room.": "Максимално разрешеният брой приспособления е вече добавен към тази стая.", + "Add a widget": "Добавяне на приспособление", + "Drop File Here": "Пусни файла тук", + "Drop file here to upload": "Пуснете файла тук, за да се качи", + " (unsupported)": " (не се поддържа)", + "Join as voice or video.": "Присъединете се с глас или с видео.", + "Ongoing conference call%(supportedText)s.": "Текущ групов разговор %(supportedText)s.", + "%(senderName)s sent an image": "%(senderName)s изпрати снимка", + "%(senderName)s sent a video": "%(senderName)s изпрати видео", + "%(senderName)s uploaded a file": "%(senderName)s качи файл", + "Options": "Настройки", + "Undecryptable": "Невъзможно разшифроване", + "Encrypted by a verified device": "Шифровано от потвърдено устройство", + "Encrypted by an unverified device": "Шифровано от непотвърдено устройство", + "Unencrypted message": "Нешифровано съобщение", + "Please select the destination room for this message": "Моля, изберете стаята, в която искате да изпратите това съобщение", + "Blacklisted": "В черния списък", + "Verified": "Потвърдено", + "Unverified": "Непотвърдено", + "device id: ": "идентификатор на устройството: ", + "Disinvite": "Отмени поканата", + "Kick": "Изгони", + "Disinvite this user?": "Отмени поканата към този потребител?", + "Kick this user?": "Изгони този потребител?", + "Failed to kick": "Неуспешно изгонване", + "Unban": "Отблокирай", + "Ban": "Блокирай", + "Unban this user?": "Отблокирай този потребител?", + "Ban this user?": "Блокирай този потребител?", + "Failed to ban user": "Неуспешно блокиране на потребителя", + "Failed to mute user": "Неуспешно заглушаване на потребителя", + "Failed to toggle moderator status": "Неуспешна промяна на статуса на модератора", + "Failed to change power level": "Неуспешна промяна на нивото на достъп", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "След като си намалите нивото на достъп, няма да можете да възвърнете тази промяна. Ако сте последния потребител с привилегии в тази стая, ще бъде невъзможно да възвърнете привилегии си.", + "Are you sure?": "Сигурни ли сте?", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Няма да можете да възвърнете тази промяна, тъй като повишавате този потребител до същото ниво на достъп като Вашето.", + "No devices with registered encryption keys": "Няма устройства с регистрирани ключове за шифроване", + "Devices": "Устройства", + "Unignore": "Премахни игнорирането", + "Ignore": "Игнорирай", + "Mention": "Спомени", + "Direct chats": "Директни чатове", + "User Options": "Опции на потребителя", + "Invite": "Покани", + "Unmute": "Премахни заглушаването", + "Make Moderator": "Направи модератор", + "Admin Tools": "Инструменти на администратора", + "Level:": "Ниво:", + "and %(count)s others...|other": "и %(count)s други...", + "and %(count)s others...|one": "и още един...", + "Invited": "Поканен", + "Filter room members": "Филтриране на членовете", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (ниво на достъп %(powerLevelNumber)s)", + "Attachment": "Прикачване", + "Upload Files": "Качи файлове", + "Are you sure you want to upload the following files?": "Сигурни ли сте, че искате да качите тези файлове?", + "Encrypted room": "Шифрована стая", + "Unencrypted room": "Нешифрована стая", + "Hangup": "Затвори", + "Voice call": "Гласово повикване", + "Video call": "Видео повикване", + "Upload file": "Качи файл", + "Show Text Formatting Toolbar": "Показване на лентата с инструменти за форматиране на текст", + "Send an encrypted reply…": "Изпрати шифрован отговор…", + "Send a reply (unencrypted)…": "Отговори (нешифрованo)…", + "Send an encrypted message…": "Изпрати шифровано съобщение…", + "Send a message (unencrypted)…": "Изпрати съобщение (нешифровано)…", + "You do not have permission to post to this room": "Нямате разрешение да публикувате в тази стая", + "Turn Markdown on": "Включи Markdown", + "Turn Markdown off": "Изключи Markdown", + "Hide Text Formatting Toolbar": "Скриване на лентата с инструменти за форматиране на текст", + "Server error": "Сървърна грешка", + "Server unavailable, overloaded, or something else went wrong.": "Сървърът е недостъпен, претоварен или нещо друго се обърка.", + "Command error": "Грешка в командата", + "bold": "удебелен", + "italic": "курсивен", + "strike": "задраскан", + "underline": "подчертан", + "code": "код", + "quote": "цитат", + "bullet": "списък", + "numbullet": "номериран списък", + "Markdown is disabled": "Markdown е изключен", + "Markdown is enabled": "Markdown е включен", + "No pinned messages.": "Няма закачени съобщения.", + "Loading...": "Зареждане...", + "Pinned Messages": "Закачени съобщения", + "%(duration)ss": "%(duration)sсек", + "%(duration)sm": "%(duration)sмин", + "%(duration)sh": "%(duration)sч", + "%(duration)sd": "%(duration)sд", + "Online for %(duration)s": "Онлайн от %(duration)s", + "Idle for %(duration)s": "Неактивен от %(duration)s", + "Offline for %(duration)s": "Офлайн от %(duration)s", + "Unknown for %(duration)s": "Неизвестен от %(duration)s", + "Idle": "Неактивен", + "Offline": "Офлайн", + "Unknown": "Неизвестен", + "Replying": "Отговаря", + "Seen by %(userName)s at %(dateTime)s": "Видяно от %(userName)s в %(dateTime)s", + "Failed to set avatar.": "Неуспешно задаване на профилна снимка.", + "Save": "Запази", + "(~%(count)s results)|other": "(~%(count)s резултати)", + "(~%(count)s results)|one": "(~%(count)s резултат)", + "Join Room": "Присъедини се към стаята", + "Upload avatar": "Качи профилна снимка", + "Remove avatar": "Премахни профилната снимка", + "Settings": "Настройки", + "Forget room": "Забрави стаята", + "Show panel": "Покажи панелa", + "Drop here to favourite": "За любим пуснeте тук", + "Drop here to tag direct chat": "Пуснете тук, за да означите директен чат", + "Drop here to restore": "Пуснете тук за възстановяване", + "Drop here to demote": "Пуснете тук за понижаване", + "Drop here to tag %(section)s": "Пуснете тук, за да означите като %(section)s", + "Failed to set direct chat tag": "Неуспешно означаване на директен чат", + "Press to start a chat with someone": "Натиснете , за да започнете чат с някого", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Все още не сте в нито една стая! Натиснете , за да направите такава или , за да прегледате директорията", + "Community Invites": "Покани за общност", + "Invites": "Покани", + "Favourites": "Любими", + "People": "Хора", + "Low priority": "Нисък приоритет", + "Historical": "Архив", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Не може да се потвърди, че адреса към който е изпратена тази покана е обвързан с акаунта Ви.", + "This invitation was sent to an email address which is not associated with this account:": "Поканата беше изпратена на имейл адрес, който не е свързан с този профил:", + "You may wish to login with a different account, or add this email to this account.": "Може да искате да влезете с друг профил или да добавите имейл адреса в този.", + "You have been invited to join this room by %(inviterName)s": "Вие сте поканен да се присъедините към тази стая от %(inviterName)s", + "Would you like to accept or decline this invitation?": "Желаете да приемете или да откажете тази покана?", + "Reason: %(reasonText)s": "Причина: %(reasonText)s", + "Rejoin": "Повторно присъединяване", + "You have been kicked from %(roomName)s by %(userName)s.": "Бяхте изгонен от %(roomName)s от %(userName)s.", + "You have been kicked from this room by %(userName)s.": "Бяхте изгонен от тази стая от %(userName)s.", + "You have been banned from %(roomName)s by %(userName)s.": "Бяхте блокиран в %(roomName)s от %(userName)s.", + "You have been banned from this room by %(userName)s.": "Бяхте блокиран в тази стая от %(userName)s.", + "This room": "В тази стая", + "%(roomName)s does not exist.": "%(roomName)s не съществува.", + "%(roomName)s is not accessible at this time.": "%(roomName)s не е достъпна към този момент.", + "You are trying to access %(roomName)s.": "Опитвате се да влезете в %(roomName)s.", + "You are trying to access a room.": "Опитвате се да влезете в стая.", + "Click here to join the discussion!": "Натиснете тук, за да се присъедините към дискусията!", + "This is a preview of this room. Room interactions have been disabled": "Това е преглед на стаята. Интеракции в нея са деактивирани", + "To change the room's avatar, you must be a": "За да смените снимката на стаята, трябва да бъдете", + "To change the room's name, you must be a": "За да смените името на стаята, трябва да бъдете", + "To change the room's main address, you must be a": "За да смените основния адрес на стаята, трябва да бъдете", + "To change the room's history visibility, you must be a": "За да смените видимостта на историята на стаята, трябва да бъдете", + "To change the permissions in the room, you must be a": "За да промените разрешенията в стаята, трябва да бъдете", + "To change the topic, you must be a": "За да смените темата, трябва да бъдете", + "To modify widgets in the room, you must be a": "За да промените приспособленията в стаята, трябва да бъдете", + "Failed to unban": "Неуспешно отблокиране", + "Banned by %(displayName)s": "Блокиран от %(displayName)s", + "Privacy warning": "Предупреждение за сигурност", + "Changes to who can read history will only apply to future messages in this room": "Промени по това кой може да чете историята ще се отнасят само за бъдещи съобщения в тази стая", + "The visibility of existing history will be unchanged": "Видимостта на историята до сега ще остане непроменена", + "End-to-end encryption is in beta and may not be reliable": "Шифроване от край до край е в бета версия и може да не е надеждно", + "Devices will not yet be able to decrypt history from before they joined the room": "Устройства все още не могат да разшифроват история от преди присъединяването към стая", + "Once encryption is enabled for a room it cannot be turned off again (for now)": "Веднъж включено, шифроването в стаята не може да бъде изключено (за сега)", + "Encrypted messages will not be visible on clients that do not yet implement encryption": "Шифровани съобщения не са видими за клиенти, които все още не поддържат шифроване", + "Enable encryption": "Включване на шифроване", + "(warning: cannot be disabled again!)": "(внимание: не може да бъде изключено в последствие!)", + "Encryption is enabled in this room": "Шифроването е включено в тази стая", + "Encryption is not enabled in this room": "Шифроването не е включено в тази стая", + "Privileged Users": "Потребители с привилегии", + "No users have specific privileges in this room": "Никой няма специфични привилегии в тази стая", + "Banned users": "Блокирани потребители", + "This room is not accessible by remote Matrix servers": "Тази стая не е достъпна за далечни Matrix сървъри", + "Leave room": "Напусни стаята", + "Tagged as: ": "Етикет: ", + "To link to a room it must have an address.": "За да дадете линк към стаята, тя трябва да има адрес.", + "Guests cannot join this room even if explicitly invited.": "Гости не могат да се присъединят към тази стая, дори изрично поканени.", + "Click here to fix": "Натиснете тук за поправяне", + "Who can access this room?": "Кой има достъп до тази стая?", + "Only people who have been invited": "Само хора, които са били поканени", + "Anyone who knows the room's link, apart from guests": "Всеки, който знае адреса на стаята (освен гости)", + "Anyone who knows the room's link, including guests": "Всеки, който знае адреса на стаята (включително гости)", + "Publish this room to the public in %(domain)s's room directory?": "Публично публикуване на тази стая в директорията на %(domain)s?", + "Who can read history?": "Кой може да чете историята?", + "Anyone": "Всеки", + "Members only (since the point in time of selecting this option)": "Само членове (от момента на избиране на тази опция)", + "Members only (since they were invited)": "Само членове (от момента, в който те са поканени)", + "Members only (since they joined)": "Само членове (от момента, в който са се присъединили)", + "Permissions": "Разрешения", + "The default role for new room members is": "По подразбиране ролята за нови членове в стаята е", + "To send messages, you must be a": "За да изпращате съобщения, трябва да бъдете", + "To invite users into the room, you must be a": "За да поканите потребители в стаята, трябва да бъдете", + "To configure the room, you must be a": "За да конфигурирате стаята, трябва да бъдете", + "To kick users, you must be a": "За да изгоните потребител, трябва да бъдете", + "To ban users, you must be a": "За да блокирате потребител, трябва да бъдете", + "To remove other users' messages, you must be a": "За да премахнете съобщения на друг потребител, трябва да бъдете", + "To send events of type , you must be a": "За да изпратите събития от вида , трябва да бъдете", + "Advanced": "Разширени", + "This room's internal ID is": "Вътрешният идентификатор на тази стая е", + "Add a topic": "Добавете тема", + "Jump to first unread message.": "Отиди до първото непрочетено съобщение.", + "Scroll to unread messages": "Отиди до непрочетените съобщения", + "Invalid alias format": "Невалиден формат на псевдонима", + "'%(alias)s' is not a valid format for an alias": "%(alias)s не е валиден формат на псевдоним", + "Invalid address format": "Невалиден формат на адреса", + "'%(alias)s' is not a valid format for an address": "%(alias)s не е валиден формат на адрес", + "not specified": "неопределен", + "not set": "незададен", + "Remote addresses for this room:": "Далечни адреси на тази стая:", + "Addresses": "Адреси", + "The main address for this room is": "Основният адрес на тази стая е", + "Local addresses for this room:": "Локалните адреси на тази стая са:", + "This room has no local addresses": "Тази стая няма локални адреси", + "New address (e.g. #foo:%(localDomain)s)": "Нов адрес (напр. #foo:%(localDomain)s)", + "Invalid community ID": "Невалиден идентификатор на общност", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' е невалиден идентификатор на общност", + "Flair": "Значка", + "Showing flair for these communities:": "Показване на значки за тези общности:", + "This room is not showing flair for any communities": "Тази стая не показва значки за нито една общност", + "New community ID (e.g. +foo:%(localDomain)s)": "Нов идентификатор на общност (напр. +foo:%(localDomain)s)", + "You have enabled URL previews by default.": "Вие сте включил URL прегледи по подразбиране.", + "You have disabled URL previews by default.": "Вие сте изключил URL прегледи по подразбиране.", + "URL previews are enabled by default for participants in this room.": "URL прегледи са включени по подразбиране за участниците в тази стая.", + "URL previews are disabled by default for participants in this room.": "URL прегледи са изключени по подразбиране за участниците в тази стая.", + "URL Previews": "URL прегледи", + "Error decrypting audio": "Грешка при разшифроване на аудио файл", + "Error decrypting attachment": "Грешка при разшифроване на прикачен файл", + "Decrypt %(text)s": "Разшифровай %(text)s", + "Download %(text)s": "Изтегли %(text)s", + "(could not connect media)": "(неуспешно свързване на медийните устройства)", + "Must be viewing a room": "Трябва да извършите това в стая", + "Usage": "Употреба", + "Remove from community": "Премахни от общността", + "Disinvite this user from community?": "Оттегляне на поканата към този потребител от общността?", + "Remove this user from community?": "Премахване на този потребител от общността?", + "Failed to remove user from community": "Неуспешно премахване на потребителя от тази общност", + "Filter community members": "Филтриране на членовете", + "Removing a room from the community will also remove it from the community page.": "Премахване на стая от общността ще бъде също премахната от страницата с общността.", + "Failed to remove room from community": "Неуспешно премахване на стаята от общността", + "Only visible to community members": "Видимо само за членове на общността", + "Filter community rooms": "Филтрирай стаи на общността", + "Community IDs cannot not be empty.": "Идентификаторите на общността не могат да бъдат празни.", + "Create Community": "Създай общност", + "Community Name": "Име на общност", + "Community ID": "Идентификатор на общност", + "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    HTML за страница на Вашата общност

    \n

    \n Използвайте дългото описание, за да въведете нови членове в общността, \n или да разпространите важни връзки\n

    \n

    \n Можете дори да използвате 'img' тагове\n

    \n", + "Add rooms to the community summary": "Добавете стаи към обобщението на общността", + "Add users to the community summary": "Добавете потребители към обобщението на общността", + "Failed to update community": "Неуспешно обновяване на общността", + "Leave Community": "Напусни общността", + "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 Ви покани да се присъедините към тази общност", + "You are an administrator of this community": "Вие сте администратор на тази общност", + "You are a member of this community": "Вие сте член на тази общност", + "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "Вашата общност няма дълго описание - HTML страница, която да се показва на членовете на общността.
    Натиснете тук, за да отворите настройките и да създадете такова!", + "Community %(groupId)s not found": "Общност %(groupId)s не е намерена", + "Create a new community": "Създаване на нова общност", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Създайте общност, за да групирате потребители и стаи! Изградете персонализирана начална страница, за да маркирате своето пространство в Matrix Вселената.", + "Join an existing community": "Присъединяване към съществуваща общност", + "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "За да се присъедините към вече съществуваща общност, трябва да знаете нейния идентификатор; той изглежда нещо подобно на +example:matrix.org.", + "Unknown (user, device) pair:": "Непозната двойка (потребител, устройство):", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Подписващият ключ, който сте предоставили, съвпада с подписващия ключ, който сте получили от устройството %(deviceId)s на %(userId)s. Устройството е маркирано като потвърдено.", + "Hide avatars in user and room mentions": "Скриване на аватара на потребители и стаи при споменаването им", + "Jump to message": "Отиди до съобщението", + "Jump to read receipt": "Отиди до потвърждението за прочитане", + "Revoke Moderator": "Премахване на правата на модератора", + "You should not yet trust it to secure data": "Все още не трябва да се доверявате на това, че ще защити Вашите данни", + "Invalid file%(extra)s": "Невалиден файл%(extra)s", + "Error decrypting image": "Грешка при разшифроване на снимка", + "Error decrypting video": "Грешка при разшифроване на видео", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s промени аватара на %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s премахна аватара на стаята.", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s промени аватара на стаята на ", + "Copied!": "Копирано!", + "Failed to copy": "Неуспешно копиране", + "Add an Integration": "Добавяне на интеграция", + "Removed or unknown message type": "Премахнато или неизвестен тип съобщение", + "Message removed by %(userId)s": "Съобщението е премахнато от %(userId)s", + "Message removed": "Съобщението е премахнато", + "This Home Server would like to make sure you are not a robot": "Този Home сървър би искал да се увери, че не сте робот", + "Sign in with CAS": "Влез с CAS", + "To continue, please enter your password.": "За да продължите, моля, въведете своята парола.", + "Password:": "Парола:", + "An email has been sent to %(emailAddress)s": "Имейл беше изпратен на %(emailAddress)s", + "Please check your email to continue registration.": "Моля, проверете имейла си, за да продължите регистрацията.", + "Token incorrect": "Неправителен тоукън", + "A text message has been sent to %(msisdn)s": "Текстово съобщение беше изпратено на %(msisdn)s", + "Please enter the code it contains:": "Моля, въведете кода, който то съдържа:", + "Start authentication": "Започни автентикация", + "Username on %(hs)s": "Потребителско име на %(hs)s", + "User name": "Потребителско име", + "Mobile phone number": "Мобилен номер", + "Forgot your password?": "Забравена парола?", + "%(serverName)s Matrix ID": "%(serverName)s Matrix ID", + "Sign in with": "Влизане с", + "Email address": "Имейл адрес", + "Sign in": "Вход", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ако не посочите имейл адрес, няма да бъде възможно да възстановите Вашата парола. Сигурни ли сте?", + "Email address (optional)": "Имейл адрес (по избор)", + "You are registering with %(SelectedTeamName)s": "Регистрирате се с %(SelectedTeamName)s", + "Mobile phone number (optional)": "Мобилен номер (по избор)", + "Default server": "Сървър по подразбиране", + "Custom server": "Потребителски сървър", + "Home server URL": "Адрес на Home сървър", + "Identity server URL": "Адрес на сървър за самоличност", + "What does this mean?": "Какво означава това?", + "Failed to withdraw invitation": "Неуспешно оттегляне на поканата", + "Flair will appear if enabled in room settings": "Значката ще се покаже, ако е включена в настройките на стаята", + "Flair will not appear": "Значката няма да се покаже", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Сигурни ли сте, че искате да премахнете '%(roomName)s' от %(groupId)s?", + "Failed to remove '%(roomName)s' from %(groupId)s": "Неуспешно премахване на '%(roomName)s' от %(groupId)s", + "Something went wrong!": "Нещо се обърка!", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Видимостта на '%(roomName)s' в %(groupId)s не може да бъде обновена.", + "Visibility in Room List": "Видимост в списъка със стаи", + "Visible to everyone": "Видимо за всеки", + "Something went wrong when trying to get your communities.": "Нещо се обърка при зареждането на Вашите общности.", + "Display your community flair in rooms configured to show it.": "Показване на значката на общността в стаи, конфигурирани да я показват.", + "You're not currently a member of any communities.": "Към момента не сте член на нито една общност.", + "Unknown Address": "Неизвестен адрес", + "NOTE: Apps are not end-to-end encrypted": "ЗАБЕЛЕЖКА: Приложенията не са шифровани от край до край", + "Do you want to load widget from URL:": "Искате ли да заредите приспособление от URL адреса:", + "Allow": "Позволи", + "Delete Widget": "Изтриване на приспособление", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Изтриването на приспособление го премахва за всички потребители в тази стая. Сигурни ли сте, че искате да изтриете това приспособление?", + "Delete widget": "Изтрий приспособлението", + "Revoke widget access": "Премахни достъпа на приспособлението", + "Minimize apps": "Минимизирай приложенията", + "Create new room": "Създай нова стая", + "Unblacklist": "Премахни от черния списък", + "Blacklist": "Добави в черен списък", + "Unverify": "Махни потвърждението", + "Verify...": "Потвърди...", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "Вашето непотвърдено устройство '%(displayName)s' изисква ключове за шифроване.", + "I have verified my email address": "Потвърдих имейл адреса си", + "NOT verified": "НЕ е потвърдено", + "verified": "потвърдено", + "No results": "Няма резултати", + "Delete": "Изтрий", + "Communities": "Общности", + "Home": "Начална страница", + "Integrations Error": "Грешка при интеграциите", + "Could not connect to the integration server": "Неуспешно свързване със сървъра с интеграции", + "Manage Integrations": "Управление на интеграциите", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)sсе присъединиха %(count)s пъти", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sсе присъединиха", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)sсе присъедини %(count)s пъти", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)sсе присъедини", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)sнапуснаха %(count)s пъти", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)sнапуснаха", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)sнапусна %(count)s пъти", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)sнапусна", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)sсе присъединиха и напуснаха %(count)s пъти", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)sсе присъединиха и напуснаха", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)sсе присъедини и напусна %(count)s пъти", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sсе присъедини и напусна", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)sнапуснаха и се присъединиха отново %(count)s пъти", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)sнапуснаха и се присъединиха отново", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)sнапусна и се присъедини отново %(count)s пъти", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sнапусна и се присъедини отново", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)sотхвърлиха своите покани %(count)s пъти", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)sотхвърлиха своите покани", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)sотхвърли своята покана %(count)s пъти", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)sотхвърли своята покана", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)sоттеглиха своите покани %(count)s пъти", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)sоттеглиха своите покани", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)sоттегли своята покана %(count)s пъти", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)sоттегли своята покана", + "were invited %(count)s times|other": "бяха поканени %(count)s пъти", + "were invited %(count)s times|one": "бяха поканени", + "was invited %(count)s times|other": "беше поканен %(count)s пъти", + "was invited %(count)s times|one": "беше поканен", + "were banned %(count)s times|other": "бяха блокирани %(count)s пъти", + "were banned %(count)s times|one": "бяха блокирани", + "was banned %(count)s times|other": "беше блокиран %(count)s пъти", + "was banned %(count)s times|one": "беше блокиран", + "were unbanned %(count)s times|other": "бяха отблокирани %(count)s пъти", + "were unbanned %(count)s times|one": "бяха отблокирани", + "was unbanned %(count)s times|other": "беше отблокиран %(count)s пъти", + "was unbanned %(count)s times|one": "беше отблокиран", + "were kicked %(count)s times|other": "бяха изгонени %(count)s пъти", + "were kicked %(count)s times|one": "бяха изгонени", + "was kicked %(count)s times|other": "беше изгонен %(count)s пъти", + "was kicked %(count)s times|one": "беше изгонен", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)sсмениха своето име %(count)s пъти", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)sсмениха своето име", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sсмени своето име %(count)s пъти", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sсмени своето име", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)sсмениха своята профилна снимка %(count)s пъти", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)sсмениха своята профилна снимка", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)sсмени своята профилна снимка %(count)s пъти", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)sсмени своята профилна снимка", + "%(items)s and %(count)s others|other": "%(items)s и %(count)s други", + "%(items)s and %(count)s others|one": "%(items)s и още един", + "%(items)s and %(lastItem)s": "%(items)s и %(lastItem)s", + "collapse": "свий", + "expand": "разшири", + "Custom of %(powerLevel)s": "Персонализирано със стойност %(powerLevel)s", + "Custom level": "Персонализирано ниво", + "Custom": "Персонализиран", + "In reply to ": "В отговор на ", + "Room directory": "Директория със стаи", + "Start chat": "Започни чат", + "And %(count)s more...|other": "И %(count)s други...", + "ex. @bob:example.com": "напр. @bob:example.com", + "Add User": "Добави потребител", + "Matrix ID": "Matrix ID", + "Matrix Room ID": "Идентификатор на стаята", + "email address": "имейл адрес", + "Try using one of the following valid address types: %(validTypesList)s.": "Опитайте се да използвате един от следните видове валидни адреси: %(validTypesList)s.", + "You have entered an invalid address.": "Въвели сте невалиден адрес.", + "Create a new chat or reuse an existing one": "Създаване на нов чат или повторно използване на съществуващ", + "Start new chat": "Започни нов чат", + "You already have existing direct chats with this user:": "Вече имате налични директни чатове с този потребител:", + "Start chatting": "Започнете чата", + "Click on the button below to start chatting!": "Натиснете бутона по-долу, за да започнете чата!", + "Start Chatting": "Започнете чата", + "Confirm Removal": "Потвърдете премахването", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Идентификаторите на общността могат да съдържат само a-z, 0-9, или '=_-./'", + "Something went wrong whilst creating your community": "Нещо се обърка по време на създаването на Вашата общност", + "Example": "Пример", + "example": "пример", + "Create": "Създай", + "Create Room": "Създай стая", + "Room name (optional)": "Име на стая (по избор)", + "Advanced options": "Разширени настройки", + "Block users on other matrix homeservers from joining this room": "Не позволявай на потребители от други matrix Home сървъри да се присъединяват към тази стая", + "This setting cannot be changed later!": "Тази настройка не може да бъде променена по-късно!", + "Unknown error": "Неизвестна грешка", + "Incorrect password": "Неправилна парола", + "Deactivate Account": "Деактивация на профила", + "Deactivate my account": "Деактивирай моя профил", + "Device name": "Име на устройство", + "Device key": "Ключ на устройство", + "In future this verification process will be more sophisticated.": "В бъдеще този процес на потвърждение ще бъде по-лесен.", + "Verify device": "Потвърди устройството", + "Start verification": "Започни потвърждението", + "Verification Pending": "Очакване на потвърждение", + "Verification": "Потвърждение", + "I verify that the keys match": "Потвърждавам, че ключовете съвпадат", + "An error has occurred.": "Възникна грешка.", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Добавихте ново устройство '%(displayName)s', което изисква ключове за шифроване.", + "Share without verifying": "Сподели без потвърждение", + "Ignore request": "Игнорирай поканата", + "Loading device info...": "Зареждане на информация за устройството...", + "Encryption key request": "Заявка за ключ за шифроване", + "Unable to restore session": "Неуспешно възстановяване на сесията", + "Invalid Email Address": "Невалиден имейл адрес", + "This doesn't appear to be a valid email address": "Това не изглежда да е валиден имейл адрес", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Моля, проверете своя имейл адрес и натиснете връзката, която той съдържа. След като направите това, натиснете продължи.", + "Unable to add email address": "Неуспешно добавяне на имейл адрес", + "Unable to verify email address.": "Неуспешно потвърждение на имейл адрес.", + "Unable to accept invite": "Неуспешно приемане на поканата", + "Unable to reject invite": "Неуспешно отхвърляне на поканата", + "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.": "Това ще Ви позволи да възстановите Вашата парола и да получавате известия.", + "Skip": "Пропусни", + "User names may only contain letters, numbers, dots, hyphens and underscores.": "Потребителските имена могат да съдържат само букви, цифри, точки, тирета и долни черти.", + "Username not available": "Потребителското име е заето", + "Username invalid: %(errMessage)s": "Невалидно потребителско име: %(errMessage)s", + "An error occurred: %(error_string)s": "Възникна грешка: %(error_string)s", + "Username available": "Потребителското име не е заето", + "To get started, please pick a username!": "За да започнете, моля изберете потребителско име!", + "If you already have a Matrix account you can log in instead.": "Ако вече имате Matrix профил, можете да влезете с него.", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "В момента Вие блокирате непотвърдени устройства; за да изпращате съобщения до тези устройства, трябва да ги потвърдите.", + "Room contains unknown devices": "Стаята съдържа непознати устройства", + "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" съдържа устройства, който не сте виждали до сега.", + "Unknown devices": "Непознати устройства", + "Private Chat": "Личен чат", + "Public Chat": "Публичен чат", + "Alias (optional)": "Псевдоним (по избор)", + "Name": "Име", + "Topic": "Тема", + "Make this room private": "Направи тази стая лична", + "Share message history with new users": "Сподели историята на съобщенията с нови потребители", + "Encrypt room": "Шифровай стаята", + "You must register to use this functionality": "Трябва да се регистрирате, за да използвате тази функционалност", + "You must join the room to see its files": "Трябва да се присъедините към стаята, за да видите файловете, които съдържа", + "There are no visible files in this room": "Няма видими файлове в тази стая", + "Which rooms would you like to add to this summary?": "Кои стаи бихте искали да добавите в това обобщение?", + "Add to summary": "Добави в обобщението", + "Failed to add the following rooms to the summary of %(groupId)s:": "Неуспешно добавяне на следните стаи в обобщението на %(groupId)s:", + "Add a Room": "Добавяне на стая", + "Failed to remove the room from the summary of %(groupId)s": "Неуспешно премахване на стаята от обобщението на %(groupId)s", + "The room '%(roomName)s' could not be removed from the summary.": "Стаята '%(roomName)s' не може да бъде премахната от обобщението.", + "Who would you like to add to this summary?": "Кого бихте желали да добавите в това обобщение?", + "Failed to add the following users to the summary of %(groupId)s:": "Неуспешно добавяне на следните потребители в обобщението на %(groupId)s:", + "Add a User": "Добавяне на потребител", + "Failed to remove a user from the summary of %(groupId)s": "Неуспешно премахване на потребител от обобщението на %(groupId)s", + "The user '%(displayName)s' could not be removed from the summary.": "Потребителят '%(displayName)s' не може да бъде премахнат от обобщението.", + "Failed to upload image": "Неуспешно качване на снимката", + "Leave %(groupName)s?": "Напускане на %(groupName)s?", + "Featured Rooms:": "Препоръчани стаи:", + "Featured Users:": "Препоръчани потребители:", + "Long Description (HTML)": "Дълго описание (HTML)", + "Description": "Описание", + "This Home server does not support communities": "Този Home сървър не поддържа общности", + "Failed to load %(groupId)s": "Неуспешно зареждане на %(groupId)s", + "Reject invitation": "Отхвърли поканата", + "Are you sure you want to reject the invitation?": "Сигурни ли сте, че искате да отхвърлите поканата?", + "Failed to reject invitation": "Неуспешно отхвърляне на поканата", + "This room is not public. You will not be able to rejoin without an invite.": "Тази стая не е публична. Няма да можете да се присъедините отново без покана.", + "Are you sure you want to leave the room '%(roomName)s'?": "Сигурни ли сте, че искате да напуснете стаята '%(roomName)s'?", + "Failed to leave room": "Неуспешно напускане на стаята", + "Old cryptography data detected": "Бяха открити стари криптографски данни", + "Your Communities": "Вашите общности", + "Failed to fetch avatar URL": "Неуспешно изтегляне от адреса на аватара", + "Signed Out": "Излязохте", + "For security, this session has been signed out. Please sign in again.": "Поради мерки за сигурност, тази сесия е прекратена. Моля, влезте отново.", + "Logout": "Излез", + "Sign out": "Изход", + "Error whilst fetching joined communities": "Грешка при извличането на общности, към които сте присъединени", + "You have no visible notifications": "Нямате видими известия", + "Scroll to bottom of page": "Отиди до края на страницата", + "Message not sent due to unknown devices being present": "Съобщението не е изпратено поради наличието на непознати устройства", + "Show devices, send anyway or cancel.": "Покажи устройствата, изпрати въпреки това или откажи.", + "%(count)s of your messages have not been sent.|other": "Някои от Вашите съобщение не бяха изпратени.", + "%(count)s of your messages have not been sent.|one": "Вашето съобщение не беше изпратено.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Изпрати всички отново или откажи всички сега. Също така може да изберете индивидуални съобщения, които да изпратите отново или да откажете.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Изпрати съобщението отново или откажи съобщението сега.", + "Connectivity to the server has been lost.": "Връзката със сървъра е изгубена.", + "Sent messages will be stored until your connection has returned.": "Изпратените съобщения ще бъдат запаметени докато връзката Ви се възвърне.", + "%(count)s new messages|other": "%(count)s нови съобщения", + "%(count)s new messages|one": "%(count)s ново съобщение", + "Active call": "Активен разговор", + "Use with caution": "Внимавайте при използване", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Няма никой друг тук! Поканете други или изключете предупреждението, че стаята е празна?", + "You seem to be uploading files, are you sure you want to quit?": "Изглежда, че качвате файлове. Сигурни ли сте, че искате да затворите програмата?", + "You seem to be in a call, are you sure you want to quit?": "Изглежда, че сте в разговор. Сигурни ли сте, че искате да излезете от програмата?", + "Failed to upload file": "Неуспешно качване на файлове", + "Server may be unavailable, overloaded, or the file too big": "Сървърът може би е недостъпен, претоварен или файлът е твърде голям", + "Search failed": "Търсенето е неуспешно", + "Server may be unavailable, overloaded, or search timed out :(": "Сървърът може би е недостъпен, претоварен или времето за търсене изтече :(", + "No more results": "Няма повече резултати", + "Unknown room %(roomId)s": "Неизвестна стая %(roomId)s", + "Room": "Стая", + "Failed to save settings": "Неуспешно запазване на настройките", + "Failed to reject invite": "Неуспешно отхвърляне на поканата", + "Reject all %(invitedRooms)s invites": "Отхвърли всички %(invitedRooms)s покани", + "Fill screen": "Запълни екрана", + "Click to unmute video": "Натиснете, за да включите звука на видеото", + "Click to mute video": "Натиснете, за да заглушите видеото", + "Click to unmute audio": "Натиснете, за да включите звука", + "Click to mute audio": "Натиснете, за да заглушите звука", + "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.": "Беше направен опит да се зареди конкретна точка в хронологията на тази стая, но нямате разрешение да разгледате въпросното съобщение.", + "Failed to load timeline position": "Неуспешно зареждане на позицията в хронологията", + "Uploading %(filename)s and %(count)s others|other": "Качване на %(filename)s и %(count)s други", + "Uploading %(filename)s and %(count)s others|zero": "Качване на %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Качване на %(filename)s и %(count)s друг", + "Light theme": "Светла тема", + "Dark theme": "Тъмна тема", + "Status.im theme": "Тема Status.im", + "Can't load user settings": "Потребителските настройки не могат да бъдат заредени", + "Server may be unavailable or overloaded": "Сървърът може би е недостъпен или претоварен", + "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 сесии, моля експортирайте Вашите ключове за стаите.", + "Success": "Успешно", + "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 %(threePid)s?": "Премахни %(threePid)s?", + "Refer a friend to Riot:": "Покани приятел в Riot:", + "Interface Language": "Език на интерфейса", + "User Interface": "Потребителски интерфейс", + "Autocomplete Delay (ms):": "Забавяне на визуализацията на автоматичните подсказки (мс):", + "": "<не се поддържа>", + "Import E2E room keys": "Импортирай E2E ключове за стая", + "Cryptography": "Криптография", + "Device ID:": "Идентификатор на устройството:", + "Device key:": "Ключ на устройството:", + "Ignored Users": "Игнорирани потребители", + "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.": "Научете повече за това как използваме статистическите данни.", + "Labs": "Експерименти", + "These are experimental features that may break in unexpected ways": "Това са експериментални функции , които могат да се счупят по неочаквани начини", + "Clear Cache": "Изчисти кеш", + "Clear Cache and Reload": "Изчисти кеша и зареди отново", + "Updates": "Нови версии", + "Check for update": "Провери за нова версия", + "Bulk Options": "Групови опции", + "Desktop specific": "Специфичен за работния плот", + "Start automatically after system login": "Автоматично стартиране след влизане в системата", + "No media permissions": "Няма разрешения за медийните устройства", + "You may need to manually permit Riot to access your microphone/webcam": "Може да се наложи ръчно да разрешите на Riot да получи достъп до Вашия микрофон/уеб камера", + "Missing Media Permissions, click here to request.": "Липсват разрешения за медийните устройства. Натиснете тук, за да ги поискате.", + "No Microphones detected": "Няма открити микрофони", + "No Webcams detected": "Няма открити уеб камери", + "Default Device": "Устройство по подразбиране", + "Microphone": "Микрофон", + "Camera": "Камера", + "VoIP": "VoIP", + "Email": "Имейл", + "Add email address": "Добави имейл адрес", + "Profile": "Профил", + "Display name": "Име/псевдоним", + "Account": "Акаунт", + "To return to your account in future you need to set a password": "За да се върнете в профила си в бъдеще, трябва да зададете парола", + "Logged in as:": "Влезли сте като:", + "Access Token:": "Тоукън за достъп:", + "click to reveal": "натиснете за показване", + "Homeserver is": "Home сървър:", + "Identity Server is": "Сървър за самоличност:", + "matrix-react-sdk version:": "Версия на matrix-react-sdk:", + "riot-web version:": "Версия на riot-web:", + "olm version:": "Версия на olm:", + "Failed to send email": "Неуспешно изпращане на имейл", + "The email address linked to your account must be entered.": "Имейл адресът, свързан с профила Ви, трябва да бъде въведен.", + "A new password must be entered.": "Трябва да бъде въведена нова парола.", + "New passwords must match each other.": "Новите пароли трябва да съвпадат една с друга.", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Имейл беше изпратен на %(emailAddress)s. След като проследите връзката, която съдържа, натиснете по-долу.", + "Your password has been reset": "Вашата парола беше възстановена", + "Return to login screen": "Връщане към страницата за влизане в профила", + "To reset your password, enter the email address linked to your account": "За да възстановите Вашата парола, въведете имейл адреса, свързан с профила Ви", + "New password": "Нова парола", + "Confirm your new password": "Потвърдете новата си парола", + "Send Reset Email": "Изпрати имейл за възстановяване на парола", + "Create an account": "Създаване на профил", + "This Home Server does not support login using email address.": "Този Home сървър не поддържа влизане в профила чрез имейл адрес.", + "Incorrect username and/or password.": "Неправилно потребителско име и/или парола.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Моля, обърнете внимание, че влизате в %(hs)s сървър, а не в matrix.org.", + "Guest access is disabled on this Home Server.": "Достъпът за гости е изключен на този Home сървър.", + "The phone number entered looks invalid": "Въведеният телефонен номер изглежда невалиден", + "This homeserver doesn't offer any login flows which are supported by this client.": "Този Home сървър не предлага методи за влизане, които се поддържат от този клиент.", + "Error: Problem communicating with the given homeserver.": "Грешка: Проблем при комуникацията с дадения Home сървър.", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Не е възможно свързване към Home сървъра чрез HTTP, когато има HTTPS адрес в лентата на браузъра Ви. Или използвайте HTTPS или включете функция небезопасни скриптове.", + "Login as guest": "Влез като гост", + "Sign in to get started": "Влезте в профила си, за да започнете", + "Set a display name:": "Задаване на име:", + "Upload an avatar:": "Качване на профилна снимка:", + "This server does not support authentication with a phone number.": "Този сървър не поддържа автентикация с телефонен номер.", + "Missing password.": "Липсва парола.", + "Passwords don't match.": "Паролите не съвпадат.", + "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Паролата е твърде къса (мин. %(MIN_PASSWORD_LENGTH)s).", + "This doesn't look like a valid email address.": "Това не изглежда да е валиден имейл адрес.", + "This doesn't look like a valid phone number.": "Това не изглежда да е валиден телефонен номер.", + "You need to enter a user name.": "Трябва да въведете потребителско име.", + "An unknown error occurred.": "Възникна неизвестна грешка.", + "I already have an account": "Вече имам профил", + "Displays action": "Показва действие", + "Bans user with given id": "Блокира потребители с даден идентификатор", + "Unbans user with given id": "Отблокира потребител с даден идентификатор", + "Define the power level of a user": "Променя нивото на достъп на потребителя", + "Deops user with given id": "Отнема правата на потребител с даден идентификатор", + "Invites user with given id to current room": "Поканва потребител с даден идентификатор в текущата стая", + "Joins room with given alias": "Присъединяване към стая с даден псевдоним", + "Sets the room topic": "Задава темата на стаята", + "Kicks user with given id": "Изгонва потребителя с даден идентификатор", + "Changes your display nickname": "Сменя Вашия псевдоним", + "Searches DuckDuckGo for results": "Търси в DuckDuckGo за резултати", + "Changes colour scheme of current room": "Променя цветовата схема на текущата стая", + "Verifies a user, device, and pubkey tuple": "Потвърждава потребител, устройство или ключова двойка", + "Ignores a user, hiding their messages from you": "Игнорира потребител, скривайки съобщенията му от Вас", + "Stops ignoring a user, showing their messages going forward": "Спира игнорирането на потребител, показвайки съобщенията му занапред", + "Commands": "Команди", + "Results from DuckDuckGo": "Резултати от DuckDuckGo", + "Emoji": "Емотикони", + "Notify the whole room": "Извести всички в стаята", + "Room Notification": "Известие за стая", + "Users": "Потребители", + "unknown device": "неизвестно устройство", + "Ed25519 fingerprint": "Ed25519 отпечатък", + "User ID": "Потребителски идентификатор", + "Curve25519 identity key": "Curve25519 ключ за самоличност", + "Algorithm": "Алгоритъм", + "unencrypted": "нешифрован", + "Decryption error": "Грешка при разшифроването", + "Session ID": "Идентификатор на сесията", + "Claimed Ed25519 fingerprint key": "Заявен ключов отпечатък Ed25519", + "End-to-end encryption information": "Информация за шифроването от край до край", + "Event information": "Информация за събитието", + "Sender device information": "Информация за устройството на подателя", + "Passphrases must match": "Паролите трябва да съвпадат", + "Passphrase must not be empty": "Паролата не трябва да е празна", + "Export room keys": "Експортиране на ключове за стаята", + "Enter passphrase": "Въведи парола", + "Confirm passphrase": "Потвърди парола", + "Export": "Експортирай", + "Import room keys": "Импортиране на ключове за стая", + "File to import": "Файл за импортиране", + "Import": "Импортирай", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Когато тази страница съдържа информация идентифицираща Вас (като например стая, потребител или идентификатор на група), тези данни биват премахнати преди да бъдат изпратени до сървъра.", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Има непознати устройства в тази стая. Ако продължите без да ги потвърдите, ще бъде възможно за някого да подслушва Вашия разговор.", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ВНИМАНИЕ: НЕУСПЕШНО ПОТВЪРЖДАВАНЕ НА КЛЮЧА! Ключът за подписване за %(userId)s и устройството %(deviceId)s е \"%(fprint)s\", което не съвпада с предоставения ключ \"%(fingerprint)s\". Това може да означава, че Вашата комуникация е прихваната!", + "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Смяната на парола ще нулира всички ключове за шифроване от край до край на всички устройства, правейки историята на шифрования чат невъзможна за четене, освен ако първо не експортирате ключовете за стаята и ги импортирате отново след това. В бъдеще това ще бъде подобрено.", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "На път сте да бъдете отведени до друг сайт, където можете да удостоверите профила си за използване с %(integrationsUrl)s. Искате ли да продължите?", + "Robot check is currently unavailable on desktop - please use a web browser": "Проверка за робот в момента не е налична на работния плот. Моля, използвайте уеб браузър", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Можете да използвате опциите за друг сървър, за да влезете в други Matrix сървъри като посочите различен Home сървър.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Това Ви позволява да използвате това приложение със съществуващ Matrix профил на различен Home сървър.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Възможно е и да зададете друг сървър за самоличност, но това обикновено предотвратява намирането на други потребители по имейл адрес.", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Сигурни ли сте, че искате да премахнете (изтриете) това събитие? Забележете, че ако изтриете събитие за промяна на името на стая или тема, това може да обърне промяната.", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "За да потвърдите, че на това устройство може да се вярва, моля свържете се със собственика му по друг начин (напр. на живо или чрез телефонен разговор) и го попитайте дали ключът, който той вижда в неговите настройки на потребителя за това устройство, съвпада с ключа по-долу:", + "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.": "Ако съвпада, моля натиснете бутона за потвърждение по-долу. Ако не, то тогава някой друг имитира това устройство и вероятно искате вместо това да натиснете бутона за черен списък.", + "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ако преди сте използвали по-нова версия на Riot, Вашата сесия може да не бъде съвместима с текущата версия. Затворете този прозорец и се върнете в по-новата версия.", + "This will be your account name on the homeserver, or you can pick a different server.": "Това ще бъде името на профила Ви на Home сървъра, или можете да изберете друг сървър.", + "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Препоръчваме Ви да минете през процеса за потвърждение за всяко устройство, за да потвърдите, че принадлежат на легитимен собственик. Ако предпочитате, можете да изпратите съобщение без потвърждение.", + "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": "Вие сте излязли от профила си от всички устройства и вече няма да получавате известия. За да включите известията отново, влезте в профила си от всички устройства", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Няма връзка с Home сървъра. Моля, проверете Вашата връзка. Уверете се, че SSL сертификатът на Home сървъра е надежден и че някое разширение на браузъра не блокира заявките.", + "none": "няма", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Този процес Ви позволява да експортирате във файл ключовете за съобщения в шифровани стаи. Така ще можете да импортирате файла в друг Matrix клиент, така че той също да може да разшифрова такива съобщения.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Експортираният файл ще позволи на всеки, който може да го прочете, да разшифрова всяко шифровано съобщение, което можете да видите. Трябва да го държите на сигурно място. За да направите това, трябва да въведете парола по-долу, която ще се използва за шифроване на експортираните данни. Ще бъде възможно да се импортират данните само с използване на същата парола.", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Този процес позволява да импортирате ключове за шифроване, които преди сте експортирали от друг Matrix клиент. Тогава ще можете да разшифровате всяко съобщение, което другият клиент може да разшифрова.", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Експортираният файл може да бъде предпазен с парола. Трябва да въведете парола тук, за да разшифровате файла.", + "Did you know: you can use communities to filter your Riot.im experience!": "Знаете ли, че: може да използвате общности, за да филтрирате Вашето 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.": "За да създадете филтър, дръпнете и пуснете аватара на общността върху панела за филтриране в най-лявата част на екрана. По всяко време може да натиснете върху аватар от панела, за да видите само стаите и хората от тази общност.", + "Disable Community Filter Panel": "Изключи панела за филтриране на общности", + "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.": "Заявки за споделяне на ключове се изпращат автоматично към другите Ви устройства. Ако сте ги отхвърлили от другите устройства, натиснете тук, за да заявите нови за тази сесия.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Ако другите Ви устройства нямат ключа за това съобщение, няма да можете да го разшифровате.", + "Key request sent.": "Заявката за ключ е изпратена.", + "Re-request encryption keys from your other devices.": "Заявете отново ключове за шифроване от другите Ви устройства.", + "%(user)s is a %(userRole)s": "%(user)s е %(userRole)s", + "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 contain messages.": "Ако сте изпратили грешка чрез GitHub, логовете за дебъгване могат да ни помогнат да проследим проблема. Логовете за дебъгване съдържат данни за използване на приложението, включващи потребителското Ви име, идентификаторите или псевдонимите на стаите или групите, които сте посетили, и потребителските имена на други потребители. Те не съдържат съобщения.", + "Submit debug logs": "Изпрати логове за дебъгване", + "Opens the Developer Tools dialog": "Отваря прозорец с инструменти на разработчика", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Видяно от %(displayName)s (%(userName)s) в %(dateTime)s", + "Unable to join community": "Неуспешно влизане в общността", + "Unable to leave community": "Неуспешно напускане на общността", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Промени направени по името и аватара на вашата общност може да не се отразят при другите потребители за до 30 минути.", + "Join this community": "Присъединете се в тази общност", + "Leave this community": "Напуснете тази общност", + "Stickerpack": "Пакет със стикери", + "You don't currently have any stickerpacks enabled": "В момента нямате включени пакети със стикери", + "Add a stickerpack": "Добави пакет със стикери", + "Hide Stickers": "Скрий стикери", + "Show Stickers": "Покажи стикери", + "Who can join this community?": "Кой може да се присъедини към тази общност?", + "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 set a password": "За да се върнете в профила си в бъдеще, трябва да зададете парола", + "Forget": "Забрави", + "Hide panel": "Скриване на панела", + "You cannot delete this image. (%(code)s)": "Не можете да изтриете тази снимка. (%(code)s)", + "Cancel Sending": "Откажи изпращането", + "This Room": "В тази стая", + "The Home Server may be too old to support third party networks": "Home сървърът може да е твърде стар, за да поддържа работа с други мрежи", + "Resend": "Изпрати отново", + "Room not found": "Стаята не е намерена", + "Downloading update...": "Сваляне на нова версия...", + "Messages in one-to-one chats": "Съобщения в индивидуални чатове", + "Unavailable": "Не е наличен", + "View Decrypted Source": "Прегледай разшифрования източник", + "Failed to update keywords": "Грешка при обновяване на ключови думи", + "Notes:": "Бележки:", + "remove %(name)s from the directory.": "премахване %(name)s от директорията.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Известия за следните ключови думи изпълняват правила, които не могат да бъдат показани тук:", + "Safari and Opera work too.": "Safari и Opera са други алтернативи.", + "Please set a password!": "Моля, въведете парола!", + "You have successfully set a password!": "Вие успешно зададохте парола!", + "Explore Room State": "Преглед на състоянието на стаята", + "Source URL": "URL на източника", + "Messages sent by bot": "Съобщения изпратени от бот", + "Filter results": "Филтриране на резултати", + "Members": "Членове", + "No update available.": "Няма нова версия.", + "Noisy": "Шумно", + "Failed to get protocol list from Home Server": "Неуспешно получаване на списък с протоколи от Home сървър", + "Collecting app version information": "Събиране на информация за версията на приложението", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Изтриване на псевдонима %(alias)s на стаята и премахване на %(name)s от директорията?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Това ще Ви позволи да се върнете в профила си след излизане от него, и да влезете от други устройства.", + "Enable notifications for this account": "Включване на известия за този профил", + "Directory": "Директория", + "Invite to this community": "Покани в тази общност", + "Search for a room": "Търсене на стая", + "Search…": "Търсене…", + "Messages containing keywords": "Съобщения, съдържащи ключови думи", + "Error saving email notification preferences": "Грешка при запазване на настройките за имейл известяване", + "Tuesday": "Вторник", + "Enter keywords separated by a comma:": "Ключови думи разделени чрез запетая:", + "Forward Message": "Препрати съобщението", + "You have successfully set a password and an email address!": "Вие успешно зададохте парола и имейл адрес!", + "Remove %(name)s from the directory?": "Премахване на %(name)s от директорията?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot използва много разширени браузър харектеристики, някои от които не са налични или са все още експериментални в настоящия Ви браузър.", + "Developer Tools": "Инструменти за разработчика", + "Preparing to send logs": "Подготовка за изпращане на логове", + "Explore Account Data": "Преглед на данните от профила", + "All messages (noisy)": "Всички съобщения (шумно)", + "Saturday": "Събота", + "Remember, you can always set an email address in user settings if you change your mind.": "Ако си промените мнението, винаги може да зададете имейл адрес в настройки на потребителя.", + "Direct Chat": "Директен чат", + "The server may be unavailable or overloaded": "Сървърът не е наличен или е претоварен", + "Reject": "Отхвърли", + "Failed to set Direct Message status of room": "Неуспешно настройване на стаята като Директен чат", + "Monday": "Понеделник", + "Remove from Directory": "Премахни от директорията", + "Enable them now": "Включете ги сега", + "Messages containing my user name": "Съобщения, съдържащи моето потребителско име", + "Toolbox": "Инструменти", + "Collecting logs": "Събиране на логове", + "more": "още", + "GitHub issue link:": "Линк към GitHub issue:", + "Failed to get public room list": "Неуспешно получаване на списък с публични стаи", + "You must specify an event type!": "Трябва да укажате тип на събитието", + "(HTTP status %(httpStatus)s)": "(HTTP статус %(httpStatus)s)", + "All Rooms": "Във всички стаи", + "Please install Chrome or Firefox for the best experience.": "Моля, инсталирайте Chrome или Firefox за най-добро преживяване.", + "Wednesday": "Сряда", + "Quote": "Цитирай", + "Send logs": "Изпращане на логове", + "All messages": "Всички съобщения", + "Call invitation": "Покана за разговор", + "Messages containing my display name": "Съобщения, съдържащи моя псевдоним", + "State Key": "State ключ", + "Failed to send custom event.": "Неуспешно изпращане на потребителско събитие.", + "What's new?": "Какво ново?", + "Notify me for anything else": "Извести ме за всичко останало", + "When I'm invited to a room": "Когато ме поканят в стая", + "Keywords": "Ключови думи", + "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 стая", + "Invite to this room": "Покани в тази стая", + "You cannot delete this message. (%(code)s)": "Това съобщение не може да бъде изтрито. (%(code)s)", + "Thursday": "Четвъртък", + "I understand the risks and wish to continue": "Разбирам рисковете и желая да продължа", + "Logs sent": "Логовете са изпратени", + "Back": "Назад", + "Reply": "Отговори", + "Show message in desktop notification": "Показване на съдържание в известията на работния плот", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Логовете за дебъгване съдържат данни за използване на приложението, включващи потребителското Ви име, идентификаторите или псевдонимите на стаите или групите, които сте посетили, и потребителските имена на други потребители. Те не съдържат съобщения.", + "Unhide Preview": "Покажи отново прегледа", + "Unable to join network": "Неуспешно присъединяване към мрежата", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Възможна конфигурация на настройките за известия в клиент, различен от Riot. Не могат да бъдат променени в Riot, но важат въпреки това", + "Sorry, your browser is not able to run Riot.": "За жалост, Вашият браузър не може да пусне Riot.", + "Messages in group chats": "Съобщения в групови чатове", + "Yesterday": "Вчера", + "Error encountered (%(errorDetail)s).": "Възникна грешка (%(errorDetail)s).", + "Event Type": "Вид на събитие", + "Low Priority": "Нисък приоритет", + "What's New": "Какво ново", + "Set Password": "Задаване на парола", + "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": "Съществуват разширени настройки за известия, които не са показани тук", + "Missing roomId.": "Липсва идентификатор на стая.", + "Picture": "Изображение", + "Every page you use in the app": "Всяка използвана страница от приложението", + "e.g. ": "например: ", + "Your User Agent": "Вашият браузър", + "Your device resolution": "Разделителната способност на устройството Ви", + "Always show encryption icons": "Винаги показвай икони за шифроване", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "В момента не може да се отговаря с файл, така че това ще се изпрати без да бъде отговор.", + "Unable to reply": "Не може да се отговори", + "At this time it is not possible to reply with an emote.": "В момента не може да се отговори с емотикона.", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не може да се зареди събитието, на което е отговорено. Или не съществува или нямате достъп да го видите." +} 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 6af10bf907..407b9f61d4 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -18,7 +18,7 @@ "Error": "Error", "Failed to forget room %(errCode)s": "No s'ha pogut oblidar la sala %(errCode)s", "Favourite": "Favorit", - "Mute": "Silenciat", + "Mute": "Silencia", "Room directory": "Directori de sales", "Settings": "Paràmetres", "Start chat": "Inicia un xat", @@ -30,5 +30,999 @@ "Remove": "Elimina", "unknown error code": "codi d'error desconegut", "OK": "D'acord", - "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "S'ha enviat un missatge de text a +%(msisdn)s. Entreu si us plau el codi de verificació que conté" + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "S'ha enviat un missatge de text a +%(msisdn)s. Entreu si us plau el codi de verificació que conté", + "Operation failed": "No s'ha pogut realitzar l'operació", + "Search": "Cerca", + "powered by Matrix": "amb tecnologia de Matrix", + "Edit": "Edita", + "Unpin Message": "Desenganxa el missatge", + "Register": "Registre", + "Rooms": "Sales", + "Add rooms to this community": "Afegeix sales a aquesta comunitat", + "World readable": "Llegible al món", + "Guests can join": "Els usuaris d'altres xarxes s'hi poden unir", + "This email address is already in use": "Aquesta adreça de correu electrònic ja està en ús", + "This phone number is already in use": "Aquest número de telèfon ja està en ús", + "Failed to verify email address: make sure you clicked the link in the email": "No s'ha pogut verificar l'adreça de correu electrònic. Assegureu-vos de fer clic a l'enllaç del correu electrònic de verificació", + "Call Failed": "No s'ha pogut realitzar la trucada", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Hi ha dispositius desconeguts a aquesta sala. Si continueu sense verificar-los, és possible que algú escolti la vostra trucada.", + "Review Devices": "Revisió de dispositius", + "Call Anyway": "Truca de totes maneres", + "Answer Anyway": "Contesta en tot cas", + "Call": "Truca", + "Answer": "Contesta", + "The remote side failed to pick up": "El costat remot no s'ha pogut recuperar", + "Unable to capture screen": "No s'ha pogut capturar la pantalla", + "Existing Call": "Trucades existents", + "You are already in a call.": "Ja sou a una trucada.", + "VoIP is unsupported": "El VoIP no és compatible aquí", + "You cannot place VoIP calls in this browser.": "No es poden fer trucades VoIP amb aquest navegador.", + "You cannot place a call with yourself.": "No és possible trucar-se a un mateix.", + "Conference calls are not supported in this client": "Aquest client no és compatible amb les trucades de conferència", + "Conference calls are not supported in encrypted rooms": "Les trucades de conferència no es poden fer dins les sales encriptades", + "Warning!": "Avís!", + "Conference calling is in development and may not be reliable.": "Les conferències estan en desenvolupament i podrien no ser fiables.", + "Failed to set up conference call": "No s'ha pogut realitzar la trucada de conferència", + "Conference call failed.": "No s´ha pogut realitzar la trucada de conferència.", + "The file '%(fileName)s' failed to upload": "No s'ha pogut pujar el fitxer '%(fileName)s'", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "El fitxer '%(fileName)s' supera el límit de mida per a les càrregues d'aquest servidor", + "Upload Failed": "No s'ha pogut realitzar la pujada", + "Sun": "dg.", + "Mon": "dl.", + "Tue": "dt.", + "Wed": "dc.", + "Thu": "dj.", + "Fri": "dv.", + "Sat": "ds.", + "Jan": "gen.", + "Feb": "febr.", + "Mar": "març", + "Apr": "abr.", + "May": "maig", + "Jun": "juny", + "Jul": "jul.", + "Aug": "ag.", + "Sep": "set.", + "Oct": "oct.", + "Nov": "nov.", + "Dec": "des.", + "PM": "PM", + "AM": "AM", + "%(weekDayName)s %(time)s": "%(weekDayName)s%(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s%(day)s%(monthName)s%(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s%(day)s%(monthName)s%(fullYear)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s%(day)s%(monthName)s%(fullYear)s%(time)s", + "Who would you like to add to this community?": "A qui voleu afegir a aquesta comunitat?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Avís: les persones que afegiu a aquesta comunitat seran visibles públicament per a qualsevol que conegui l'ID de la comunitat", + "Invite new community members": "Convida a unir-se a la comunitat a nous membres", + "Name or matrix ID": "Nom o ID de Matrix", + "Invite to Community": "Convida a la comunitat", + "Which rooms would you like to add to this community?": "Quines sales voleu afegir a aquesta comunitat?", + "Show these rooms to non-members on the community page and room list?": "Voleu mostrar a la llista de sales i a la pàgina de la comunitat, aquestes sales, als qui no en siguin membres?", + "Add rooms to the community": "Afegeix sales a la comunitat", + "Room name or alias": "Nom de la sala o àlies", + "Add to community": "Afegeix a la comunitat", + "Failed to invite the following users to %(groupId)s:": "No s'ha pogut convidar al grup %(groupId)s els següents usuaris:", + "Failed to invite users to community": "No s'ha pogut convidar als usuaris a la comunitat", + "Failed to invite users to %(groupId)s": "No s'ha pogut convidar els usuaris al grup %(groupId)s", + "Failed to add the following rooms to %(groupId)s:": "No s'ha pogut afegir al grup %(groupId)s les següents sales:", + "Riot does not have permission to send you notifications - please check your browser settings": "Riot no té permís per enviar-vos notificacions. Comproveu la configuració del vostre navegador", + "Riot was not given permission to send notifications - please try again": "Riot no ha rebut cap permís per enviar notificacions. Torneu-ho a provar", + "Unable to enable Notifications": "No s'ha pogut activar les notificacions", + "This email address was not found": "Aquesta adreça de correu electrònic no s'ha trobat", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "La vostra adreça de correu electrònic no sembla que estigui associada amb un identificador de Matrix d'aquest servidor.", + "Default": "Per defecte", + "Restricted": "Restringit", + "Moderator": "Moderador", + "Admin": "Admin", + "Start a chat": "Comença un xat", + "Who would you like to communicate with?": "Amb qui es vol comunicar?", + "Email, name or matrix ID": "Correu electrònic, nom o ID de Matrix", + "Start Chat": "Comença un xat", + "Invite new room members": "Convida a nous membres a la sala", + "Who would you like to add to this room?": "A qui vol afegir a aquesta sala?", + "Send Invites": "Envia invitacions", + "Failed to invite user": "No s'ha pogut convidar al usuari", + "Failed to invite": "No s'ha pogut tramitar la invitació", + "Failed to invite the following users to the %(roomName)s room:": "No s'ha pogut convidar a la sala %(roomName)s els següents usuaris:", + "You need to be logged in.": "És necessari estar autenticat.", + "You need to be able to invite users to do that.": "Per poder fer això, heu de poder convidar a altres usuaris.", + "Unable to create widget.": "No s'ha pogut crear el giny.", + "Failed to send request.": "No s'ha pogut enviar la sol·licitud.", + "This room is not recognised.": "No es reconeix aquesta sala.", + "Power level must be positive integer.": "El nivell de potència ha de ser un enter positiu.", + "You are not in this room.": "No heu entrat a aquesta sala.", + "You do not have permission to do that in this room.": "No teniu el permís per realitzar aquesta acció en aquesta sala.", + "Missing room_id in request": "Falta l'ID de la sala en la vostra sol·licitud", + "Must be viewing a room": "Hauríeu de veure una sala", + "Room %(roomId)s not visible": "La sala %(roomId)s no és visible", + "Missing user_id in request": "Falta l'ID d'usuari a la vostre sol·licitud", + "Failed to lookup current room": "No s'ha pogut buscar la sala actual", + "Usage": "Ús", + "/ddg is not a command": "/ddg no és un comandament", + "To use it, just wait for autocomplete results to load and tab through them.": "Per utilitzar-lo, simplement espereu que es completin els resultats automàticament i seleccioneu-ne el desitjat.", + "Unrecognised room alias:": "Àlies de sala no reconeguts:", + "Ignored user": "Usuari ignorat", + "You are now ignoring %(userId)s": "S'està ignorant l'usuari %(userId)s", + "Unignored user": "Usuari no ignorat", + "You are no longer ignoring %(userId)s": "Ja no s'està ignorant al usuari %(userId)s", + "Device already verified!": "El dispositiu ja estava verificat!", + "WARNING: Device already verified, but keys do NOT MATCH!": "AVÍS: El dispositiu ja estava verificat, però les claus NO COINCIDIEN!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "AVÍS: NO S'HA POGUT VERIFICAR! La firma de la clau de l'usuari %(userId)s i el dispositiu %(deviceId)s és \"%(fprint)s\", però no coincideix amb la clau \"%(fingerprint)s\". Això pot significar que les vostres comunicacions estan sent interceptades!", + "Verified key": "Claus verificades", + "Call Timeout": "Temps d'espera de les trucades", + "Unknown (user, device) pair:": "Parell desconegut (usuari, dispositiu):", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La clau de signatura que heu proporcionat coincideix amb la clau de signatura que heu rebut del dispositiu %(deviceId)s de l'usuari %(userId)s. S'ha marcat el dispositiu com a dispositiu verificat.", + "Unrecognised command:": "Ordre no reconegut:", + "Reason": "Raó", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ha acceptat la invitació de %(displayName)s.", + "%(targetName)s accepted an invitation.": "%(targetName)s ha acceptat una invitació.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s ha sol·licitat una conferència VoIP.", + "%(senderName)s invited %(targetName)s.": "%(senderName)s ha convidat a %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s ha expulsat a %(targetName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ha establert %(displayName)s com el seu nom visible.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha retirat el seu nom visible %(oldDisplayName)s.", + "%(senderName)s removed their profile picture.": "%(senderName)s ha retirat la seva foto de perfil.", + "%(senderName)s changed their profile picture.": "%(senderName)s ha canviat la seva foto de perfil.", + "%(senderName)s set a profile picture.": "%(senderName)s ha establert una foto de perfil.", + "VoIP conference started.": "S'ha iniciat la conferència VoIP.", + "%(targetName)s joined the room.": "%(targetName)s ha entrat a la sala.", + "VoIP conference finished.": "S'ha finalitzat la conferència VoIP.", + "%(targetName)s rejected the invitation.": "%(targetName)s ha rebutjat la invitació.", + "%(targetName)s left the room.": "%(targetName)s ha sortir de la sala.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ha readmès a %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s ha fet fora a %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha retirat la invitació per a %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ha canviat el tema a \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha eliminat el nom de la sala.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ha canviat el nom de la sala a %(roomName)s.", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s ha enviat una imatge.", + "Someone": "Algú", + "(not supported by this browser)": "(no és compatible amb aquest navegador)", + "%(senderName)s answered the call.": "%(senderName)s ha contestat la trucada.", + "(could not connect media)": "(no s'ha pogut connectar el medi)", + "(no answer)": "(sense resposta)", + "(unknown failure: %(reason)s)": "(error desconegut: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s ha penjat.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s ha col·locat una trucada de %(callType)s.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s ha enviat una invitació a %(targetDisplayName)s a entrar a aquesta sala.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s ha fet visible l'històric futur de la sala per a tots els membres, a partir de que hi són convidats.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s ha fet visible l'històric futur de la sala a tots els membres, des de que entren a la sala.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s ha fet visible l'històric futur de la sala a tots els membres de la sala.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s ha fet visible l´historial de la sala per a tothom.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha fet visible l'històric de la sala per a desconeguts (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha activat l'encriptació d'extrem a extrem (algoritme %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s fins %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha canviat el nivell de potència de %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ha canviat els missatges fixats de la sala.", + "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s ha modificat el giny %(widgetName)s", + "%(widgetName)s widget added by %(senderName)s": "%(senderName)s ha afegit el giny %(widgetName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s ha eliminat el giny %(widgetName)s", + "%(displayName)s is typing": "%(displayName)s està escrivint", + "%(names)s and %(count)s others are typing|other": "%(names)s i %(count)s més estan escrivint", + "%(names)s and %(count)s others are typing|one": "%(names)s i algú altre està escrivint", + "%(names)s and %(lastPerson)s are typing": "%(names)s i %(lastPerson)s estan escrivint", + "Failure to create room": "No s'ha pogut crear la sala", + "Server may be unavailable, overloaded, or you hit a bug.": "És possible que el servidor no estigui disponible, amb sobrecàrrega o que s'hagi trobat un error.", + "Send anyway": "Envia de totes maneres", + "Send": "Envia", + "Unnamed Room": "Sala sense nom", + "Your browser does not support the required cryptography extensions": "El vostre navegador no és compatible amb els complements criptogràfics necessaris", + "Not a valid Riot keyfile": "El fitxer no és un fitxer de claus de Riot valid", + "Authentication check failed: incorrect password?": "Ha fallat l'autenticació: heu introduït correctament la contrasenya?", + "Failed to join room": "No s'ha pogut entrar a la sala", + "Message Replies": "Respostes del missatge", + "Message Pinning": "Fixació de missatges", + "Tag Panel": "Tauler d'etiquetes", + "Disable Emoji suggestions while typing": "Desactiva els suggeriments d'Emoji mentre s'escriu", + "Use compact timeline layout": "Utilitza el disseny compacte de la línia de temps", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Amaga els missatges d'entrada i sortida (no afecta a les invitacions, expulsions o prohibicions)", + "Hide avatar changes": "Amaga els canvis de foto de perfil", + "Hide display name changes": "Amaga els canvis de nom visible", + "Hide read receipts": "Amaga els rebuts llegits", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "Mostra les marques de temps en format de 12 hores (per exemple, 2:30pm)", + "Autoplay GIFs and videos": "Reprodueix de forma automàtica els GIF i vídeos", + "Enable automatic language detection for syntax highlighting": "Activa la detecció automàtica d'idiomes per al ressaltat de sintaxi", + "Disable big emoji in chat": "Desactiva els grans emoji al xat", + "Don't send typing notifications": "No enviïs notificacions d'escriptura", + "Automatically replace plain text Emoji": "Substitueix automàticament Emoji de text pla", + "Disable Peer-to-Peer for 1:1 calls": "Desactiva el Peer-to-Peer per a trucades entre dos", + "Never send encrypted messages to unverified devices in this room from this device": "Des d'aquest dispositiu no enviïs mai a aquesta sala missatges encriptats a dispositius sense verificar", + "Enable inline URL previews by default": "Activa per defecte la vista prèvia d'URLs en línia", + "Enable URL previews for this room (only affects you)": "Activa la vista prèvia d'URLs d'aquesta sala (no afecta a altres usuaris)", + "Enable URL previews by default for participants in this room": "Activa per defecte la vista prèvia d'URLs per als participants d'aquesta sala", + "Room Colour": "Color de la sala", + "Active call (%(roomName)s)": "Trucada activa (%(roomName)s)", + "unknown caller": "trucada d'un desconegut", + "Incoming voice call from %(name)s": "Trucada de veu entrant de %(name)s", + "Hide avatars in user and room mentions": "Amaga els avatars a les mencions de l'usuari i de la sala", + "Never send encrypted messages to unverified devices from this device": "No enviïs mai des de aquest dispositiu missatges encriptats a dispositius no verificats", + "Incoming video call from %(name)s": "Trucada de vídeo entrant de %(name)s", + "Incoming call from %(name)s": "Trucada entrant de %(name)s", + "Decline": "Declina", + "Accept": "Accepta", + "Incorrect verification code": "El codi de verificació és incorrecte", + "Enter Code": "Introduïu el codi", + "Submit": "Envia", + "Phone": "Telèfon", + "Add phone number": "Afegiu un número de telèfon", + "Add": "Afegeix", + "Failed to upload profile picture!": "No s'ha pogut pujar la imatge!", + "Upload new:": "Puja un nou:", + "No display name": "Sense nom visible", + "New passwords don't match": "Les noves contrasenyes no coincideixen", + "Passwords can't be empty": "Les contrasenyes no poden estar buides", + "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Si canvieu la contrasenya es reiniciaran totes les actuals claus de xifratge d'extrem per a tots els dispositius, fent que l'historial encriptat no sigui llegible, tret que primer exporteu les claus de la vostra sala i les torneu a importar després. En un futur això serà millorat.", + "Export E2E room keys": "Exporta les claus E2E de la sala", + "Do you want to set an email address?": "Voleu establir una adreça de correu electrònic?", + "Current password": "Contrasenya actual", + "Password": "Contrasenya", + "New Password": "Nova contrasenya", + "Confirm password": "Confirma la contrasenya", + "Change Password": "Canvia la contrasenya", + "Your home server does not support device management.": "El seu servidor amfitrió no és compatible amb la gestió de dispositius.", + "Unable to load device list": "No s'ha pogut carregar la llista de dispositius", + "Authentication": "Autenticació", + "Delete %(count)s devices|other": "Suprimeix %(count)s dispositius", + "Delete %(count)s devices|one": "Suprimeix el dispositiu", + "Device ID": "ID del dispositiu", + "Device Name": "Nom del dispositiu", + "Last seen": "Vist per últim cop", + "Select devices": "Selecciona els dispositius", + "Failed to set display name": "No s'ha pogut establir el nom visible", + "Disable Notifications": "Desactiva les notificacions", + "Enable Notifications": "Activa les notificacions", + "Cannot add any more widgets": "No s'ha pogut afegir cap més giny", + "The maximum permitted number of widgets have already been added to this room.": "Ja s'han afegit el màxim de ginys permesos en aquesta sala.", + "Drop File Here": "Deixeu anar un fitxer aquí", + "Drop file here to upload": "Deixeu anar un arxiu aquí per pujar-lo", + " (unsupported)": " (incompatible)", + "Join as voice or video.": "Uneix-te com voice o video.", + "Ongoing conference call%(supportedText)s.": "Trucada de conferència en curs %(supportedText)s.", + "%(senderName)s sent an image": "%(senderName)s ha enviat una imatge", + "%(senderName)s sent a video": "%(senderName)s ha enviat un vídeo", + "%(senderName)s uploaded a file": "%(senderName)s ha pujat un fitxer", + "Options": "Opcions", + "Undecryptable": "Indesxifrable", + "Encrypted by a verified device": "Encriptat per un dispositiu verificat", + "Encrypted by an unverified device": "Encriptat per un dispositiu no verificat", + "Unencrypted message": "Missatge no encriptat", + "Please select the destination room for this message": "Si us plau, seleccioneu la sala destinatària per a aquest missatge", + "Blacklisted": "Llista negre", + "Verified": "Verificat", + "Unverified": "No verificat", + "device id: ": "ID del dispositiu: ", + "Disinvite": "Descarta la invitació", + "Kick": "Fes fora", + "Disinvite this user?": "Descartar la invitació per a aquest usuari?", + "Kick this user?": "Voleu fer fora a aquest usuari?", + "Failed to kick": "No s'ha pogut fer fora", + "Unban": "Retira l'expulsió", + "Ban": "Expulsa", + "Unban this user?": "Voleu retirar l'expulsió de aquest usuari?", + "This room is not public. You will not be able to rejoin without an invite.": "Aquesta sala no és pública. No podreu tronar a entrar sense invitació.", + "Ban this user?": "Voleu expulsar a aquest usuari?", + "Failed to ban user": "No s'ha pogut expulsar l'usuari", + "Failed to mute user": "No s'ha pogut silenciar l'usuari", + "Failed to toggle moderator status": "No s'ha pogut canviar l'estat del moderador", + "Failed to change power level": "No s'ha pogut canviar el nivell de potència", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "No podreu desfer aquest canvi ja que estareu baixant de grau de privilegis. Només un altre usuari amb més privilegis podrà fer que els recupereu.", + "Are you sure?": "Esteu segur?", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "No podreu desfer aquesta acció ja que esteu donant al usuari el mateix nivell de privilegi que el vostre.", + "No devices with registered encryption keys": "No hi ha cap dispositiu amb les claus d'encriptació registrades", + "Devices": "Dispositius", + "Unignore": "Deixa de ignorar", + "Ignore": "Ignora", + "Jump to read receipt": "Vés a l'últim missatge llegit", + "Mention": "Menciona", + "Invite": "Convida", + "User Options": "Opcions d'usuari", + "Direct chats": "Xats directes", + "Unmute": "No silenciïs", + "Revoke Moderator": "Revoca el moderador", + "Make Moderator": "Fes-lo moderador", + "Admin Tools": "Eines d'administració", + "Level:": "Nivell:", + "and %(count)s others...|other": "i %(count)s altres...", + "and %(count)s others...|one": "i un altre...", + "Invited": "Convidat", + "Filter room members": "Filtra membres de sala", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (poder %(powerLevelNumber)s)", + "Attachment": "Adjunt", + "Upload Files": "Puja fitxers", + "Are you sure you want to upload the following files?": "Confirmeu que voleu pujar els següents fitxers?", + "Encrypted room": "Sala encriptada", + "Unencrypted room": "Sala no encriptada", + "Hangup": "Penja", + "Voice call": "Trucada de veu", + "Video call": "Trucada de vídeo", + "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…", + "Send a reply (unencrypted)…": "Envia una resposta (sense encriptar)…", + "Send an encrypted message…": "Envia un missatge encriptat…", + "Send a message (unencrypted)…": "Envia un missatge (sense encriptar)…", + "You do not have permission to post to this room": "No teniu el permís per escriure en aquesta sala", + "Turn Markdown on": "Activa el Markdown", + "Turn Markdown off": "Desactiva el Markdown", + "Hide Text Formatting Toolbar": "Amaga la barra d'eines de format de text", + "Server error": "S'ha produït un error al servidor", + "Mirror local video feed": "Mostra el vídeo local com un mirall", + "Server unavailable, overloaded, or something else went wrong.": "El servidor no està disponible, està sobrecarregat o alguna altra cosa no ha funcionat correctament.", + "Command error": "S'ha produït un error en l'ordre", + "bold": "negreta", + "italic": "cursiva", + "strike": "tatxat", + "underline": "subratllat", + "code": "codi", + "quote": "cita", + "bullet": "pic", + "numbullet": "pic numerat", + "Markdown is disabled": "El Markdown està desactivat", + "Markdown is enabled": "El Markdown està activat", + "Jump to message": "Salta al missatge", + "No pinned messages.": "No hi ha cap missatge fixat.", + "Loading...": "S'està carregant...", + "Pinned Messages": "Missatges fixats", + "%(duration)ss": "%(duration)ss", + "%(duration)sm": "%(duration)sm", + "%(duration)sh": "%(duration)sh", + "%(duration)sd": "%(duration)sd", + "Online for %(duration)s": "En línia durant %(duration)s", + "Idle for %(duration)s": "Inactiu durant %(duration)s", + "Offline for %(duration)s": "Desconnectat durant %(duration)s", + "Unknown for %(duration)s": "Desconegut durant %(duration)s", + "Online": "Conectat", + "Idle": "Inactiu", + "Offline": "Desconnectat", + "Unknown": "Desconegut", + "Replying": "S'està contestant", + "Seen by %(userName)s at %(dateTime)s": "Vist per %(userName)s el %(dateTime)s", + "No rooms to show": "No hi ha cap sala per a mostrar", + "Unnamed room": "Sala sense nom", + "Failed to set avatar.": "No s'ha pogut establir l'avatar.", + "Save": "Desa", + "(~%(count)s results)|other": "(~%(count)s resultats)", + "(~%(count)s results)|one": "(~%(count)s resultat)", + "Join Room": "Entra a la sala", + "Upload avatar": "Puja l'avatar", + "Remove avatar": "Elimina l'avatar", + "Forget room": "Oblida la sala", + "Show panel": "Mostra el plafó", + "Drop here to favourite": "Deixa-ho anar aquí per a marcar-ho com a favorit", + "Drop here to tag direct chat": "Deixa'l anar aquí per posar-li la etiqueta de xat directe", + "Drop here to restore": "Deixa'l anar aquí per a restaurar-lo", + "Drop here to demote": "Deixa'l anar aquí per a baixar-lo de grau", + "Drop here to tag %(section)s": "Deixa´l anar aquí per posar-li la etiqueta de %(section)s", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Encara no ha entrat a cap sala. Premeu per crear una sala o bé per fullejar el directori", + "Community Invites": "Invitacions de les comunitats", + "Invites": "Invitacions", + "Favourites": "Preferits", + "Low priority": "Baixa prioritat", + "Historical": "Històric", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "No s'ha pogut determinar que s'hagi enviat la invitació des de una adreça associada al vostre compte.", + "This invitation was sent to an email address which is not associated with this account:": "Aquesta invitació s'ha enviat a una adreça de correu electrònic que no està associada a aquest compte:", + "Press to start a chat with someone": "Prem per a començar un xat amb algú", + "You may wish to login with a different account, or add this email to this account.": "És possible que vulgueu iniciar la sessió amb un altre compte o bé afegir aquest correu electrònic a aquest compte.", + "You have been invited to join this room by %(inviterName)s": "Heu sigut convidat a aquesta sala per %(inviterName)s", + "Would you like to accept or decline this invitation?": "Voleu accept o bé declineText>decline aquesta invitació?", + "Reason: %(reasonText)s": "Raó: %(reasonText)s", + "Rejoin": "Trona a entrar", + "You have been kicked from %(roomName)s by %(userName)s.": "%(userName)s us ha fet fora de la sala %(roomName)s.", + "You have been kicked from this room by %(userName)s.": "%(userName)s vos ha fet fora de la sala.", + "You have been banned from %(roomName)s by %(userName)s.": "%(userName)s vos ha expulsat de la sala %(roomName)s.", + "You have been banned from this room by %(userName)s.": "Heu sigut expulsat d'aquesta sala per %(userName)s.", + "This room": "Aquesta sala", + "%(roomName)s does not exist.": "La sala %(roomName)s no existeix.", + "%(roomName)s is not accessible at this time.": "La sala %(roomName)s no és accessible en aquest moment.", + "You are trying to access %(roomName)s.": "Esteu intentant accedir a la sala %(roomName)s.", + "You are trying to access a room.": "Esteu intentant accedir a una sala.", + "Click here to join the discussion!": "Click here per a entrar al debat!", + "This is a preview of this room. Room interactions have been disabled": "Aquesta és una vista prèvia de la sala. No s'hi pot interactuar des de aquí", + "To change the room's avatar, you must be a": "Per canviar l'avatar de la sala, heu de ser", + "To change the room's name, you must be a": "Per canviar el nom de la sala, heu de ser", + "To change the room's main address, you must be a": "Per canviar l'adreça principal de la sala, heu de ser", + "To change the room's history visibility, you must be a": "Per canviar la visibilitat de l'historial de la sala, heu de ser", + "To change the permissions in the room, you must be a": "Per canviar els permisos a la sala, heu de ser", + "To change the topic, you must be a": "Per canviar el tema, heu de ser", + "To modify widgets in the room, you must be a": "Per modificar els ginys de la sala, has de ser", + "Failed to unban": "No s'ha pogut expulsar", + "Banned by %(displayName)s": "Expulsat per %(displayName)s", + "Privacy warning": "Avís de privadesa", + "Changes to who can read history will only apply to future messages in this room": "Els canvis de qui pot llegir l'historial només s'aplicaran als missatges futurs d'aquesta sala", + "The visibility of existing history will be unchanged": "La visibilitat de l'historial existent no es modificarà", + "End-to-end encryption is in beta and may not be reliable": "L'encriptació d'extrem a extrem està en fase beta i pot ser que no sigui fiable", + "You should not yet trust it to secure data": "Encara no hi heu de confiar per a comunicacions segures", + "Devices will not yet be able to decrypt history from before they joined the room": "Els dispositius encara no podran desencriptar l'historial d'abans d'entrar a la sala", + "Once encryption is enabled for a room it cannot be turned off again (for now)": "Quan s'activa la encriptació en una sala, no es pot desactivar posteriorment (per ara)", + "Encrypted messages will not be visible on clients that do not yet implement encryption": "Els missatges encriptats no es podran veure en els clients que encara no tenguin implementada la encriptació", + "Enable encryption": "L'encriptació està activada", + "(warning: cannot be disabled again!)": "(avís: no es pot desactivar de nou!)", + "Encryption is enabled in this room": "L'encriptació està activada en aquesta sala", + "Encryption is not enabled in this room": "L'encriptació no està activada en aquesta sala", + "Privileged Users": "Usuaris amb privilegis", + "No users have specific privileges in this room": "Cap usuari té privilegis específics en aquesta sala", + "Banned users": "Usuaris expulsats", + "This room is not accessible by remote Matrix servers": "Aquesta sala no és accessible per a servidors de Matrix remots", + "Leave room": "Surt de la sala", + "Tagged as: ": "Etiquetats com: ", + "To link to a room it must have an address.": "Per poder fer un enllaç a una sala aquesta ha de tenir an address.", + "Guests cannot join this room even if explicitly invited.": "Els usuaris d'altres xarxes no poden entrar a la sala d'aquest esdeveniment encara que hi hagin sigut convidats de forma explícita.", + "Click here to fix": "Feu clic aquí per corregir-ho", + "Who can access this room?": "Qui pot entrar a aquesta sala?", + "Only people who have been invited": "Només les persones que hi hagin sigut convidades", + "Anyone who knows the room's link, apart from guests": "Qualsevol que conegui l'enllaç de la sala, excepte usuaris d'altres xarxes", + "Publish this room to the public in %(domain)s's room directory?": "Voleu que es publiqui aquesta sala al directori de sales públiques de %(domain)s?", + "Who can read history?": "Qui pot llegir l'historial?", + "Anyone": "Qualsevol", + "Members only (since the point in time of selecting this option)": "Només els membres (a partir del punt en què seleccioneu aquesta opció)", + "Members only (since they were invited)": "Només els membres (a partir del punt en què hi són convidats)", + "Members only (since they joined)": "Només els membres (a partir del punt en què entrin a la sala)", + "Permissions": "Permisos", + "The default role for new room members is": "El rol per defecte dels nous membres de la sala és", + "To send messages, you must be a": "Per poder enviar missatges, heu de ser", + "To invite users into the room, you must be a": "Per poder convidar a usuaris a aquesta sala, heu de ser", + "To configure the room, you must be a": "Per poder configurar aquesta sala, heu de ser", + "To kick users, you must be a": "Per poder fer fora a usuaris, heu de ser", + "To ban users, you must be a": "Per expulsar a usuaris, heu de ser", + "To remove other users' messages, you must be a": "Per eliminar missatges d'altres usuaris, heu de ser", + "To send events of type , you must be a": "Per poder enviar esdeveniments de tipus , heu de ser", + "This room's internal ID is": "L'ID d'aquesta sala és", + "Add a topic": "Afegeix un tema", + "Scroll to unread messages": "Desplaça't fins els missatges no llegits", + "Jump to first unread message.": "Salta al primer missatge no llegit.", + "Invalid alias format": "El format de l'àlies no és vàlid", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' no és un format d'àlies vàlid", + "Invalid address format": "L'adreça no té un format vàlid", + "Anyone who knows the room's link, including guests": "Qualsevol que conegui l'enllaç de la sala, inclosos els usuaris d'altres xarxes", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' no és un format vàlid per a una adreça", + "not specified": "sense especificar", + "not set": "sense definir", + "Remote addresses for this room:": "Adreces remotes per a aquesta sala:", + "Addresses": "Adreces", + "The main address for this room is": "L'adreça principal d'aquesta sala és", + "Local addresses for this room:": "Adreces locals d'aquesta sala:", + "This room has no local addresses": "Aquesta sala no té adreces locals", + "New address (e.g. #foo:%(localDomain)s)": "Nova adreça (per exemple #foo:%(localDomain)s)", + "Invalid community ID": "L'ID de la comunitat no és vàlid", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' no és un ID de comunitat vàlid", + "New community ID (e.g. +foo:%(localDomain)s)": "Nou ID de comunitat (per exemple +foo:%(localDomain)s)", + "You have enabled URL previews by default.": "Heu enabled les previsualitzacions per defecte de les URL.", + "You have disabled URL previews by default.": "Heu disabled les previsualitzacions per defecte de les URL.", + "URL previews are enabled by default for participants in this room.": "Les previsualitzacions de les URL estan activades per defecte per als membres d'aquesta sala.", + "URL previews are disabled by default for participants in this room.": "Les previsualitzacions de les URL estan per defecte desactivades per als membres d'aquesta sala.", + "URL Previews": "Previsualitzacions de les URL", + "Error decrypting audio": "S'ha produït un error mentre es desencriptava l'audio", + "Error decrypting attachment": "S'ha produït un error en desencriptar el fitxer adjunt", + "Decrypt %(text)s": "Desencripta %(text)s", + "Download %(text)s": "Baixa %(text)s", + "Invalid file%(extra)s": "Fitxer invàlid%(extra)s", + "Error decrypting image": "S'ha produït un error en desencriptar la imatge", + "Error decrypting video": "S'ha produït un error en desencriptar el vídeo", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ha canviat el seu avatar per a la sala %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s ha eliminat l'avatar de la sala.", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s ha canviat l'avatar de la sala per aquest ", + "Copied!": "Copiat!", + "Failed to copy": "No s'ha pogut copiar", + "Add an Integration": "Afegeix una integració", + "Removed or unknown message type": "El tipus de missatge ha sigut eliminat o és desconegut", + "Message removed by %(userId)s": "El missatge ha sigut eliminat per l'usuari %(userId)s", + "Message removed": "S'ha eliminat el missatge", + "Robot check is currently unavailable on desktop - please use a web browser": "Actualment, la verificació del robot no està disponible a l'escriptori: utilitzeu un web browser", + "Sign in with CAS": "Inicieu sessió amb CAS", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Podeu utilitzar les opcions de servidor personalitzades per a iniciar sessió en altres servidors Matrix, especificant una altre URL de servidor principal.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Això us permet utilitzar aquesta aplicació amb un compte de Matrix existent en un altre servidor.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "També podeu establir un servidor d'identitat personalitzat, però normalment això evitarà la interacció basada en l'adreça de correu electrònic amb altres usuaris.", + "To continue, please enter your password.": "Per poder continuar, si us plau, introduïu una contrasenya.", + "Password:": "Contrasenya:", + "An email has been sent to %(emailAddress)s": "S'ha enviat un correu electrònic a %(emailAddress)s", + "Please check your email to continue registration.": "Reviseu el vostre correu electrònic per a poder continuar amb el registre.", + "Token incorrect": "El testimoni és incorrecte", + "A text message has been sent to %(msisdn)s": "S'ha enviat un missatge de text a %(msisdn)s", + "Please enter the code it contains:": "Introduïu el codi que conté:", + "Start authentication": "Inicia l'autenticació", + "Username on %(hs)s": "Nom d'usuari a %(hs)s", + "User name": "Nom d'usuari", + "Mobile phone number": "Número de telèfon mòbil", + "Forgot your password?": "Heu oblidat la vostra contrasenya?", + "%(serverName)s Matrix ID": "ID de Matrix de %(serverName)s", + "Sign in with": "Inicieu sessió amb", + "Email address": "Correu electrònic", + "Sign in": "Inicia sessió", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Si no especifiqueu una adreça de correu electrònic, no podreu restablir la vostra contrasenya. N'esteu segur?", + "Email address (optional)": "Correu electrònic (opcional)", + "You are registering with %(SelectedTeamName)s": "Esteu registrant-vos amb %(SelectedTeamName)s", + "Mobile phone number (optional)": "Número de telèfon mòbil (opcional)", + "Default server": "Servidor per defecte", + "Custom server": "Servidor personalitzat", + "Identity server URL": "URL del servidor d'identitat", + "What does this mean?": "Què vol dir això?", + "Remove from community": "Elimina de la comunitat", + "Disinvite this user from community?": "Voleu retirar la invitació de aquest usuari a la comunitat?", + "Remove this user from community?": "Voleu eliminar de la comunitat a aquest usuari?", + "Failed to withdraw invitation": "No s'ha pogut retirar la invitació", + "Failed to remove user from community": "No s'ha pogut treure l'usuari de la comunitat", + "Filter community members": "Filtra membres de comunitat", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Esteu segur que voleu treure l'usuari '%(roomName)s' del grup %(groupId)s?", + "Home server URL": "URL del servidor d'origen", + "In reply to ": "In reply to ", + "Removing a room from the community will also remove it from the community page.": "L'eliminació d'una sala de la comunitat també l'eliminarà de la pàgina de la comunitat.", + "Failed to remove room from community": "No s'ha pogut eliminar la sala de la comunitat", + "Failed to remove '%(roomName)s' from %(groupId)s": "No s'ha pogut treure la sala '%(roomName)s' de la comunitat %(groupId)s", + "Something went wrong!": "Alguna cosa ha anat malament!", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "No s'ha pogut actualitzar la visibilitat de la sala '%(roomName)s' de la comunitat %(groupId)s.", + "Visibility in Room List": "Visibilitat a la llista de les sales", + "Visible to everyone": "Visible per a tothom", + "Only visible to community members": "Només visible per als membres de la comunitat", + "Filter community rooms": "Filtra sales de comunitats", + "Something went wrong when trying to get your communities.": "S'ha produït un error en intentar obtenir les vostres comunitats.", + "You're not currently a member of any communities.": "Actualment no sou membre de cap comunitat.", + "Unknown Address": "Adreça desconeguda", + "NOTE: Apps are not end-to-end encrypted": "NOTA: Les aplicacions no estan encriptades d'extrem a extrem", + "Do you want to load widget from URL:": "Carregar ginys des de l'URL:", + "Allow": "Permetre", + "Delete Widget": "Suprimeix el giny", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "La supressió d'un giny l'elimina per a tots els usuaris d'aquesta sala. Esteu segur que voleu eliminar aquest giny?", + "Delete widget": "Suprimeix el giny", + "Revoke widget access": "Revoca l'accés del giny", + "Minimize apps": "Minimitza les aplicacions", + "Blacklist": "Llista negre", + "Unverify": "Sense verificar", + "Verify...": "Verificar...", + "No results": "Sense resultats", + "Delete": "Esborra", + "Communities": "Comunitats", + "Home": "Inici", + "Integrations Error": "S'ha produït un error d'integració", + "Could not connect to the integration server": "No s'ha pogut connectar amb el servidor de l'integració", + "Manage Integrations": "Gestiona les integracions", + "%(nameList)s %(transitionList)s": "%(transitionList)s%(nameList)s", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s han entrat", + "Guest access is disabled on this Home Server.": "L'accés a usuaris d'altres xarxes no està permès en aquest servidor.", + "Login as guest": "Inicia sessió com a convidat", + "Unblacklist": "Treure de la llista negre", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s s'ha unit", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s han sortit", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s ha sortit", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s s'han unit i han sortit %(count)s vegades", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s s'han unit i han sortit", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s ha entrat i ha sortit %(count)s vegades", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s ha entrat i ha sortit", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s han sortit i han tornat a entrar %(count)s vegades", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s han sortit i han tornat a entrar", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s ha sortit i ha tornat a entrar %(count)s vegades", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s ha sortit i ha tornat a entrar", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s han rebutjat les seves invitacions %(count)s vegades", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s han rebutjat les seves invitacions", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s ha rebutjat la seva invitació %(count)s vegades", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s ha rebutjat la seva invitació", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "a %(severalUsers)s els hi han retirat les seves invitacions %(count)s vegades", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "a %(severalUsers)s els hi han retirat les seves invitacions", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "a %(oneUser)s li han retirat la seva invitació %(count)s vegades", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "a %(oneUser)s li han retirat la seva invitació", + "were invited %(count)s times|other": "a sigut invitat %(count)s vegades", + "were invited %(count)s times|one": "han sigut convidats", + "was invited %(count)s times|other": "ha sigut convidat %(count)s vegades", + "was invited %(count)s times|one": "ha sigut convidat", + "were banned %(count)s times|other": "han sigut expulsats %(count)s vegades", + "were banned %(count)s times|one": "ha sigut expulsat", + "was banned %(count)s times|other": "ha sigut expulsat %(count)s vegades", + "was banned %(count)s times|one": "ha sigut expulsat", + "were unbanned %(count)s times|other": "han sigut readmesos %(count)s vegades", + "were unbanned %(count)s times|one": "han sigut readmesos", + "was unbanned %(count)s times|other": "ha sigut readmès %(count)s vegades", + "was unbanned %(count)s times|one": "ha sigut readmès", + "were kicked %(count)s times|other": "els han fet fora %(count)s vegades", + "were kicked %(count)s times|one": "els han fet fora", + "was kicked %(count)s times|other": "l'han fet fora %(count)s vegades", + "was kicked %(count)s times|one": "l'han fet fora", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s han canviat el seu nom %(count)s vegades", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s han canviat el seu nom", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s han canviat el seu nom %(count)s vegades", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s ha canviat el seu nom", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s han canviat el seu avatar %(count)s vegades", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s han canviat el seu avatar", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s han canviat el seu avatar %(count)s vegades", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s ha canviat el seu avatar", + "%(items)s and %(count)s others|other": "%(items)s i %(count)s altres", + "%(items)s and %(count)s others|one": "%(items)s i un altre", + "%(items)s and %(lastItem)s": "%(items)s i %(lastItem)s", + "collapse": "col·lapsa", + "expand": "expandeix", + "Custom of %(powerLevel)s": "Personalitzat de %(powerLevel)s", + "Custom level": "Nivell personalitzat", + "And %(count)s more...|other": "I %(count)s més...", + "ex. @bob:example.com": "per exemple @carles:exemple.cat", + "Add User": "Afegeix un usuari", + "Matrix ID": "ID de Matrix", + "Matrix Room ID": "ID de sala de Matrix", + "email address": "correu electrònic", + "Try using one of the following valid address types: %(validTypesList)s.": "Proveu d'utilitzar un dels següents tipus d'adreça vàlids: %(validTypesList)s.", + "You have entered an invalid address.": "No heu introduït una adreça vàlida.", + "Create a new chat or reuse an existing one": "Creeu un xat nou o feu-ne servit un d'existent", + "Start new chat": "Inicia un nou xat", + "You already have existing direct chats with this user:": "Ja teniu xats directes amb aquest usuari:", + "Start chatting": "Comença a xerrar", + "Click on the button below to start chatting!": "Feu clic al botó de sota per començar a xerrar!", + "Start Chatting": "Comenceu a xatejar", + "Confirm Removal": "Confirmeu l'eliminació", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Esteu segur que voleu eliminar (suprimir) aquest esdeveniment? Tingueu en compte que si suprimiu un nom sala o si feu un canvi de tema, desfaria el canvi.", + "This room is not showing flair for any communities": "Aquesta sala no mostra talent per a cap comunitat", + "Flair": "Talents", + "Showing flair for these communities:": "Mostra els talents d'aquestes comunitats:", + "Flair will appear if enabled in room settings": "Els talents es mostraran si són activats a la configuració de la sala", + "Flair will not appear": "Els talents no es mostraran", + "Display your community flair in rooms configured to show it.": "Mostra els talents de la vostra comunitat dins les sales configurades per a mostrar-los.", + "This Home Server would like to make sure you are not a robot": "Aquest servidor amfitrió es vol assegurar que no sou un robot", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s han entrat %(count)s vegades", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s ha entrat %(count)s vegades", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s han sortit %(count)s vegades", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s ha sortit %(count)s vegades", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Les ID de les comunitats només poden contendre caràcters a-z, 0-9, o '=_-./'", + "Community IDs cannot not be empty.": "Les ID de les comunitats no poden estar buides.", + "Something went wrong whilst creating your community": "S'ha produït un error al crear la vostra comunitat", + "Create Community": "Crea una comunitat", + "Community Name": "Nom de la comunitat", + "Example": "Exemple", + "Community ID": "ID de la comunitat", + "example": "exemple", + "Create": "Crea", + "Create Room": "Crea una sala", + "Room name (optional)": "Nom de la sala (opcional)", + "Advanced options": "Opcions avançades", + "This setting cannot be changed later!": "Aquests paràmetres no es poden canviar després!", + "Unknown error": "S'ha produït un error desconegut", + "Incorrect password": "Contrasenya incorrecta", + "Deactivate Account": "Desactivar el compte", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Per verificar que es pot confiar en aquest dispositiu, poseu-vos en contacte amb el propietari mitjançant altres mitjans (per exemple, en persona o amb una trucada telefònica) i pregunteu-li si la clau que veuen a la configuració del seu usuari, aquest dispositiu coincideix amb la següent clau:", + "Device name": "Nom del dispositiu", + "Device key": "Clau del dispositiu", + "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.": "Si coincideix, premeu el botó de verificació de sota. Si no coincideix, algú més està interceptant aquest dispositiu i probablement voleu prémer el botó de llista negra.", + "In future this verification process will be more sophisticated.": "En un futur, aquest procés de verificació serà més sofisticat.", + "Verify device": "Verifica el dispositiu", + "I verify that the keys match": "Verifico que les claus coincideixen", + "An error has occurred.": "S'ha produït un error.", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Heu afegit el nou dispositiu '%(displayName)s', que està demanant les claus d'encriptació.", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "El dispositiu no verificat '%(displayName)s' està demanat les claus d'encriptació.", + "Start verification": "Inicia la verificació", + "Share without verifying": "Comparteix sense verificar", + "Ignore request": "Ignora la sol·licitud", + "Loading device info...": "S'està carregant la informació del dispositiu...", + "Encryption key request": "Sol·licitud de claus", + "Unable to restore session": "No s'ha pogut restaurar la sessió", + "Invalid Email Address": "El correu electrònic no és vàlid", + "This doesn't appear to be a valid email address": "Aquest no sembla ser un correu electrònic vàlid", + "Verification Pending": "Verificació pendent", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Reviseu el vostre correu electrònic i feu clic a l'enllaç que conté. Un cop fet això, feu clic a Continua.", + "Unable to add email address": "No s'ha pogut afegir el correu electrònic", + "Unable to verify email address.": "No s'ha pogut verificar el correu electrònic.", + "This will allow you to reset your password and receive notifications.": "Això us permetrà restablir la vostra contrasenya i rebre notificacions.", + "Skip": "Omet", + "User names may only contain letters, numbers, dots, hyphens and underscores.": "Els noms d'usuari només poden contenir lletres, números, punts, guionets i guionets baixos.", + "Username not available": "Aquest nom d'usuari no està disponible", + "Username invalid: %(errMessage)s": "El nom d'usuari és invàlid: %(errMessage)s", + "An error occurred: %(error_string)s": "S'ha produït un error: %(error_string)s", + "Username available": "Aquest nom d'usuari està disponible", + "To get started, please pick a username!": "Per començar, seleccioneu un nom d'usuari!", + "This will be your account name on the homeserver, or you can pick a different server.": "Aquest serà el nom del seu compte al servidor amfitrió, o bé trieu-ne un altre different server.", + "If you already have a Matrix account you can log in instead.": "Si ja teniu un compte a Matrix, podeu log in.", + "Block users on other matrix homeservers from joining this room": "Impedeix als usuaris d'altres servidors de Matrix d'entrar a aquesta sala", + "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.": "Si anteriorment heu utilitzat un versió de Riot més recent, la vostra sessió podría ser incompatible amb aquesta versió. Tanqueu aquesta finestra i torneu a la versió més recent.", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Actualment teniu a la llista negre els dispositius no verificats; per enviar missatges a aquests dispositius, els heu de verificar abans.", + "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.": "Recomanem que dugueu a terme el procès de verificació per a cada dispositiu per tal de confirmar que són del legítim propietari, però podeu enviar el missatge sense verificar-ho si ho preferiu.", + "Room contains unknown devices": "Hi ha dispositius desconeguts a la sala", + "\"%(RoomName)s\" contains devices that you haven't seen before.": "A la sala \"%(RoomName)s\" hi ha dispositius que no havíeu vist abans.", + "Unknown devices": "Dispositius desconeguts", + "Private Chat": "Xat privat", + "Public Chat": "Xat públic", + "Custom": "Personalitzat", + "Name": "Nom", + "Topic": "Tema", + "Make this room private": "Fes que aquesta sala sigui privada", + "Share message history with new users": "Comparteix l'historial dels missatges amb els nous usuaris", + "Encrypt room": "Sala encriptada", + "You must register to use this functionality": "Heu de register per utilitzar aquesta funcionalitat", + "You must join the room to see its files": "Heu d'entrar a la sala per poder-ne veure els fitxers", + "There are no visible files in this room": "No hi ha fitxers visibles en aquesta sala", + "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    Aquest és l'HTML per a la pàgina de la vostra comunitat

    \n

    \n Utilitzeu la descripció llarga per a presentar la comunitat a nous membres,\n o per afegir-hi enlaços d'interès. \n

    \n

    \n També podeu utilitzar etiquetes 'img'.\n

    \n", + "Add rooms to the community summary": "Afegiu sales al resum de la comunitat", + "Which rooms would you like to add to this summary?": "Quines sales voleu afegir a aquest resum?", + "Add to summary": "Afegeix-ho al resum", + "Failed to add the following rooms to the summary of %(groupId)s:": "No s'ha pogut afegir al resum de la comunitat %(groupId)s les següents sales:", + "Add a Room": "Afegeix una sala", + "Failed to remove the room from the summary of %(groupId)s": "No s'ha pogut eliminar la sala del resum de la comunitat %(groupId)s", + "The room '%(roomName)s' could not be removed from the summary.": "La sala '%(roomName)s' no s'ha pogut eliminar del resum.", + "Add users to the community summary": "Afegeix usuaris al resum de la comunitat", + "Who would you like to add to this summary?": "A qui vol afegir a aquest resum?", + "Failed to add the following users to the summary of %(groupId)s:": "No s'ha pogut afegir al resum de la comunitat %(groupId)s, els següents usuaris:", + "Add a User": "Afegeix un usuari", + "Failed to remove a user from the summary of %(groupId)s": "No s'ha pogut eliminar l'usuari del resum de la comunitat %(groupId)s", + "The user '%(displayName)s' could not be removed from the summary.": "L'usuari '%(displayName)s' no s'ha pogut eliminar del resum.", + "Failed to upload image": "No s'ha pogut pujar la imatge", + "Failed to update community": "No s'ha pogut actualitzar la comunitat", + "Unable to accept invite": "No s'ha pogut acceptar la invitació", + "Unable to reject invite": "No s'ha pogut rebutjar la invitació", + "Leave Community": "Abandona la comunitat", + "Leave %(groupName)s?": "Voleu sortir de la comunitat %(groupName)s?", + "Leave": "Surt", + "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:", + "Featured Users:": "Usuaris destacats:", + "%(inviter)s has invited you to join this community": "%(inviter)s vos convida a unir-vos a aquesta comunitat", + "You are an administrator of this community": "Sou un administrador d'aquesta comunitat", + "You are a member of this community": "Sou un membre d'aquesta comunitat", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Esteu a punt de ser portat a un lloc de tercers perquè pugui autenticar-se amb el vostre compte per utilitzar-lo amb %(integrationsUrl)s. Voleu continuar?", + "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "La vostra comunitat no té una descripció llarga, una pàgina HTML per mostrar als membres de la comunitat.
    Feu clic aquí per obrir la configuració i donar-ne una!", + "Long Description (HTML)": "Descripció llarga (HTML)", + "Description": "Descripció", + "Community %(groupId)s not found": "No s'ha pogut trobar la comunitat %(groupId)s", + "This Home server does not support communities": "Aquest servidor amfitrió no admet comunitats", + "Failed to load %(groupId)s": "No s'ha pogut carregar la comunitat %(groupId)s", + "Reject invitation": "Rebutja la invitació", + "Are you sure you want to reject the invitation?": "Esteu segur que voleu rebutjar la invitació?", + "Failed to reject invitation": "No s'ha pogut rebutjar la invitació", + "Are you sure you want to leave the room '%(roomName)s'?": "Esteu segur que voleu sortir de la sala '%(roomName)s'?", + "Failed to leave room": "No s'ha pogut sortir de la sala", + "For security, this session has been signed out. Please sign in again.": "Per seguretat, aquesta sessió s'ha tancat. Torna a iniciar la sessió.", + "Old cryptography data detected": "S'han detectat dades de criptografia antigues", + "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.": "S'han detectat dades d'una versió antiga de Riot. Això pot provocar que l'encriptació d'extrem a extrem no funcioni correctament a la versió anterior. Els missatges encriptats d'extrem a extrem que s'han intercanviat recentment mentre s'utilitzava la versió anterior no es poden desencriptar en aquesta versió. També pot provocar que els missatges intercanviats amb aquesta versió fallin. Si teniu problemes, tanqueu-lo i torneu-ho a engegar. Per poder llegir l'historial dels missatges encriptats, exporteu i torneu a importar les vostres claus.", + "Logout": "Surt", + "Your Communities": "Les teves comunitats", + "Error whilst fetching joined communities": "S'ha produït un error en buscar comunitats unides", + "Create a new community": "Crea una nova comunitat", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crea una comunitat per agrupar usuaris i sales! Creeu una pàgina d'inici personalitzada per definir el vostre espai a l'univers Matrix.", + "Join an existing community": "Uneix-te a una comunitat existent", + "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Per unir-se a una comunitat existent, haureu de conèixer l'identificador de la comunitat; això es veurà com +exemple:matrix.org.", + "You have no visible notifications": "No teniu cap notificació visible", + "Scroll to bottom of page": "Desplaça't fins a la part inferior de la pàgina", + "Message not sent due to unknown devices being present": "El missatge no s'ha enviat perquè hi ha dispositius desconeguts presents", + "%(count)s of your messages have not been sent.|other": "Alguns dels vostres missatges no s'han enviat.", + "%(count)s of your messages have not been sent.|one": "El vostre missatge no s'ha enviat.", + "Warning": "Avís", + "Connectivity to the server has been lost.": "S'ha perdut la connectivitat amb el servidor.", + "Sent messages will be stored until your connection has returned.": "Els missatges enviats s'emmagatzemaran fins que la vostra connexió hagi tornat.", + "%(count)s new messages|other": "%(count)s nous missatges", + "%(count)s new messages|one": "%(count)s nou missatge", + "Active call": "Trucada activa", + "You seem to be uploading files, are you sure you want to quit?": "Sembla que s'està pujant fitxers, esteu segur que voleu sortir?", + "You seem to be in a call, are you sure you want to quit?": "Sembla que està en una trucada, estàs segur que vols sortir?", + "Failed to upload file": "No s'ha pogut pujar el fitxer", + "Server may be unavailable, overloaded, or the file too big": "El servidor pot estar no disponible, sobrecarregat o el fitxer és massa gran", + "Search failed": "No s'ha pogut cercar", + "Server may be unavailable, overloaded, or search timed out :(": "Pot ser que el servidor no estigui disponible, que estigui sobrecarregat o que s'ha esgotat el temps de cerca :(", + "No more results": "No hi ha més resultats", + "Unknown room %(roomId)s": "La sala %(roomId)s és desconeguda", + "Room": "Sala", + "Failed to save settings": "No s'ha pogut desar la configuració", + "Failed to reject invite": "No s'ha pogut rebutjar la invitació", + "Fill screen": "Emplena la pantalla", + "Click to unmute video": "Feu clic per activar el so de vídeo", + "Click to mute video": "Feu clic per desactivar el so de vídeo", + "Click to unmute audio": "Feu clic per activar el so", + "Click to mute audio": "Feu clic per desactivar el so", + "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "S'ha intentat carregar un punt específic dins la línia de temps d'aquesta sala, però no teniu permís per veure el missatge en qüestió.", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "S'ha intentat carregar un punt específic de la línia de temps d'aquesta sala, però no s'ha pogut trobar.", + "Failed to load timeline position": "No s'ha pogut carregar aquesta posició de la línia de temps", + "Show devices, send anyway or cancel.": "Mostra els dispositius, envia de totes maneres o cancel·la.", + "Signed Out": "Sessió tancada", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Reenviar tot o cancel·lar tot ara. També pots seleccionar missatges individualment per reenviar o cancel·lar.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Reenviar missarge o cancel·lar missatge ara.", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "No hi ha ningú més aquí! T'agradaria convidar algú o no avisar més que la sala està buida?", + "Uploading %(filename)s and %(count)s others|other": "Pujant %(filename)s i %(count)s més", + "Uploading %(filename)s and %(count)s others|zero": "Pujant %(filename)s", + "Light theme": "Tema clar", + "Dark theme": "Tema fosc", + "Status.im theme": "Tema d'Status.im", + "Sign out": "Tancar sessió", + "Remove %(threePid)s?": "Esborrar %(threePid)s?", + "Interface Language": "Idioma de l'interfície", + "User Interface": "Interfície d'usuari", + "Import E2E room keys": "Importar claus E2E de la sala", + "Cryptography": "Criptografia", + "Device ID:": "ID del dispositiu:", + "Device key:": "Clau del dispositiu:", + "Ignored Users": "Usuaris ignorats", + "Labs": "Laboraroris", + "Use with caution": "Utilitzar amb precaució", + "Deactivate my account": "Desactivar la meva compte", + "Updates": "Actualitzacions", + "matrix-react-sdk version:": "Versió de matrix-react-sdk:", + "riot-web version:": "Versió de riot-web:", + "olm version:": "Versió d'olm:", + "Your password has been reset": "La teva contrasenya s'ha reiniciat", + "New password": "Nova contrasenya", + "Confirm your new password": "Confirma la teva nova contrasenya", + "Incorrect username and/or password.": "Usuari i/o contrasenya incorrectes.", + "The phone number entered looks invalid": "El número de telèfon introduït sembla erroni", + "none": "cap", + "Curve25519 identity key": "Clau de la identitat Curve25519", + "Claimed Ed25519 fingerprint key": "Empremta digital Ed25519 reclamada", + "Session ID": "ID de la sessió", + "End-to-end encryption information": "Informació de l'encriptació d'extrem a extrem", + "Event information": "Informació d'esdeveniment", + "User ID": "ID de l'usuari", + "Decryption error": "Error de desencriptació", + "Sender device information": "Informació del dispositiu remitent", + "Export room keys": "Exporta les claus de la sala", + "Upload an avatar:": "Pujar un avatar:", + "Confirm passphrase": "Introduïu una contrasenya", + "Export": "Exporta", + "Import room keys": "Importa les claus de la sala", + "Import": "Importa", + "The version of Riot.im": "La versió de Riot.im", + "Email": "Correu electrònic", + "Add email address": "Afegeix correu electrònic", + "I have verified my email address": "He verificat l'adreça de correu electrònic", + "Send Reset Email": "Envia email de reinici", + "Your homeserver's URL": "URL del teu homeserver", + "Your identity server's URL": "URL del teu servidor d'identitat", + "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", + "Display name": "Nom visible", + "Identity Server is": "El servidor d'identitat es", + "Submit debug logs": "Enviar logs de depuració", + "The platform you're on": "La plataforma a la que estàs", + "Whether or not you're logged in (we don't record your user name)": "Si estàs identificat o no (no desem el teu nom d'usuari)", + "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:", + "Fetching third party location failed": "S'ha produït un error en obtenir la ubicació de tercers", + "A new version of Riot is available.": "Hi ha una nova versió del Riot disponible.", + "Couldn't load home page": "No s'ha pogut carregar la pàgina d'inici", + "Send Account Data": "Envia les dades del compte", + "Advanced notification settings": "Paràmetres avançats de notificacions", + "Uploading report": "S'està enviant l'informe", + "Sunday": "Diumenge", + "Failed to add tag %(tagName)s to room": "No s'ha pogut afegir l'etiqueta %(tagName)s a la sala", + "Notification targets": "Objectius de les notificacions", + "Failed to set direct chat tag": "No s'ha pogut establir l'etiqueta del xat directe", + "Today": "Avui", + "Files": "Fitxers", + "You are not receiving desktop notifications": "No esteu rebent notificacions d'escriptori", + "Friday": "Divendres", + "Update": "Actualització", + "What's New": "Novetats", + "Add an email address above to configure email notifications": "Afegiu més amunt un correu electrònic per a configurar les notificacions", + "Expand panel": "Expandeix el panel", + "On": "Engegat", + "%(count)s Members|other": "%(count)s membres", + "Filter room names": "Filtra els noms de les sales", + "Changelog": "Registre de canvis", + "Waiting for response from server": "S'està esperant una resposta del servidor", + "Uploaded on %(date)s by %(user)s": "Pujat el %(date)s per l'usuari %(user)s", + "Send Custom Event": "Envia els esdeveniments personalitzats", + "All notifications are currently disabled for all targets.": "Actualment totes les notificacions estan inhabilitades per a tots els objectius.", + "Failed to send logs: ": "No s'han pogut enviar els logs: ", + "delete the alias.": "esborra l'alies.", + "To return to your account in future you need to set a password": "Per poder tornar al vostre compte en un futur, heu de set a password", + "Forget": "Oblida", + "#example": "#exemple", + "Hide panel": "Amaga el panel", + "You cannot delete this image. (%(code)s)": "No podeu eliminar aquesta imatge. (%(code)s)", + "Cancel Sending": "Cancel·la l'enviament", + "This Room": "Aquesta sala", + "The Home Server may be too old to support third party networks": "El servidor local pot ser massa antic per a ser compatible amb xarxes de tercers", + "Resend": "Reenvia", + "Room not found": "No s'ha trobat la sala", + "Messages containing my display name": "Missatges que contenen el meu nom visible", + "Messages in one-to-one chats": "Missatges en xats un a un", + "Unavailable": "No disponible", + "Error saving email notification preferences": "No s'han pogut desar les preferències de les notificacions a causa d'un error", + "View Decrypted Source": "Mostra el codi desencriptat", + "Failed to update keywords": "No s'han pogut actualitzar les paraules clau", + "Notes:": "Notes:", + "remove %(name)s from the directory.": "elimina %(name)s del directori.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Les notificacions sobre les següents paraules clau segueixen regles que no es poden mostrar aquí:", + "Safari and Opera work too.": "Safari i Opera també fan la feina.", + "Please set a password!": "Si us plau, establiu una contrasenya", + "You have successfully set a password!": "Heu establert correctament la contrasenya", + "An error occurred whilst saving your email notification preferences.": "S'ha produït un error en desar les vostres preferències de notificació per correu electrònic.", + "Explore Room State": "Esbrina els estats de les sales", + "Source URL": "URL origen", + "Messages sent by bot": "Missatges enviats pel bot", + "Filter results": "Resultats del filtre", + "Members": "Membres", + "No update available.": "No hi ha cap actualització disponible.", + "Noisy": "Sorollós", + "Failed to get protocol list from Home Server": "No s'ha pogut obtenir la llista de protocols del servidor local", + "Collecting app version information": "S'està recollint la informació de la versió de l'aplicació", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Voleu esborrar de la sala l'alies %(alias)s i retirar %(name)s del directori?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Això farà possible que pugueu tronar al vostre compte des de qualsevol dispositiu.", + "Enable notifications for this account": "Habilita les notificacions per aquest compte", + "Directory": "Directori", + "Invite to this community": "Convida a aquesta comunitat", + "Search for a room": "Busca una sala", + "Search…": "Cerca…", + "Messages containing keywords": "Missatges que contenen keywords", + "When I'm invited to a room": "Quan sóc convidat a una sala", + "Tuesday": "Dimarts", + "Enter keywords separated by a comma:": "Introduïu les paraules clau separades per una coma:", + "Forward Message": "Reenvia el missatge", + "Remove %(name)s from the directory?": "Voleu retirar %(name)s del directori?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utilitza moltes funcions avançades del navegador, algunes de les quals no estan disponibles o són experimentals al vostre navegador actual.", + "Developer Tools": "Eines de desenvolupador", + "Preparing to send logs": "Preparant l'enviament de logs", + "Explore Account Data": "Explora les dades del compte", + "Remove from Directory": "Elimina del directori", + "Saturday": "Dissabte", + "Remember, you can always set an email address in user settings if you change your mind.": "Recordeu-ho, si canvieu d'idea, sempre podreu establir una adreça de correu electrònic a las vostra configuració d'usuari.", + "Direct Chat": "Xat directe", + "The server may be unavailable or overloaded": "El servidor pot no estar disponible o sobrecarregat", + "Reject": "Rebutja", + "Failed to set Direct Message status of room": "No s'ha pogut establir l'estat del missatge directe de la sala", + "Monday": "Dilluns", + "All messages (noisy)": "Tots els missatges (sorollós)", + "Enable them now": "Habilita-ho ara", + "Messages containing my user name": "Missatges que contenen el meu nom d'usuari", + "Toolbox": "Caixa d'eines", + "Collecting logs": "S'estan recopilant els registres", + "more": "més", + "GitHub issue link:": "Enllaç de l'issue de GitHub:", + "Failed to get public room list": "No s'ha pogut obtenir el llistat de sales públiques", + "You must specify an event type!": "Heu d'especificar un tipus d'esdeveniment", + "(HTTP status %(httpStatus)s)": "(Estat de l´HTTP %(httpStatus)s)", + "All Rooms": "Totes les sales", + "State Key": "Clau d'estat", + "Please install Chrome or Firefox for the best experience.": "Si us plau, instal·leu Chrome or Firefox per gaudir d'una millor experiència.", + "Wednesday": "Dimecres", + "Send logs": "Envia els registres", + "All messages": "Tots els missatges", + "Call invitation": "Invitació de trucada", + "Downloading update...": "Descarregant l'actualització...", + "You have successfully set a password and an email address!": "Heu establert correctament la vostra contrasenya i l'adreça de correu electrònic", + "Failed to send custom event.": "No s'ha pogut enviar l'esdeveniment personalitzat.", + "What's new?": "Què hi ha de nou?", + "Notify me for anything else": "Notifica'm per a qualsevol altra cosa", + "View Source": "Mostra el codi", + "Keywords": "Paraules clau", + "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", + "Invite to this room": "Convida a aquesta sala", + "You cannot delete this message. (%(code)s)": "No podeu eliminar aquest missatge. (%(code)s)", + "Thursday": "Dijous", + "I understand the risks and wish to continue": "Entenc el riscos i desitjo continuar", + "Logs sent": "Logs enviats", + "Back": "Enrere", + "Reply": "Respon", + "Show message in desktop notification": "Mostra els missatges amb notificacions d'escriptori", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Els logs de depuració contenen dades d'ús de l'aplicació que inclouen el teu nom d'usuari, les IDs o pseudònims de les sales o grups que has visitat i els noms d'usuari d'altres usuaris. No contenen missatges.", + "Unhide Preview": "Mostra la previsualització", + "Unable to join network": "No s'ha pogut unir-se a la xarxa", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "És possible que els hàgiu configurat en un client diferent de Riot. No podeu modificar-los amb Riot, però encara s'apliquen", + "Sorry, your browser is not able to run Riot.": "Disculpeu, el seu navegador not pot executar Riot.", + "Quote": "Cita", + "Messages in group chats": "Missatges en xats de grup", + "Yesterday": "Ahir", + "Error encountered (%(errorDetail)s).": "S'ha trobat un error (%(errorDetail)s).", + "Login": "Inicia sessió", + "Low Priority": "Baixa prioritat", + "Unable to fetch notification target list": "No s'ha pogut obtenir la llista d'objectius de les notificacions", + "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 b6b1aa8255..33c7a3d5f1 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -90,7 +90,6 @@ "Are you sure you want to upload the following files?": "Určitě chcete nahrát následující soubory?", "Attachment": "Příloha", "Autoplay GIFs and videos": "Automaticky přehrávat GIFy a videa", - "Bug Report": "Hlášení o chybě", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nelze se připojit k domovskému serveru – zkontrolujte prosím své připojení, prověřte, zdali je SSL certifikát vašeho domovského serveru důvěryhodný, a že některé z rozšíření prohlížeče neblokuje komunikaci.", "Anyone who knows the room's link, apart from guests": "Kdokoliv, kdo má odkaz na místnost, kromě hostů", "Anyone who knows the room's link, including guests": "Kdokoliv, kdo má odkaz na místnost, a to i hosté", @@ -207,7 +206,6 @@ "%(senderName)s answered the call.": "%(senderName)s přijal/a hovor.", "Click to mute audio": "Kliknutím ztlumíte zvuk", "Failed to verify email address: make sure you clicked the link in the email": "E-mailovou adresu se nepodařilo ověřit. Přesvědčte se, že jste kliknul/a na zaslaný odkaz", - "Found a bug?": "Našli jste chybu?", "Guest access is disabled on this Home Server.": "Na tomto domovském serveru je hostům vstup odepřen.", "Guests cannot join this room even if explicitly invited.": "Hosté nemohou vstoupit do této místnosti, i když jsou přímo pozváni.", "Hide read receipts": "Skrýt potvrzení o přečtení", @@ -264,7 +262,6 @@ "olm version:": "verze olm:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Jakmile je jednou šifrování v místnosti zapnuto, nelze už vypnout (prozatím)", "Only people who have been invited": "Pouze lidé, kteří byli pozváni", - "Otherwise, click here to send a bug report.": "V opačném případě klikněte zde a pošlete hlášení o chybě.", "Password": "Heslo", "Password:": "Heslo:", "Passwords can't be empty": "Hesla nemohou být prázdná", @@ -278,7 +275,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 +302,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", @@ -359,7 +354,6 @@ "Active call (%(roomName)s)": "Probíhající hovor (%(roomName)s)", "%(senderName)s banned %(targetName)s.": "%(senderName)s vykázal/a %(targetName)s.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Nelze se připojit k domovskému serveru přes HTTP, pokud je v adresním řádku HTTPS. Buď použijte HTTPS, nebo povolte nebezpečné scripty.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s změnil/a své zobrazované jméno z %(oldDisplayName)s na %(displayName)s.", "Click here to fix": "Klikněte zde pro opravu", "Click to mute video": "Klikněte pro zakázání videa", "click to reveal": "klikněte pro odhalení", @@ -418,7 +412,6 @@ "Use with caution": "Používejte s opatrností", "User ID": "Uživatelské ID", "User Interface": "Uživatelské rozhraní", - "%(user)s is a": "%(user)s je", "User name": "Uživatelské jméno", "Username invalid: %(errMessage)s": "Neplatné uživatelské jméno: %(errMessage)s", "Users": "Uživatelé", @@ -500,8 +493,6 @@ "You need to be able to invite users to do that.": "Pro tuto akci musíte mít právo zvát uživatele.", "Delete Widget": "Smazat widget", "Error decrypting image": "Chyba při dešifrování obrázku", - "Image '%(Body)s' cannot be displayed.": "Obrázek '%(Body)s' nemůže být zobrazen.", - "This image cannot be displayed.": "Tento obrázek nelze zobrazit.", "Error decrypting video": "Chyba při dešifrování videa", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odstranil/a avatar místnosti.", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s změnil/a avatar místnosti na ", @@ -532,7 +523,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", @@ -562,7 +552,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", @@ -651,7 +640,6 @@ "%(senderName)s placed a %(callType)s call.": "%(senderName)s uskutečnil %(callType)s hovor.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s zpřístupnil budoucí historii místnosti neznámým (%(visibility)s).", "Not a valid Riot keyfile": "Neplatný soubor s klíčem Riot", - "Presence Management": "Správce účasti", "Disable Emoji suggestions while typing": "Zakázat návrhy Emoji během psaní", "Hide avatar changes": "Skrýt změny avatara", "Hide display name changes": "Skrýt změny zobrazovaného jména", @@ -659,7 +647,6 @@ "Disable big emoji in chat": "Zakázat velké Emoji v konverzaci", "Mirror local video feed": "Zrcadlit lokání video", "Disable Peer-to-Peer for 1:1 calls": "Zakázat Peer-to-Peer pro 1:1 hovory", - "Opt out of analytics": "Odhlásit se z analytiky údajů", "Never send encrypted messages to unverified devices from this device": "Z tohoto zařízení nikdy neodesílat šifrované zprávy na neověřená zařízení", "Enable inline URL previews by default": "Nastavit povolení náhledů URL adres jako výchozí", "Enable URL previews for this room (only affects you)": "Povolit náhledy URL adres pro tuto místnost (ovlivňuje pouze vás)", @@ -801,8 +788,6 @@ "This setting cannot be changed later!": "Toto nastavení nelze v budoucnu změnit!", "Unknown error": "Neznámá chyba", "Incorrect password": "Nesprávné heslo", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Toto způsobí, že váš účet nebude již nikdy použitelný. Zároveň nebude možné se znovu zaregistrovat pod stejným uživatelským ID.", - "This action is irreversible.": "Tuto operaci nebude možné vrátit zpět.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Pokud si chcete ověřit, zda je zařízení skutečně důvěryhodné, kontaktujte vlastníka jiným způsobem (např. osobně anebo telefonicky) a zeptejte se ho na klíč, který má pro toto zařízení zobrazený v nastavení a zda se shoduje s klíčem zobrazeným níže:", "Device name": "Název zařízení", "Device key": "Klíč zařízení", @@ -817,9 +802,7 @@ "Ignore request": "Ignorovat žádost", "Encryption key request": "Žádost o šifrovací klíč", "Unable to restore session": "Nelze obnovit relaci", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Při pokusu o obnovení vaší předcházející relace se vyskytla chyba. Pokud budete pokračovat musíte se znovu přihlásit a historie šifrovaného rozhovoru nebude již dostupná.", "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.": "Pokud jste se v minulosti již přihlásili s novější verzi programu Riot, vaše relace nemusí být kompatibilní s touto verzí. Zavřete prosím toto okno a přihlaste se znovu pomocí nové verze.", - "Continue anyway": "Přesto pokračovat", "Please check your email and click on the link it contains. Once this is done, click continue.": "Prosím, zkontrolujte si email a klikněte na odkaz ve zprávě, kterou jsme vám zaslali. V případě, že jste tak již učinili, klikněte na tlačítko Pokračovat.", "This will allow you to reset your password and receive notifications.": "Toto vám umožní obnovit si heslo a přijímat oznámení emailem.", "Skip": "Přeskočit", @@ -948,10 +931,157 @@ "Addresses": "Adresy", "collapse": "sbalit", "expand": "rozbalit", - "Cryptography data migrated": "Šifrovaná data byla převedena", - "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.": "Jednorázová migrace šifrovaných údajů dokončena. E2E šifrovaní vám nebude fungovat jakmile se vrátíte ke starší verzi programu Riot. Pokud plánujete používat šifrovaní ve starší verzi Riot, doporučujeme vám se nejdříve odhlásit. Aby jste si zachovali historii šifrovaných konverzací, exportujte a znovu importujte klíče místností.", "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.", - "Show devices or cancel all.": "Zobrazit zařízení anebo Zrušit vše.", - "Warning": "Upozornění" + "Warning": "Upozornění", + "Fetching third party location failed": "Nepodařilo se zjistit umístění třetí strany", + "A new version of Riot is available.": "Je dostupná nová verze Riotu.", + "I understand the risks and wish to continue": "Rozumím rizikům a přeji si pokračovat", + "Couldn't load home page": "Nepodařilo se nahrát úvodní stránku", + "Send Account Data": "Poslat data o účtu", + "Advanced notification settings": "Pokročilé nastavení upozornění", + "Uploading report": "Nahrávám hlášení", + "Sunday": "Neděle", + "Messages sent by bot": "Zprávy poslané robotem", + "Notification targets": "Cíle upozornění", + "Failed to set direct chat tag": "Nepodařilo se nastavit štítek přímého chatu", + "Today": "Dnes", + "Files": "Soubory", + "You are not receiving desktop notifications": "Nedostáváte upozornění na desktopu", + "Friday": "Pátek", + "Update": "Aktualizace", + "What's New": "Co je nového", + "Add an email address above to configure email notifications": "Abyste mohli nastavovat e-mailová upozornění, musíte uvést svoji e-mailovou adresu v kolonce výše", + "Expand panel": "Rozbalit panel", + "On": "Zapnout", + "%(count)s Members|other": "%(count)s Členů", + "Filter room names": "Filtrovat místnosti dle názvu", + "Changelog": "Seznam změn", + "Waiting for response from server": "Čekám na odezvu ze serveru", + "Send Custom Event": "Odeslat vlastní událost", + "All notifications are currently disabled for all targets.": "Veškeré notifikace jsou aktuálně pro všechny cíle vypnuty.", + "delete the alias.": "smazat alias.", + "To return to your account in future you need to set a password": "Abyste se mohli ke svému účtu v budoucnu vrátit, musíte si nastavit heslo", + "Forget": "Zapomenout", + "Hide panel": "Skrýt panel", + "You cannot delete this image. (%(code)s)": "Tento obrázek nemůžete smazat. (%(code)s)", + "Cancel Sending": "Zrušit odesílání", + "This Room": "Tato místnost", + "The Home Server may be too old to support third party networks": "Tento domovský server může být příliš zastaralý na to, aby podporoval sítě třetích stran", + "Noisy": "Hlučný", + "Room not found": "Místnost nenalezena", + "Messages containing my display name": "Zprávy obsahující mé zobrazované jméno", + "Remember, you can always set an email address in user settings if you change your mind.": "Vězte, že kdybyste si to rozmysleli, e-mailovou adresu můžete kdykoliv doplnit v uživatelském nastavení.", + "Unavailable": "Nedostupné", + "Error saving email notification preferences": "Chyba při ukládání nastavení e-mailových upozornění", + "View Decrypted Source": "Zobrazit dešifrovaný zdroj", + "Failed to update keywords": "Nepodařilo se aktualizovat klíčová slova", + "remove %(name)s from the directory.": "odebrat %(name)s z adresáře.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Upozornění na následující klíčová slova se řídí pravidly, která zde nelze zobrazit:", + "Safari and Opera work too.": "Safari a Opera fungují taky.", + "Please set a password!": "Prosím nastavte si heslo!", + "You have successfully set a password!": "Úspěšně jste si nastavili heslo!", + "Explore Room State": "Prohlížet stav místnosti", + "Source URL": "Zdrojová URL", + "Failed to add tag %(tagName)s to room": "Nepodařilo se přidat štítek %(tagName)s k místnosti", + "Filter results": "Filtrovat výsledky", + "Members": "Členové", + "No update available.": "Není dostupná žádná aktualizace.", + "Resend": "Poslat znovu", + "Failed to get protocol list from Home Server": "Z domovského serveru se nepodařilo získat seznam protokolů", + "Collecting app version information": "Sbírání informací o verzi aplikace", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Smazat alias místnosti %(alias)s a odstranit %(name)s z adresáře?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Toto vám umožní vrátit se po odhlášení ke svému účtu a používat jej na ostatních zařízeních.", + "Keywords": "Klíčová slova", + "Enable notifications for this account": "Zapnout upozornění na tomto účtu", + "Directory": "Adresář", + "Invite to this community": "Pozvat do této komunity", + "Search for a room": "Hledat místnost", + "Messages containing keywords": "Zprávy obsahující klíčová slova", + "View Source": "Zobrazit zdroj", + "Tuesday": "Úterý", + "Enter keywords separated by a comma:": "Vložte klíčová slova oddělená čárkou:", + "Forward Message": "Přeposlat zprávu", + "You have successfully set a password and an email address!": "Úspěšně jste si nastavili heslo a e-mailovou adresu!", + "Remove %(name)s from the directory?": "Odebrat %(name)s z adresáře?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot používá mnoho pokročilých funkcí, z nichž některé jsou ve vašem současném prohlížeči nedostupné nebo experimentální.", + "Developer Tools": "Nástroje pro vývojáře", + "Enable desktop notifications": "Zapnout upozornění na ploše", + "Explore Account Data": "Prozkoumat data o účtu", + "Remove from Directory": "Odebrat z adresáře", + "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", + "You must specify an event type!": "Musíte určit typ události!", + "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)", + "Invite to this room": "Pozvat do této místnosti", + "Please install Chrome or Firefox for the best experience.": "Pro nejlepší zážitek si prosím nainstalujte Chrome nebo Firefox.", + "Failed to get public room list": "Nepodařilo se získat seznam veřejných místností", + "Send logs": "Odeslat záznamy", + "All messages": "Všechny zprávy", + "Call invitation": "Pozvánka k hovoru", + "Downloading update...": "Stahování aktualizace...", + "State Key": "Stavový klíč", + "Failed to send custom event.": "Nepodařilo se odeslat vlastní událost.", + "What's new?": "Co je nového?", + "Notify me for anything else": "Upozorni mě na cokoliv jiného", + "When I'm invited to a room": "Pokud jsem pozván do místnosti", + "Can't update user notification settings": "Nelze aktualizovat uživatelské nastavení upozornění", + "Notify for all other messages/rooms": "Upozorni na všechny ostatní zprávy/místnosti", + "Unable to look up room ID from server": "Nelze získat ID místnosti ze serveru", + "Couldn't find a matching Matrix room": "Odpovídající Matrix místost nenalezena", + "All Rooms": "Všechny místnosti", + "You cannot delete this message. (%(code)s)": "Tuto zprávu nemůžete smazat. (%(code)s)", + "Thursday": "Čtvrtek", + "Search…": "Vyhledat…", + "Back": "Zpět", + "Failed to change settings": "Nepodařilo se změnit nastavení", + "Reply": "Odpovědět", + "Show message in desktop notification": "Zobrazovat zprávu v upozornění na ploše", + "Unhide Preview": "Zobrazit náhled", + "Unable to join network": "Nelze se připojit k síti", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Snad jste je nastavili v jiném klientu než Riot. V Riotu je nemůžete upravit, ale přesto platí", + "Sorry, your browser is not able to run Riot.": "Omlouváme se, váš prohlížeč není schopný spustit Riot.", + "Uploaded on %(date)s by %(user)s": "Nahráno %(date)s uživatelem %(user)s", + "Messages in group chats": "Zprávy ve skupinových chatech", + "Yesterday": "Včera", + "Error encountered (%(errorDetail)s).": "Nastala chyba (%(errorDetail)s).", + "Login": "Přihlásit", + "Low Priority": "Nízká priorita", + "Riot does not know how to join a room on this network": "Riot neví, jak vstoupit do místosti na této síti", + "Set Password": "Nastavit heslo", + "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 67f00cdefb..2a59530d5a 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", @@ -218,7 +217,6 @@ "%(senderName)s requested a VoIP conference.": "%(senderName)s forespurgte en VoIP konference.", "%(senderName)s invited %(targetName)s.": "%(senderName)s inviterede %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s bannede %(targetName)s.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s ændrede deres viste navn fra %(oldDisplayName)s til %(displayName)s.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s satte deres viste navn til %(displayName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s fjernede deres viste navn (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s fjernede deres profilbillede.", @@ -243,5 +241,165 @@ "(unknown failure: %(reason)s)": "(ukendt fejl: %(reason)s)", "%(senderName)s ended the call.": "%(senderName)s afsluttede opkaldet.", "%(senderName)s placed a %(callType)s call.": "%(senderName)s startede et %(callType)s opkald.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s inviterede %(targetDisplayName)s til rummet." + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s inviterede %(targetDisplayName)s til rummet.", + "Submit debug logs": "Indsend debug-logfiler", + "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 set a password": "For at komme ind på din konto i fremtiden skal du indstille et password", + "Forget": "Glem", + "#example": "#eksempel", + "Hide panel": "Gem panel", + "You cannot delete this image. (%(code)s)": "Du kan ikke slette dette billede. (%(code)s)", + "Cancel Sending": "Stop Forsendelse", + "Warning": "Advarsel", + "This Room": "Dette rum", + "The Home Server may be too old to support third party networks": "Hjemmeserveren kan være for gammel til at understøtte tredjepartsnetværk", + "Room not found": "Rummet ikke fundet", + "Messages containing my display name": "Beskeder der indeholder mit viste navn", + "Messages in one-to-one chats": "Beskeder i en-til-en chats", + "Unavailable": "Utilgængelig", + "Error saving email notification preferences": "Fejl ved at gemme e-mail-underretningsindstillinger", + "View Decrypted Source": "Se Dekrypteret Kilde", + "Failed to update keywords": "Kunne ikke opdatere søgeord", + "remove %(name)s from the directory.": "fjern %(name)s fra kataloget.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Meddelelser om følgende søgeord følger regler, der ikke kan vises her:", + "Safari and Opera work too.": "Safari og Opera virker også.", + "Please set a password!": "Indstil venligst et password!", + "You have successfully set a password!": "Du har succesfuldt indstillet et password!", + "An error occurred whilst saving your email notification preferences.": "Der opstod en fejl under opbevaring af dine e-mail-underretningsindstillinger.", + "Explore Room State": "Udforsk Rum Tilstand", + "Source URL": "Kilde URL", + "Failed to add tag %(tagName)s to room": "Kunne ikke tilføje tag(s): %(tagName)s til rummet", + "Filter results": "Filtrér resultater", + "Members": "Medlemmer", + "No update available.": "Ingen opdatering tilgængelig.", + "Noisy": "Støjende", + "Failed to get protocol list from Home Server": "Kunne ikke få protokolliste fra Home Server", + "Collecting app version information": "Indsamler app versionsoplysninger", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Slet rumaliaset %(alias)s og fjern %(name)s fra kataloget?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Dette vil tillade dig at vende tilbage til din konto efter at have logget ud og at logge ind på andre enheder.", + "Keywords": "Søgeord", + "Enable notifications for this account": "Aktivér underretninger for dette brugernavn", + "Directory": "Rum katalog", + "Invite to this community": "Inviter til dette fællesskab", + "Search for a room": "Søg efter et rum", + "Search…": "Søg…", + "Messages containing keywords": "Beskeder der indeholder keywords", + "When I'm invited to a room": "Når jeg bliver inviteret til et rum", + "Tuesday": "Tirsdag", + "Enter keywords separated by a comma:": "Indtast søgeord adskilt af et komma:", + "Forward Message": "Videresend Besked", + "Remove %(name)s from the directory?": "Fjern %(name)s fra kataloget?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot bruger mange avancerede browser funktioner, hvoraf nogle af dem ikke er tilgængelige eller er eksperimentelle i din browser.", + "Event sent!": "Begivenhed sendt!", + "Explore Account Data": "Udforsk Konto Data", + "Saturday": "Lørdag", + "Remember, you can always set an email address in user settings if you change your mind.": "Husk, du kan altid indstille en emailadresse i dine bruger indstillinger hvis du ombestemmer dig.", + "Direct Chat": "Personlig Chat", + "The server may be unavailable or overloaded": "Serveren kan være utilgængelig eller overbelastet", + "Reject": "Afvis", + "Failed to set Direct Message status of room": "Kunne ikke indstille Direkte Beskedstatus for rummet", + "Monday": "Mandag", + "Remove from Directory": "Fjern fra Katalog", + "Enable them now": "Aktivér dem nu", + "Messages containing my user name": "Beskeder der indeholder mit brugernavn", + "Toolbox": "Værktøjer", + "Collecting logs": "Indsamler logfiler", + "more": "mere", + "You must specify an event type!": "Du skal angive en begivenhedstype!", + "(HTTP status %(httpStatus)s)": "(HTTP tilstand %(httpStatus)s)", + "Invite to this room": "Inviter til dette rum", + "State Key": "Tilstandsnøgle", + "Please install Chrome or Firefox for the best experience.": "Installer venligst Chrome eller Firefox for den bedste oplevelse.", + "Failed to get public room list": "Kunne ikke få offentlig rumliste", + "Send": "Send", + "Send logs": "Send logs", + "All messages": "Alle beskeder", + "Call invitation": "Opkalds invitation", + "Downloading update...": "Downloader opdatering...", + "You have successfully set a password and an email address!": "Du har succesfuldt indstillet et password og en emailadresse!", + "Failed to send custom event.": "Kunne ikke sende brugerdefinerede begivenhed.", + "What's new?": "Hvad er nyt?", + "Notify me for anything else": "Underret mig om noget andet", + "View Source": "Se Kilde", + "Can't update user notification settings": "Kan ikke opdatere brugermeddelelsesindstillinger", + "Notify for all other messages/rooms": "Underret om alle andre meddelelser / rum", + "Unable to look up room ID from server": "Kunne ikke slå rum-id op på server", + "Couldn't find a matching Matrix room": "Kunne ikke finde et matchende Matrix-rum", + "All Rooms": "Alle rum", + "You cannot delete this message. (%(code)s)": "Du kan ikke slette denne besked. (%(code)s)", + "Thursday": "Torsdag", + "I understand the risks and wish to continue": "Jeg forstår risikoen og ønsker at fortsætte", + "Back": "Tilbage", + "Show message in desktop notification": "Vis besked i skrivebordsnotifikation", + "Unhide Preview": "Vis Forhåndsvisning", + "Unable to join network": "Kan ikke forbinde til netværket", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du har muligvis konfigureret dem i en anden klient end Riot. Du kan ikke tune dem i Riot, men de gælder stadig", + "Sorry, your browser is not able to run Riot.": "Beklager, din browser kan ikke køre Riot.", + "Quote": "Citat", + "Messages in group chats": "Beskeder i gruppechats", + "Yesterday": "I går", + "Error encountered (%(errorDetail)s).": "En fejl er opstået (%(errorDetail)s).", + "Event Type": "Begivenhedstype", + "Low Priority": "Lav prioritet", + "Unable to fetch notification target list": "Kan ikke hente meddelelsesmålliste", + "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", + "%(count)s Members|other": "%(count)s medlemmer", + "Logs sent": "Logfiler sendt", + "Reply": "Besvar", + "All messages (noisy)": "Alle meddelelser (højlydt)", + "GitHub issue link:": "Link til GitHub issue:", + "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-logfiler indeholder brugerdata såsom brugernavn, ID'er eller aliaser for de rum eller grupper, du har besøgt, og andres brugernavne. De indeholder ikke meddelelser.", + "Failed to send logs: ": "Kunne ikke sende logfiler: ", + "View Community": "Vis community", + "%(count)s Members|one": "%(count)s medlem", + "Notes:": "Noter:", + "Preparing to send logs": "Forbereder afsendelse af logfiler" } diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index ec2d43aed7..c8e01819bd 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -31,7 +31,7 @@ "Sender device information": "Geräte-Informationen des Absenders", "Displays action": "Zeigt Aktionen an", "Bans user with given id": "Verbannt den Benutzer mit der angegebenen ID", - "Deops user with given id": "Entfernt OP beim Benutzer mit der angegebenen ID", + "Deops user with given id": "Setzt das Berechtigungslevel beim Benutzer mit der angegebenen ID zurück", "Invites user with given id to current room": "Lädt den Benutzer mit der angegebenen ID in den aktuellen Raum ein", "Joins room with given alias": "Raum wird mit dem angegebenen Alias betreten", "Kicks user with given id": "Benutzer mit der angegebenen ID kicken", @@ -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", @@ -81,7 +80,7 @@ "Failed to change password. Is your password correct?": "Passwortänderung fehlgeschlagen. Ist dein Passwort richtig?", "Failed to leave room": "Verlassen des Raums fehlgeschlagen", "Failed to reject invitation": "Einladung konnte nicht abgelehnt werden", - "Failed to set avatar.": "Fehler beim Setzen des Profilbilds.", + "Failed to set avatar.": "Profilbild konnte nicht gesetzt werden.", "Failed to unban": "Aufheben der Verbannung fehlgeschlagen", "Failed to upload file": "Datei-Upload fehlgeschlagen", "Favourite": "Favorit", @@ -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:", @@ -227,7 +225,7 @@ "%(weekDayName)s %(time)s": "%(weekDayName)s, %(time)s", "Set a display name:": "Anzeigename eingeben:", "Upload an avatar:": "Profilbild hochladen:", - "This server does not support authentication with a phone number.": "Dieser Server unterstützt keine Authentifizierung mittels Telefonnummer.", + "This server does not support authentication with a phone number.": "Dieser Server unterstützt keine Authentifizierung per Telefonnummer.", "Missing password.": "Fehlendes Passwort.", "Passwords don't match.": "Passwörter stimmen nicht überein.", "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Passwort zu kurz (min. %(MIN_PASSWORD_LENGTH)s).", @@ -246,7 +244,6 @@ "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s hat die Einladung für %(displayName)s akzeptiert.", "%(senderName)s answered the call.": "%(senderName)s hat den Anruf angenommen.", "%(senderName)s banned %(targetName)s.": "%(senderName)s hat %(targetName)s verbannt.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s hat den Anzeigenamen von %(oldDisplayName)s auf %(displayName)s geändert.", "%(senderName)s changed their profile picture.": "%(senderName)s hat das Profilbild geändert.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s hat den Raumnamen geändert zu %(roomName)s.", @@ -263,7 +260,7 @@ "%(targetName)s left the room.": "%(targetName)s hat den Raum verlassen.", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden).", "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie beigetreten sind).", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für: Alle Raum-Mitglieder.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für Alle.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für unbekannt (%(visibility)s).", "Missing room_id in request": "Fehlende room_id in Anfrage", @@ -278,7 +275,7 @@ "%(senderName)s removed their profile picture.": "%(senderName)s hat das Profilbild gelöscht.", "%(senderName)s requested a VoIP conference.": "%(senderName)s möchte eine VoIP-Konferenz beginnen.", "Room %(roomId)s not visible": "Raum %(roomId)s ist nicht sichtbar", - "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s hat ein Bild übermittelt.", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s hat ein Bild gesendet.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s hat %(targetDisplayName)s in diesen Raum eingeladen.", "%(senderName)s set a profile picture.": "%(senderName)s hat ein Profilbild gesetzt.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s hat den Anzeigenamen geändert in %(displayName)s.", @@ -376,7 +373,7 @@ "bullet": "Aufzählung", "Click to unmute video": "Klicken, um die Video-Stummschaltung zu deaktivieren", "Click to unmute audio": "Klicken, um den Ton wieder einzuschalten", - "Failed to load timeline position": "Laden der Position im Chatverlauf fehlgeschlagen", + "Failed to load timeline position": "Laden der Chat-Position fehlgeschlagen", "Failed to toggle moderator status": "Umschalten des Moderator-Status fehlgeschlagen", "Enable encryption": "Verschlüsselung aktivieren", "The main address for this room is": "Die Hauptadresse für diesen Raum ist", @@ -399,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)", @@ -427,7 +423,6 @@ "Confirm Removal": "Entfernen bestätigen", "Unknown error": "Unbekannter Fehler", "Incorrect password": "Ungültiges Passwort", - "This action is irreversible.": "Diese Aktion kann nicht rückgängig gemacht werden.", "To continue, please enter your password.": "Zum fortfahren bitte Passwort eingeben.", "Device name": "Geräte-Name", "Device key": "Geräte-Schlüssel", @@ -435,7 +430,6 @@ "Verify device": "Gerät verifizieren", "I verify that the keys match": "Ich bestätige, dass die Schlüssel identisch sind", "Unable to restore session": "Sitzungswiederherstellung fehlgeschlagen", - "Continue anyway": "Trotzdem fortfahren", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Nicht verifizierte Geräte werden aktuell blockiert und auf die Sperrliste gesetzt. Um Nachrichten an diese Geräte senden zu können, müssen diese zunächst verifiziert werden.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" enthält Geräte, die du bislang noch nicht gesehen hast.", "Unknown devices": "Unbekannte Geräte", @@ -450,7 +444,7 @@ "Dismiss": "Ablehnen", "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Du kannst auch einen angepassten Idantitätsserver angeben aber dies wird typischerweise Interaktionen mit anderen Nutzern auf Basis der E-Mail-Adresse verhindern.", "Please check your email to continue registration.": "Bitte prüfe deine E-Mails, um mit der Registrierung fortzufahren.", - "Token incorrect": "Token inkorrekt", + "Token incorrect": "Token fehlerhaft", "Please enter the code it contains:": "Bitte gebe den Code ein, den sie enthält:", "powered by Matrix": "betrieben mit Matrix", "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Wenn du keine E-Mail-Adresse angibst, wirst du nicht in der Lage sein, dein Passwort zurückzusetzen. Bist du sicher?", @@ -462,8 +456,6 @@ "What does this mean?": "Was bedeutet das?", "Error decrypting audio": "Audio-Entschlüsselung fehlgeschlagen", "Error decrypting image": "Bild-Entschlüsselung fehlgeschlagen", - "Image '%(Body)s' cannot be displayed.": "Das Bild '%(Body)s' kann nicht angezeigt werden.", - "This image cannot be displayed.": "Dieses Bild kann nicht angezeigt werden.", "Error decrypting video": "Video-Entschlüsselung fehlgeschlagen", "Import room keys": "Raum-Schlüssel importieren", "File to import": "Zu importierende Datei", @@ -472,7 +464,6 @@ "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Dieser Prozess erlaubt es dir, die Schlüssel für die in verschlüsselten Räumen empfangenen Nachrichten in eine lokale Datei zu exportieren. In Zukunft wird es möglich sein, diese Datei in einen anderen Matrix-Client zu importieren, sodass dieser Client diese Nachrichten ebenfalls entschlüsseln kann.", "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Mit der exportierten Datei kann jeder, der diese Datei lesen kann, jede verschlüsselte Nachricht entschlüsseln, die für dich lesbar ist. Du solltest die Datei also unbedingt sicher verwahren. Um den Vorgang sicherer zu gestalten, solltest du unten eine Passphrase eingeben, die dazu verwendet wird, die exportierten Daten zu verschlüsseln. Anschließend wird es nur möglich sein, die Daten zu importieren, wenn dieselbe Passphrase verwendet wird.", "Analytics": "Anonymisierte Analysedaten", - "Opt out of analytics": "Zustimmung zur Übermittlung von anonymisierten Analysedaten verweigern", "Riot collects anonymous analytics to allow us to improve the application.": "Riot sammelt anonymisierte Analysedaten, um die Anwendung kontinuierlich verbessern zu können.", "Add an Integration": "Eine Integration hinzufügen", "Removed or unknown message type": "Gelöschte Nachricht oder unbekannter Nachrichten-Typ", @@ -481,10 +472,8 @@ "Online": "Online", " (unsupported)": " (nicht unterstützt)", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Dieser Prozess erlaubt es dir, die zuvor von einem anderen Matrix-Client exportierten Verschlüsselungs-Schlüssel zu importieren. Danach kannst du alle Nachrichten entschlüsseln, die auch bereits auf dem anderen Client entschlüsselt werden konnten.", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Dies wird dein Benutzerkonto dauerhaft unbenutzbar machen. Du wirst nicht in der Lage sein, dich mit derselben Benutzer-ID erneut zu registrieren.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Um sicherzustellen, dass diesem Gerät vertraut werden kann, kontaktiere bitte den Eigentümer des Geräts über ein anderes Kommunikationsmittel (z.B. im persönlichen Gespräch oder durch einen Telefonanruf) und vergewissere dich, dass der Schlüssel, den der Eigentümer in den Benutzer-Einstellungen für dieses Gerät sieht, mit dem folgenden Schlüssel identisch ist:", "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.": "Wenn er identisch ist, bitte den Bestätigen-Button unten verwenden. Falls er nicht identisch sein sollte, hat eine Fremdperson Kontrolle über dieses Gerät und es sollte gesperrt werden.", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Bei der Wiederherstellung deiner letzten Sitzung ist ein Fehler aufgetreten. Um fortzufahren, musst du dich erneut anmelden. Ein zuvor verschlüsselter Chatverlauf wird in der Folge nicht mehr lesbar sein.", "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.": "Wenn du zuvor eine aktuellere Version von Riot verwendet hast, ist deine Sitzung eventuell inkompatibel mit dieser Version. Bitte schließe dieses Fenster und kehre zur aktuelleren Version zurück.", "Blacklist": "Blockieren", "Unblacklist": "Entblockieren", @@ -594,7 +583,6 @@ "Last seen": "Zuletzt gesehen", "Level:": "Berechtigungslevel:", "No display name": "Kein Anzeigename", - "Otherwise, click here to send a bug report.": "Alternativ hier klicken, um einen Fehlerbericht zu senden.", "Private Chat": "Privater Chat", "Public Chat": "Öffentlicher Chat", "Reason: %(reasonText)s": "Grund: %(reasonText)s", @@ -616,7 +604,6 @@ "Unnamed Room": "Unbenannter Raum", "Unverified": "Nicht verifiziert", "Upload new:": "Neue(s) hochladen:", - "%(user)s is a": "%(user)s ist ein", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (Berechtigungslevel %(powerLevelNumber)s)", "Verified": "Verifiziert", "Would you like to accept or decline this invitation?": "Möchtest du diese Einladung akzeptieren oder ablehnen?", @@ -630,7 +617,7 @@ "(could not connect media)": "(Medienverbindung konnte nicht hergestellt werden)", "(no answer)": "(keine Antwort)", "(unknown failure: %(reason)s)": "(Unbekannter Fehler: %(reason)s)", - "Your browser does not support the required cryptography extensions": "Dein Browser unterstützt die benötigten Kryptografie-Erweiterungen nicht", + "Your browser does not support the required cryptography extensions": "Dein Browser unterstützt die benötigten Verschlüsselungs-Erweiterungen nicht", "Not a valid Riot keyfile": "Keine gültige Riot-Schlüsseldatei", "Authentication check failed: incorrect password?": "Authentifizierung fehlgeschlagen: Falsches Passwort?", "Disable Peer-to-Peer for 1:1 calls": "Peer-to-Peer-Verbindung für 1-zu-1-Anrufe deaktivieren", @@ -653,13 +640,11 @@ "Changes colour scheme of current room": "Ändere Farbschema des aktuellen Raumes", "Delete widget": "Widget entfernen", "Define the power level of a user": "Setze das Berechtigungslevel eines Benutzers", - "Edit": "Editieren", + "Edit": "Bearbeiten", "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", @@ -694,7 +679,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?", @@ -706,11 +690,11 @@ "Matrix ID": "Matrix-ID", "Advanced options": "Erweiterte Optionen", "Block users on other matrix homeservers from joining this room": "Benutzern auf anderen Matrix-Heimservern das Betreten dieses Raumes verbieten", - "This setting cannot be changed later!": "Diese Einstellung kann nachträglich nicht mehr geändert werden!", + "This setting cannot be changed later!": "Diese Einstellung kann später nicht mehr geändert werden!", "Unignore": "Ignorieren aufheben", "User Options": "Benutzer-Optionen", "Unignored user": "Benutzer nicht mehr ignoriert", - "Ignored user": "Ignorierter Benutzer", + "Ignored user": "Benutzer ignoriert", "Stops ignoring a user, showing their messages going forward": "Beendet das Ignorieren eines Benutzers, nachfolgende Nachrichten werden wieder angezeigt", "Ignores a user, hiding their messages from you": "Ignoriert einen Benutzer und verbirgt dessen Nachrichten", "Disable Emoji suggestions while typing": "Emoji-Vorschläge während des Schreibens deaktivieren", @@ -730,7 +714,7 @@ "To change the topic, you must be a": "Notwendiges Berechtigungslevel, um das Thema zu ändern", "To modify widgets in the room, you must be a": "Notwendiges Berechtigungslevel, um Widgets in diesem Raum zu ändern", "Description": "Beschreibung", - "Unable to accept invite": "Einladung kann nicht akzeptiert werden", + "Unable to accept invite": "Einladung kann nicht angenommen werden", "Failed to invite users to %(groupId)s": "Benutzer konnten nicht in %(groupId)s eingeladen werden", "Unable to reject invite": "Einladung konnte nicht abgelehnt werden", "Who would you like to add to this summary?": "Wen möchtest zu dieser Übersicht hinzufügen?", @@ -759,10 +743,10 @@ "Long Description (HTML)": "Lange Beschreibung (HTML)", "Jump to message": "Zur Nachricht springen", "No pinned messages.": "Keine angehefteten Nachrichten vorhanden.", - "Loading...": "Lade...", + "Loading...": "Lädt...", "Unpin Message": "Nachricht nicht mehr anheften", "Unnamed room": "Unbenannter Raum", - "World readable": "Lesbar für alle", + "World readable": "Für alle lesbar", "Guests can join": "Gäste können beitreten", "No rooms to show": "Keine anzeigbaren Räume", "Community Settings": "Community-Einstellungen", @@ -789,7 +773,7 @@ "Community ID": "Community-ID", "example": "Beispiel", "Add rooms to the community summary": "Fügt Räume zur Community-Übersicht hinzu", - "Add users to the community summary": "Fügt Benutzer zur Community-Übersicht hinzu", + "Add users to the community summary": "Füge Benutzer zur Community-Übersicht hinzu", "Failed to update community": "Aktualisieren der Community fehlgeschlagen", "Leave Community": "Community verlassen", "Add rooms to this community": "Räume zu dieser Community hinzufügen", @@ -804,7 +788,7 @@ "Join an existing community": "Einer bestehenden Community beitreten", "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Um einer bereits bestehenden Community beitreten zu können, musst dir deren Community-ID bekannt sein. Diese sieht z. B. aus wie +example:matrix.org.", "Your Communities": "Deine Communities", - "You're not currently a member of any communities.": "Du bist aktuell kein Mitglied einer Community.", + "You're not currently a member of any communities.": "Du gehörst aktuell keiner Community an.", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Erstelle eine Community, um Benutzer und Räume miteinander zu verbinden! Erstelle zusätzlich eine eigene Homepage, um deinen individuellen Bereich im Matrix-Universum zu gestalten.", "Something went wrong whilst creating your community": "Beim Erstellen deiner Community ist ein Fehler aufgetreten", "%(names)s and %(count)s others are typing|other": "%(names)s und %(count)s weitere schreiben", @@ -867,9 +851,9 @@ "Ban this user?": "Diesen Benutzer verbannen?", "Drop here to favourite": "Hierher ziehen, um als Favorit zu markieren", "Drop here to tag direct chat": "Hierher ziehen, um als Direkt-Chat zu markieren", - "Drop here to restore": "Hierher ziehen zum Wiederherstellen", + "Drop here to restore": "Hierher ziehen, um wiederherzustellen", "Drop here to demote": "Hierher ziehen, um herabzustufen", - "You have been kicked from this room by %(userName)s.": "Du wurdest von %(userName)s aus diesem Raum gekickt.", + "You have been kicked from this room by %(userName)s.": "%(userName)s hat dich aus diesem Raum gekickt.", "You are trying to access a room.": "Du versuchst, auf einen Raum zuzugreifen.", "Members only (since the point in time of selecting this option)": "Nur Mitglieder (ab dem Zeitpunkt, an dem diese Option ausgewählt wird)", "Members only (since they were invited)": "Nur Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden)", @@ -898,7 +882,7 @@ "Community Invites": "Community-Einladungen", "Notify the whole room": "Alle im Raum benachrichtigen", "Room Notification": "Raum-Benachrichtigung", - "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Diese Räume werden Community-Mitgliedern auf der Community-Seite angezeigt. Community-Mitglieder können diesen Räumen beitreten, indem sie auf diese klicken.", + "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Diese Räume werden Community-Mitgliedern auf der Community-Seite angezeigt. Community-Mitglieder können diesen Räumen beitreten, indem sie diese anklicken.", "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume Nicht-Mitgliedern auf der Community-Seite und in der Raum-Liste angezeigt werden?", "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    HTML für deine Community-Seite

    \n

    \n Nutze die ausführliche Beschreibung, um neuen Mitgliedern diese Community vorzustellen\n oder um wichtige Links bereitzustellen.\n

    \n

    \n Du kannst sogar 'img'-Tags (HTML) verwenden\n

    \n", "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "Deine Community hat noch keine ausführliche Beschreibung, d. h. eine HTML-Seite, die Community-Mitgliedern angezeigt wird.
    Hier klicken, um die Einstellungen zu öffnen und eine Beschreibung zu erstellen!", @@ -915,7 +899,6 @@ "URL previews are disabled by default for participants in this room.": "URL-Vorschau ist für Mitglieder dieses Raumes standardmäßig deaktiviert.", "URL previews are enabled by default for participants in this room.": "URL-Vorschau ist für Mitglieder dieses Raumes standardmäßig aktiviert.", "Restricted": "Eingeschränkt", - "Presence Management": "Anwesenheitsmanagement", "Status.im theme": "Status.im-Thema", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", @@ -937,7 +920,7 @@ "Display your community flair in rooms configured to show it.": "Zeige deinen Community-Flair in den Räumen, die es erlauben.", "This homeserver doesn't offer any login flows which are supported by this client.": "Dieser Heimserver verfügt über keinen, von diesem Client unterstütztes Anmeldeverfahren.", "Call Failed": "Anruf fehlgeschlagen", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "In diesem Raum befinden sich nicht verifizierte Geräte. Wenn du ohne Verifizierung fortfährst, könnten Angreifer den Anruf mithören.", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "In diesem Raum befinden sich nicht verifizierte Geräte. Wenn du ohne sie zu verifizieren fortfährst, könnten Angreifer den Anruf mithören.", "Review Devices": "Geräte ansehen", "Call Anyway": "Trotzdem anrufen", "Answer Anyway": "Trotzdem annehmen", @@ -947,10 +930,242 @@ "Addresses": "Adressen", "collapse": "Verbergen", "expand": "Erweitern", - "Cryptography data migrated": "Kryptographie-Schlüssel wurden übertragen", "Old cryptography data detected": "Alte Kryptografiedaten erkannt", - "Show devices or cancel all.": "Geräte anzeigen oder alle abbrechen.", "Warning": "Warnung", - "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.": "Eine tiefgreifende Migration im Kontext der Verschlüsselungsdaten wurde durchgeführt. Ende-zu-Ende-Verschlüsselung wird nicht mehr funktionieren, wenn du zu einer älteren Version von Riot zurückkehrst. Wenn du Ende-zu-Ende-Verschlüssung bei einer älteren Version von Riot brauchst, melde dich bitte vorher ab. Um die Historie zu behalten, ex- und reimportiere deine Schlüssel.", - "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Es wurden Daten von einer älteren Version von Riot entdeckt. Dies wird zu Fehlern in der Ende-zu-Ende-Verschlüsselung der älteren Version geführt haben. Ende-zu-Ende verschlüsselte Nachrichten, die ausgetauscht wruden, während die ältere Version genutzt wurde, werden in dieser Version nicht entschlüsselbar sein. Es kann auch zu Fehlern mit Nachrichten führen, die mit dieser Version versendet werden. Wenn du Probleme feststellst, melde dich ab und wieder an. Um die Historie zu behalten, ex- und reimportiere deine Schlüssel." + "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Es wurden Daten von einer älteren Version von Riot entdeckt. Dies wird zu Fehlern in der Ende-zu-Ende-Verschlüsselung der älteren Version geführt haben. Ende-zu-Ende verschlüsselte Nachrichten, die ausgetauscht wruden, während die ältere Version genutzt wurde, werden in dieser Version nicht entschlüsselbar sein. Es kann auch zu Fehlern mit Nachrichten führen, die mit dieser Version versendet werden. Wenn du Probleme feststellst, melde dich ab und wieder an. Um die Historie zu behalten, ex- und reimportiere deine Schlüssel.", + "Send an encrypted reply…": "Verschlüsselte Antwort senden…", + "Send a reply (unencrypted)…": "Antwort senden (unverschlüsselt)…", + "Send an encrypted message…": "Verschlüsselte Nachricht senden…", + "Send a message (unencrypted)…": "Nachricht senden (unverschlüsselt)…", + "Replying": "Antwortet", + "Minimize apps": "Apps minimieren", + "%(count)s of your messages have not been sent.|one": "Deine Nachricht wurde nicht gesendet.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Jetzt alle erneut senden oder alle abbrechen. Du kannst auch einzelne Nachrichten auswählen und erneut senden oder abbrechen.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Nachricht jetzt erneut senden oder senden abbrechen now.", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privatsphäre ist uns wichtig, deshalb sammeln wir keine persönlichen oder identifizierbaren Daten für unsere Analysen.", + "The information being sent to us to help make Riot.im better includes:": "Die Informationen, die an uns gesendet werden um Riot.im zu verbessern enthalten:", + "The platform you're on": "Benutzte Plattform", + "The version of Riot.im": "Riot.im Version", + "Your language of choice": "Deine ausgewählte Sprache", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Ob du den Richtext-Modus des Editors benutzt oder nicht", + "Your homeserver's URL": "Die URL deines Homeservers", + "Your identity server's URL": "Die URL deines Identitätsservers", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", + "Tag Panel": "Beschriftungsfeld", + "Message Replies": "Antworten auf Nachrichten", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Du wirst nicht in der Lage sein, die Änderung zurückzusetzen, da du dich degradierst. Wenn du der letze Nutzer mit Berechtigungen bist, wird es unmöglich sein die Privilegien zurückzubekommen.", + "Community IDs cannot not be empty.": "Community-IDs können nicht leer sein.", + "Show devices, send anyway or cancel.": "Geräte anzeigen, trotzdem senden oder abbrechen.", + "Learn more about how we use analytics.": "Lerne mehr darüber, wie wir die Analysedaten nutzen.", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Wenn diese Seite identifizierbare Informationen sowie Raum, Nutzer oder Gruppen-ID enthalten, werden diese Daten entfernt bevor sie an den Server gesendet werden.", + "Whether or not you're logged in (we don't record your user name)": "Ob oder ob du nicht angemeldet bist (wir zeichnen deinen Benutzernamen nicht auf)", + "Which officially provided instance you are using, if any": "Welche offiziell angebotene Instanz du nutzt, wenn es der Fall ist", + "In reply to ": "Antwort zu ", + "This room is not public. You will not be able to rejoin without an invite.": "Dies ist kein öffentlicher Raum. Du wirst diesen nicht ohne Einladung wieder beitreten können.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s änderte den Anzeigenamen auf %(displayName)s.", + "Failed to set direct chat tag": "Fehler beim Setzen der Direkt-Chat-Markierung", + "Failed to remove tag %(tagName)s from room": "Fehler beim Entfernen des \"%(tagName)s\"-Tags von dem Raum", + "Failed to add tag %(tagName)s to room": "Fehler beim Hinzufügen des \"%(tagName)s\"-Tags an dem Raum", + "Did you know: you can use communities to filter your Riot.im experience!": "Wusstest du: Du kannst Communities nutzen um deine Riot.im-Erfahrung zu filtern!", + "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Um einen Filter zu setzen, siehe einen Community-Bild auf das Filter-Panel ganz links. Du kannst jederzeit auf einen Avatar im Filter-Panel klicken um nur die Räume und Personen aus der Community zu sehen.", + "Clear filter": "Filter zurücksetzen", + "Disable Community Filter Panel": "Deaktivere Community-Filter-Panel", + "Your key share request has been sent - please check your other devices for key share requests.": "Deine Schlüssel-Teil-Anfragen wurden gesendet. Bitte prüfe deine anderen Geräte auf die Schlüssel-Teil-Anfragen.", + "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.": "Schlüssel-Anfragen wurden automatisch zu den anderen Geräten gesendet. Wenn du diese Anfragen auf deinen anderen Geräten abgelehnt oder verpasst hast, klicke hier um die Schlüssel für diese Sitzung erneut anzufragen.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Wenn deine anderen Geräte keine Schlüssel für diese Nachricht haben, wirst du diese nicht entschlüsseln können.", + "Key request sent.": "Schlüssel-Anfragen gesendet.", + "Re-request encryption keys from your other devices.": "Verschlüsselungs-Schlüssel von deinen anderen Geräten erneut anfragen.", + "%(user)s is a %(userRole)s": "%(user)s ist ein %(userRole)s", + "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 contain 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", + "Code": "Code", + "Opens the Developer Tools dialog": "Öffnet den Entwicklerwerkzeugkasten", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Von %(displayName)s (%(userName)s) um %(dateTime)s gesehen", + "Unable to join community": "Community konnte nicht betreten werden", + "Unable to leave community": "Community konnte nicht verlassen werden", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Änderungen am Namen und Bild deiner Community werden evtl. erst nach 30 Minuten von anderen Nutzern gesehen werden.", + "Join this community": "Community beitreten", + "Leave this community": "Community verlassen", + "You don't currently have any stickerpacks enabled": "Du hast aktuell keine Stickerpacks aktiviert", + "Add a stickerpack": "Füge ein Stickerpack hinzu", + "Hide Stickers": "Sticker verbergen", + "Show Stickers": "Sticker zeigen", + "Who can join this community?": "Wer kann dieser Community beitreten?", + "Everyone": "Jeder", + "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 set a password": "Um in Zukunft auf dein Benutzerkonto zugreifen zu können, musst du ein Passwort setzen", + "Forget": "Entfernen", + "#example": "#Beispiel", + "Hide panel": "Panel verbergen", + "You cannot delete this image. (%(code)s)": "Das Bild kann nicht gelöscht werden. (%(code)s)", + "Cancel Sending": "Senden abbrechen", + "This Room": "In diesem Raum", + "The Home Server may be too old to support third party networks": "Der Home-Server ist eventuell zu alt, um Drittanbieter-Netzwerke zu unterstützen", + "Resend": "Erneut senden", + "Room not found": "Raum nicht gefunden", + "Messages containing my display name": "Nachrichten, die meinen Anzeigenamen enthalten", + "Messages in one-to-one chats": "Nachrichten in Einzel-Chats", + "Unavailable": "Nicht verfügbar", + "View Decrypted Source": "Entschlüsselten Quellcode ansehen", + "Failed to update keywords": "Schlüsselwörter konnten nicht aktualisiert werden", + "Notes:": "Notizen:", + "remove %(name)s from the directory.": "entferne %(name)s aus dem Verzeichnis.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Die Benachrichtigungen zu den folgenden Schlüsselwörtern folgen Regeln, die hier nicht angezeigt werden können:", + "Safari and Opera work too.": "Safari und Opera sind weitere Alternativen.", + "Please set a password!": "Bitte setze ein Passwort!", + "You have successfully set a password!": "Du hast erfolgreich ein Passwort gesetzt!", + "An error occurred whilst saving your email notification preferences.": "Beim Speichern deiner E-Mail-Benachrichtigungseinstellungen ist ein Fehler aufgetreten.", + "Explore Room State": "Raum-Status erkunden", + "Source URL": "Quell-URL", + "Messages sent by bot": "Nachrichten von Bots", + "Filter results": "Ergebnisse filtern", + "Members": "Mitglieder", + "No update available.": "Kein Update verfügbar.", + "Noisy": "Laut", + "Failed to get protocol list from Home Server": "Fehler beim Abrufen der Protokoll-Liste vom Home-Server", + "Collecting app version information": "App-Versionsinformationen werden abgerufen", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Soll der Raum-Alias %(alias)s gelöscht und der %(name)s aus dem Verzeichnis entfernt werden?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Dies erlaubt dir, dich wieder an deinem Konto anzumelden, nachdem du dich abgemeldet hast.", + "Keywords": "Schlüsselwörter", + "Enable notifications for this account": "Benachrichtigungen für dieses Benutzerkonto aktivieren", + "Directory": "Raum-Verzeichnis", + "Invite to this community": "In diese Community einladen", + "Failed to get public room list": "Die Liste der öffentlichen Räume konnte nicht geladen werden", + "Messages containing keywords": "Nachrichten, die Schlüsselwörter enthalten", + "Error saving email notification preferences": "Fehler beim Speichern der E-Mail-Benachrichtigungseinstellungen", + "Tuesday": "Dienstag", + "Enter keywords separated by a comma:": "Schlüsselwörter kommagetrennt eingeben:", + "Forward Message": "Nachricht weiterleiten", + "You have successfully set a password and an email address!": "Du hast erfolgreich ein Passwort und eine E-Mail-Adresse gesetzt!", + "Remove %(name)s from the directory?": "Soll der Raum %(name)s aus dem Verzeichnis entfernt werden?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot nutzt zahlreiche fortgeschrittene Browser-Funktionen, die teilweise in deinem aktuell verwendeten Browser noch nicht verfügbar sind oder sich noch im experimentellen Status befinden.", + "Developer Tools": "Entwicklerwerkzeuge", + "Preparing to send logs": "Senden von Logs wird vorbereitet", + "Enable desktop notifications": "Desktop-Benachrichtigungen aktivieren", + "Remember, you can always set an email address in user settings if you change your mind.": "Vergiss nicht, dass du in den Benutzereinstellungen jederzeit eine E-Mail-Adresse setzen kannst, wenn du deine Meinung änderst.", + "Explore Account Data": "Benutzerkonto-Daten analysieren", + "All messages (noisy)": "Alle Nachrichten (laut)", + "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:", + "You must specify an event type!": "Du musst einen Event-Typ spezifizieren!", + "(HTTP status %(httpStatus)s)": "(HTTP-Status %(httpStatus)s)", + "Invite to this room": "In diesen Raum einladen", + "Please install Chrome or Firefox for the best experience.": "Bitte installiere Chrome oder Firefox für ein optimales Anwendungsergebnis.", + "Wednesday": "Mittwoch", + "You cannot delete this message. (%(code)s)": "Diese Nachricht kann nicht gelöscht werden. (%(code)s)", + "Quote": "Zitat", + "Send logs": "Logdateien übermitteln", + "All messages": "Alle Nachrichten", + "Call invitation": "Anruf-Einladung", + "Downloading update...": "Update wird heruntergeladen...", + "State Key": "Status-Schlüssel", + "Failed to send custom event.": "Senden des benutzerdefinierten Events fehlgeschlagen.", + "What's new?": "Was ist neu?", + "Notify me for anything else": "Über alles andere benachrichtigen", + "When I'm invited to a room": "Wenn ich in einen Raum eingeladen werde", + "Can't update user notification settings": "Benachrichtigungs-Einstellungen des Benutzers konnten nicht aktualisiert werden", + "Notify for all other messages/rooms": "Benachrichtigungen für alle anderen Mitteilungen/Räume aktivieren", + "Unable to look up room ID from server": "Es ist nicht möglich, die Raum-ID auf dem Server nachzuschlagen", + "Couldn't find a matching Matrix room": "Konnte keinen entsprechenden Matrix-Raum finden", + "All Rooms": "In allen Räumen", + "Search for a room": "Nach einem Raum suchen", + "Thursday": "Donnerstag", + "Search…": "Suchen…", + "Logs sent": "Logs gesendet", + "Back": "Zurück", + "Reply": "Antworten", + "Show message in desktop notification": "Nachricht in der Desktop-Benachrichtigung anzeigen", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Fehlerberichte enthalten Anwendungsdaten wie deinen Nutzernamen, Raum- und Gruppen-ID's und Aliase die du besucht hast sowie Nutzernamen anderer Nutzer. Sie enthalten keine Nachrichten.", + "Unhide Preview": "Vorschau wieder anzeigen", + "Unable to join network": "Es ist nicht möglich, dem Netzwerk beizutreten", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du hast sie eventuell auf einem anderen Matrix-Client und nicht in Riot konfiguriert. Sie können in Riot nicht verändert werden, gelten aber trotzdem", + "Sorry, your browser is not able to run Riot.": "Es tut uns leid, aber dein Browser kann Riot nicht ausführen.", + "Messages in group chats": "Nachrichten in Gruppen-Chats", + "Yesterday": "Gestern", + "Error encountered (%(errorDetail)s).": "Es ist ein Fehler aufgetreten (%(errorDetail)s).", + "Login": "Anmeldung", + "Low Priority": "Niedrige Priorität", + "Unable to fetch notification target list": "Liste der Benachrichtigungsempfänger konnte nicht abgerufen werden", + "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", + "Missing roomId.": "Fehlende Raum-ID.", + "Picture": "Bild", + "Every page you use in the app": "Jede Seite, die du in der App benutzt", + "e.g. ": "z.B. ", + "Your User Agent": "Deine Browser-Kennung", + "Your device resolution": "Deine Bildschirmauflösung", + "Popout widget": "Widget ausklinken", + "Always show encryption icons": "Immer Verschlüsselungssymbole zeigen", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Aktuell ist es nicht möglich mit einer Datei zu antworten, sodass diese gesendet wird ohne eine Antwort zu sein.", + "Unable to reply": "Antworten nicht möglich", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Das Ereignis auf das geantwortet wurde könnte nicht geladen werden, da es entweder nicht existiert oder du keine Berechtigung hast, dieses anzusehen.", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Riot-Fehler werden auf GitHub festgehalten: Erzeuge ein GitHub-Issue.", + "Log out and remove encryption keys?": "Abmelden und alle Verschlüsselungs-Schlüssel löschen?", + "Send Logs": "Sende Protokoll", + "Clear Storage and Sign Out": "Speicher leeren und abmelden", + "Refresh": "Neu laden", + "We encountered an error trying to restore your previous session.": "Wir haben ein Problem beim Wiederherstellen deiner vorherigen Sitzung festgestellt.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Den Browser-Speicher zu löschen kann das Problem lösen, wird dich aber abmelden und verschlüsselte Chats unlesbar machen.", + "Collapse Reply Thread": "Antwort-Thread zusammenklappen", + "At this time it is not possible to reply with an emote.": "An dieser Stelle ist es nicht möglich mit einer Umschreibung zu antworten.", + "Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren" } diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index 4974268999..fabd88c74a 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. Παρακαλώ γράψε τον κωδικό επαλήθευσης που περιέχει", @@ -49,7 +48,6 @@ "Blacklisted": "Στη μαύρη λίστα", "Can't load user settings": "Δεν είναι δυνατή η φόρτωση των ρυθμίσεων χρήστη", "Change Password": "Αλλαγή κωδικού πρόσβασης", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "Ο %(senderName)s άλλαξε το όνομά του από %(oldDisplayName)s σε %(displayName)s.", "%(senderName)s changed their profile picture.": "Ο %(senderName)s άλλαξε τη φωτογραφία του προφίλ του.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "Ο %(senderDisplayName)s άλλαξε το όνομα του δωματίου σε %(roomName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "Ο %(senderDisplayName)s άλλαξε το θέμα σε \"%(topic)s\".", @@ -59,7 +57,7 @@ "%(senderDisplayName)s removed the room name.": "Ο %(senderDisplayName)s διέγραψε το όνομα του δωματίου.", "Changes your display nickname": "Αλλάζει το ψευδώνυμο χρήστη", "Conference call failed.": "Η κλήση συνδιάσκεψης απέτυχε.", - "powered by Matrix": "βασισμένο στο πρωτόκολλο Matrix", + "powered by Matrix": "βασισμένο στο Matrix", "Confirm password": "Επιβεβαίωση κωδικού πρόσβασης", "Confirm your new password": "Επιβεβαίωση του νέου κωδικού πρόσβασης", "Continue": "Συνέχεια", @@ -118,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": "Ο διακομιστής είναι", @@ -263,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 δεν είναι ορατό", @@ -317,7 +313,6 @@ "Use with caution": "Χρησιμοποιήστε τα με προσοχή", "User ID": "Αναγνωριστικό χρήστη", "User Interface": "Διεπαφή χρήστη", - "%(user)s is a": "Ο %(user)s είναι", "User name": "Όνομα χρήστη", "Username invalid: %(errMessage)s": "Μη έγκυρο όνομα χρήστη: %(errMessage)s", "Users": "Χρήστες", @@ -389,7 +384,6 @@ "Device key": "Κλειδί συσκευής", "Verify device": "Επιβεβαίωση συσκευής", "Unable to restore session": "Αδυναμία επαναφοράς συνεδρίας", - "Continue anyway": "Συνέχεια οπωσδήποτε", "Unknown devices": "Άγνωστες συσκευές", "Unknown Address": "Άγνωστη διεύθυνση", "Blacklist": "Μαύρη λίστα", @@ -407,8 +401,6 @@ "What does this mean?": "Τι σημαίνει αυτό;", "Error decrypting audio": "Σφάλμα κατά την αποκρυπτογράφηση του ήχου", "Error decrypting image": "Σφάλμα κατά την αποκρυπτογράφηση της εικόνας", - "Image '%(Body)s' cannot be displayed.": "Η εικόνα '%(Body)s' δεν μπορεί να εμφανιστεί.", - "This image cannot be displayed.": "Αυτή η εικόνα δεν μπορεί να εμφανιστεί.", "Error decrypting video": "Σφάλμα κατά την αποκρυπτογράφηση του βίντεο", "Add an Integration": "Προσθήκη ενσωμάτωσης", "URL Previews": "Προεπισκόπηση συνδέσμων", @@ -467,7 +459,6 @@ "No users have specific privileges in this room": "Κανένας χρήστης δεν έχει συγκεκριμένα δικαιώματα σε αυτό το δωμάτιο", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Μόλις ενεργοποιηθεί η κρυπτογράφηση για ένα δωμάτιο, δεν μπορεί να απενεργοποιηθεί ξανά (για τώρα)", "Only people who have been invited": "Μόνο άτομα που έχουν προσκληθεί", - "Otherwise, click here to send a bug report.": "Διαφορετικά, κάντε κλικ εδώ για να αποστείλετε μια αναφορά σφάλματος.", "%(senderName)s placed a %(callType)s call.": "Ο %(senderName)s πραγματοποίησε μια %(callType)s κλήση.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Παρακαλούμε ελέγξτε την ηλεκτρονική σας αλληλογραφία και κάντε κλικ στον σύνδεσμο που περιέχει. Μόλις γίνει αυτό, κάντε κλίκ στο κουμπί συνέχεια.", "Refer a friend to Riot:": "Πείτε για το Riot σε έναν φίλο σας:", @@ -522,11 +513,9 @@ "Please select the destination room for this message": "Παρακαλούμε επιλέξτε ένα δωμάτιο προορισμού για αυτό το μήνυμα", "Desktop specific": "Μόνο για επιφάνεια εργασίας", "Analytics": "Αναλυτικά δεδομένα", - "Opt out of analytics": "Αποκλεισμός αναλυτικών δεδομένων", "Riot collects anonymous analytics to allow us to improve the application.": "Το Riot συλλέγει ανώνυμα δεδομένα επιτρέποντας μας να βελτιώσουμε την εφαρμογή.", "Failed to invite": "Δεν ήταν δυνατή η πρόσκληση", "Failed to invite user": "Δεν ήταν δυνατή η πρόσκληση του χρήστη", - "This action is irreversible.": "Αυτή η ενέργεια είναι μη αναστρέψιμη.", "In future this verification process will be more sophisticated.": "Στο μέλλον η διαδικασία επαλήθευσης θα είναι πιο εξελιγμένη.", "I verify that the keys match": "Επιβεβαιώνω πως ταιριάζουν τα κλειδιά", "\"%(RoomName)s\" contains devices that you haven't seen before.": "Το \"%(RoomName)s\" περιέχει συσκευές που δεν έχετε ξαναδεί.", @@ -623,10 +612,8 @@ "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Το αρχείο εξαγωγής θα επιτρέψει σε οποιονδήποτε που μπορεί να το διαβάσει να αποκρυπτογραφήσει κρυπτογραφημένα μηνύματα που εσείς μπορείτε να δείτε, οπότε θα πρέπει να είστε προσεκτικοί για να το κρατήσετε ασφαλές. Για να βοηθήσετε με αυτό, θα πρέπει να εισαγάγετε ένα συνθηματικό, το οποία θα χρησιμοποιηθεί για την κρυπτογράφηση των εξαγόμενων δεδομένων. Η εισαγωγή δεδομένων θα είναι δυνατή χρησιμοποιώντας μόνο το ίδιο συνθηματικό.", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Αυτή η διαδικασία σας επιτρέπει να εισαγάγετε κλειδιά κρυπτογράφησης που έχετε προηγουμένως εξάγει από άλλο πρόγραμμα του Matrix. Στη συνέχεια, θα μπορέσετε να αποκρυπτογραφήσετε τυχόν μηνύματα που το άλλο πρόγραμμα θα μπορούσε να αποκρυπτογραφήσει.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Το αρχείο εξαγωγής θα είναι προστατευμένο με συνθηματικό. Θα χρειαστεί να πληκτρολογήσετε το συνθηματικό εδώ για να αποκρυπτογραφήσετε το αρχείο.", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Με αυτόν τον τρόπο, ο λογαριασμός σας θα είναι μόνιμα αχρησιμοποίητος. Δεν θα μπορείτε να εγγραφείτε ξανά με το ίδιο αναγνωριστικό χρήστη.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Για να βεβαιωθείτε ότι είναι αξιόπιστη αυτή η συσκευή, επικοινωνήστε με τον κάτοχο της χρησιμοποιώντας άλλα μέσα (π.χ. προσωπικά ή μέσω τηλεφώνου) και ρωτήστε εάν το κλειδί που βλέπετε στις ρυθμίσεις χρήστη για αυτήν τη συσκευή ταιριάζει με το παρακάτω κλειδί:", "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.": "Εάν ταιριάζει, πατήστε το κουμπί επιβεβαίωσης παρακάτω. Εάν όχι, τότε κάποιος άλλος παρακολουθεί αυτή τη συσκευή και ίσως θέλετε να πατήσετε το κουμπί της μαύρης λίστας.", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Παρουσιάστηκε ένα σφάλμα κατά την προσπάθεια επαναφοράς της προηγούμενης συνεδρίας. Αν συνεχίσετε, θα χρειαστεί να συνδεθείτε ξανά και το κρυπτογραφημένο ιστορικό συνομιλιών θα είναι μη αναγνώσιμο.", "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, η συνεδρία σας ίσως είναι μη συμβατή με αυτήν την έκδοση. Κλείστε αυτό το παράθυρο και επιστρέψτε στην πιο πρόσφατη έκδοση.", "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.": "Σας συνιστούμε να ολοκληρώσετε τη διαδικασία επαλήθευσης για κάθε συσκευή και να επιβεβαιώσετε ότι ανήκουν στον νόμιμο κάτοχό της, αλλά εάν προτιμάτε μπορείτε να στείλετε ξανά το μήνυμα χωρίς επαλήθευση.", @@ -645,5 +632,147 @@ "Your unverified device '%(displayName)s' is requesting encryption keys.": "Η ανεπιβεβαίωτη συσκευή σας '%(displayName)s' ζητά κλειδιά κρυπτογράφησης.", "Encryption key request": "Αίτημα κλειδιού κρυπτογράφησης", "Updates": "Ενημερώσεις", - "Check for update": "Έλεγχος για ενημέρωση" + "Check for update": "Έλεγχος για ενημέρωση", + "Fetching third party location failed": "Η λήψη τοποθεσίας απέτυχε", + "A new version of Riot is available.": "Μία νέα έκδοση του Riot είναι διαθέσιμη.", + "All notifications are currently disabled for all targets.": "Όλες οι ειδοποιήσεις είναι προς το παρόν απενεργοποιημένες για όλες τις συσκευές.", + "Uploading report": "Αποστολή αναφοράς", + "Sunday": "Κυριακή", + "Guests can join": "Επισκέπτες μπορούν να συνδεθούν", + "Failed to add tag %(tagName)s to room": "Δεν ήταν δυνατή η προσθήκη της ετικέτας %(tagName)s στο δωμάτιο", + "Notification targets": "Στόχοι ειδοποιήσεων", + "Failed to set direct chat tag": "Δεν ήταν δυνατός ο χαρακτηρισμός της συνομιλίας ως 1-προς-1", + "Today": "Σήμερα", + "Files": "Αρχεία", + "You are not receiving desktop notifications": "Δεν λαμβάνετε ειδοποιήσεις στην επιφάνεια εργασίας", + "Friday": "Παρασκευή", + "Update": "Ενημέρωση", + "Riot does not know how to join a room on this network": "To Riot δεν γνωρίζει πως να συνδεθεί σε δωμάτια που ανήκουν σ' αυτό το δίκτυο", + "Add an email address above to configure email notifications": "Προσθέστε μια διεύθυνση ηλεκτρονικής αλληλογραφίας στο παραπάνω πεδίο, για να έχετε τη δυνατότητα να λαμβάνετε ειδοποιήσεις", + "Expand panel": "Μεγιστοποίηση καρτέλας", + "On": "Ενεργό", + "Filter room names": "Φιλτράρισμα δωματίων", + "Changelog": "Αλλαγές", + "Waiting for response from server": "Αναμονή απάντησης από τον διακομιστή", + "Leave": "Αποχώρηση", + "Uploaded on %(date)s by %(user)s": "Απεστάλη στις %(date)s από %(user)s", + "Advanced notification settings": "Προχωρημένες ρυθμίσεις ειδοποιήσεων", + "delete the alias.": "διέγραψε το ψευδώνυμο.", + "To return to your account in future you need to set a password": "Για να επιστρέψετε στον λογαριασμό σας μελλοντικα πρέπει να ορίσετε έναν κωδικό πρόσβασης", + "Forget": "Παράλειψη", + "World readable": "Εμφανές σε όλους", + "Hide panel": "Απόκρυψη καρτέλας", + "You cannot delete this image. (%(code)s)": "Δεν μπορείτε να διαγράψετε αυτή την εικόνα. (%(code)s)", + "Cancel Sending": "Ακύρωση αποστολής", + "Warning": "Προειδοποίηση", + "This Room": "Στο δωμάτιο", + "The Home Server may be too old to support third party networks": "Ο διακομιστής μπορεί να είναι αρκετά παλιός για να υποστηρίζει δίκτυα τρίτων", + "Resend": "Αποστολή ξανά", + "Room not found": "Το δωμάτιο δεν βρέθηκε", + "Messages containing my display name": "Μηνύματα που περιέχουν το όνομα μου", + "Messages in one-to-one chats": "Μηνύματα σε 1-προς-1 συνομιλίες", + "Unavailable": "Μη διαθέσιμο", + "View Decrypted Source": "Προβολή του αποκρυπτογραφημένου κώδικα", + "Send": "Αποστολή", + "remove %(name)s from the directory.": "αφαίρεση του %(name)s από το ευρετήριο.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Οι ειδοποιήσεις για τις επόμενες λέξεις κλειδία ακολουθούν κανόνες που δεν είναι δυνατόν να εμφανιστούν εδώ:", + "Please set a password!": "Παρακαλούμε ορίστε έναν κωδικό πρόσβασης!", + "You have successfully set a password!": "Ο κωδικός πρόσβασης ορίστηκε επιτυχώς!", + "An error occurred whilst saving your email notification preferences.": "Ένα σφάλμα προέκυψε κατά την αποθήκευση των ρυθμίσεων σας.", + "Source URL": "Πηγαίο URL", + "Messages sent by bot": "Μηνύματα από bots", + "Members": "Μέλη", + "No update available.": "Δεν υπάρχει διαθέσιμη ενημέρωση.", + "Noisy": "Δυνατά", + "Failed to get protocol list from Home Server": "Δεν ήταν δυνατή η εύρεση των διαθέσιμων πρωτοκόλλων από το διακομιστή", + "Collecting app version information": "Συγκέντρωση πληροφοριών σχετικά με την έκδοση της εφαρμογής", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Διαγραφή του ψευδώνυμου %(alias)s και αφαίρεση του %(name)s από το ευρετήριο;", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Αυτό θα σας επιτρέψει να επιστρέψετε στον λογαριασμό σας αφού αποσυνδεθείτε και συνδεθείτε από άλλες συσκευές.", + "Keywords": "Λέξεις κλειδιά", + "Enable notifications for this account": "Ενεργοποίηση ειδοποιήσεων για τον λογαριασμό", + "Directory": "Ευρετήριο", + "Search for a room": "Αναζήτηση δωματίου", + "Messages containing keywords": "Μηνύματα που περιέχουν λέξεις κλειδιά", + "Error saving email notification preferences": "Σφάλμα κατά την αποθήκευση των προτιμήσεων", + "Tuesday": "Τρίτη", + "Enter keywords separated by a comma:": "Προσθέστε λέξεις κλειδιά χωρισμένες με κόμμα:", + "I understand the risks and wish to continue": "Κατανοώ του κινδύνους και επιθυμώ να συνεχίσω", + "Remove %(name)s from the directory?": "Αφαίρεση του %(name)s από το ευρετήριο;", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Το Riot χρησιμοποιεί αρκετά προχωρημένα χαρακτηριστικά των περιηγητών Ιστού, ορισμένα από τα οποία δεν είναι διαθέσιμα ή είναι σε πειραματικό στάδιο στον περιηγητή σας.", + "Unnamed room": "Ανώνυμο δωμάτιο", + "Remove from Directory": "Αφαίρεση από το ευρετήριο", + "Saturday": "Σάββατο", + "Remember, you can always set an email address in user settings if you change your mind.": "Να θυμάστε ότι μπορείτε πάντα να ορίσετε μια διεύθυνση ηλεκτρονικής αλληλογραφίας στις ρυθμίσεις χρήστη αν αλλάξετε γνώμη.", + "Direct Chat": "Απευθείας συνομιλία", + "The server may be unavailable or overloaded": "Ο διακομιστής είναι μη διαθέσιμος ή υπερφορτωμένος", + "Reject": "Απόρριψη", + "Failed to set Direct Message status of room": "Δεν ήταν δυνατός ο ορισμός της κατάστασης Direct Message του δωματίου", + "Monday": "Δευτέρα", + "All messages (noisy)": "Όλα τα μηνύματα (δυνατά)", + "Enable them now": "Ενεργοποίηση", + "Forward Message": "Προώθηση", + "Messages containing my user name": "Μηνύματα που περιέχουν το ψευδώνυμο μου", + "Collecting logs": "Συγκέντρωση πληροφοριών", + "more": "περισσότερα", + "Failed to get public room list": "Δεν ήταν δυνατή η λήψη της λίστας με τα δημόσια δωμάτια", + "(HTTP status %(httpStatus)s)": "(Κατάσταση HTTP %(httpStatus)s)", + "All Rooms": "Όλα τα δωμάτια", + "Wednesday": "Τετάρτη", + "Failed to update keywords": "Οι λέξεις κλειδιά δεν ενημερώθηκαν", + "Send logs": "Αποστολή πληροφοριών", + "All messages": "Όλα τα μηνύματα", + "Call invitation": "Πρόσκληση σε κλήση", + "Downloading update...": "Γίνεται λήψη της ενημέρωσης...", + "You have successfully set a password and an email address!": "Ο κωδικός πρόσβασης και η διεύθυνση ηλεκτρονικής αλληλογραφίας ορίστηκαν επιτυχώς!", + "What's new?": "Τι νέο υπάρχει;", + "Notify me for anything else": "Ειδοποίηση για οτιδήποτε άλλο", + "When I'm invited to a room": "Όταν με προσκαλούν σ' ένα δωμάτιο", + "Can't update user notification settings": "Δεν είναι δυνατή η ενημέρωση των ρυθμίσεων ειδοποίησης χρήστη", + "Notify for all other messages/rooms": "Ειδοποίηση για όλα τα υπόλοιπα μηνύματα/δωμάτια", + "Unable to look up room ID from server": "Δεν είναι δυνατή η εύρεση του ID για το δωμάτιο", + "Couldn't find a matching Matrix room": "Δεν βρέθηκε κάποιο δωμάτιο", + "Invite to this room": "Πρόσκληση σε αυτό το δωμάτιο", + "You cannot delete this message. (%(code)s)": "Δεν μπορείτε να διαγράψετε αυτό το μήνυμα. (%(code)s)", + "Thursday": "Πέμπτη", + "Search…": "Αναζήτηση…", + "Unhide Preview": "Προεπισκόπηση", + "Unable to join network": "Δεν είναι δυνατή η σύνδεση στο δίκτυο", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Ισως να έχετε κάνει τις ρυθμίσεις σε άλλη εφαρμογή εκτός του Riot. Δεν μπορείτε να τις αλλάξετε μέσω του Riot αλλά ισχύουν κανονικά", + "Sorry, your browser is not able to run Riot.": "Λυπούμαστε, αλλά ο περιηγητές σας δεν υποστηρίζεται από το Riot.", + "Messages in group chats": "Μηνύματα σε ομαδικές συνομιλίες", + "Yesterday": "Χθές", + "Error encountered (%(errorDetail)s).": "Παρουσιάστηκε σφάλμα (%(errorDetail)s).", + "Low Priority": "Χαμηλή προτεραιότητα", + "What's New": "Τι νέο υπάρχει", + "Set Password": "Ορισμός κωδικού πρόσβασης", + "Enable audible notifications in web client": "Ενεργοποίηση ηχητικών ειδοποιήσεων", + "Permalink": "Μόνιμος σύνδεσμος", + "Off": "Ανενεργό", + "#example": "#παράδειγμα", + "Mentions only": "Μόνο αναφορές", + "Failed to remove tag %(tagName)s from room": "Δεν ήταν δυνατή η διαγραφή της ετικέτας %(tagName)s από το δωμάτιο", + "You can now return to your account after signing out, and sign in on other devices.": "Μπορείτε να επιστρέψετε στον λογαριασμό σας αφού αποσυνδεθείτε και συνδεθείτε από άλλες συσκευές.", + "Enable desktop notifications": "Ενεργοποίηση ειδοποιήσεων στην επιφάνεια εργασίας", + "Enable email notifications": "Ενεργοποίηση ειδοποιήσεων μέσω μηνυμάτων ηλ. αλληλογραφίας", + "Login": "Σύνδεση", + "No rooms to show": "Δεν υπάρχουν δωμάτια για εμφάνιση", + "Download this file": "Λήψη αρχείου", + "Failed to change settings": "Δεν ήταν δυνατή η αλλαγή των ρυθμίσεων", + "View Source": "Προβολή κώδικα", + "Unable to fetch notification target list": "Δεν ήταν δυνατή η εύρεση στόχων για τις ειδοποιήσεις", + "Quote": "Παράθεση", + "Collapse panel": "Ελαχιστοποίηση καρτέλας", + "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Με τον τρέχον περιηγητή, η εμφάνιση και η αίσθηση της εφαρμογής ενδέχεται να είναι εντελώς εσφαλμένη και ορισμένες ή όλες οι λειτουργίες ενδέχεται να μην λειτουργούν. Εάν θέλετε να το δοκιμάσετε ούτως ή άλλως μπορείτε να συνεχίσετε, αλλά είστε μόνοι σας σε ό, τι αφορά τα προβλήματα που μπορεί να αντιμετωπίσετε!", + "Checking for an update...": "Γίνεται έλεγχος για ενημέρωση...", + "There are advanced notifications which are not shown here": "Υπάρχουν προχωρημένες ειδοποιήσεις οι οποίες δεν εμφανίζονται εδώ", + "Your identity server's URL": "Το URL του διακομιστή ταυτοποίησής σας", + "The platform you're on": "Η πλατφόρμα στην οποία βρίσκεστε", + "The version of Riot.im": "Η έκδοση του Riot.im", + "Your language of choice": "Η γλώσσα επιλογής σας", + "Your homeserver's URL": "Το URL του διακομιστή σας", + "Every page you use in the app": "Κάθε σελίδα που χρησιμοποιείτε στην εφαρμογή", + "e.g. ": "π.χ. ", + "Your device resolution": "Η ανάλυση της συσκευής σας", + "The information being sent to us to help make Riot.im better includes:": "Οι πληροφορίες που στέλνονται σε εμάς με σκοπό την βελτίωση του Riot.im περιλαμβάνουν:", + "Call Failed": "Η κλήση απέτυχε" } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 0d686ad490..41f1780425 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2,6 +2,22 @@ "This email address is already in use": "This email address is already in use", "This phone number is already in use": "This phone number is already in use", "Failed to verify email address: make sure you clicked the link in the email": "Failed to verify email address: make sure you clicked the link in the email", + "The platform you're on": "The platform you're on", + "The version of Riot.im": "The version of Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Whether or not you're logged in (we don't record your user name)", + "Your language of choice": "Your language of choice", + "Which officially provided instance you are using, if any": "Which officially provided instance you are using, if any", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Whether or not you're using the Richtext mode of the Rich Text Editor", + "Your homeserver's URL": "Your homeserver's URL", + "Your identity server's URL": "Your identity server's URL", + "e.g. %(exampleValue)s": "e.g. %(exampleValue)s", + "Every page you use in the app": "Every page you use in the app", + "e.g. ": "e.g. ", + "Your User Agent": "Your User Agent", + "Your device resolution": "Your device resolution", + "Analytics": "Analytics", + "The information being sent to us to help make Riot.im better includes:": "The information being sent to us to help make Riot.im better includes:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.", "Call Failed": "Call Failed", "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.", "Review Devices": "Review Devices", @@ -49,6 +65,7 @@ "AM": "AM", "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", "Who would you like to add to this community?": "Who would you like to add to this community?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID", @@ -87,6 +104,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.", @@ -118,7 +136,7 @@ "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.", "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s changed their display name to %(displayName)s.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.", @@ -172,7 +190,6 @@ "Failed to join room": "Failed to join room", "Message Replies": "Message Replies", "Message Pinning": "Message Pinning", - "Presence Management": "Presence Management", "Tag Panel": "Tag Panel", "Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing", "Use compact timeline layout": "Use compact timeline layout", @@ -184,20 +201,34 @@ "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)", "Always show message timestamps": "Always show message timestamps", "Autoplay GIFs and videos": "Autoplay GIFs and videos", + "Always show encryption icons": "Always show encryption icons", "Enable automatic language detection for syntax highlighting": "Enable automatic language detection for syntax highlighting", "Hide avatars in user and room mentions": "Hide avatars in user and room mentions", "Disable big emoji in chat": "Disable big emoji in chat", "Don't send typing notifications": "Don't send typing notifications", "Automatically replace plain text Emoji": "Automatically replace plain text Emoji", "Mirror local video feed": "Mirror local video feed", + "Disable Community Filter Panel": "Disable Community Filter Panel", "Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls", - "Opt out of analytics": "Opt out of analytics", + "Send analytics data": "Send analytics data", "Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device", "Never send encrypted messages to unverified devices in this room from this device": "Never send encrypted messages to unverified devices in this room from this device", "Enable inline URL previews by default": "Enable inline URL previews by default", "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", + "Enable widget screenshots on supported widgets": "Enable widget screenshots on supported widgets", + "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", @@ -239,6 +270,33 @@ "Failed to set display name": "Failed to set display name", "Disable Notifications": "Disable Notifications", "Enable Notifications": "Enable Notifications", + "Error saving email notification preferences": "Error saving email notification preferences", + "An error occurred whilst saving your email notification preferences.": "An error occurred whilst saving your email notification preferences.", + "Keywords": "Keywords", + "Enter keywords separated by a comma:": "Enter keywords separated by a comma:", + "OK": "OK", + "Failed to change settings": "Failed to change settings", + "Can't update user notification settings": "Can't update user notification settings", + "Failed to update keywords": "Failed to update keywords", + "Messages containing keywords": "Messages containing keywords", + "Notify for all other messages/rooms": "Notify for all other messages/rooms", + "Notify me for anything else": "Notify me for anything else", + "Enable notifications for this account": "Enable notifications for this account", + "All notifications are currently disabled for all targets.": "All notifications are currently disabled for all targets.", + "Add an email address above to configure email notifications": "Add an email address above to configure email notifications", + "Enable email notifications": "Enable email notifications", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Notifications on the following keywords follow rules which can’t be displayed here:", + "Unable to fetch notification target list": "Unable to fetch notification target list", + "Notification targets": "Notification targets", + "Advanced notification settings": "Advanced notification settings", + "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply", + "Enable desktop notifications": "Enable desktop notifications", + "Show message in desktop notification": "Show message in desktop notification", + "Enable audible notifications in web client": "Enable audible notifications in web client", + "Off": "Off", + "On": "On", + "Noisy": "Noisy", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -251,6 +309,11 @@ "%(senderName)s sent a video": "%(senderName)s sent a video", "%(senderName)s uploaded a file": "%(senderName)s uploaded a file", "Options": "Options", + "Your key share request has been sent - please check your other devices for key share requests.": "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.": "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.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "If your other devices do not have the key for this message you will not be able to decrypt them.", + "Key request sent.": "Key request sent.", + "Re-request encryption keys from your other devices.": "Re-request encryption keys from your other devices.", "Undecryptable": "Undecryptable", "Encrypted by a verified device": "Encrypted by a verified device", "Encrypted by an unverified device": "Encrypted by an unverified device", @@ -297,6 +360,7 @@ "Filter room members": "Filter room members", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)", "Attachment": "Attachment", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "At this time it is not possible to reply with a file so this will be sent without being a reply.", "Upload Files": "Upload Files", "Are you sure you want to upload the following files?": "Are you sure you want to upload the following files?", "Encrypted room": "Encrypted room", @@ -304,8 +368,6 @@ "Hangup": "Hangup", "Voice call": "Voice call", "Video call": "Video call", - "Hide Apps": "Hide Apps", - "Show Apps": "Show Apps", "Upload file": "Upload file", "Show Text Formatting Toolbar": "Show Text Formatting Toolbar", "Send an encrypted reply…": "Send an encrypted reply…", @@ -319,6 +381,8 @@ "Server error": "Server error", "Server unavailable, overloaded, or something else went wrong.": "Server unavailable, overloaded, or something else went wrong.", "Command error": "Command error", + "Unable to reply": "Unable to reply", + "At this time it is not possible to reply with an emote.": "At this time it is not possible to reply with an emote.", "bold": "bold", "italic": "italic", "strike": "strike", @@ -346,8 +410,9 @@ "Idle": "Idle", "Offline": "Offline", "Unknown": "Unknown", - "Replying": "Replying", "Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Seen by %(displayName)s (%(userName)s) at %(dateTime)s", + "Replying": "Replying", "No rooms to show": "No rooms to show", "Unnamed room": "Unnamed room", "World readable": "World readable", @@ -418,9 +483,17 @@ "(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)", "Encryption is enabled in this room": "Encryption is enabled in this room", "Encryption is not enabled in this room": "Encryption is not enabled in this room", - "Privileged Users": "Privileged Users", - "%(user)s is a": "%(user)s is a", + "The default role for new room members is": "The default role for new room members is", + "To send messages, you must be a": "To send messages, you must be a", + "To invite users into the room, you must be a": "To invite users into the room, you must be a", + "To configure the room, you must be a": "To configure the room, you must be a", + "To kick users, you must be a": "To kick users, you must be a", + "To ban users, you must be a": "To ban users, you must be a", + "To remove other users' messages, you must be a": "To remove other users' messages, you must be a", "No users have specific privileges in this room": "No users have specific privileges in this room", + "%(user)s is a %(userRole)s": "%(user)s is a %(userRole)s", + "Privileged Users": "Privileged Users", + "Muted Users": "Muted Users", "Banned users": "Banned users", "This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers", "Leave room": "Leave room", @@ -429,6 +502,7 @@ "To link to a room it must have an address.": "To link to a room it must have an address.", "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.", "Click here to fix": "Click here to fix", + "To send events of type , you must be a": "To send events of type , you must be a", "Who can access this room?": "Who can access this room?", "Only people who have been invited": "Only people who have been invited", "Anyone who knows the room's link, apart from guests": "Anyone who knows the room's link, apart from guests", @@ -440,18 +514,18 @@ "Members only (since they were invited)": "Members only (since they were invited)", "Members only (since they joined)": "Members only (since they joined)", "Permissions": "Permissions", - "The default role for new room members is": "The default role for new room members is", - "To send messages, you must be a": "To send messages, you must be a", - "To invite users into the room, you must be a": "To invite users into the room, you must be a", - "To configure the room, you must be a": "To configure the room, you must be a", - "To kick users, you must be a": "To kick users, you must be a", - "To ban users, you must be a": "To ban users, you must be a", - "To remove other users' messages, you must be a": "To remove other users' messages, you must be a", - "To send events of type , you must be a": "To send events of type , you must be a", "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", @@ -478,14 +552,21 @@ "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", "Download %(text)s": "Download %(text)s", "Invalid file%(extra)s": "Invalid file%(extra)s", "Error decrypting image": "Error decrypting image", - "Image '%(Body)s' cannot be displayed.": "Image '%(Body)s' cannot be displayed.", - "This image cannot be displayed.": "This image cannot be displayed.", "Error decrypting video": "Error decrypting video", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", @@ -512,6 +593,7 @@ "Token incorrect": "Token incorrect", "A text message has been sent to %(msisdn)s": "A text message has been sent to %(msisdn)s", "Please enter the code it contains:": "Please enter the code it contains:", + "Code": "Code", "Start authentication": "Start authentication", "powered by Matrix": "powered by Matrix", "Username on %(hs)s": "Username on %(hs)s", @@ -554,8 +636,25 @@ "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.", + "Help improve Riot by sending usage data? This will use a cookie. (See our cookie and privacy policies).": "Help improve Riot by sending usage data? This will use a cookie. (See our cookie and privacy policies).", + "Help improve Riot by sending usage data? This will use a cookie.": "Help improve Riot by sending usage data? This will use a cookie.", + "Yes please": "Yes please", + "You are not receiving desktop notifications": "You are not receiving desktop notifications", + "Enable them now": "Enable them now", + "What's New": "What's New", + "Update": "Update", + "What's new?": "What's new?", + "A new version of Riot is available.": "A new version of Riot is available.", + "To return to your account in future you need to set a password": "To return to your account in future you need to set a password", + "Set Password": "Set Password", + "Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).", + "Checking for an update...": "Checking for an update...", + "No update available.": "No update available.", + "Downloading update...": "Downloading update...", + "Warning": "Warning", "Unknown Address": "Unknown Address", "NOTE: Apps are not end-to-end encrypted": "NOTE: Apps are not end-to-end encrypted", + "Warning: This widget might use cookies.": "Warning: This widget might use cookies.", "Do you want to load widget from URL:": "Do you want to load widget from URL:", "Allow": "Allow", "Delete Widget": "Delete Widget", @@ -563,6 +662,8 @@ "Delete widget": "Delete widget", "Revoke widget access": "Revoke widget access", "Minimize apps": "Minimize apps", + "Popout widget": "Popout widget", + "Picture": "Picture", "Edit": "Edit", "Create new room": "Create new room", "Unblacklist": "Unblacklist", @@ -573,6 +674,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", @@ -632,7 +736,8 @@ "expand": "expand", "Custom of %(powerLevel)s": "Custom of %(powerLevel)s", "Custom level": "Custom level", - "Quote": "Quote", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.", + "In reply to ": "In reply to ", "Room directory": "Room directory", "Start chat": "Start chat", "And %(count)s more...|other": "And %(count)s more...", @@ -643,6 +748,18 @@ "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", + "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.", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Riot bugs are tracked on GitHub: 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:", @@ -651,6 +768,7 @@ "Start Chatting": "Start Chatting", "Confirm Removal": "Confirm Removal", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.", + "Community IDs cannot not be empty.": "Community IDs cannot not be empty.", "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Community IDs may only contain characters a-z, 0-9, or '=_-./'", "Something went wrong whilst creating your community": "Something went wrong whilst creating your community", "Create Community": "Create Community", @@ -664,11 +782,16 @@ "Advanced options": "Advanced options", "Block users on other matrix homeservers from joining this room": "Block users on other matrix homeservers from joining this room", "This setting cannot be changed later!": "This setting cannot be changed later!", + "Failed to indicate account erasure": "Failed to indicate account erasure", "Unknown error": "Unknown error", "Incorrect password": "Incorrect password", "Deactivate Account": "Deactivate Account", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "This will make your account permanently unusable. You will not be able to re-register the same user ID.", - "This action is irreversible.": "This action is irreversible.", + "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.", + "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.": "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.", + "Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.", + "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)", + "To continue, please enter your password:": "To continue, please enter your password:", + "password": "password", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:", "Device name": "Device name", "Device key": "Device key", @@ -676,8 +799,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", @@ -685,11 +821,15 @@ "Ignore request": "Ignore request", "Loading device info...": "Loading device info...", "Encryption key request": "Encryption key request", - "Otherwise, click here to send a bug report.": "Otherwise, click here to send a bug report.", + "Sign out": "Sign out", + "Log out and remove encryption keys?": "Log out and remove encryption keys?", + "Clear Storage and Sign Out": "Clear Storage and Sign Out", + "Send Logs": "Send Logs", + "Refresh": "Refresh", "Unable to restore session": "Unable to restore session", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.", + "We encountered an error trying to restore your previous session.": "We encountered an error trying to restore your previous session.", "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.": "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.", - "Continue anyway": "Continue anyway", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.", "Invalid Email Address": "Invalid Email Address", "This doesn't appear to be a valid email address": "This doesn't appear to be a valid email address", "Verification Pending": "Verification Pending", @@ -706,6 +846,14 @@ "To get started, please pick a username!": "To get started, please pick a username!", "This will be your account name on the homeserver, or you can pick a different server.": "This will be your account name on the homeserver, or you can pick a different server.", "If you already have a Matrix account you can log in instead.": "If you already have a Matrix account you can log in instead.", + "You have successfully set a password!": "You have successfully set a password!", + "You have successfully set a password and an email address!": "You have successfully set a password and an email address!", + "You can now return to your account after signing out, and sign in on other devices.": "You can now return to your account after signing out, and sign in on other devices.", + "Remember, you can always set an email address in user settings if you change your mind.": "Remember, you can always set an email address in user settings if you change your mind.", + "Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?", + "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)", + "Please set a password!": "Please set a password!", + "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", "Room contains unknown devices": "Room contains unknown devices", @@ -715,6 +863,35 @@ "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", + "Collapse Reply Thread": "Collapse Reply Thread", + "Failed to set Direct Message status of room": "Failed to set Direct Message status of room", + "All messages (noisy)": "All messages (noisy)", + "All messages": "All messages", + "Mentions only": "Mentions only", + "Leave": "Leave", + "Forget": "Forget", + "Reject": "Reject", + "Low Priority": "Low Priority", + "Direct Chat": "Direct Chat", + "View Community": "View Community", + "Sorry, your browser is not able to run Riot.": "Sorry, your browser is not able to run Riot.", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.", + "Please install Chrome or Firefox for the best experience.": "Please install Chrome or Firefox for the best experience.", + "Safari and Opera work too.": "Safari and Opera work too.", + "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!", + "I understand the risks and wish to continue": "I understand the risks and wish to continue", "Name": "Name", "Topic": "Topic", "Make this room private": "Make this room private", @@ -741,57 +918,94 @@ "Failed to update community": "Failed to update community", "Unable to accept invite": "Unable to accept invite", "Unable to reject invite": "Unable to reject invite", + "Unable to join community": "Unable to join community", "Leave Community": "Leave Community", "Leave %(groupName)s?": "Leave %(groupName)s?", - "Leave": "Leave", - "Unable to leave room": "Unable to leave room", + "Unable to leave community": "Unable to leave community", "Community Settings": "Community Settings", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.", "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "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": "Add rooms to this community", "Featured Rooms:": "Featured Rooms:", "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", "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!", "Long Description (HTML)": "Long Description (HTML)", "Description": "Description", "Community %(groupId)s not found": "Community %(groupId)s not found", "This Home server does not support communities": "This Home server does not support communities", "Failed to load %(groupId)s": "Failed to load %(groupId)s", + "Couldn't load home page": "Couldn't load home page", + "Login": "Login", "Reject invitation": "Reject invitation", "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?", "Failed to reject invitation": "Failed to reject invitation", + "This room is not public. You will not be able to rejoin without an invite.": "This room is not public. You will not be able to rejoin without an invite.", "Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?", "Failed to leave room": "Failed to leave room", "Signed Out": "Signed Out", "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.", - "Cryptography data migrated": "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.": "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.", + "Terms and Conditions": "Terms and Conditions", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.", + "Review terms and conditions": "Review terms and conditions", "Old cryptography data detected": "Old cryptography data detected", "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.": "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.", "Logout": "Logout", "Your Communities": "Your Communities", + "Did you know: you can use communities to filter your Riot.im experience!": "Did you know: you can use communities to filter your Riot.im experience!", + "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.", "Error whilst fetching joined communities": "Error whilst fetching joined communities", "Create a new community": "Create a new community", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.", "Join an existing community": "Join an existing community", "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.", "You have no visible notifications": "You have no visible notifications", + "Members": "Members", + "%(count)s Members|other": "%(count)s Members", + "%(count)s Members|one": "%(count)s Member", + "Invite to this room": "Invite to this room", + "Files": "Files", + "Notifications": "Notifications", + "Hide panel": "Hide panel", + "Invite to this community": "Invite to this community", + "Failed to get protocol list from Home Server": "Failed to get protocol list from Home Server", + "The Home Server may be too old to support third party networks": "The Home Server may be too old to support third party networks", + "Failed to get public room list": "Failed to get public room list", + "The server may be unavailable or overloaded": "The server may be unavailable or overloaded", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Delete the room alias %(alias)s and remove %(name)s from the directory?", + "Remove %(name)s from the directory?": "Remove %(name)s from the directory?", + "Remove from Directory": "Remove from Directory", + "remove %(name)s from the directory.": "remove %(name)s from the directory.", + "delete the alias.": "delete the alias.", + "Unable to join network": "Unable to join network", + "Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network", + "Room not found": "Room not found", + "Couldn't find a matching Matrix room": "Couldn't find a matching Matrix room", + "Fetching third party location failed": "Fetching third party location failed", + "Unable to look up room ID from server": "Unable to look up room ID from server", + "Directory": "Directory", + "Search for a room": "Search for a room", + "#example": "#example", "Scroll to bottom of page": "Scroll to bottom of page", "Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present", - "Show devices, mark devices known and send or cancel all.": "Show devices, mark devices known and send or cancel all.", + "Show devices, send anyway or cancel.": "Show devices, send anyway or cancel.", "%(count)s of your messages have not been sent.|other": "Some of your messages have not been sent.", "%(count)s of your messages have not been sent.|one": "Your message was not sent.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Resend all or cancel all now. You can also select individual messages to resend or cancel.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Resend message or cancel message now.", - "Warning": "Warning", "Connectivity to the server has been lost.": "Connectivity to the server has been lost.", "Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.", "%(count)s new messages|other": "%(count)s new messages", "%(count)s new messages|one": "%(count)s new message", "Active call": "Active call", "There's no one else here! Would you like to invite others or stop warning about the empty room?": "There's no one else here! Would you like to invite others or stop warning about the empty room?", + "more": "more", "You seem to be uploading files, are you sure you want to quit?": "You seem to be uploading files, are you sure you want to quit?", "You seem to be in a call, are you sure you want to quit?": "You seem to be in a call, are you sure you want to quit?", "Failed to upload file": "Failed to upload file", @@ -808,6 +1022,10 @@ "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.", "Failed to load timeline position": "Failed to load timeline position", @@ -819,9 +1037,7 @@ "Status.im theme": "Status.im theme", "Can't load user settings": "Can't load user settings", "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?", @@ -837,10 +1053,8 @@ "Device ID:": "Device ID:", "Device key:": "Device key:", "Ignored Users": "Ignored Users", - "Bug Report": "Bug Report", - "Found a bug?": "Found a bug?", - "Report it": "Report it", - "Analytics": "Analytics", + "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 contain 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 contain messages.", "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.", @@ -867,7 +1081,6 @@ "VoIP": "VoIP", "Email": "Email", "Add email address": "Add email address", - "Notifications": "Notifications", "Profile": "Profile", "Display name": "Display name", "Account": "Account", @@ -933,6 +1146,7 @@ "Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple", "Ignores a user, hiding their messages from you": "Ignores a user, hiding their messages from you", "Stops ignoring a user, showing their messages going forward": "Stops ignoring a user, showing their messages going forward", + "Opens the Developer Tools dialog": "Opens the Developer Tools dialog", "Commands": "Commands", "Results from DuckDuckGo": "Results from DuckDuckGo", "Emoji": "Emoji", @@ -968,15 +1182,7 @@ "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.", "File to import": "File to import", "Import": "Import", - "The information being sent to us to help make Riot.im better includes:": "The information being sent to us to help make Riot.im better includes:", - "We also record each page you use in the app (currently ), your User Agent () and your device resolution ().": "We also record each page you use in the app (currently ), your User Agent () and your device resolution ().", - "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.", - "The platform you're on": "The platform you're on", - "The version of Riot.im": "The version of Riot.im", - "Whether or not you're logged in (we don't record your user name)": "Whether or not you're logged in (we don't record your user name)", - "Your language of choice": "Your language of choice", - "Which officially provided instance you are using, if any": "Which officially provided instance you are using, if any", - "Whether or not you're using the Richtext mode of the Rich Text Editor": "Whether or not you're using the Richtext mode of the Rich Text Editor", - "Your homeserver's URL": "Your homeserver's URL", - "Your identity server's URL": "Your identity server's URL" + "Failed to set direct chat tag": "Failed to set direct chat tag", + "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", + "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room" } diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index ce606d3907..43e2041020 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -46,13 +46,11 @@ "Banned users": "Banned users", "Bans user with given id": "Bans user with given id", "Blacklisted": "Blacklisted", - "Bug Report": "Bug Report", "Bulk Options": "Bulk Options", "Call Timeout": "Call Timeout", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.", "Can't load user settings": "Can't load user settings", "Change Password": "Change Password", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.", @@ -160,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", @@ -283,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", @@ -315,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", @@ -480,7 +474,6 @@ "Start automatically after system login": "Start automatically after system login", "Desktop specific": "Desktop specific", "Analytics": "Analytics", - "Opt out of analytics": "Opt out of analytics", "Banned by %(displayName)s": "Banned by %(displayName)s", "Options": "Options", "Riot collects anonymous analytics to allow us to improve the application.": "Riot collects anonymous analytics to allow us to improve the application.", @@ -505,8 +498,6 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.", "Unknown error": "Unknown error", "Incorrect password": "Incorrect password", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "This will make your account permanently unusable. You will not be able to re-register the same user ID.", - "This action is irreversible.": "This action is irreversible.", "To continue, please enter your password.": "To continue, please enter your password.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:", "Device name": "Device name", @@ -515,10 +506,8 @@ "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", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.", "Unable to restore session": "Unable to restore session", "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.": "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.", - "Continue anyway": "Continue anyway", "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.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contains devices that you haven't seen before.", @@ -564,8 +553,6 @@ "What does this mean?": "What does this mean?", "Error decrypting audio": "Error decrypting audio", "Error decrypting image": "Error decrypting image", - "Image '%(Body)s' cannot be displayed.": "Image '%(Body)s' cannot be displayed.", - "This image cannot be displayed.": "This image cannot be displayed.", "Error decrypting video": "Error decrypting video", "Add an Integration": "Add an Integration", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?", @@ -614,7 +601,6 @@ "Last seen": "Last seen", "Level:": "Level:", "No display name": "No display name", - "Otherwise, click here to send a bug report.": "Otherwise, click here to send a bug report.", "Private Chat": "Private Chat", "Public Chat": "Public Chat", "Reason: %(reasonText)s": "Reason: %(reasonText)s", @@ -640,7 +626,6 @@ "Uploading %(filename)s and %(count)s others|one": "Uploading %(filename)s and %(count)s other", "Uploading %(filename)s and %(count)s others|other": "Uploading %(filename)s and %(count)s others", "Upload new:": "Upload new:", - "%(user)s is a": "%(user)s is a", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)", "Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s", "Verified": "Verified", @@ -712,5 +697,140 @@ "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s", "Robot check is currently unavailable on desktop - please use a web browser": "Robot check is currently unavailable on desktop - please use a web browser", "Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room." + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", + "Fetching third party location failed": "Fetching third party location failed", + "A new version of Riot is available.": "A new version of Riot is available.", + "Couldn't load home page": "Couldn't load home page", + "All notifications are currently disabled for all targets.": "All notifications are currently disabled for all targets.", + "Uploading report": "Uploading report", + "Sunday": "Sunday", + "Guests can join": "Guests can join", + "Messages sent by bot": "Messages sent by bot", + "Notification targets": "Notification targets", + "Failed to set direct chat tag": "Failed to set direct chat tag", + "Today": "Today", + "Failed to get protocol list from Home Server": "Failed to get protocol list from Home Server", + "You are not receiving desktop notifications": "You are not receiving desktop notifications", + "Friday": "Friday", + "Update": "Update", + "What's New": "What's New", + "Add an email address above to configure email notifications": "Add an email address above to configure email notifications", + "Expand panel": "Expand panel", + "On": "On", + "Filter room names": "Filter room names", + "Changelog": "Changelog", + "Waiting for response from server": "Waiting for response from server", + "Leave": "Leave", + "Advanced notification settings": "Advanced notification settings", + "delete the alias.": "delete the alias.", + "To return to your account in future you need to set a password": "To return to your account in future you need to set a password", + "Forget": "Forget", + "World readable": "World readable", + "#example": "#example", + "Hide panel": "Hide panel", + "You cannot delete this image. (%(code)s)": "You cannot delete this image. (%(code)s)", + "Cancel Sending": "Cancel Sending", + "Warning": "Warning", + "This Room": "This Room", + "The Home Server may be too old to support third party networks": "The Home Server may be too old to support third party networks", + "Noisy": "Noisy", + "Room not found": "Room not found", + "Messages containing my display name": "Messages containing my display name", + "Messages in one-to-one chats": "Messages in one-to-one chats", + "Unavailable": "Unavailable", + "View Decrypted Source": "View Decrypted Source", + "Failed to update keywords": "Failed to update keywords", + "remove %(name)s from the directory.": "remove %(name)s from the directory.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Notifications on the following keywords follow rules which can’t be displayed here:", + "Please set a password!": "Please set a password!", + "You have successfully set a password!": "You have successfully set a password!", + "An error occurred whilst saving your email notification preferences.": "An error occurred while saving your email notification preferences.", + "Source URL": "Source URL", + "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room", + "Members": "Members", + "No update available.": "No update available.", + "Resend": "Resend", + "Files": "Files", + "Collecting app version information": "Collecting app version information", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Delete the room alias %(alias)s and remove %(name)s from the directory?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.", + "Keywords": "Keywords", + "Unpin Message": "Unpin Message", + "Enable notifications for this account": "Enable notifications for this account", + "Directory": "Directory", + "Failed to get public room list": "Failed to get public room list", + "Messages containing keywords": "Messages containing keywords", + "Error saving email notification preferences": "Error saving email notification preferences", + "Tuesday": "Tuesday", + "Enter keywords separated by a comma:": "Enter keywords separated by a comma:", + "Search…": "Search…", + "Remove %(name)s from the directory?": "Remove %(name)s from the directory?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.", + "Enable desktop notifications": "Enable desktop notifications", + "Unnamed room": "Unnamed room", + "Remember, you can always set an email address in user settings if you change your mind.": "Remember, you can always set an email address in user settings if you change your mind.", + "All messages (noisy)": "All messages (noisy)", + "Saturday": "Saturday", + "I understand the risks and wish to continue": "I understand the risks and wish to continue", + "Direct Chat": "Direct Chat", + "The server may be unavailable or overloaded": "The server may be unavailable or overloaded", + "Reject": "Reject", + "Failed to set Direct Message status of room": "Failed to set Direct Message status of room", + "Monday": "Monday", + "Remove from Directory": "Remove from Directory", + "Enable them now": "Enable them now", + "Messages containing my user name": "Messages containing my user name", + "Collecting logs": "Collecting logs", + "more": "more", + "Search for a room": "Search for a room", + "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)", + "All Rooms": "All Rooms", + "Wednesday": "Wednesday", + "Quote": "Quote", + "Send": "Send", + "Send logs": "Send logs", + "All messages": "All messages", + "Call invitation": "Call invitation", + "Downloading update...": "Downloading update...", + "You have successfully set a password and an email address!": "You have successfully set a password and an email address!", + "What's new?": "What's new?", + "Notify me for anything else": "Notify me for anything else", + "When I'm invited to a room": "When I'm invited to a room", + "Can't update user notification settings": "Can't update user notification settings", + "Notify for all other messages/rooms": "Notify for all other messages/rooms", + "Unable to look up room ID from server": "Unable to look up room ID from server", + "Couldn't find a matching Matrix room": "Couldn't find a matching Matrix room", + "Invite to this room": "Invite to this room", + "You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)", + "Thursday": "Thursday", + "Forward Message": "Forward Message", + "Unhide Preview": "Unhide Preview", + "Unable to join network": "Unable to join network", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply", + "Sorry, your browser is not able to run Riot.": "Sorry, your browser is not able to run Riot.", + "Uploaded on %(date)s by %(user)s": "Uploaded on %(date)s by %(user)s", + "Messages in group chats": "Messages in group chats", + "Yesterday": "Yesterday", + "Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).", + "Low Priority": "Low Priority", + "Unable to fetch notification target list": "Unable to fetch notification target list", + "Set Password": "Set Password", + "Enable audible notifications in web client": "Enable audible notifications in web client", + "Permalink": "Permalink", + "Off": "Off", + "Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network", + "Mentions only": "Mentions only", + "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", + "You can now return to your account after signing out, and sign in on other devices.": "You can now return to your account after signing out, and sign in on other devices.", + "Enable email notifications": "Enable email notifications", + "Login": "Login", + "No rooms to show": "No rooms to show", + "Download this file": "Download this file", + "Pin Message": "Pin Message", + "Failed to change settings": "Failed to change settings", + "View Source": "View Source", + "Collapse panel": "Collapse panel", + "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!", + "Checking for an update...": "Checking for an update...", + "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here" } diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 409c2054cb..68645ffd9c 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -115,7 +115,6 @@ "%(senderName)s requested a VoIP conference.": "%(senderName)s petis rettelefonan vokon.", "%(senderName)s invited %(targetName)s.": "%(senderName)s invitis uzanton %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s forbaris uzanton %(targetName)s.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s ŝanĝis sian vidigan nomon de %(oldDisplayName)s al %(displayName)s.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s agordis sian vidigan nomon al %(displayName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s forigis sian vidigan nomon (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s forigis sian profilbildon.", @@ -166,7 +165,6 @@ "Authentication check failed: incorrect password?": "Aŭtentiga kontrolo malsukcesis: ĉu pro malĝusta pasvorto?", "Failed to join room": "Malsukcesis aliĝi al ĉambro", "Message Pinning": "Fikso de mesaĝoj", - "Presence Management": "Ĉeesta administrado", "Tag Panel": "Etikeda panelo", "Disable Emoji suggestions while typing": "Malŝalti mienetajn sugestojn dum tajpado", "Use compact timeline layout": "Uzi densan okazordan aranĝon", @@ -194,7 +192,6 @@ "Automatically replace plain text Emoji": "Aŭtomate anstataŭigi tekstajn mienetojn", "Mirror local video feed": "Speguli lokan videon", "Disable Peer-to-Peer for 1:1 calls": "Malŝalti samtavolajn duopajn vokojn", - "Opt out of analytics": "Malpermesi datuman analizon", "Never send encrypted messages to unverified devices from this device": "Neniam sendi neĉifritajn mesaĝojn al nekontrolitaj aparatoj de tiu ĉi aparato", "Never send encrypted messages to unverified devices in this room from this device": "Neniam sendi ĉifritajn mesaĝojn al nekontrolitaj aparatoj en tiu ĉi ĉambro de tiu ĉi aparto", "Enable inline URL previews by default": "Ŝalti entekstan antaŭrigardon al retadresoj", @@ -308,8 +305,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", @@ -418,7 +413,6 @@ "Encryption is enabled in this room": "Ĉifrado estas ŝaltita en tiu ĉi ĉambro", "Encryption is not enabled in this room": "Ĉifrado ne estas ŝaltita en tiu ĉi ĉambro", "Privileged Users": "Privilegiuloj", - "%(user)s is a": "%(user)s estas", "No users have specific privileges in this room": "Neniuj uzantoj havas specialajn privilegiojn en tiu ĉi ĉambro", "Banned users": "Forbaritaj uzantoj", "This room is not accessible by remote Matrix servers": "Ĉi tiu ĉambro ne atingeblas por foraj serviloj de Matrix", @@ -480,8 +474,6 @@ "Download %(text)s": "Elŝuti %(text)s", "Invalid file%(extra)s": "Malvalida dosiero%(extra)s", "Error decrypting image": "Eraro malĉifrante bildon", - "Image '%(Body)s' cannot be displayed.": "Bildo ‹%(Body)s› ne montreblas.", - "This image cannot be displayed.": "Ĉi tiu bildo ne montreblas.", "Error decrypting video": "Eraro malĉifrante videon", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s forigis la ĉambran profilbildon.", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s agordis la ĉambran profilbildon al ", @@ -660,8 +652,6 @@ "Unknown error": "Nekonata eraro", "Incorrect password": "Malĝusta pasvorto", "Deactivate Account": "Malaktivigi konton", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Tio ĉi por ĉiam senuzebligos vian konton. Vi ne povos reregistriĝi kun la sama identigaĵo.", - "This action is irreversible.": "Tiu ĉi ago ne malfareblas.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Por kontroli ke tiu ĉi aparato estas fidinda, bonvolu kontakti ties posedanton per alia maniero (ekz-e persone aŭ telefone) kaj demandi ĝin ĉu la ŝlosilo, kiun ĝi vidas en agordoj de uzanto ĉe si, kongruas kun la ĉi-suba ŝlosilo:", "Device name": "Aparata nomo", "Device key": "Aparata ŝlosilo", @@ -678,11 +668,8 @@ "Ignore request": "Malatenti peton", "Loading device info...": "Enleganta informojn pri aparato…", "Encryption key request": "Peto por ĉifra ŝlosilo", - "Otherwise, click here to send a bug report.": "Alie, klaku ĉi tie por sendi cimraporton.", "Unable to restore session": "Seanco ne restaŭreblas", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Okazis eraron dum restaŭro de via antaŭa seanco. Se vi daŭrigos, vi devos denove saluti, kaj ĉifrita babila historio estos nelegebla.", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Se vi antaŭe uzis pli novan version de Riot, via seanco eble ne kongruos kun ĉi tiu versio. Fermu ĉi tiun fenestron kaj revenu al la pli nova versio.", - "Continue anyway": "Tamen daŭrigi", "Invalid Email Address": "Malvalida retpoŝtadreso", "This doesn't appear to be a valid email address": "Tio ĉi ne ŝajnas esti valida retpoŝtadreso", "Verification Pending": "Atendanta kontrolon", @@ -733,7 +720,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:", @@ -753,8 +739,6 @@ "Are you sure you want to leave the room '%(roomName)s'?": "Ĉu vi certe volas forlasi la ĉambron ‹%(roomName)s›?", "Failed to leave room": "Malsukcesis forlasi la ĉambron", "Signed Out": "Adiaŭinta", - "Cryptography data migrated": "Kriptografiaj datumoj transmetiĝis", - "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.": "Unufoja transmeto de kriptografiaj datumoj fariĝis. Ĝiscela ĉifrado ne funkcios se vi revenos al pli malnova versio de Riot. Se vi bezonas ĝiscelan ĉifradon ĉe pli malnova versio, adiaŭu unue. Por reteni mesaĝan historion, elportu kaj reenportu viajn ŝlosilojn.", "Old cryptography data detected": "Malnovaj kriptografiaj datumoj troviĝis", "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Datumoj el malnova versio de Riot troviĝis. Ĉi tio malfunkciigos ĝiscelan ĉifradon en la malnova versio. Ĝiscele ĉifritaj mesaĝoj interŝanĝitaj freŝtempe per la malnova versio eble ne malĉifreblos. Tio povas kaŭzi malsukceson ankaŭ al mesaĝoj interŝanĝitaj kun tiu ĉi versio. Se vin trafos problemoj, adiaŭu kaj resalutu. Por reteni mesaĝan historion, elportu kaj reenportu viajn ŝlosilojn.", "Logout": "Adiaŭi", @@ -767,7 +751,6 @@ "You have no visible notifications": "Neniuj videblaj sciigoj", "Scroll to bottom of page": "Rulumi al susbo de la paĝo", "Message not sent due to unknown devices being present": "Mesaĝoj ne sendiĝis pro ĉeesto de nekonataj aparatoj", - "Show devices or cancel all.": "Montri aparatojnnuligi ĉiujn.", "Connectivity to the server has been lost.": "Konekto al la servilo perdiĝis.", "Sent messages will be stored until your connection has returned.": "Senditaj mesaĝoj konserviĝos ĝis via konekto refunkcios.", "%(count)s new messages|other": "%(count)s novaj mesaĝoj", @@ -818,9 +801,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", @@ -946,5 +926,182 @@ "Import": "Enporti", "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Forigo de fenestraĵo efektiviĝos por ĉiuj uzantoj en ĉi tiu ĉambro. Ĉu vi certe volas ĝin forigi?", "Unblacklist": "Repermesi legadon de ĉifritaj mesaĝoj", - "none": "neniu" + "none": "neniu", + "The version of Riot.im": "Tiu ĉi versio de Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Ĉu vi salutis aŭ ne (ni ne registras vian salutnomon)", + "Your language of choice": "Via preferata lingvo", + "The information being sent to us to help make Riot.im better includes:": "Informoj sendataj al ni por plibonigi la servon Riot.im inkluzivas:", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ŝanĝis sian vidigan nomon al %(displayName)s.", + "Send an encrypted reply…": "Sendi ĉifritan respondon…", + "Send a reply (unencrypted)…": "Sendi respondon (neĉifritan)…", + "Send an encrypted message…": "Sendi ĉifritan mesaĝon…", + "Send a message (unencrypted)…": "Sendi mesaĝon (neĉifritan)…", + "Replying": "Respondanta", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privato gravas al ni, tial ni ne kolektas personajn aŭ spureblajn datumojn por nia analizo.", + "Learn more about how we use analytics.": "Lernu pli pri nia uzo de analiziloj.", + "Your homeserver's URL": "URL de via servilo", + "Your identity server's URL": "URL de via identiga servilo", + "The platform you're on": "Via sistemtipo", + "Which officially provided instance you are using, if any": "Kiun oficiale disponeblan aperon vi uzas, se iun ajn", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Ĉu vi uzas la riĉtekstan reĝimon de la riĉteksta redaktilo aŭ ne", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Kiam ĉi tiu paĝo enhavas identigeblajn informojn, ekzemple ĉambron, uzantan aŭ grupan identigilon, ĝi sendiĝas al la servilo sen tiuj.", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", + "Disable Community Filter Panel": "Malŝalti komunuman filtran breton", + "Failed to add tag %(tagName)s to room": "Malsukcesis aldoni etikedon %(tagName)s al ĉambro", + "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 set a password": "Por reveni al via konto estonte, vi devas agordi pasvorton", + "Forget": "Forgesi", + "#example": "#ekzemplo", + "Hide panel": "Kaŝi panelon", + "You cannot delete this image. (%(code)s)": "Vi ne povas forigi tiun ĉi bildon. (%(code)s)", + "Cancel Sending": "Nuligi sendon", + "This Room": "Ĉi tiu ĉambro", + "The Home Server may be too old to support third party networks": "La hejmservilo povas esti tro malnova por subteni retojn de eksteraj liverantoj", + "Noisy": "Brua", + "Room not found": "Ĉambro ne troviĝis", + "Messages containing my display name": "Mesaĝoj enhavantaj mian vidigan nomon", + "Messages in one-to-one chats": "Mesaĝoj en duopaj babiloj", + "Unavailable": "Nedisponebla", + "View Decrypted Source": "Vidi malĉifritan fonton", + "Failed to update keywords": "Malsukcesis ĝisdatigi la ŝlosilvortojn", + "remove %(name)s from the directory.": "forigi %(name)s de la ujo.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "La sciigoj de la jenaj ŝlosilvortoj sekvas regulojn kiuj ne povas esti montrataj ĉi tie:", + "Safari and Opera work too.": "Ankaŭ Safario kaj Opero funkcias.", + "Please set a password!": "Bonvolu agordi pasvorton!", + "You have successfully set a password!": "Vi sukcese agordis pasvorton!", + "An error occurred whilst saving your email notification preferences.": "Eraro okazis dum konservado de agordoj pri retpoŝtaj sciigoj.", + "Explore Room State": "Esplori staton de ĉambro", + "Source URL": "Fonta URL", + "Messages sent by bot": "Mesaĝoj senditaj per roboto", + "Filter results": "Filtri rezultojn", + "Members": "Anoj", + "No update available.": "Neniuj ĝisdatigoj haveblas.", + "Resend": "Resendi", + "Failed to get protocol list from Home Server": "Malsukcesis akiri liston de protokoloj el la hejmservilo", + "Collecting app version information": "Kolektanta informon pri versio de la aplikaĵo", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ĉu forigi la ĉambran kromnomon %(alias)s kaj forigi %(name)s de la ujo?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Tio ĉi permesos al vi reveni al via konto post adiaŭo, kaj saluti kun alia aparato.", + "Enable notifications for this account": "Ŝalti sciigojn por tiu ĉi konto", + "Directory": "Dosierujo", + "Invite to this community": "Inviti al tiu ĉi komunumo", + "Failed to get public room list": "Malsukcesis akiri liston de publikaj ĉambroj", + "Messages containing keywords": "Mesaĝoj enhavantaj ŝlosilovortojn", + "Error saving email notification preferences": "Eraro konservante agordojn pri retpoŝtaj sciigoj", + "Tuesday": "Mardo", + "Enter keywords separated by a comma:": "Entajpu ŝlosilvortojn apartigitajn per komoj:", + "Search…": "Serĉi…", + "You have successfully set a password and an email address!": "Vi sukcese agordis pasvorton kaj retpoŝtadreson!", + "Remove %(name)s from the directory?": "Ĉu forigi %(name)s de la ujo?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uzas multajn specialajn funkciojn, el kiuj kelkaj ne disponeblas aŭ estas eksperimentaj en via nuna foliumilo.", + "Event sent!": "Okazo sendiĝis!", + "Explore Account Data": "Esplori kontajn datumojn", + "All messages (noisy)": "Ĉiuj mesaĝoj (lauta)", + "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", + "You must specify an event type!": "Vi devas specifi tipon de okazo!", + "(HTTP status %(httpStatus)s)": "(stato de HTTP %(httpStatus)s)", + "Invite to this room": "Inviti al ĉi tiu ĉambro", + "Please install Chrome or Firefox for the best experience.": "Bonvolu instali ĤromonFajrovulpon por plej bona sperto.", + "Wednesday": "Merkredo", + "You cannot delete this message. (%(code)s)": "Vi ne povas forigi tiun ĉi mesaĝon. (%(code)s)", + "Quote": "Citi", + "Send logs": "Sendi protokolojn", + "All messages": "Ĉiuj mesaĝoj", + "Call invitation": "Invito al voko", + "Downloading update...": "Elŝutanta ĝisdatigon…", + "State Key": "Stata ŝlosilo", + "Failed to send custom event.": "Malsukcesis sendi propran okazon.", + "What's new?": "Kio novas?", + "Notify me for anything else": "Sciigu min pri ĉio alia", + "When I'm invited to a room": "Kiam mi estas invitita al ĉambro", + "Keywords": "Ŝlosilvortoj", + "Can't update user notification settings": "Agordoj de sciigoj al uzanto ne ĝisdatigeblas", + "Notify for all other messages/rooms": "Sciigu min por ĉiu alia babilejo", + "Unable to look up room ID from server": "Ĉambra identigaĵo ne akireblas de la servilo", + "Couldn't find a matching Matrix room": "Malsukcesis trovi kongruan ĉambron en Matrix", + "All Rooms": "Ĉiuj babilejoj", + "Search for a room": "Serĉi ĉambron", + "Thursday": "Ĵaŭdo", + "Forward Message": "Plusendi mesaĝon", + "Back": "Reen", + "Failed to change settings": "Malsukcesis ŝanĝi la agordojn", + "Reply": "Respondi", + "Show message in desktop notification": "Montradi mesaĝojn en labortablaj sciigoj", + "Unhide Preview": "Malkaŝi antaŭrigardon", + "Unable to join network": "Malsukcesis konektiĝi al la reto", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Vi eble agordis ilin en alia kliento. Vi ne povas agordi ilin en Riot, sed ili ankoraŭ validas", + "Sorry, your browser is not able to run Riot.": "Pardonu, via foliumilo ne kapablas funkciigi klienton Riot.", + "Uploaded on %(date)s by %(user)s": "Alŝutita je %(date)s de %(user)s", + "Messages in group chats": "Mesaĝoj en grupaj babiloj", + "Yesterday": "Hieraŭ", + "Error encountered (%(errorDetail)s).": "Eraro okazis (%(errorDetail)s).", + "Login": "Saluti", + "Low Priority": "Malalta prioritato", + "Unable to fetch notification target list": "Malsukcesis akiri la liston de celoj por sciigoj", + "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", + "Logs sent": "Protokolo sendiĝis", + "GitHub issue link:": "Ligilo al raporto ĉe GitHub:", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Sencimigaj protokoloj enhavas informojn pri uzo de aplikaĵo, inkluzive vian salutnomon, la identigilojn aŭ nomojn de la ĉambroj aŭ grupoj kiujn vi vizitis, kaj la salutnomojn de aliaj uzantoj. Ili ne enhavas mesaĝojn.", + "Failed to send logs: ": "Malsukcesis sendi protokolon: ", + "Notes:": "Rimarkoj:", + "Preparing to send logs": "Pretiganta sendon de protokolo" } diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index ff28d339d0..8e7925ba36 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -29,13 +29,11 @@ "Banned users": "Usuarios bloqueados", "Bans user with given id": "Bloquear usuario por ID", "Blacklisted": "En lista negra", - "Bug Report": "Reporte de fallo", "Bulk Options": "Opciones masivas", "Call Timeout": "Tiempo de espera de la llamada", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "No se puede conectar al servidor via HTTP, cuando es necesario un enlace HTTPS en la barra de direcciones de tu navegador. Ya sea usando HTTPS o habilitando los scripts inseguros.", "Can't load user settings": "No se puede cargar las configuraciones del usuario", "Change Password": "Cambiar clave", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s ha cambiado su nombre de %(oldDisplayName)s a %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s ha cambiado su foto de perfil.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha cambiado el nivel de acceso de %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ha cambiado el nombre de la sala a %(roomName)s.", @@ -133,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", @@ -228,7 +225,6 @@ "Start chat": "Comenzar chat", "New Password": "Nueva contraseña", "Analytics": "Analíticas", - "Opt out of analytics": "No participar en las analíticas", "Options": "Opciones", "Passphrases must match": "Las contraseñas deben coincidir", "Passphrase must not be empty": "La contraseña no puede estar en blanco", @@ -244,7 +240,6 @@ "Failed to invite the following users to the %(roomName)s room:": "No se pudo invitar a los siguientes usuarios a la sala %(roomName)s:", "Unknown error": "Error desconocido", "Incorrect password": "Contraseña incorrecta", - "This action is irreversible.": "Esta acción es irreversible.", "To continue, please enter your password.": "Para continuar, introduzca su contraseña.", "Device name": "Nombre del dispositivo", "Device Name": "Nombre del dispositivo", @@ -253,7 +248,6 @@ "Verify device": "Verifique el dispositivo", "I verify that the keys match": "Confirmo que las claves coinciden", "Unable to restore session": "No se puede recuperar la sesión", - "Continue anyway": "Continuar igualmente", "Room Colour": "Color de la sala", "Room contains unknown devices": "La sala contiene dispositivos desconocidos", "Room name (optional)": "Nombre de la sala (opcional)", @@ -347,7 +341,6 @@ "Once encryption is enabled for a room it cannot be turned off again (for now)": "Una vez se active el cifrado en esta sala, no podrá ser desactivado (por ahora)", "Only people who have been invited": "Sólo usuarios que han sido invitados", "Operation failed": "Falló la operación", - "Otherwise, click here to send a bug report.": "También puede pulsar aquí para enviar un informe de fallos.", "Password": "Contraseña", "Password:": "Contraseña:", "Passwords can't be empty": "Las contraseñas no pueden estar en blanco", @@ -377,7 +370,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", @@ -429,12 +421,10 @@ "Changes colour scheme of current room": "Cambia el esquema de colores de esta sala", "Delete widget": "Eliminar widget", "Define the power level of a user": "Definir el nivel de poder de los usuarios", - "Edit": "Edita", + "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.", @@ -473,7 +463,6 @@ "Use with caution": "Usar con precaución", "User ID": "Identificación de usuario", "User Interface": "Interfaz de usuario", - "%(user)s is a": "%(user)s es un", "User name": "Nombre de usuario", "Username invalid: %(errMessage)s": "Nombre de usuario no válido: %(errMessage)s", "Users": "Usuarios", @@ -560,7 +549,7 @@ "Jun": "Jun", "Jul": "Jul", "Aug": "August", - "Add rooms to this community": "Agrega salas a esta comunidad", + "Add rooms to this community": "Agregar salas a esta comunidad", "Call Failed": "La llamada falló", "Review Devices": "Revisar Dispositivos", "Call Anyway": "Llamar de todas formas", @@ -570,5 +559,186 @@ "Sep": "Sep", "Oct": "Oct", "Nov": "Nov", - "Dec": "Dic" + "Dec": "Dic", + "Warning": "Advertencia", + "Unpin Message": "Desmarcar Mensaje", + "Online": "Conectado", + "Submit debug logs": "Enviar registros de depuración", + "The platform you're on": "La plataforma en la que te encuentras", + "The version of Riot.im": "La versión de Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Estés identificado o no (no almacenamos tu nombre de usuario)", + "Your language of choice": "El idioma que has elegido", + "Your homeserver's URL": "La URL de tu homeserver", + "Your identity server's URL": "La URL de tu servidor de identidad", + "The information being sent to us to help make Riot.im better includes:": "La información remitida a nosotros para ayudar a mejorar Riot.im incluye:", + "Drop here to demote": "Suelta aquí para degradar", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Estés o no usando el modo Richtext del Editor de Texto Enriquecido", + "Who would you like to add to this community?": "¿A quién deseas añadir a esta comunidad?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Aviso: cualquier persona que añadas a una comunidad será públicamente visible a cualquiera que conozca el ID de la comunidad", + "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?", + "Fetching third party location failed": "Falló la obtención de la ubicación de un tercero", + "A new version of Riot is available.": "Una nueva versión de Riot está disponible.", + "I understand the risks and wish to continue": "Entiendo los riesgos y deseo continuar", + "Couldn't load home page": "No se puede cargar la página principal", + "Send Account Data": "Enviar Datos de la Cuenta", + "Advanced notification settings": "Configuración avanzada de notificaciones", + "Uploading report": "Enviando informe", + "Sunday": "Domingo", + "Guests can join": "Los invitados se pueden unir", + "Failed to add tag %(tagName)s to room": "Error al añadir la etiqueta %(tagName)s a la sala", + "Notification targets": "Objetivos de notificación", + "Failed to set direct chat tag": "Error al establecer la etiqueta de chat directo", + "Today": "Hoy", + "Files": "Archivos", + "You are not receiving desktop notifications": "No estás recibiendo notificaciones de escritorio", + "Friday": "Viernes", + "Update": "Actualizar", + "What's New": "Novedades", + "Add an email address above to configure email notifications": "Añade una dirección de correo arriba para configurar las notificaciones por correo", + "Expand panel": "Expandir panel", + "On": "Encendido", + "%(count)s Members|other": "%(count)s miembros", + "Filter room names": "Filtrar los nombres de las salas", + "Changelog": "Registro de cambios", + "Waiting for response from server": "Esperando una respuesta del servidor", + "Leave": "Salir", + "Uploaded on %(date)s by %(user)s": "Subido el %(date)s por %(user)s", + "Send Custom Event": "Enviar Evento Personalizado", + "All notifications are currently disabled for all targets.": "Las notificaciones estan desactivadas para todos los objetivos.", + "Failed to send logs: ": "Error al enviar registros: ", + "delete the alias.": "borrar el alias.", + "To return to your account in future you need to set a password": "Para regresar a tu cuenta en el futuro debes establecer una contraseña", + "Forget": "Olvidar", + "World readable": "Legible por todo el mundo", + "Hide panel": "Ocultar panel", + "You cannot delete this image. (%(code)s)": "No puedes eliminar esta imagen. (%(code)s)", + "Cancel Sending": "Cancelar envío", + "This Room": "Esta sala", + "The Home Server may be too old to support third party networks": "El Home Server puede ser demasiado antiguo para soportar redes de terceros", + "Resend": "Reenviar", + "Room not found": "Sala no encontrada", + "Messages containing my display name": "Mensajes que contienen mi nombre", + "Messages in one-to-one chats": "Mensajes en chats uno a uno", + "Unavailable": "No disponible", + "View Decrypted Source": "Ver Fuente Descifrada", + "Failed to update keywords": "Error al actualizar las palabras clave", + "Notes:": "Notas:", + "remove %(name)s from the directory.": "retirar %(name)s del directorio.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Las notificaciones de las siguientes palabras clave siguen reglas que no se pueden mostrar aquí:", + "Safari and Opera work too.": "Safari y Opera también funcionan.", + "Please set a password!": "¡Por favor establece una contraseña!", + "You have successfully set a password!": "¡Has establecido una nueva contraseña!", + "An error occurred whilst saving your email notification preferences.": "Se ha producido un error al guardar las preferencias de notificación por email.", + "Explore Room State": "Explorar Estado de la Sala", + "Source URL": "URL de Origen", + "Messages sent by bot": "Mensajes enviados por bot", + "Filter results": "Filtrar resultados", + "Members": "Miembros", + "No update available.": "No hay actualizaciones disponibles.", + "Noisy": "Ruidoso", + "Failed to get protocol list from Home Server": "Error al obtener la lista de protocolos desde el Home Server", + "Collecting app version information": "Recolectando información de la versión de la aplicación", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "¿Borrar el alias de la sala %(alias)s y eliminar %(name)s del directorio?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Esto te permitirá regresar a tu cuenta después de cerrar sesión, así como iniciar sesión en otros dispositivos.", + "Keywords": "Palabras clave", + "Enable notifications for this account": "Habilitar notificaciones para esta cuenta", + "Directory": "Directorio", + "Invite to this community": "Invitar a esta comunidad", + "Search for a room": "Buscar sala", + "Messages containing keywords": "Mensajes que contienen palabras clave", + "Error saving email notification preferences": "Error al guardar las preferencias de notificación por email", + "Tuesday": "Martes", + "Enter keywords separated by a comma:": "Introduzca palabras clave separadas por una coma:", + "Search…": "Buscar…", + "You have successfully set a password and an email address!": "¡Has establecido una nueva contraseña y dirección de correo electrónico!", + "Remove %(name)s from the directory?": "¿Retirar %(name)s del directorio?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot usa muchas características avanzadas del navegador, algunas de las cuales no están disponibles en su navegador actual.", + "Event sent!": "Evento enviado!", + "Preparing to send logs": "Preparando para enviar registros", + "Enable desktop notifications": "Habilitar notificaciones de escritorio", + "Unnamed room": "Sala sin nombre", + "Explore Account Data": "Explorar Datos de la Cuenta", + "Remove from Directory": "Retirar del Directorio", + "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:", + "You must specify an event type!": "Debes especificar un tipo de evento!", + "(HTTP status %(httpStatus)s)": "(estado HTTP %(httpStatus)s)", + "Invite to this room": "Invitar a esta sala", + "Please install Chrome or Firefox for the best experience.": "Por favor instala Chrome o Firefox para una experiencia óptima.", + "Failed to get public room list": "No se pudo obtener la lista de salas públicas", + "Send": "Enviar", + "Send logs": "Enviar registros", + "All messages": "Todos los mensajes", + "Call invitation": "Invitación a la llamada", + "Thank you!": "¡Gracias!", + "Downloading update...": "Descargando actualizaciones...", + "State Key": "Clave de estado", + "Failed to send custom event.": "Ha fallado el envio del evento personalizado.", + "What's new?": "¿Qué hay de nuevo?", + "Notify me for anything else": "Notificarme para cualquier otra cosa", + "When I'm invited to a room": "Cuando estoy invitado a una sala", + "Can't update user notification settings": "No se puede actualizar la configuración de notificaciones del usuario", + "Notify for all other messages/rooms": "Notificar para todos los demás mensajes/salas", + "Unable to look up room ID from server": "No se puede buscar el ID de la sala desde el servidor", + "Couldn't find a matching Matrix room": "No se encontró una sala Matrix que coincida", + "All Rooms": "Todas las salas", + "You cannot delete this message. (%(code)s)": "No puedes eliminar este mensaje. (%(code)s)", + "Thursday": "Jueves", + "Forward Message": "Reenviar mensaje", + "Logs sent": "Registros enviados", + "Back": "Atrás", + "Reply": "Responder", + "Show message in desktop notification": "Mostrar mensaje en la notificación del escritorio", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Los registros de depuración contienen datos de uso de la aplicación como nombre de usuario, ID o alias de las salas o grupos que hayas visitado (y nombres de usuario de otros usuarios). No contienen mensajes.", + "Unhide Preview": "Mostrar Vista Previa", + "Unable to join network": "No se puede unir a la red", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Es posible que los hayas configurado en un cliente que no sea Riot. No puedes ajustarlos en Riot, pero todavía se aplican", + "Sorry, your browser is not able to run Riot.": "¡Lo sentimos! Su navegador no puede ejecutar Riot.", + "Messages in group chats": "Mensajes en chats de grupo", + "Yesterday": "Ayer", + "Error encountered (%(errorDetail)s).": "Error encontrado (%(errorDetail)s).", + "Login": "Iniciar sesión", + "Low Priority": "Baja Prioridad", + "Riot does not know how to join a room on this network": "Riot no sabe cómo unirse a una sala en esta red", + "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 ebf755ef7d..0c143bb597 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", @@ -63,7 +62,7 @@ "Ban": "Debekatu", "Unban": "Debekua kendu", "Connectivity to the server has been lost.": "Zerbitzariarekin konexioa galdu da.", - "You do not have permission to post to this room": "Ez duzu gela honetan idazteko baimena", + "You do not have permission to post to this room": "Ez duzu gela honetara mezuak bidaltzeko baimenik", "Logout": "Amaitu saioa", "Filter room members": "Iragazi gelako kideak", "Email": "E-mail", @@ -73,7 +72,7 @@ "Advanced": "Aurreratua", "Cryptography": "Kriptografia", "Devices": "Gailuak", - "Hide read receipts": "Ezkutatu irakurtze-agiria", + "Hide read receipts": "Ezkutatu irakurragiriak", "Don't send typing notifications": "Ez bidali idatzi bitarteko jakinarazpenak", "Always show message timestamps": "Erakutsi beti mezuen denbora-zigilua", "Name": "Izena", @@ -86,11 +85,11 @@ "Please check your email and click on the link it contains. Once this is done, click continue.": "Irakurri zure e-maila eta egin klik dakarren estekan. Behin eginda, egin klik Jarraitu botoian.", "This email address is already in use": "E-mail helbide hau erabilita dago", "This phone number is already in use": "Telefono zenbaki hau erabilita dago", - "Topic": "Gaia", + "Topic": "Mintzagaia", "none": "bat ere ez", "Who can read history?": "Nork irakurri dezake historiala?", "Who can access this room?": "Nor sartu daiteke gelara?", - "Anyone": "Edonor", + "Anyone": "Edonork", "Only people who have been invited": "Gonbidatua izan den jendea besterik ez", "Anyone who knows the room's link, apart from guests": "Gelaren esteka dakien edonor, bisitariak ezik", "Anyone who knows the room's link, including guests": "Gelaren esteka dakien edonor, bisitariak barne", @@ -121,11 +120,11 @@ "Import": "Inportatu", "Never send encrypted messages to unverified devices from this device": "Ez bidali inoiz zifratutako mezuak egiaztatu gabeko gailuetara gailu honetatik", "Verified": "Egiaztatuta", - "Blacklisted": "Zerrenda beltzean", + "Blacklisted": "Blokeatuta", "unknown device": "gailu ezezaguna", "Unverify": "Kendu egiaztaketa", - "Blacklist": "Sartu zerrenda beltzean", - "Unblacklist": "Atera zerrenda beltzean", + "Blacklist": "Blokeatu", + "Unblacklist": "Desblokeatu", "Verify device": "Egiaztatu gailua", "I verify that the keys match": "Gakoak bat datozela egiaztatu dut", "Room contains unknown devices": "Gelan gailu ezezagunak daude", @@ -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:", @@ -147,7 +145,7 @@ "Access Token:": "Sarbide tokena:", "Active call (%(roomName)s)": "Dei aktiboa (%(roomName)s)", "Add": "Gehitu", - "Add a topic": "Gehitu gai bat", + "Add a topic": "Gehitu mintzagai bat", "Admin": "Kudeatzailea", "Admin Tools": "Administrazio-tresnak", "VoIP": "VoIP", @@ -173,7 +171,7 @@ "Bans user with given id": "Debekatu ID zehatz bat duen erabiltzailea", "Call Timeout": "Deiaren denbora-muga", "Change Password": "Aldatu pasahitza", - "Changes your display nickname": "Zure pantaila izena aldatzen du", + "Changes your display nickname": "Zure pantaila-izena aldatzen du", "Clear Cache": "Garbitu cachea", "Click here to join the discussion!": "Elkartu elkarrizketara!", "Click here to fix": "Egin klik hemen konpontzeko", @@ -209,14 +207,14 @@ "Device key:": "Gailuaren gakoa:", "Direct chats": "Txat zuzenak", "Disable Notifications": "Desgaitu jakinarazpenak", - "Display name": "Pantaila izena", + "Display name": "Pantaila-izena", "Displays action": "Ekintza bistaratzen du", "Drop File Here": "Jaregin fitxategia hona", "%(items)s and %(lastItem)s": "%(items)s eta %(lastItem)s", "%(senderName)s answered the call.": "%(senderName)s erabiltzaileak deia erantzun du.", "Can't load user settings": "Ezin izan dira erabiltzailearen ezarpenak kargatu", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s erabiltzaileak gelaren izena kendu du.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s erabiltzaileak gaia aldatu du beste honetara: \"%(topic)s\".", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s erabiltzaileak mintzagaia aldatu du beste honetara: \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Historiala irakurtzeko baimenen aldaketak gela honetara hemendik aurrera heldutako mezuei aplikatuko zaizkie", "Clear Cache and Reload": "Garbitu cachea eta birkargatu", "Devices will not yet be able to decrypt history from before they joined the room": "Gailuek ezin izango dute taldera elkartu aurretiko historiala deszifratu", @@ -253,7 +251,7 @@ "Failed to send email": "Huts egin du e-maila bidaltzean", "Failed to send request.": "Huts egin du eskaera bidaltzean.", "Failed to set avatar.": "Huts egin du abatarra ezartzean.", - "Failed to set display name": "Huts egin du pantaila izena ezartzean", + "Failed to set display name": "Huts egin du pantaila-izena ezartzean", "Failed to set up conference call": "Huts egin du konferentzia deia ezartzean", "Failed to toggle moderator status": "Huts egin du moderatzaile rola aldatzean", "Failed to unban": "Huts egin du debekua kentzean", @@ -272,9 +270,8 @@ "Bulk Options": "Aukera masiboak", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Ezin da hasiera zerbitzarira konektatu, egiaztatu zure konexioa, ziurtatu zure hasiera zerbitzariaren SSL ziurtagiria fidagarritzat jotzen duela zure gailuak, eta nabigatzailearen pluginen batek ez dituela eskaerak blokeatzen.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Ezin zara hasiera zerbitzarira HTTP bidez konektatu zure nabigatzailearen barran dagoen URLa HTTS bada. Erabili HTTPS edo gaitu script ez seguruak.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s erabiltzaileak bere pantaila izena aldatu du, %(oldDisplayName)s izatetik %(displayName)s izatera.", "%(senderName)s changed their profile picture.": "%(senderName)s erabiltzaileak bere profileko argazkia aldatu du.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s erabiltzaileak %(powerLevelDiffText)s erabiltzailearen botere maila aldatu du.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s erabiltzaileak botere mailaz aldatu du %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s erabiltzaileak gelaren izena aldatu du, orain %(roomName)s da.", "Drop here to tag %(section)s": "Jaregin hona %(section)s atalari etiketa jartzeko", "Incoming voice call from %(name)s": "%(name)s erabiltzailearen deia jasotzen", @@ -290,7 +287,7 @@ "'%(alias)s' is not a valid format for an address": "'%(alias)s' ez da baliozko formatua helbide batentzat", "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ez da baliozko formatua ezizen batentzat", "%(displayName)s is typing": "%(displayName)s idazten ari da", - "Sign in with": "Hasi saioa honekin:", + "Sign in with": "Hasi saioa hau erabilita:", "Join as voice or video.": "Elkartu ahotsa edo bideoa erabiliz.", "%(targetName)s joined the room.": "%(targetName)s erabiltzailea gelara elkartu da.", "Joins room with given alias": "Gelara emandako ezizenarekin elkartu da", @@ -330,7 +327,6 @@ "No users have specific privileges in this room": "Ez dago gela honetan baimen zehatzik duen erabiltzailerik", "olm version:": "olm bertsioa:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Behin gela batean zifratzea gaituta ezin da gero desgaitu (oraingoz)", - "Otherwise, click here to send a bug report.": "Bestela, bidali arazte-txosten bat.", "Server may be unavailable, overloaded, or you hit a bug.": "Agian zerbitzaria ez dago eskuragarri, edo gainezka dago, edo akats bat aurkitu duzu.", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "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. Etorkizunean hau hobetuko da.", "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.": "Segurtasunagatik, saioa amaitzeak nabigatzaile honetako muturretik muturrerako zifratze gako guztiak ezabatuko ditu. Zure elkarrizketen historiala deszifratzeko gai izan nahi baduzu etorkizuneko Riot saioetan, esportatu zure gelako gakoen babes-kopia bat.", @@ -354,11 +350,10 @@ "Rejoin": "Berriro elkartu", "Remote addresses for this room:": "Gela honen urruneko helbideak:", "Remove Contact Information?": "Kendu kontaktuaren informazioa?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s erabiltzaileak bere pantaila izena kendu du (%(oldDisplayName)s).", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s erabiltzaileak bere pantaila-izena kendu du (%(oldDisplayName)s).", "%(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", @@ -452,7 +447,6 @@ "Use with caution": "Erabili kontuz", "User ID": "Erabiltzaile ID-a", "User Interface": "Erabiltzaile interfazea", - "%(user)s is a": "%(user)s hau da:", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)", "Username invalid: %(errMessage)s": "Erabiltzaile-izen baliogabea: %(errMessage)s", "Users": "Erabiltzaileak", @@ -554,7 +548,6 @@ "Start automatically after system login": "Hasi automatikoki sisteman saioa hasi eta gero", "Desktop specific": "Mahaigainean besterik ez", "Analytics": "Estatistikak", - "Opt out of analytics": "Ez bidali estatistikak", "Options": "Aukerak", "Riot collects anonymous analytics to allow us to improve the application.": "Riotek estatistika anonimoak jasotzen ditu aplikazioa hobetzeko.", "Passphrases must match": "Pasaesaldiak bat etorri behar dira", @@ -570,19 +563,15 @@ "Failed to invite user": "Huts egin du erabiltzailea gonbidatzean", "Failed to invite the following users to the %(roomName)s room:": "Huts egin du honako erabiltzaile hauek %(roomName)s gelara gonbidatzean:", "Confirm Removal": "Berretsi kentzea", - "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Ziur gertaera hau kendu (ezabatu) nahi duzula? Jakin gelaren izenaren edo gaiaren aldaketa ezabatzen baduzu, desegitea dagoela.", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Ziur gertaera hau kendu (ezabatu) nahi duzula? Jakin gelaren izenaren edo mintzagaiaren aldaketa ezabatzen baduzu, aldaketa desegin daitekeela.", "Unknown error": "Errore ezezaguna", "Incorrect password": "Pasahitz okerra", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Honek zure kontua behin betiko erabilezin bihurtuko du. Ezin izango duzu ID honekin berriro erregistratu.", - "This action is irreversible.": "Ez dago ekintza hau atzera egiterik.", "To continue, please enter your password.": "Jarraitzeko sartu zure pasahitza.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Gailu hau fidagarria dela egiaztatzeko, kontaktatu bere jabea beste medio bat erabiliz (adib. aurrez aurre edo telefonoz deituz) eta galdetu beraien erabiltzaile-ezarpenetan bere gailurako ikusten duen gakoa hemen beheko bera den:", - "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.": "Bat badator sakatu egiaztatu botoia. Bat ez badator, beste inor gailu hau atzematen dago eta zerrenda beltzera gehitu beharko zenuke.", + "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.": "Bat badator sakatu egiaztatu botoia. Bat ez badator, beste inor gailu hau atzematen dago eta blokeatu beharko zenuke.", "In future this verification process will be more sophisticated.": "etorkizunean egiaztaketa metodoa hobetuko da.", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Errore bat gertatu da zure aurreko saioa berreskuratzen saiatzean. Jarraitzen baduzu berriro hasi beharko duzu saioa eta ezin izango duzu irakurri zifratutako historiala.", "Unable to restore session": "Ezin izan da saioa berreskuratu", "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.": "Aurretik Riot bertsio berriago bat erabili baduzu, zure saioa bertsio honekin bateraezina izan daiteke. Itxi leiho hau eta itzuli bertsio berriagora.", - "Continue anyway": "Jarraitu hala ere", "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.": "Gailu bakoitzaren egiaztaketa prozesua jarraitzea aholkatzen dizugu, benetako jabeari dagozkiela baieztatzeko, baina mezua egiaztatu gabe birbidali dezakezu ere.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" gelan aurretik ikusi ez dituzun gailuak daude.", "Unknown devices": "Gailu ezezagunak", @@ -598,15 +587,13 @@ "Please enter the code it contains:": "Sartu dakarren kodea:", "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ez baduzu e-mail helbide bat zehazten, ezin izango duzu zure pasahitza berrezarri. Ziur zaude?", "You are registering with %(SelectedTeamName)s": "%(SelectedTeamName)s erabiliz erregistratzen ari zara", - "Default server": "Lehenetsitako zerbitzaria", - "Custom server": "Zerbitzari pertsonalizatua", + "Default server": "Zerbitzari lenetetsia", + "Custom server": "Zerbitzari aukeratua", "Home server URL": "Hasiera zerbitzariaren URLa", "Identity server URL": "Identitate zerbitzariaren URLa", "What does this mean?": "Zer esan nahi du honek?", "Error decrypting audio": "Errorea audioa deszifratzean", "Error decrypting image": "Errorea audioa deszifratzean", - "Image '%(Body)s' cannot be displayed.": "Ezin da '%(Body)s' irudia bistaratu.", - "This image cannot be displayed.": "Irudi hau ezin da bistaratu.", "Error decrypting video": "Errorea bideoa deszifratzean", "Add an Integration": "Gehitu integrazioa", "Removed or unknown message type": "Kenduta edo mezu mota ezezaguna", @@ -654,7 +641,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?", @@ -662,8 +648,7 @@ "PM": "PM", "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 gaia ezartzen du", - "Show Apps": "Erakutsi aplikazioak", + "Sets the room topic": "Gelaren mintzagaia ezartzen du", "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.", @@ -703,12 +688,12 @@ "Disable Emoji suggestions while typing": "Desgaitu Emoji proposamenak idaztean", "Banned by %(displayName)s": "%(displayName)s erabiltzaileak debekatuta", "Message removed by %(userId)s": "%(userId)s erabiltzaileak kendu du mezua", - "To send messages, you must be a": "Mezuak bidaltzeko hau izan behar zara:", - "To invite users into the room, you must be a": "Erabiltzaileak gonbidatzeko hau izan behar zara:", - "To configure the room, you must be a": "Gela konfiguratzeko hau izan behar zara:", - "To kick users, you must be a": "Erabiltzaileak kanporatzeko hau izan behar zara:", - "To ban users, you must be a": "Erabiltzaileak debekatzeko hau izan behar zara:", - "To remove other users' messages, you must be a": "Beste erabiltzaileen mezuak kentzeko hau izan behar zara:", + "To send messages, you must be a": "Mezuak bidaltzeko:", + "To invite users into the room, you must be a": "Erabiltzaileak gonbidatzeko:", + "To configure the room, you must be a": "Gela konfiguratzeko:", + "To kick users, you must be a": "Erabiltzaileak kanporatzeko:", + "To ban users, you must be a": "Erabiltzaileak debekatzeko:", + "To remove other users' messages, you must be a": "Beste erabiltzaileen mezuak kentzeko:", "Unpin Message": "Desfinkatu mezua", "Add rooms to this community": "Gehitu gelak komunitate honetara", "Call Failed": "Deiak huts egin du", @@ -738,7 +723,6 @@ "%(names)s and %(count)s others are typing|one": "%(names)s eta beste bat idazten ari dira", "Send": "Bidali", "Message Pinning": "Mezuak finkatzea", - "Presence Management": "Presentzia-kudeaketa", "Tag Panel": "Etiketen panela", "Hide avatar changes": "Ezkutatu abatar aldaketak", "Hide display name changes": "Ezkutatu pantaila izenen aldaketak", @@ -783,17 +767,17 @@ "You have been kicked from this room by %(userName)s.": "Gela honetatik kanporatu zaitu %(userName)s erabiltzaileak.", "You have been banned from this room by %(userName)s.": "Gela honetatik debekatu zaitu %(userName)s erabiltzaileak.", "You are trying to access a room.": "Gela bat atzitzen saiatzen ari zara.", - "To change the room's avatar, you must be a": "Gelaren abatara aldatzeko, hau izan behar zara:", - "To change the room's name, you must be a": "Gelaren izena aldatzeko, hau izan behar zara:", - "To change the room's main address, you must be a": "Gelaren helbide nagusia aldatzeko, hau izan behar zara:", - "To change the room's history visibility, you must be a": "Gelaren ikusgaitasuna aldatzeko, hau izan behar zara:", - "To change the permissions in the room, you must be a": "Gelaren baimenak aldatzeko, hau izan behar zara:", - "To change the topic, you must be a": "Gaia aldatzeko, hau izan behar zara:", - "To modify widgets in the room, you must be a": "Gelaren trepetak aldatzeko, hau izan behar zara:", - "Members only (since the point in time of selecting this option)": "Kideak besterik ez (aukera hau hautatzen den unetik)", - "Members only (since they were invited)": "Kideak besterik ez (gonbidatu zaienetik)", - "Members only (since they joined)": "Kideak besterik ez (elkartu zirenetik)", - "To send events of type , you must be a": " motako gertaerak bidaltzeko, hau izan behar zara:", + "To change the room's avatar, you must be a": "Gelaren abatara aldatzeko:", + "To change the room's name, you must be a": "Gelaren izena aldatzeko:", + "To change the room's main address, you must be a": "Gelaren helbide nagusia aldatzeko:", + "To change the room's history visibility, you must be a": "Gelaren ikusgaitasuna aldatzeko:", + "To change the permissions in the room, you must be a": "Gelaren baimenak aldatzeko:", + "To change the topic, you must be a": "Mintzagaia aldatzeko:", + "To modify widgets in the room, you must be a": "Gelaren trepetak aldatzeko:", + "Members only (since the point in time of selecting this option)": "Kideek besterik ez (aukera hau hautatzen den unetik)", + "Members only (since they were invited)": "Kideek besterik ez (gonbidatu zaienetik)", + "Members only (since they joined)": "Kideek besterik ez (elkartu zirenetik)", + "To send events of type , you must be a": " motako gertaerak bidaltzeko:", "Addresses": "Helbideak", "Invalid community ID": "Komunitate ID baliogabea", "'%(groupId)s' is not a valid community ID": "%(groupId)s ez da baliozko komunitate ID bat", @@ -814,7 +798,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", @@ -822,7 +805,6 @@ "Long Description (HTML)": "Deskripzio luzea (HTML)", "Description": "Deskripzioa", "Community %(groupId)s not found": "Ez da %(groupId)s komunitatea aurkitu", - "Cryptography data migrated": "Kriptografia datuak migratuta", "Old cryptography data detected": "Kriptografia datu zaharrak atzeman dira", "Your Communities": "Zure komunitateak", "Create a new community": "Sortu komunitate berria", @@ -943,15 +925,246 @@ "Try using one of the following valid address types: %(validTypesList)s.": "Saiatu baliozko helbide mota hauetako bat erabiltzen: %(validTypesList)s.", "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Komunitate IDak a-z, 0-9, edo '=_-./' karaktereak besterik ez ditu onartzen", "Custom of %(powerLevel)s": "%(powerLevel)s pertsonalizatua", - "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.": "Kriptografia datuen migrazio bat egon da. Muturretik muturrerako zifratzeak ez du funtzionatuko Riot bertsio zaharrago bat erabiltzen baduzu. Muturretik muturrerako zifratzea erabili behar baduzu bertsio zaharrago batean amaitu saioa Rioten lehenbizi. Mezuen historiala gordetzeko esportatu eta berriro inportatu zure gakoak.", "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 bertsio zahar batek datuak antzeman dira. Honek bertsio zaharrean muturretik muturrerako zifratzea ez funtzionatzea eragingo du. Azkenaldian bertsio zaharrean bidali edo jasotako zifratutako mezuak agian ezin izango dira deszifratu bertsio honetan. Honek ere Bertsio honekin egindako mezu trukeak huts egitea ekar dezake. Arazoak badituzu, amaitu saioa eta hasi berriro saioa. Mezuen historiala gordetzeko, esportatu eta berriro inportatu zure gakoak.", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Sortu komunitate bat erabiltzaileak eta gelak biltzeko! Sortu zure hasiera orria eta markatu zure espazioa Matrix unibertsoan.", "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Bdagoen komunitate batera elkartzeko, komunitatearen identifikatzailea jakin behar duzu; honen antza izango du +adibidea:matrix.org.", - "Show devices or cancel all.": "Erakutsi gailuak edo baztertu guztia.", "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Ez dago beste inor hemen! Beste batzuk gonbidatu nahi dituzu edo gela hutsik dagoela abisatzeari utzi?", - "Light theme": "Gai argia", - "Dark theme": "Gai iluna", - "Status.im theme": "Status.im gaia", + "Light theme": "Itxura argia", + "Dark theme": "Itxura iluna", + "Status.im theme": "Status.im itxura", "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "%(emailAddress)s helbidera e-mail bat bidali da. Behin dakarren esteka jarraituta, egin klik behean.", - "This homeserver doesn't offer any login flows which are supported by this client.": "Hasiera zerbitzari honek ez du bezero honek onartzen duen fluxurik eskaintzen." + "This homeserver doesn't offer any login flows which are supported by this client.": "Hasiera zerbitzari honek ez du bezero honek onartzen duen fluxurik eskaintzen.", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Ezin izango duzu hau aldatu zure burua mailaz jaisten ari zarelako, zu bazara gelan baimenak dituen azken erabiltzailea ezin izango dira baimenak berreskuratu.", + "%(count)s of your messages have not been sent.|one": "Zure mezua ez da bidali.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Birbidali guztiak edo baztertu guztiak orain. Mezuak banaka birbidali edo baztertu ditzakezu ere.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Birbidali mezua edo baztertu mezua orain.", + "Message Replies": "Mezuei erantzunak", + "Send an encrypted reply…": "Bidali zifratutako erantzun bat…", + "Send a reply (unencrypted)…": "Bidali erantzun bat (zifratu gabea)…", + "Send an encrypted message…": "Bidali zifratutako mezu bat…", + "Send a message (unencrypted)…": "Bidali mezu bat (zifratu gabea)…", + "Replying": "Erantzuten", + "Minimize apps": "Minimizatu aplikazioak", + "The platform you're on": "Zauden plataforma", + "The version of Riot.im": "Riot.im bertsioa", + "Your language of choice": "Zure aukerako hizkuntza", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Pribatutasuna garrantzitsua da guretzat, beraz ez dugu datu pertsonalik edo identifikagarririk jasotzen gure estatistiketan.", + "Learn more about how we use analytics.": "Ikasi gehiago estatistikei ematen diegun erabileraz.", + "The information being sent to us to help make Riot.im better includes:": "Riot.im hobetzeko bidaltzen zaigun informazioan hau dago:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Orri honek informazio identifikagarria badu ere, esaterako gela, erabiltzailea edo talde ID-a, datu hauek ezabatu egiten dira zerbitzarira bidali aurretik.", + "Whether or not you're logged in (we don't record your user name)": "Saioa hasita dagoen ala ez (ez dugu erabiltzaile-izena gordetzen)", + "Which officially provided instance you are using, if any": "Erabiltzen ari zaren instantzia ofiziala, balego", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Testu editorean testu aberatsa modua erabiltzen duzun", + "Your homeserver's URL": "Zure hasiera zerbitzariaren URL-a", + "Your identity server's URL": "Zure identitate zerbitzariaren URL-a", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(fullYear)s(e)ko %(monthName)sk %(day)sa", + "This room is not public. You will not be able to rejoin without an invite.": "Gela hau ez da publikoa. Ezin izango zara berriro elkartu gonbidapenik gabe.", + "Community IDs cannot not be empty.": "Komunitate ID-ak ezin dira hutsik egon.", + "Show devices, send anyway or cancel.": "Erakutsi gailuak, bidali hala ere edo ezeztatu.", + "In reply to ": "honi erantzunez: ", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s erabiltzaileak bere pantaila izena aldatu du %(displayName)s izatera.", + "Failed to set direct chat tag": "Huts egin du txat zuzenarenaren etiketa jartzean", + "Failed to remove tag %(tagName)s from room": "Huts egin du %(tagName)s etiketa gelatik kentzean", + "Failed to add tag %(tagName)s to room": "Huts egin du %(tagName)s etiketa gelara gehitzean", + "Clear filter": "Garbitu iragazkia", + "Disable Community Filter Panel": "Desgaitu komunitate-iragazi panela", + "Did you know: you can use communities to filter your Riot.im experience!": "Ba al zenekien? Komunitateak erabili ditzakezu zure Riot.im esperientzia iragazteko!", + "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.": "Iragazki bat ezartzeko, arrastatu komunitate baten abatarra pantailaren ezkerrean dagoen iragazki-panelera. Iragazki-paneleko abatar batean klik egin dezakezu komunitate horri lotutako gelak eta pertsonak besterik ez ikusteko.", + "Your key share request has been sent - please check your other devices for key share requests.": "Zure gakoa partekatzeko eskaria bidali da - egiaztatu zure beste gailuetan gakoa partekatzeko eskariak.", + "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.": "Gakoa partekatzeko eskariak automatikoki bidaltzen dira zure beste gailuetara. Zure beste gailuetan gakoa partekatzeko eskaria ukatu edo baztertu baduzu, egin klik hemen saio honetarako gakoak eskatzeko berriz ere.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Zure beste gailuek mezu honetarako gakoa ez badute ezin izango dute deszifratu.", + "Key request sent.": "Gako eskaria bidalita.", + "Re-request encryption keys from your other devices.": "Berriz eskatu zifratze-gakoak zure beste gailuetatik.", + "%(user)s is a %(userRole)s": "%(user)s %(userRole)s da", + "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 contain 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.", + "Submit debug logs": "Bidali arazte-txostenak", + "Opens the Developer Tools dialog": "Garatzailearen tresnen elkarrizketa-koadroa irekitzen du", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s)(e)k ikusita %(dateTime)s(e)tan", + "Unable to join community": "Ezinekoa komunitatera elkartzea", + "Unable to leave community": "Ezinezkoa komunitatetik ateratzea", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Zure komunitatearen izen eta abatarari egindako aldaketak 30 minutu behar ditzakete beste erabiltzaileek ikusi arte.", + "Join this community": "Elkartu komunitate honetara", + "Leave this community": "Atera komunitate honetatik", + "Stickerpack": "Eranskailu-multzoa", + "You don't currently have any stickerpacks enabled": "Ez duzu eranskailu multzorik aktibatuta", + "Add a stickerpack": "Gehitu eranskailu-multzoa", + "Hide Stickers": "Ezkutatu eranskailuak", + "Show Stickers": "Erakutsi eranskailuak", + "Who can join this community?": "Nor elkartu daiteke komunitate honetara?", + "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 set a password": "Etorkizunean kontura itzuli ahal izateko pasahitz bat ezarri behar duzu", + "Forget": "Ahaztu", + "#example": "#adibidea", + "Hide panel": "Ezkutatu panela", + "You cannot delete this image. (%(code)s)": "Ezin duzu irudi hau ezabatu. (%(code)s)", + "Cancel Sending": "Utzi bidaltzeari", + "This Room": "Gela hau", + "The Home Server may be too old to support third party networks": "Hasiera zerbitzaria zaharregia izan daiteke hirugarrengoen sarean onartzeko", + "Noisy": "Zaratatsua", + "Error saving email notification preferences": "Errorea e-mail jakinarazpenen hobespenak gordetzean", + "Messages containing my display name": "Nire pantaila-izena duten mezuak", + "Messages in one-to-one chats": "Biren arteko txatetako mezuak", + "Unavailable": "Eskuraezina", + "View Decrypted Source": "Ikusi deszifratutako iturria", + "Failed to update keywords": "Huts egin du hitz gakoak eguneratzean", + "Notes:": "Oharrak:", + "remove %(name)s from the directory.": "kendu %(name)s direktoriotik.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Hitz gako hauen jakinarazpenak hemen bistaratu ezin daitezkeen arauak jarraitzen dituzte:", + "Safari and Opera work too.": "Safari eta Opera badabiltza ere.", + "Please set a password!": "Ezarri pasahitza mesedez!", + "You have successfully set a password!": "Ongi ezarri duzu pasahitza!", + "An error occurred whilst saving your email notification preferences.": "Errore bat gertatu da zure e-mail bidezko jakinarazpenen hobespenak gordetzean.", + "Explore Room State": "Miatu gelaren egoera", + "Source URL": "Iturriaren URLa", + "Messages sent by bot": "Botak bidalitako mezuak", + "Filter results": "Iragazi emaitzak", + "Members": "Kideak", + "No update available.": "Ez dago eguneraketarik eskuragarri.", + "Resend": "Birbidali", + "Files": "Fitxategiak", + "Collecting app version information": "Aplikazioaren bertsio-informazioa biltzen", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ezabatu gelaren %(alias)s ezizena eta kendu %(name)s direktoriotik?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Honek zure kontura itzultzea ahalbidetuko dizu, beste gailuetan saioa amaitu eta berriro hasi eta gero.", + "Keywords": "Hitz gakoak", + "Enable notifications for this account": "Gaitu jakinarazpenak kontu honetarako", + "Directory": "Direktorioa", + "Invite to this community": "Gonbidatu komunitate honetara", + "Failed to get public room list": "Huts egin du gela publikoen zerrenda jasotzean", + "Messages containing keywords": "Hitz gakoak dituzten mezuak", + "Room not found": "Ez da gela aurkitu", + "Tuesday": "Asteartea", + "Enter keywords separated by a comma:": "Idatzi hitz gakoak koma bidez banatuta:", + "Forward Message": "Birbidali mezua", + "You have successfully set a password and an email address!": "Ondo ezarri dituzu pasahitza eta e-mail helbidea!", + "Remove %(name)s from the directory?": "Kendu %(name)s direktoriotik?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riotek nabigatzaileen ezaugarri aurreratu ugari erabiltzen ditu, hauetako batzuk ez daude erabilgarri edo esperimentalak dira zure oraingo nabigatzailean.", + "Event sent!": "Gertaera bidalita!", + "Preparing to send logs": "Egunkariak bidaltzeko prestatzen", + "Enable desktop notifications": "Gaitu mahaigaineko jakinarazpenak", + "Remember, you can always set an email address in user settings if you change your mind.": "Gogoratu, e-mail helbide bat ezarri dezakezu erabiltzaile-ezarpenetan iritzia aldatzen baduzu.", + "Explore Account Data": "Miatu kantuaren datuak", + "All messages (noisy)": "Mezu guztiak (ozen)", + "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:", + "You must specify an event type!": "Gertaera mota bat zehaztu behar duzu!", + "(HTTP status %(httpStatus)s)": "(HTTP egoera %(httpStatus)s)", + "All Rooms": "Gela guztiak", + "Please install Chrome or Firefox for the best experience.": "Instalatu Chrome edo Firefox esperientzia onena izateko.", + "Wednesday": "Asteazkena", + "You cannot delete this message. (%(code)s)": "Ezin duzu mezu hau ezabatu. (%(code)s)", + "Quote": "Aipua", + "Send logs": "Bidali egunkariak", + "All messages": "Mezu guztiak", + "Call invitation": "Dei gonbidapena", + "Downloading update...": "Eguneraketa deskargatzen...", + "State Key": "Egoera gakoa", + "Failed to send custom event.": "Huts egin du gertaera pertsonalizatua bidaltzean.", + "What's new?": "Zer dago berri?", + "Notify me for anything else": "Jakinarazi beste edozer", + "When I'm invited to a room": "Gela batetara gonbidatzen nautenean", + "Can't update user notification settings": "Ezin dira erabiltzailearen jakinarazpenen ezarpenak eguneratu", + "Notify for all other messages/rooms": "Jakinarazi beste mezu/gela guztiak", + "Unable to look up room ID from server": "Ezin izan da gelaren IDa zerbitzarian bilatu", + "Couldn't find a matching Matrix room": "Ezin izan da bat datorren Matrix gela bat aurkitu", + "Invite to this room": "Gonbidatu gela honetara", + "Search for a room": "Bilatu gela bat", + "Thursday": "Osteguna", + "Search…": "Bilatu…", + "Logs sent": "Egunkariak bidalita", + "Back": "Atzera", + "Reply": "Erantzun", + "Show message in desktop notification": "Erakutsi mezua mahaigaineko jakinarazpenean", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Arazte-egunkariek aplikazioak darabilen datuak dauzkate, zure erabiltzaile izena barne, bisitatu dituzun gelen ID-ak edo ezizenak eta beste erabiltzaileen izenak. Ez dute mezurik.", + "Unhide Preview": "Ez ezkutatu aurrebista", + "Unable to join network": "Ezin izan da sarera elkartu", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Agian Riot ez beste bezero batean konfiguratu dituzu. Ezin dituzu Riot bidez doitu, baina aplikagarriak dira", + "Sorry, your browser is not able to run Riot.": "Zure nabigatzaileak ez du Riot erabiltzeko gaitasunik.", + "Uploaded on %(date)s by %(user)s": "%(user)s erabiltzaileak %(date)s (e)an igota", + "Messages in group chats": "Talde txatetako mezuak", + "Yesterday": "Atzo", + "Error encountered (%(errorDetail)s).": "Errorea aurkitu da (%(errorDetail)s).", + "Login": "Hasi saioa", + "Low Priority": "Lehentasun baxua", + "Unable to fetch notification target list": "Ezin izan da jakinarazpen helburuen zerrenda eskuratu", + "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", + "Missing roomId.": "Gelaren ID-a falta da.", + "Picture": "Irudia", + "Every page you use in the app": "Aplikazioan erabilitako orri oro", + "e.g. ": "adib. ", + "Your User Agent": "Zure erabiltzaile-agentea", + "Your device resolution": "Zure gailuaren bereizmena", + "Always show encryption icons": "Beti erakutsi zifratze ikonoak", + "Popout widget": "Laster-leiho trepeta", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Riot-en akatsak GitHub bidez kudeatzen dira: sortu akats txosten bat GitHub-en.", + "Log out and remove encryption keys?": "Amaitu saioa eta kendu zifratze gakoak?", + "Send Logs": "Bidali egunkariak", + "Clear Storage and Sign Out": "Garbitu biltegiratzea eta amaitu saioa", + "Refresh": "Freskatu", + "We encountered an error trying to restore your previous session.": "Errore bat aurkitu dugu zure aurreko saioa berrezartzen saiatzean.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Zure nabigatzailearen biltegiratzea garbitzeak arazoa konpon lezake, baina saioa amaituko da eta zifratutako txaten historiala ezin izango da berriro irakurri.", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Une honetan ezin da fitxategi batekin erantzun, mezu arrunt eta ez erantzun gisa bidaliko da.", + "Unable to reply": "Ezin erantzun", + "At this time it is not possible to reply with an emote.": "Une honetan ezin da irriabartxo batekin erantzun.", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Ezin izan da erantzundako gertaera kargatu, edo ez dago edo ez duzu ikusteko baimenik.", + "Collapse Reply Thread": "Tolestu erantzun-haria" } diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index 0967ef424b..0e532d9483 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -1 +1,150 @@ -{} +{ + "Fetching third party location failed": "تطبیق اطلاعات از منابع‌ دسته سوم با شکست مواجه شد", + "Messages in one-to-one chats": "پیام‌های درون چت‌های یک‌به‌یک", + "A new version of Riot is available.": "نسخه‌ی جدید از رایوت موجود است.", + "Advanced notification settings": "تنظیمات پیشرفته برای آگاه‌سازی‌ها", + "Uploading report": "در حال بارگذاری گزارش", + "Sunday": "یکشنبه", + "Guests can join": "میهمان‌ها می‌توانند بپیوندند", + "Messages sent by bot": "پیام‌های ارسال شده توسط ربات", + "Notification targets": "هدف‌های آگاه‌سازی", + "Failed to set direct chat tag": "تنظیم تگ برای چت مستقیم موفقیت‌آمیز نبود", + "Today": "امروز", + "Files": "فایل‌ها", + "You are not receiving desktop notifications": "شما آگاه‌سازی‌های دسکتاپ را دریافت نمی‌کنید", + "Friday": "آدینه", + "Update": "به‌روزرسانی", + "Notifications": "آگاه‌سازی‌ها", + "What's New": "تازه‌ها", + "Add an email address above to configure email notifications": "آدرس ایمیلتان را به بالا بیفزایید تا بتوانید آگاه‌سازی با ایمیل را مدیریت کنید", + "Expand panel": "پنل را بگشا", + "On": "روشن", + "Filter room names": "جستجو در گپ‌ها", + "Changelog": "تغییراتِ به‌وجودآمده", + "Waiting for response from server": "در انتظار پاسخی از سمت سرور", + "Leave": "خروج", + "OK": "باشه", + "All notifications are currently disabled for all targets.": "همه‌ی آگاه‌سازی‌ها برای تمام هدف‌ها غیرفعال‌اند.", + "Operation failed": "عملیات شکست خورد", + "delete the alias.": "نام مستعار را پاک کن.", + "To return to your account in future you need to set a password": "برای بازگشتِ دوباره به اکانتان در آینده نیاز به ثبت یک پسورد دارید", + "Forget": "فراموش کن", + "World readable": "خواندن جهانی", + "Mute": "سکوت", + "Hide panel": "پنل را پنهان کن", + "You cannot delete this image. (%(code)s)": "شما نمی‌توانید این تصویر را پاک کنید. (%(code)s)", + "Cancel Sending": "فرستادن را لغو کن", + "Warning": "هشدار", + "This Room": "این گپ", + "Resend": "بازفرست", + "Error saving email notification preferences": "خطا در ذخیره‌سازی ترجیحات آگاهسازی با ایمیل", + "Downloading update...": "در حال بارگیریِ به‌روزرسانی...", + "#example": "#نمونه", + "Remember, you can always set an email address in user settings if you change your mind.": "به خاطر داشته باشید که اگر نظرتان عوض شد می‌توانید از بخش تنظیمات یک ایمیل را به اکانتتان متصل کنید.", + "Unavailable": "غیرقابل‌دسترسی", + "View Decrypted Source": "دیدن منبع رمزگشایی شده", + "Failed to update keywords": "به‌روزرسانی کلیدواژه‌ها موفقیت‌آمیز نبود", + "remove %(name)s from the directory.": "%(name)s را از فهرست گپ‌ها حذف کن", + "Please set a password!": "لطفا یک پسورد اختیار کنید!", + "powered by Matrix": "قدرت‌یافته از ماتریکس", + "You have successfully set a password!": "شما با موفقیت رمزتان را انتخاب کردید!", + "Favourite": "علاقه‌مندی‌ها", + "All Rooms": "همه‌ی گپ‌ها", + "Source URL": "آدرس مبدا", + "Failed to add tag %(tagName)s to room": "در افزودن تگ %(tagName)s موفقیت‌آمیز نبود", + "Members": "اعضا", + "No update available.": "هیچ به روزرسانی جدیدی موجود نیست.", + "Noisy": "پرسروصدا", + "Failed to get protocol list from Home Server": "دریافت لیست پروتکل‌ها از کارگزار مبدا موفقیت‌آمیز نبود", + "Collecting app version information": "درحال جمع‌آوری اطلاعات نسخه‌ی برنامه", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "آیا مطمئنید که می‌خواهید نام مستعار گپ %(alias)s را پاک و %(name)s را از فهرست حذف کنید؟", + "This will allow you to return to your account after signing out, and sign in on other devices.": "این به شما اجازه خواهد داد که پس از خروج به اکانت خود بازگردید و از سایر دستگاه‌ها وارد شوید.", + "Cancel": "لغو", + "Enable notifications for this account": "آگاه سازی با رایانامه را برای این اکانت فعال کن", + "Directory": "فهرست گپ‌گاه‌ها", + "Failed to get public room list": "گرفتن لیست گپ‌گاه‌های عمومی موفقیت‌آمیز نبود", + "Messages containing keywords": "پیا‌م‌های دارای این کلیدواژه‌ها ", + "Room not found": "گپ یافت نشد", + "Tuesday": "سه‌شنبه", + "Enter keywords separated by a comma:": "کلیدواژه‌ها را وارد کنید؛ از کاما(,) برای جدا کردن آنها از یکدیگر استفاده کنید:", + "Forward Message": "هدایت پیام", + "Remove %(name)s from the directory?": "آیا مطمئنید می‌خواهید %(name)s را از فهرست گپ‌ها حذف کنید؟", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "رایوت از بسیاری از ویژگی‌های پیشرفته در مروگرها استفاده می‌کند، برخی از این ویژگی‌ها در مرورگر کنونی شما موجود نیستند و یا در حالت آزمایشی قرار دارند.", + "Unnamed room": "گپ نام‌گذاری نشده", + "Dismiss": "نادیده بگیر", + "Remove from Directory": "از فهرستِ گپ‌ها حذف کن", + "Saturday": "شنبه", + "I understand the risks and wish to continue": "از خطرات این کار آگاهم و مایلم که ادامه بدهم", + "Direct Chat": "چت مستقیم", + "The server may be unavailable or overloaded": "این سرور ممکن است ناموجود یا بسیار شلوغ باشد", + "Reject": "پس زدن", + "Failed to set Direct Message status of room": "تنظیم حالت پیام مستقیم برای گپ موفقیت‌آمیز نبود", + "Monday": "دوشنبه", + "All messages (noisy)": "همه‌ی پیام‌ها(بلند)", + "Enable them now": "همین حالا فعالشان کن", + "Messages containing my user name": "پیام‌های شامل نامِ کاربری من", + "Collecting logs": "درحال جمع‌آوری گزارش‌ها", + "more": "بیشتر", + "Search for a room": "جستجوی برای یک گپ", + "Search": "جستجو", + "(HTTP status %(httpStatus)s)": "(HTTP وضعیت %(httpStatus)s)", + "Failed to forget room %(errCode)s": "فراموش کردن گپ‌گاه %(errCode)s موفقیت‌آمیز نبود", + "Wednesday": "چهارشنبه", + "Quote": "گفتآورد", + "Send": "ارسال", + "Error": "خطا", + "Send logs": "ارسال گزارش‌ها", + "All messages": "همه‌ی پیام‌ها", + "unknown error code": "کد خطای ناشناخته", + "Call invitation": "دعوت به تماس", + "Messages containing my display name": "پیام‌های حاوی نمای‌نامِ من", + "You have successfully set a password and an email address!": "تخصیص ایمیل و پسوردتان با موفقیت انجام شد!", + "What's new?": "تازه‌ها", + "Notify me for anything else": "مرا برای هرچیز دیگری باخبر کن", + "When I'm invited to a room": "وقتی من به گپی دعوت میشوم", + "Close": "بستن", + "Can't update user notification settings": "امکان به‌روزرسانی تنظیمات آگاه‌سازی کاربر وجود ندارد", + "Notify for all other messages/rooms": "برای همه‌ی پیام‌ها/گپ‌های دیگر آگاه‌سازی کن", + "Couldn't find a matching Matrix room": "گپ‌گاه مورد نظر در ماتریکس یافت نشد", + "Invite to this room": "دعوت به این گپ", + "You cannot delete this message. (%(code)s)": "شما نمی‌توانید این پیام را پاک کنید. (%(code)s)", + "Thursday": "پنج‌شنبه", + "Search…": "جستجو…", + "Unhide Preview": "پیش‌نمایش را نمایان کن", + "Unable to join network": "خطا در ورود به شبکه", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "ممکن است شما این تنظیمات را در کارخواهی به جز رایوت اعمال کرده باشید. شما نمی‌توانید انها را تغییر دهید اما آنها همچنان تاثیر خود را دارند", + "Sorry, your browser is not able to run Riot.": "متاسفانه مرورگر شما نمی‌تواند رایوت را اجرا کند.", + "Uploaded on %(date)s by %(user)s": "آپلود شده در تاریخ %(date)s توسط %(user)s", + "Messages in group chats": "پیام‌های درون چت‌های گروهی", + "Yesterday": "دیروز", + "Error encountered (%(errorDetail)s).": "خطای رخ داده (%(errorDetail)s).", + "Keywords": "کلیدواژه‌ها", + "Low Priority": "کم اهمیت", + "Unable to fetch notification target list": "ناتوانی در تطبیق لیست آگاه‌سازی‌های هدف", + "Set Password": "پسوردتان را انتخاب کنید", + "An error occurred whilst saving your email notification preferences.": "خطایی در حین ذخیره‌ی ترجیجات شما درباره‌ی رایانامه رخ داد.", + "Enable audible notifications in web client": "آگاه‌سازی صدادار را در کارگزار وب فعال کن", + "Permalink": "پایاپیوند", + "Off": "خاموش", + "Riot does not know how to join a room on this network": "رایوت از چگونگی ورود به یک گپ در این شبکه اطلاعی ندارد", + "Mentions only": "فقط نام‌بردن‌ها", + "Failed to remove tag %(tagName)s from room": "خطا در حذف کلیدواژه‌ی %(tagName)s از گپ", + "Remove": "حذف کن", + "You can now return to your account after signing out, and sign in on other devices.": "اکنون می‌توانید پس از خروج به اکانتتان بازگردید و با دستگاه‌های دیگری وارد شوید.", + "Continue": "ادامه", + "Enable desktop notifications": "آگاه‌سازی دسکتاپ را فعال کن", + "Enable email notifications": "آگاه‌سازی با رایانامه را فعال کن", + "Login": "ورود", + "No rooms to show": "هیچ گپی برای نشان دادن موجود نیست", + "Download this file": "بارگیری کن", + "Failed to change settings": "تغییر تنظیمات موفقیت‌آمیز نبود", + "Failed to change password. Is your password correct?": "خطا در تغییر گذرواژه. آیا از درستی گذرواژه‌تان اطمینان دارید؟", + "View Source": "دیدن منبع", + "Custom Server Options": "تنظیمات سفارشی برای سرور", + "Collapse panel": "پنل را ببند", + "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "با مرورگر کنونی شما، ظاهر و حس استفاده از برنامه ممکن است کاملا اشتباه باشد و برخی یا همه‌ی ویژگی‌ها ممکن است کار نکنند. می‌توانید به استفاده ادامه دهید اما مسئولیت هر مشکلی که به آن بربخورید بر عهده‌ی خودتان است!", + "Checking for an update...": "درحال بررسی به‌روزرسانی‌ها...", + "There are advanced notifications which are not shown here": "آگاه‌سازی‌های پیشرفته‌ای هستند که در اینجا نشان داده نشده‌اند", + "This email address is already in use": "این آدرس ایمیل در حال حاضر در حال استفاده است", + "This phone number is already in use": "این شماره تلفن در حال استفاده است" +} diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 0ae3379ed7..e5787ab561 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -62,7 +62,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Yhdistäminen kotipalveluun HTTP:n avulla ei ole mahdollista kun selaimen osoitepalkissa on HTTPS URL. Käytä joko HTTPS tai salli turvattomat skriptit.", "Can't load user settings": "Käyttäjäasetusten lataaminen epäonnistui", "Change Password": "Muuta salasana", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s muutti näyttönimensä %(oldDisplayName)s -> %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s muutti profiilikuvansa.", "%(targetName)s accepted an invitation.": "%(targetName)s hyväksyi kutsun.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s hyväksyi kutsun käyttäjän %(displayName)s puolesta.", @@ -72,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ä", @@ -167,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", @@ -418,7 +414,6 @@ "Start automatically after system login": "Käynnistä automaattisesti käyttöjärjestelmään kirjautumisen jälkeen", "Desktop specific": "Työpöytäkäytön asetukset", "Analytics": "Analytiikka", - "Opt out of analytics": "Ota analytiikka pois käytöstä", "Options": "Valinnat", "Riot collects anonymous analytics to allow us to improve the application.": "Riot kerää anonyymisti tilastoja jotta voimme parantaa ohjelmistoa.", "Passphrases must match": "Salasanojen on täsmättävä", @@ -436,7 +431,6 @@ "Confirm Removal": "Varmista poistaminen", "Unknown error": "Tuntematon virhe", "Incorrect password": "Virheellinen salasana", - "This action is irreversible.": "Tätä toimintoa ei voi perua.", "Device name": "Laitenimi", "Device Name": "Laitenimi", "Device key": "Laiteavain", @@ -444,7 +438,6 @@ "Verify device": "Varmenna laite", "I verify that the keys match": "Totean että avaimet vastaavat toisiaan", "Unable to restore session": "Istunnon palautus epäonnistui", - "Continue anyway": "Jatka kuitenkin", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s poisti huoneen nimen.", "Changes to who can read history will only apply to future messages in this room": "Muutokset koskien ketkä voivat lukea historian koskevat vain uusia viestejä", "Click here to join the discussion!": "Paina tästä liittyäksesi keskusteluun", @@ -476,7 +469,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ä", @@ -515,7 +507,6 @@ "Use with caution": "Käytä varoen", "User ID": "Käyttäjätunniste", "User Interface": "Käyttöliittymä", - "%(user)s is a": "%(user)s on", "User name": "Käyttäjänimi", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s asetti aiheeksi \"%(topic)s\".", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Salasanan muuttaminen uudelleenalustaa myös päästä päähän-salausavaimet kaikilla laitteilla, jolloin vanhojen viestien lukeminen ei ole enään mahdollista, ellet ensin vie huoneavaimet ja tuo ne takaisin jälkeenpäin. Tämä tulee muuttumaan tulevaisuudessa.", @@ -523,7 +514,6 @@ "Failed to change power level": "Oikeustason muuttaminen epäonnistui", "'%(alias)s' is not a valid format for an address": "'%(alias)s' ei ole oikean muotoinen osoitteelle", "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ei ole oikean muotoinen aliakselle", - "Otherwise, click here to send a bug report.": "Paina muutoin tästä lähettääksesi virheraportin.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Ole hyvä ja tarkista sähköpostisi ja seuraa sen sisältämää linkkiä. Kun olet valmis, paina jatka.", "Power level must be positive integer.": "Oikeustason pitää olla positiivinen kokonaisluku.", "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.": "Salasanan uudelleenalustus uudelleenalustaa myös päästä päähän-salausavaimet kaikilla laitteilla, jolloin vanhojen viestien lukeminen ei ole enään mahdollista, ellet ensin vie huoneavaimet ja tuo ne takaisin jälkeenpäin. Tämä tulee muuttumaan tulevaisuudessa.", @@ -562,7 +552,7 @@ "Sep": "syyskuu", "Oct": "lokakuu", "Nov": "marraskuu", - "Dec": "jolukuu", + "Dec": "joulukuu", "User names may only contain letters, numbers, dots, hyphens and underscores.": "Käyttäjänimet voivat sisältää vain kirjaimia, numeroita, pisteitä, viivoja ja alaviivoja.", "To continue, please enter your password.": "Ole hyvä ja syötä salasanasi jatkaaksesi.", "Verifies a user, device, and pubkey tuple": "Varmentaa käyttäjän, laitteen ja julkisen avaimen kolmikon", @@ -582,8 +572,6 @@ "What does this mean?": "Mitä tämä tarkoittaa?", "Error decrypting audio": "Äänen salauksen purku epäonnistui", "Error decrypting image": "Kuvan salauksen purku epäonnistui", - "Image '%(Body)s' cannot be displayed.": "Kuva '%(Body)s' ei voida näyttää.", - "This image cannot be displayed.": "Tätä kuvaa ei voida näyttää.", "Error decrypting video": "Videon salauksen purku epäonnistui", "Add an Integration": "Lisää integraatio", "Removed or unknown message type": "Poistettu tai tuntematon viestityyppi", @@ -682,7 +670,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ä.", @@ -767,7 +754,6 @@ "Advanced options": "Lisäasetukset", "Block users on other matrix homeservers from joining this room": "Salli vain tämän palvelimen käyttäjät", "This setting cannot be changed later!": "Tätä asetusta ei voi muuttaa myöhemmin!", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Tämä tekee tilistäsi pysyvästi käyttökelvottoman. Et voi rekisteröidä samaa tunnusta uudestaan.", "Add rooms to the community summary": "Lisää huoneita yhteisön yhteenvetoon", "Which rooms would you like to add to this summary?": "Mitkä huoneet haluaisit lisätä tähän yhteenvetoon?", "Add to summary": "Lisää yhteenvetoon", @@ -787,7 +773,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:", @@ -839,7 +824,6 @@ "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s pienoisohjelman lisännyt %(senderName)s", "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s pienoisohjelman poistanut %(senderName)s", "Send": "Lähetä", - "Presence Management": "Tilanhallinta", "Tag Panel": "Tagit", "Delete %(count)s devices|other": "Poista %(count)s laitetta", "Delete %(count)s devices|one": "Poista laite", @@ -935,8 +919,157 @@ "Custom of %(powerLevel)s": "Valinnaiset %(powerLevel)s", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Varmistaaksesi että tähän laitteeseen voidaan luottaa, ole yhteydessä omistajaan jollain muulla tavalla (henkilökohtaisesti tai puhelimitse) ja pyydä heitä varmistamaan näkyykö Käyttäjäasetuksissa laite jolla on alla oleva avain:", "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.", - "Cryptography data migrated": "Salaustiedot siirretty", "Old cryptography data detected": "Vanhat salaustiedot havaittu", "Warning": "Varoitus", - "Access Token:": "Pääsykoodi:" + "Access Token:": "Pääsykoodi:", + "Fetching third party location failed": "Kolmannen osapuolen paikan haku epäonnistui", + "A new version of Riot is available.": "Uusi Riot-versio on saatavilla.", + "Couldn't load home page": "Kotisivun lataus epäonnistui", + "Send Account Data": "Lähetä tilin tiedot", + "All notifications are currently disabled for all targets.": "Kaikki ilmoitukset on kytketty pois kaikilta kohteilta.", + "Uploading report": "Ladataan raporttia", + "Sunday": "Sunnuntai", + "Failed to add tag %(tagName)s to room": "Tagin %(tagName)s lisäämineen huoneelle ei onnistunut", + "Notification targets": "Ilmoituksen kohteet", + "Failed to set direct chat tag": "Suoran viestittelyn tagin asettaminen epäonnistui", + "Today": "Tänään", + "Files": "Tiedostot", + "You are not receiving desktop notifications": "Et vastaanota työpöytäilmoituksia", + "Friday": "Perjantai", + "Update": "Päivitä", + "What's New": "Mikä on uutta", + "Add an email address above to configure email notifications": "Lisää sähköpostiosoite yllä saadaksesi ilmoituksia sähköpostiisi", + "Expand panel": "Avaa paneeli", + "On": "Päällä", + "%(count)s Members|other": "%(count)s jäsentä", + "Filter room names": "Suodata", + "Changelog": "Muutosloki", + "Waiting for response from server": "Odotetaan vastausta palvelimelta", + "Send Custom Event": "Lähetä kustomoitu tapahtuma", + "Advanced notification settings": "Lisäasetukset ilmoituksille", + "delete the alias.": "poista alias.", + "To return to your account in future you need to set a password": "Voidaksesi tulevaisuudessa palata tilillesi sinut pitää asettaa salasana", + "Forget": "Unohda", + "#example": "#esimerkki", + "Hide panel": "Piilota paneeli", + "You cannot delete this image. (%(code)s)": "Et voi poistaa tätä kuvaa. (%(code)s)", + "Cancel Sending": "Peruuta lähetys", + "This Room": "Tämä huone", + "The Home Server may be too old to support third party networks": "Kotipalvelin saattaa olla liian vanha tukeakseen kolmannen osapuolen verkkoja", + "Noisy": "Äänekäs", + "Room not found": "Huonetta ei löytynyt", + "Downloading update...": "Ladataan päivitystä...", + "Messages in one-to-one chats": "Viestit henkilökohtaisissa keskusteluissa", + "Unavailable": "Ei saatavilla", + "Error saving email notification preferences": "Virhe tallennettaessa sähköposti-ilmoitusasetuksia", + "View Decrypted Source": "Näytä purettu lähdekoodi", + "Failed to update keywords": "Avainsanojen päivittäminen epäonnistui", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Seuraaviin avainsanoihin liittyvät ilmoitukset seuraavat sääntöjä joita ei voida näyttää tässä:", + "Safari and Opera work too.": "Safari ja Opera ovat myös tuettuja.", + "Please set a password!": "Ole hyvä ja aseta salasana!", + "You have successfully set a password!": "Olet onnistuneesti asettanut salasanan!", + "Explore Room State": "Huoneen tila", + "Source URL": "Lähde URL", + "Messages sent by bot": "Bottien lähettämät viestit", + "Filter results": "Suodata", + "Members": "Jäsenet", + "No update available.": "Ei päivityksiä saatavilla.", + "Resend": "Lähetä uudelleen", + "Failed to get protocol list from Home Server": "Protokollalistan hakeminen Kotipalvelimelta ei onnistunut", + "Collecting app version information": "Haetaan versiotietoja", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Poista huonetunnus %(alias)s ja poista %(name)s hakemistosta?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Tämä mahdollistaa sinut palamaan tilillesi uloskirjautumisen jälkeen sekä kirjautumaan muilla laitteilla.", + "Keywords": "Avainsanat", + "Enable notifications for this account": "Ota käyttöön ilmoitukset tälle tilille", + "Directory": "Hakemisto", + "Invite to this community": "Kutsu käyttäjiä", + "Search for a room": "Hae huonetta", + "Messages containing keywords": "Avainsanoja sisältävät viestit", + "View Source": "Näytä lähde", + "Tuesday": "Tiistai", + "Enter keywords separated by a comma:": "Anna avainsanat eroteltuna pilkuin:", + "Search…": "Haku…", + "You have successfully set a password and an email address!": "Olet onnistuneesti asettanut salasanan ja sähköpostiosoitteen!", + "Remove %(name)s from the directory?": "Poista %(name)s hakemistosta?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot käyttää monia selainominaisuuksia, joista osa selaimesi ei tue tai ne ovat kokeellisia.", + "Developer Tools": "Kehitystila", + "Enable desktop notifications": "Ota käyttöön työpöytäilmoitukset", + "Explore Account Data": "Tilitiedot", + "All messages (noisy)": "Kaikki viestit (äänekkäästi)", + "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ää", + "You must specify an event type!": "Sinun on määritettävä tapahtuman tyyppi!", + "(HTTP status %(httpStatus)s)": "(HTTP tila %(httpStatus)s)", + "All Rooms": "Kaikki huoneet", + "Please install Chrome or Firefox for the best experience.": "Asenna Chrome tai Firefox parhaan käyttökokemuksen saavuttamiseksi.", + "Failed to get public room list": "Julkisten huoneiden listan hakeminen epäonnistui", + "Quote": "Lainaa", + "Send logs": "Lähetä lokit", + "All messages": "Kaikki viestit", + "Call invitation": "Puhelukutsu", + "Messages containing my display name": "Viestit joissa mainitaan nimimerkkini", + "State Key": "Tila-avain", + "Failed to send custom event.": "Kustomoidun tapahtuman lähettäminen epäonnistui.", + "What's new?": "Mikä on uutta?", + "Notify me for anything else": "Ilmoita minulle kaikesta muusta", + "When I'm invited to a room": "Kun minut kutsutaan huoneeseen", + "Can't update user notification settings": "Käyttäjän ilmoitusasetusten päivittäminen epäonnistui", + "Notify for all other messages/rooms": "Ilmoita kaikista muista viesteistä/huoneista", + "Unable to look up room ID from server": "Huone-ID:n haku palvelimelta epäonnistui", + "Couldn't find a matching Matrix room": "Vastaavaa Matrix-huonetta ei löytynyt", + "Invite to this room": "Kutsu käyttäjiä", + "You cannot delete this message. (%(code)s)": "Et voi poistaa tätä viestiä. (%(code)s)", + "Thursday": "Torstai", + "I understand the risks and wish to continue": "Ymmärrän riskit ja haluan jatkaa", + "Back": "Takaisin", + "Reply": "Vastaa", + "Show message in desktop notification": "Näytä viestit ilmoituskeskuksessa", + "Unhide Preview": "Näytä ennakkokatselu", + "Unable to join network": "Verkkoon liittyminen epäonnistui", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Olet saattanut muuttaa niitä toisessa asiakasohjelmassa kuin Riot. Et voi muuttaa niitä Riotissa mutta ne pätevät kuitenkin", + "Sorry, your browser is not able to run Riot.": "Valitettavasti Riot ei toimi selaimessasi.", + "Uploaded on %(date)s by %(user)s": "Ladattu %(date)s käyttäjän %(user)s toimesta", + "Messages in group chats": "Viestit ryhmäkeskusteluissa", + "Yesterday": "Eilen", + "Error encountered (%(errorDetail)s).": "Virhe: %(errorDetail)s.", + "Login": "Kirjaudu sisään", + "Low Priority": "Matala prioriteetti", + "Unable to fetch notification target list": "Ilmoituskohdelistan haku epäonnistui", + "Set Password": "Aseta salasana", + "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 125f7ad79e..7dbcff2c9a 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -57,12 +57,10 @@ "Banned users": "Utilisateurs bannis", "Bans user with given id": "Bannit l'utilisateur à partir de son identifiant", "Blacklisted": "Sur liste noire", - "Bug Report": "Rapport d'erreur", "Call Timeout": "Délai d’appel expiré", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Impossible de se connecter au serveur d'accueil en HTTP si l'URL dans la barre de votre explorateur est en HTTPS. Utilisez HTTPS ou activez le support des scripts non-vérifiés.", "Can't load user settings": "Impossible de charger les paramètres de l'utilisateur", "Change Password": "Changer le mot de passe", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s a changé son nom affiché de %(oldDisplayName)s en %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s a changé son image de profil.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s a changé le rang de %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s a changé le nom du salon en %(roomName)s.", @@ -94,8 +92,8 @@ "Current password": "Mot de passe actuel", "Curve25519 identity key": "Clé d’identité Curve25519", "/ddg is not a command": "/ddg n'est pas une commande", - "Deactivate Account": "Supprimer le compte", - "Deactivate my account": "Supprimer mon compte", + "Deactivate Account": "Désactiver le compte", + "Deactivate my account": "Désactiver mon compte", "Decrypt %(text)s": "Déchiffrer %(text)s", "Decryption error": "Erreur de déchiffrement", "Delete": "Supprimer", @@ -134,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", @@ -242,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", @@ -414,7 +410,6 @@ "Please select the destination room for this message": "Merci de sélectionner le salon de destination pour ce message", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s a supprimé le nom du salon.", "Analytics": "Collecte de données", - "Opt out of analytics": "Ne pas envoyer ses données", "Riot collects anonymous analytics to allow us to improve the application.": "Riot collecte des données anonymes qui nous permettent d’améliorer l’application.", "Passphrases must match": "Les phrases de passe doivent être identiques", "Passphrase must not be empty": "La phrase de passe ne peut pas être vide", @@ -437,8 +432,6 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Voulez-vous vraiment supprimer cet événement ? Notez que si vous supprimez le changement du nom ou du sujet d’un salon, il est possible que ce changement soit annulé.", "Unknown error": "Erreur inconnue", "Incorrect password": "Mot de passe incorrect", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Ceci rendra votre compte inutilisable de manière permanente. Vous ne pourrez pas vous réinscrire avec le même identifiant utilisateur.", - "This action is irreversible.": "Cette action est irréversible.", "To continue, please enter your password.": "Pour continuer, veuillez saisir votre mot de passe.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Pour vérifier que vous pouvez faire confiance à cet appareil, merci de contacter son propriétaire par un autre moyen (par ex. en personne ou par téléphone) et demandez lui si la clé qu’il/elle voit dans ses Paramètres Utilisateur pour cet appareil correspond à la clé ci-dessous :", "Device name": "Nom de l'appareil", @@ -447,10 +440,8 @@ "In future this verification process will be more sophisticated.": "À l’avenir ce processus de vérification sera plus sophistiqué.", "Verify device": "Vérifier cet appareil", "I verify that the keys match": "J’ai vérifié que les clés correspondaient", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Nous avons rencontré une erreur en essayant de rétablir votre session précédente. Si vous continuez, vous devrez vous identifier à nouveau et l’historique de vos discussions chiffrées sera illisible.", "Unable to restore session": "Impossible de restaurer la session", "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.": "Si vous avez utilisé une version plus récente de Riot précédemment, votre session risque d’être incompatible avec cette version. Fermez cette fenêtre et retournez à la version plus récente.", - "Continue anyway": "Continuer quand même", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Vous êtes en train d’ajouter à la liste noire des appareils non-vérifiés ; pour envoyer des messages à ces appareils vous devez les vérifier.", "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.": "Nous vous recommandons d’effectuer le processus de vérification pour tous les appareils afin de confirmer qu’ils appartiennent à leurs propriétaires légitimes, mais vous pouvez renvoyer le(s) message(s) sans vérifier si vous préférez.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contient des appareils que vous n'avez encore jamais vus.", @@ -482,8 +473,6 @@ "What does this mean?": "Qu’est ce que cela signifie ?", "Error decrypting audio": "Erreur lors du déchiffrement de l’audio", "Error decrypting image": "Erreur lors du déchiffrement de l’image", - "Image '%(Body)s' cannot be displayed.": "L'image \"%(Body)s\" ne peut pas être affichée.", - "This image cannot be displayed.": "Cette image ne peut pas être affichée.", "Error decrypting video": "Erreur lors du déchiffrement de la vidéo", "Add an Integration": "Ajouter une intégration", "URL Previews": "Aperçus des liens", @@ -583,7 +572,6 @@ "Incoming video call from %(name)s": "Appel vidéo entrant de %(name)s", "Incoming voice call from %(name)s": "Appel vocal entrant de %(name)s", "No display name": "Pas de nom affiché", - "Otherwise, click here to send a bug report.": "Sinon, cliquer ici pour envoyer un rapport d'erreur.", "Private Chat": "Discussion privée", "Public Chat": "Discussion publique", "Reason: %(reasonText)s": "Raison : %(reasonText)s", @@ -603,7 +591,6 @@ "unknown caller": "appelant inconnu", "Unnamed Room": "Salon anonyme", "Unverified": "Non vérifié", - "%(user)s is a": "%(user)s est un(e)", "Username invalid: %(errMessage)s": "Nom d'utilisateur non valide : %(errMessage)s", "Verified": "Vérifié", "Would you like to accept or decline this invitation?": "Souhaitez-vous accepter ou refuser cette invitation ?", @@ -653,11 +640,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", @@ -864,7 +849,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é", @@ -908,7 +892,6 @@ "Username on %(hs)s": "Nom d'utilisateur sur %(hs)s", "Restricted": "Restreint", "Custom of %(powerLevel)s": "Personnalisé de %(powerLevel)s", - "Presence Management": "Gestion de présence", "Hide avatar changes": "Masquer les changements d'avatar", "Hide display name changes": "Masquer les changements de nom affiché", "Enable inline URL previews by default": "Activer l'aperçu des URL par défaut", @@ -930,12 +913,12 @@ "Select devices": "Sélectionner les appareils", "Something went wrong when trying to get your communities.": "Une erreur est survenue lors de l'obtention de vos communautés.", "This homeserver doesn't offer any login flows which are supported by this client.": "Ce serveur d'accueil n'offre aucun flux compatible avec ce client.", - "Flair": "Talents", - "Showing flair for these communities:": "Montre les talents pour ces communautés :", - "This room is not showing flair for any communities": "Ce salon n'affiche de talent pour aucune communauté", - "Flair will appear if enabled in room settings": "Les talents apparaîtront s'ils sont activés dans les paramètres du salon", - "Flair will not appear": "Les talents n'apparaîtront pas", - "Display your community flair in rooms configured to show it.": "Afficher vos talents de communauté dans les salons configurés pour les afficher.", + "Flair": "Badge", + "Showing flair for these communities:": "Ce salon affichera les badges pour ces communautés :", + "This room is not showing flair for any communities": "Ce salon n'affiche de badge pour aucune communauté", + "Flair will appear if enabled in room settings": "Les badges n'apparaîtront que s'ils sont activés dans les paramètres de chaque salon", + "Flair will not appear": "Les badges n'apparaîtront pas", + "Display your community flair in rooms configured to show it.": "Sélectionnez les badges dans les paramètres de chaque salon pour les afficher.", "Tag Panel": "Panneau des étiquettes", "Addresses": "Adresses", "expand": "développer", @@ -948,10 +931,241 @@ "Call": "Appel", "Answer": "Répondre", "Send": "Envoyer", - "Cryptography data migrated": "Données de chiffrement migrées", - "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.": "Une migration unique des données de chiffrement a été effectuée. Le chiffrement de bout-en-bout ne fonctionnera pas si vous revenez sur une version antérieure de Riot. Si vous avez besoin d'utiliser le chiffrement de bout-en-bout sur une ancienne version, déconnectez-vous de Riot. Pour conserver l'historique des messages, exportez et réimportez vos clés de chiffrement.", "Old cryptography data detected": "Anciennes données de chiffrement détectées", "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.": "Nous avons détecté des données d'une ancienne version de Riot. Le chiffrement de bout-en-bout n'aura pas fonctionné correctement sur l'ancienne version. Les messages chiffrés échangés récemment dans l'ancienne version ne sont peut-être pas déchiffrables dans cette version. Les échanges de message avec cette version peuvent aussi échouer. Si vous rencontrez des problèmes, déconnectez-vous puis reconnectez-vous. Pour conserver l'historique des messages, exportez puis réimportez vos clés de chiffrement.", - "Show devices or cancel all.": "Afficher les appareils ou tout annuler.", - "Warning": "Attention" + "Warning": "Attention", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Vous ne pourrez pas annuler cette modification car vous vous destituez. Si vous êtes le dernier utilisateur privilégié de ce salon, il sera impossible de récupérer les privilèges.", + "%(count)s of your messages have not been sent.|one": "Votre message n'a pas été envoyé.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Tout renvoyer ou tout annuler maintenant. Vous pouvez aussi choisir des messages individuels à renvoyer ou annuler.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Renvoyer le message ou annuler le message maintenant.", + "Message Replies": "Réponses", + "Send an encrypted reply…": "Envoyer une réponse chiffrée…", + "Send a reply (unencrypted)…": "Envoyer une réponse (non chiffrée)…", + "Send an encrypted message…": "Envoyer un message chiffré…", + "Send a message (unencrypted)…": "Envoyer un message (non chiffré)…", + "Replying": "Répond", + "Minimize apps": "Minimiser les applications", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Le respect de votre vie privée est important pour nous, donc nous ne collectons aucune donnée personnelle ou permettant de vous identifier pour nos statistiques.", + "Learn more about how we use analytics.": "En savoir plus sur notre utilisation des statistiques.", + "The information being sent to us to help make Riot.im better includes:": "Les informations qui nous sont envoyées pour nous aider à améliorer Riot.im comprennent :", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Si la page contient des informations permettant de vous identifier, comme un salon, un identifiant d'utilisateur ou de groupe, ces données sont enlevées avant qu'elle ne soit envoyée au serveur.", + "The platform you're on": "La plateforme que vous utilisez", + "The version of Riot.im": "La version de Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Si vous êtes connecté ou non (nous n'enregistrons pas votre nom d'utilisateur)", + "Your language of choice": "La langue que vous avez choisie", + "Which officially provided instance you are using, if any": "Quelle instance officielle vous utilisez, si c'est le cas", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Si vous utilisez le mode de texte enrichi de l'éditeur de texte enrichi", + "Your homeserver's URL": "L'URL de votre serveur d'accueil", + "Your identity server's URL": "L'URL de votre serveur d'identité", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s %(day)s %(monthName)s %(fullYear)s", + "This room is not public. You will not be able to rejoin without an invite.": "Ce salon n'est pas public. Vous ne pourrez pas y revenir sans invitation.", + "Community IDs cannot not be empty.": "Les identifiants de communauté ne peuvent pas être vides.", + "Show devices, send anyway or cancel.": "Afficher les appareils, envoyer quand même ou annuler.", + "In reply to ": "En réponse à ", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s a changé son nom affiché en %(displayName)s.", + "Failed to set direct chat tag": "Échec de l'ajout de l'étiquette discussion directe", + "Failed to remove tag %(tagName)s from room": "Échec de la suppression de l'étiquette %(tagName)s du salon", + "Failed to add tag %(tagName)s to room": "Échec de l'ajout de l'étiquette %(tagName)s au salon", + "Clear filter": "Supprimer les filtres", + "Did you know: you can use communities to filter your Riot.im experience!": "Le saviez-vous : vous pouvez utiliser les communautés pour filtrer votre expérience 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.": "Pour activer un filtre, faites glisser un avatar de communauté sur le panneau des filtres tout à gauche de l'écran. Vous pouvez cliquer sur un avatar dans ce panneau quand vous le souhaitez afin de ne voir que les salons et les personnes associés à cette communauté.", + "Disable Community Filter Panel": "Désactiver le panneau de filtre de communauté", + "Your key share request has been sent - please check your other devices for key share requests.": "Votre demande de partage de clé a été envoyée - veuillez vérifier les demandes de partage de clé sur vos autres appareils.", + "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.": "Les demandes de partage de clé sont envoyées à vos autres appareils automatiquement. Si vous rejetez ou supprimez la demande de partage de clé sur vos autres appareils, cliquez ici pour redemander les clés pour cette session.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Si vos autres appareils n'ont pas la clé pour ce message, vous ne pourrez pas le déchiffrer.", + "Key request sent.": "Demande de clé envoyée.", + "Re-request encryption keys from your other devices.": "Re-demander les clés de chiffrement depuis vos autres appareils.", + "%(user)s is a %(userRole)s": "%(user)s est %(userRole)s", + "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", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Si vous avez signalé un bug via GitHub, les journaux de débogage peuvent nous aider à identifier le problème. Les journaux de débogage contiennent des données d'utilisation de l'application dont votre nom d'utilisateur, les identifiants ou alias des salons ou groupes que vous avez visité et les noms d'utilisateur des autres participants. Ils ne contiennent pas les messages.", + "Submit debug logs": "Envoyer les journaux de débogage", + "Opens the Developer Tools dialog": "Ouvre la fenêtre des Outils de développeur", + "Unable to join community": "Impossible de rejoindre la communauté", + "Unable to leave community": "Impossible de quitter la communauté", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Les changements effectués au nom et à l'avatar de votre communauté peuvent prendre jusqu'à 30 minutes avant d'être vus par d'autres utilisateurs.", + "Join this community": "Rejoindre cette communauté", + "Leave this community": "Quitter cette communauté", + "Stickerpack": "Pack de stickers", + "You don't currently have any stickerpacks enabled": "Vous n'avez activé aucun pack de stickers pour l'instant", + "Add a stickerpack": "Ajouter un pack de stickers", + "Hide Stickers": "Masquer les stickers", + "Show Stickers": "Afficher les stickers", + "Who can join this community?": "Qui peut rejoindre cette communauté ?", + "Everyone": "Tout le monde", + "Fetching third party location failed": "Échec de la récupération de la localisation tierce", + "A new version of Riot is available.": "Une nouvelle version de Riot est disponible.", + "Couldn't load home page": "Impossible de charger la page d'accueil", + "Send Account Data": "Envoyer les données du compte", + "All notifications are currently disabled for all targets.": "Toutes les notifications sont désactivées pour tous les appareils.", + "Uploading report": "Envoi du rapport", + "Sunday": "Dimanche", + "Notification targets": "Appareils recevant les notifications", + "Today": "Aujourd'hui", + "Files": "Fichiers", + "You are not receiving desktop notifications": "Vous ne recevez pas les notifications sur votre bureau", + "Friday": "Vendredi", + "Update": "Mettre à jour", + "What's New": "Nouveautés", + "Add an email address above to configure email notifications": "Ajouter une adresse e-mail pour la configuration des notifications par e-mail", + "Expand panel": "Dévoiler le panneau", + "On": "Activé", + "%(count)s Members|other": "%(count)s membres", + "Filter room names": "Filtrer les salons par nom", + "Changelog": "Journal des modifications", + "Waiting for response from server": "En attente d’une réponse du serveur", + "Send Custom Event": "Envoyer l'événement personnalisé", + "Advanced notification settings": "Paramètres de notification avancés", + "delete the alias.": "supprimer l'alias.", + "To return to your account in future you need to set a password": "Pour pouvoir retrouver votre compte dans le futur, vous devez définir un mot de passe", + "Forget": "Oublier", + "#example": "#exemple", + "Hide panel": "Cacher le panneau", + "You cannot delete this image. (%(code)s)": "Vous ne pouvez pas supprimer cette image. (%(code)s)", + "Cancel Sending": "Annuler l'envoi", + "This Room": "Ce salon", + "The Home Server may be too old to support third party networks": "Le serveur d'accueil semble trop ancien pour supporter des réseaux tiers", + "Noisy": "Bruyant", + "Room not found": "Salon non trouvé", + "Messages containing my display name": "Messages contenant mon nom affiché", + "Messages in one-to-one chats": "Messages dans les discussions directes", + "Unavailable": "Indisponible", + "View Decrypted Source": "Voir la source déchiffrée", + "Failed to update keywords": "Échec dans la mise à jour des mots-clés", + "remove %(name)s from the directory.": "supprimer %(name)s du répertoire.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Les notifications pour les mots-clés suivant répondent à des critères qui ne peuvent pas être affichés ici :", + "Safari and Opera work too.": "Safari et Opera fonctionnent également.", + "Please set a password!": "Veuillez définir un mot de passe !", + "You have successfully set a password!": "Vous avez défini un mot de passe avec succès !", + "An error occurred whilst saving your email notification preferences.": "Une erreur est survenue lors de la sauvegarde de vos préférences de notification par e-mail.", + "Explore Room State": "Parcourir l'état du salon", + "Source URL": "URL de la source", + "Messages sent by bot": "Messages envoyés par des robots", + "Filter results": "Filtrer les résultats", + "Members": "Membres", + "No update available.": "Aucune mise à jour disponible.", + "Resend": "Renvoyer", + "Failed to get protocol list from Home Server": "Échec lors de la récupération de la liste sur le serveur", + "Collecting app version information": "Récupération des informations de version de l’application", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Supprimer l'alias %(alias)s du salon et supprimer %(name)s du répertoire ?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Cela vous permettra de retourner sur votre compte après vous être déconnecté, et de vous identifier sur d'autres appareils.", + "Keywords": "Mots-clés", + "Enable notifications for this account": "Activer les notifications pour ce compte", + "Directory": "Répertoire", + "Invite to this community": "Inviter à cette communauté", + "Failed to get public room list": "Échec lors de la récupération de la liste des salons publics", + "Messages containing keywords": "Messages contenant des mots-clés", + "Error saving email notification preferences": "Erreur lors de la sauvegarde des préférences de notification par e-mail", + "Tuesday": "Mardi", + "Enter keywords separated by a comma:": "Entrez les mots-clés séparés par une virgule :", + "Search…": "Rechercher…", + "You have successfully set a password and an email address!": "Vous avez défini un mot de passe et une adresse e-mail avec succès !", + "Remove %(name)s from the directory?": "Supprimer %(name)s du répertoire ?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utilise de nombreuses fonctionnalités avancées du navigateur, certaines ne sont pas disponibles ou expérimentales dans votre navigateur actuel.", + "Developer Tools": "Outils de développement", + "Enable desktop notifications": "Activer les notifications de bureau", + "Remember, you can always set an email address in user settings if you change your mind.": "Souvenez-vous que vous pourrez toujours définir une adresse e-mail dans les paramètres de l'utilisateur si vous changez d’avis.", + "Explore Account Data": "Explorer les données du compte", + "Remove from Directory": "Supprimer du répertoire", + "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", + "You must specify an event type!": "Vous devez spécifier un type d'événement !", + "(HTTP status %(httpStatus)s)": "(état HTTP %(httpStatus)s)", + "Invite to this room": "Inviter dans ce salon", + "Please install Chrome or Firefox for the best experience.": "Veuillez installer Chrome ou Firefox pour une expérience optimale.", + "Wednesday": "Mercredi", + "You cannot delete this message. (%(code)s)": "Vous ne pouvez pas supprimer ce message. (%(code)s)", + "Quote": "Citer", + "Send logs": "Envoyer les journaux", + "All messages": "Tous les messages", + "Call invitation": "Appel entrant", + "Downloading update...": "Mise à jour en cours de téléchargement...", + "State Key": "Clé d'état", + "Failed to send custom event.": "Échec de l'envoi de l'événement personnalisé.", + "What's new?": "Nouveautés ?", + "Notify me for anything else": "Me notifier pour tout le reste", + "View Source": "Voir la source", + "Can't update user notification settings": "Impossible de mettre à jour les paramètres de notification de l'utilisateur", + "Notify for all other messages/rooms": "Me notifier pour tous les autres messages/salons", + "Unable to look up room ID from server": "Impossible de récupérer l'ID du salon sur le serveur", + "Couldn't find a matching Matrix room": "Impossible de trouver un salon Matrix correspondant", + "All Rooms": "Tous les salons", + "Search for a room": "Rechercher un salon", + "Thursday": "Jeudi", + "Forward Message": "Transférer le message", + "Back": "Retour", + "Reply": "Répondre", + "Show message in desktop notification": "Afficher le message dans les notifications de bureau", + "Unhide Preview": "Dévoiler l'aperçu", + "Unable to join network": "Impossible de rejoindre le réseau", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Vous les avez probablement configurées dans un autre client que Riot. Vous ne pouvez pas les configurer dans Riot mais elles s'appliquent quand même", + "Sorry, your browser is not able to run Riot.": "Désolé, Riot n'est pas supporté par votre navigateur.", + "Uploaded on %(date)s by %(user)s": "Téléchargé le %(date)s par %(user)s", + "Messages in group chats": "Messages dans les discussions de groupe", + "Yesterday": "Hier", + "Error encountered (%(errorDetail)s).": "Erreur rencontrée (%(errorDetail)s).", + "Login": "Connexion", + "Low Priority": "Priorité basse", + "Unable to fetch notification target list": "Impossible de récupérer la liste des appareils recevant les notifications", + "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", + "Logs sent": "Rapports envoyés", + "GitHub issue link:": "Lien du signalement GitHub :", + "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.": "Les rapports de débogage contiennent des données d'usage de l'application qui incluent votre nom d'utilisateur, les identifiants ou alias des salons ou groupes auxquels vous avez rendu visite ainsi que les noms des autres utilisateurs. Ils ne contiennent aucun message.", + "Failed to send logs: ": "Échec lors de l'envoi des rapports : ", + "Notes:": "Notes :", + "Preparing to send logs": "Préparation d'envoi des rapports", + "Missing roomId.": "Identifiant de salon manquant.", + "Picture": "Image", + "Popout widget": "Détacher le widget", + "Every page you use in the app": "Toutes les pages que vous utilisez dans l'application", + "e.g. ": "par ex. ", + "Your User Agent": "Votre user agent", + "Your device resolution": "La résolution de votre appareil", + "Always show encryption icons": "Toujours afficher les icônes de chiffrement", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Les bugs de Riot sont suivis sur GitHub : créer un signalement GitHub.", + "Log out and remove encryption keys?": "Se déconnecter et effacer les clés de chiffrement ?", + "Send Logs": "Envoyer les rapports", + "Clear Storage and Sign Out": "Effacer le stockage et se déconnecter", + "Refresh": "Rafraîchir", + "We encountered an error trying to restore your previous session.": "Une erreur est survenue lors de la récupération de la dernière session.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Effacer le stockage de votre navigateur peut résoudre le problème, mais cela vous déconnectera et tous les historiques de conversation encryptés seront illisibles.", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Pour le moment il n'est pas possible de répondre avec un fichier donc ceci sera envoyé sans être une réponse.", + "Unable to reply": "Impossible de répondre", + "At this time it is not possible to reply with an emote.": "Pour le moment il n'est pas possible de répondre avec un émoji.", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Impossible de charger l'événement auquel il a été répondu, soit il n'existe pas, soit vous n'avez pas l'autorisation de le voir.", + "Collapse Reply Thread": "Dévoiler le fil de réponse", + "Enable widget screenshots on supported widgets": "Activer les captures d'écran des widgets pris en charge" } diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 4800e9e34e..fdab066031 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -117,7 +117,6 @@ "%(senderName)s requested a VoIP conference.": "%(senderName)s solicitou unha conferencia VoIP.", "%(senderName)s invited %(targetName)s.": "%(senderName)s convidou a %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s bloqueou a %(targetName)s.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s mudou o seu nome público de %(oldDisplayName)s a %(displayName)s.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s estableceu o seu nome público a %(displayName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s eliminou o seu nome público (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s eliminou a súa imaxe de perfil.", @@ -170,7 +169,6 @@ "Authentication check failed: incorrect password?": "Fallou a comprobación de autenticación: contrasinal incorrecto?", "Failed to join room": "Non se puido unir a sala", "Message Pinning": "Fixando mensaxe", - "Presence Management": "Xestión da presenza", "Tag Panel": "Panel de etiquetas", "Disable Emoji suggestions while typing": "Deshabilitar a suxestión de Emoji mentras escribe", "Use compact timeline layout": "Utilizar a disposición compacta da liña temporal", @@ -234,5 +232,939 @@ "Select devices": "Escolla dispositivos", "Failed to set display name": "Fallo ao establecer o nome público", "Disable Notifications": "Deshabilitar notificacións", - "Enable Notifications": "Habilitar notificacións" + "Enable Notifications": "Habilitar notificacións", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", + "Message Replies": "Respostas a mensaxe", + "Mirror local video feed": "Copiar fonte de vídeo local", + "Cannot add any more widgets": "Non pode engadir máis widgets", + "The maximum permitted number of widgets have already been added to this room.": "Xa se engadeu o número máximo de widgets a esta sala.", + "Add a widget": "Engadir widget", + "Drop File Here": "Solte aquí o ficheiro", + "Drop file here to upload": "Solte aquí o ficheiro para subilo", + " (unsupported)": " (non soportado)", + "Join as voice or video.": "Únase como voz ou vídeo.", + "Ongoing conference call%(supportedText)s.": "Chamada de conferencia en curso%(supportedText)s.", + "%(senderName)s sent an image": "%(senderName)s enviou unha imaxe", + "%(senderName)s sent a video": "%(senderName)s enviou un vídeo", + "%(senderName)s uploaded a file": "%(senderName)s subeu un ficheiro", + "Options": "Axustes", + "Undecryptable": "Non descifrable", + "Encrypted by a verified device": "Cifrado por un dispositivo verificado", + "Encrypted by an unverified device": "Cifrado por un dispositivo non verificado", + "Unencrypted message": "Mensaxe non cifrada", + "Please select the destination room for this message": "Escolla por favor a sala de destino para esta mensaxe", + "Blacklisted": "Omitidos", + "Verified": "Verificados", + "Unverified": "Non verificados", + "device id: ": "id dispositivo: ", + "Disinvite": "Retirar convite", + "Kick": "Expulsar", + "Disinvite this user?": "Retirar convite a este usuario?", + "Kick this user?": "Expulsar este usuario?", + "Failed to kick": "Fallo ao expulsar", + "Unban": "Non bloquear", + "Ban": "Bloquear", + "Unban this user?": "Non bloquear este usuario?", + "Ban this user?": "Bloquear a este usuario?", + "Failed to ban user": "Fallo ao bloquear usuario", + "Failed to mute user": "Fallo ao acalar usuario", + "Failed to toggle moderator status": "Fallo ao mudar a estado de moderador", + "Failed to change power level": "Fallo ao cambiar o nivel de permisos", + "Are you sure?": "Está segura?", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Non poderá desfacer este cambio xa que está promovendo a usaria a ter o mesmo nivel de permisos que vostede.", + "No devices with registered encryption keys": "Sen dispositivos con chaves de cifrado rexistradas", + "Devices": "Dispositivos", + "Unignore": "Non ignorar", + "Ignore": "Ignorar", + "Jump to read receipt": "Ir ao resgardo de lectura", + "Mention": "Mención", + "Invite": "Convidar", + "User Options": "Axustes de usuaria", + "Direct chats": "Conversa directa", + "Unmute": "Non acalar", + "Mute": "Acalar", + "Revoke Moderator": "Quitar Moderador", + "Make Moderator": "Facer Moderador", + "Admin Tools": "Ferramentas de administración", + "Level:": "Nivel:", + "and %(count)s others...|other": "e %(count)s outras...", + "and %(count)s others...|one": "e outra máis...", + "Invited": "Convidada", + "Filter room members": "Filtrar membros da conversa", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (permiso %(powerLevelNumber)s)", + "Attachment": "Anexo", + "Upload Files": "Subir ficheiros", + "Are you sure you want to upload the following files?": "Está segura de que quere subir os seguintes ficheiros?", + "Encrypted room": "Sala cifrada", + "Unencrypted room": "Sala non cifrada", + "Hangup": "Quedada", + "Voice call": "Chamada de voz", + "Video call": "Chamada de vídeo", + "Upload file": "Subir ficheiro", + "Show Text Formatting Toolbar": "Mostrar barra de formato de texto", + "Send an encrypted reply…": "Enviar unha resposta cifrada…", + "Send a reply (unencrypted)…": "Enviar unha resposta (non cifrada)…", + "Send an encrypted message…": "Enviar unha mensaxe cifrada…", + "Send a message (unencrypted)…": "Enviar unha mensaxe (non cifrada)…", + "You do not have permission to post to this room": "Non ten permiso para comentar en esta sala", + "Turn Markdown on": "Habilitar Markdown", + "Turn Markdown off": "Deshabilitar Markdown", + "Hide Text Formatting Toolbar": "Agochar barra de formato de texto", + "Server error": "Fallo no servidor", + "Server unavailable, overloaded, or something else went wrong.": "Servidor non dispoñible, sobrecargado, ou outra cousa puido fallar.", + "Command error": "Erro na orde", + "bold": "remarcado", + "italic": "cursiva", + "strike": "raiado", + "underline": "subliñado", + "code": "código", + "quote": "cita", + "bullet": "lista", + "numbullet": "lista numerada", + "Markdown is disabled": "Markdown deshabilitado", + "Markdown is enabled": "Markdown habilitado", + "Unpin Message": "Desfixar mensaxe", + "Jump to message": "Ir a mensaxe", + "No pinned messages.": "Sen mensaxes fixadas.", + "Loading...": "Cargando...", + "Pinned Messages": "Mensaxes fixadas", + "%(duration)ss": "%(duration)ss", + "%(duration)sm": "%(duration)sm", + "%(duration)sh": "%(duration)sh", + "%(duration)sd": "%(duration)sd", + "Online for %(duration)s": "En liña desde %(duration)s", + "Idle for %(duration)s": "En pausa desde %(duration)s", + "Offline for %(duration)s": "Desconectado desde %(duration)s", + "Unknown for %(duration)s": "Descoñecido desde %(duration)s", + "Online": "En liña", + "Idle": "En pausa", + "Offline": "Fóra de liña", + "Unknown": "Descoñecido", + "Replying": "Respostando", + "Seen by %(userName)s at %(dateTime)s": "Visto por %(userName)s as %(dateTime)s", + "No rooms to show": "Sen salas que mostrar", + "Unnamed room": "Sala sen nome", + "World readable": "Visible por todos", + "Guests can join": "Convidados pódense unir", + "Failed to set avatar.": "Fallo ao establecer o avatar.", + "Save": "Gardar", + "(~%(count)s results)|other": "(~%(count)s resultados)", + "(~%(count)s results)|one": "(~%(count)s resultado)", + "Join Room": "Unirse a sala", + "Upload avatar": "Subir avatar", + "Remove avatar": "Quitar avatar", + "Settings": "Axustes", + "Forget room": "Esquecer sala", + "Search": "Busca", + "Show panel": "Mostra panel", + "Drop here to favourite": "Solte aqui para favorito", + "Drop here to tag direct chat": "Solte aquí para etiquetar chat directo", + "Drop here to restore": "Solte aquí para restablecer", + "Drop here to tag %(section)s": "Solte aquí para etiquetar %(section)s", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Non poderá desfacer este cambio xa que está a diminuír a súa autoridade, si vostede é a única usuaria con autorización na sala será imposible voltar a obter privilexios.", + "Drop here to demote": "Arrastre aquí para degradar", + "Press to start a chat with someone": "Pulse para iniciar a conversa con alguén", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Aínda non está en ningunha sala! Pulse para crear unha sala ou para buscar no directorio", + "Community Invites": "Convites da comunidade", + "Invites": "Convites", + "Favourites": "Favoritas", + "People": "Xente", + "Rooms": "Salas", + "Low priority": "Baixa prioridade", + "Historical": "Historial", + "This invitation was sent to an email address which is not associated with this account:": "Este convite foi enviado a un enderezo de correo que non está asociado con esta conta:", + "You may wish to login with a different account, or add this email to this account.": "Pode que desexe conectarse con outra conta, ou engadir este enderezo a súa conta.", + "You have been invited to join this room by %(inviterName)s": "Foi convidada por %(inviterName)s a unirse a esta sala", + "Would you like to accept or decline this invitation?": "Quere aceptar ou rexeitar este convite?", + "Reason: %(reasonText)s": "Razón: %(reasonText)s", + "Rejoin": "Voltar a unirse", + "You have been kicked from %(roomName)s by %(userName)s.": "Foi expulsada de %(roomName)s por %(userName)s.", + "You have been kicked from this room by %(userName)s.": "Foi expulsada de esta sala por %(userName)s.", + "You have been banned from %(roomName)s by %(userName)s.": "Non se lle permite acceder a %(roomName)s por %(userName)s.", + "You have been banned from this room by %(userName)s.": "Non se lle permite o acceso a esta sala por %(userName)s.", + "This room": "Esta sala", + "%(roomName)s does not exist.": "%(roomName)s non existe.", + "%(roomName)s is not accessible at this time.": "%(roomName)s non está accesible en este momento.", + "You are trying to access %(roomName)s.": "Está intentando acceder a %(roomName)s.", + "You are trying to access a room.": "Está intentando acceder a unha sala.", + "Click here to join the discussion!": "Pulse aquí para unirse a conversa!", + "This is a preview of this room. Room interactions have been disabled": "Esta é unha vista previa de esta sala. Desactiváronse as interaccións coa sala", + "To change the room's avatar, you must be a": "Para cambiar o avatar da sala, debe ser", + "To change the room's name, you must be a": "Para cambiar o nome da sala, debe ser", + "To change the room's main address, you must be a": "Para cambiar o enderezo principal da sala, debe ser", + "To change the room's history visibility, you must be a": "Para cambiar a visibilidade do histórico da sala, debe ser", + "To change the permissions in the room, you must be a": "Para cambiar os permisos na sala, debe ser", + "To change the topic, you must be a": "Para cambiar o asunto, debe ser", + "To modify widgets in the room, you must be a": "Para modificar os widgets da sala, debe ser", + "Failed to unban": "Fallou eliminar a prohibición", + "Banned by %(displayName)s": "Non aceptado por %(displayName)s", + "Privacy warning": "Aviso de intimidade", + "Changes to who can read history will only apply to future messages in this room": "Os cambios sobre quen pode ler o histórico serán de aplicación a futuras mensaxes en esta sala", + "The visibility of existing history will be unchanged": "A visibilidade do histórico existente non cambiará", + "unknown error code": "código de fallo descoñecido", + "Failed to forget room %(errCode)s": "Fallo ao esquecer sala %(errCode)s", + "End-to-end encryption is in beta and may not be reliable": "O cifrado de extremo-a-extremo está en beta e podería non ser fiable", + "You should not yet trust it to secure data": "Polo de agora non debería confiarlle datos seguros", + "Devices will not yet be able to decrypt history from before they joined the room": "Os dispositivos non poderán descifrar o histórico anterior a que se uniron a sala", + "Once encryption is enabled for a room it cannot be turned off again (for now)": "Unha vez habilitado o cifrado para unha sala non se poderá desactivar (por agora)", + "Encrypted messages will not be visible on clients that do not yet implement encryption": "As mensaxes cifradas non será visibles en clientes que non aínda non teñan implementado o cifrado", + "Enable encryption": "Habilitar cifrado", + "(warning: cannot be disabled again!)": "(aviso: non se pode deshabilitar!)", + "Encryption is enabled in this room": "O cifrado está habilitado en esta sala", + "Encryption is not enabled in this room": "O cifrado non se habilitou para esta sala", + "Privileged Users": "Usuarios con privilexios", + "No users have specific privileges in this room": "Non hai usuarias con privilexios específicos en esta sala", + "Banned users": "Usuarias non permitidas", + "This room is not accessible by remote Matrix servers": "Esta sala non é accesible por servidores Matrix remotos", + "Leave room": "Deixar a sala", + "Favourite": "Favorita", + "Tagged as: ": "Etiquetada como: ", + "To link to a room it must have an address.": "Para ligar a unha sala deberá ter un enderezo.", + "Guests cannot join this room even if explicitly invited.": "As convidadas non se poden unir a esta sala incluso se foro explicitamente convidadas.", + "Click here to fix": "Pulse aquí para solución", + "Who can access this room?": "Quén pode acceder a esta sala?", + "Only people who have been invited": "Só persoas que foron convidadas", + "Anyone who knows the room's link, apart from guests": "Calquera que coñeza o enderezo da sala, aparte das convidadas", + "Anyone who knows the room's link, including guests": "Calquera que coñeza a ligazón a sala, incluíndo as convidadas", + "Publish this room to the public in %(domain)s's room directory?": "Publicar esta sala no directorio público de salas de %(domain)s?", + "Who can read history?": "Quén pode ler o histórico?", + "Anyone": "Calquera", + "Members only (since the point in time of selecting this option)": "Só membros (desde o momento en que se selecciona esta opción)", + "Members only (since they were invited)": "Só membros (desde que foron convidados)", + "Members only (since they joined)": "Só membros (desde que se uniron)", + "Permissions": "Permisos", + "The default role for new room members is": "Por omisión o rol na sala para novos membros é", + "To send messages, you must be a": "Para enviar mensaxes, deberá ser", + "To invite users into the room, you must be a": "Para convidar a usuarias a esta sala, debe ser", + "To configure the room, you must be a": "Para configurar a sala, debe ser", + "To kick users, you must be a": "Para expulsar usuarias, debe ser", + "To ban users, you must be a": "Para prohibir usuarias, debe ser", + "To remove other users' messages, you must be a": "Para eliminar mensaxes de outras usuarias, debe ser", + "To send events of type , you must be a": "Para enviar eventos de tipo , debe ser", + "Advanced": "Avanzado", + "This room's internal ID is": "O ID interno de esta sala é", + "Add a topic": "Engadir asunto", + "Cancel": "Cancelar", + "Scroll to unread messages": "Desplace ate mensaxes non lidas", + "Jump to first unread message.": "Ir a primeira mensaxe non lida.", + "Close": "Pechar", + "Invalid alias format": "Formato de alias non válido", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' non é un formato válido para un alias", + "Invalid address format": "Formato de enderezo non válido", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' non é un formato válido par un enderezo", + "not specified": "non indicado", + "not set": "non establecido", + "Remote addresses for this room:": "Enderezos remotos para esta sala:", + "Addresses": "Enderezos", + "The main address for this room is": "O enderezo principal para esta sala é", + "Local addresses for this room:": "O enderezo local para esta sala:", + "This room has no local addresses": "Esta sala non ten enderezos locais", + "New address (e.g. #foo:%(localDomain)s)": "Novos enderezos (ex. #foo:%(localDomain)s)", + "Invalid community ID": "ID da comunidade non válido", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' non é un ID de comunidade válido", + "New community ID (e.g. +foo:%(localDomain)s)": "Novo ID da comunidade (ex. +foo:%(localDomain)s)", + "You have enabled URL previews by default.": "Vostede habilitou a vista previa de URL por omisión.", + "You have disabled URL previews by default.": "Vostede desactivou a vista previa de URL por omisión.", + "URL previews are enabled by default for participants in this room.": "As vistas previas de URL están habilitadas por omisión para os participantes de esta sala.", + "URL previews are disabled by default for participants in this room.": "As vistas previas de URL están desactivadas por omisión para os participantes de esta sala.", + "URL Previews": "Vista previa de URL", + "Error decrypting audio": "Fallo ao descifrar audio", + "Error decrypting attachment": "Fallo descifrando o anexo", + "Decrypt %(text)s": "Descifrar %(text)s", + "Download %(text)s": "Baixar %(text)s", + "Invalid file%(extra)s": "Ficheiro non válido %(extra)s", + "Error decrypting image": "Fallo ao descifrar a imaxe", + "Error decrypting video": "Fallo descifrando vídeo", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s cambiou o avatar para %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s eliminou o avatar da sala.", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s cambiou o avatar da sala a ", + "Copied!": "Copiado!", + "Failed to copy": "Fallo ao copiar", + "Add an Integration": "Engadir unha integración", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Vai ser redirixido a unha web de terceiros para poder autenticar a súa conta e así utilizar %(integrationsUrl)s. Quere continuar?", + "Removed or unknown message type": "Tipo de mensaxe descoñecida ou eliminada", + "Message removed by %(userId)s": "Mensaxe eliminada por %(userId)s", + "Message removed": "Mensaxe eliminada", + "Robot check is currently unavailable on desktop - please use a web browser": "Comprobación por Robot non está dispoñible en escritorio - por favor utilice un navegador web", + "This Home Server would like to make sure you are not a robot": "Este Servidor quere asegurarse de que vostede non é un robot", + "Sign in with CAS": "Conectarse con CAS", + "Custom Server Options": "Opcións personalizadas do servidor", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Pode utilizar as opcións personalizadas do servidor para conectarse a outros servidores Matrix indicando un URL de servidor de inicio diferente.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Así pode utilizar este aplicativo con unha conta Matrix existente en un servidor de incio diferente.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Tamén pode establecer un servidor de identidade personalizado pero esto normalmente dificulta a interacción con usuarias basándose non enderezo de correo.", + "Dismiss": "Rexeitar", + "To continue, please enter your password.": "Para continuar, por favor introduza o seu contrasinal.", + "Password:": "Contrasinal:", + "An email has been sent to %(emailAddress)s": "Enviouse un correo a %(emailAddress)s", + "Please check your email to continue registration.": "Por favor comprobe o seu correo para continuar co rexistro.", + "Token incorrect": "Testemuño incorrecto", + "A text message has been sent to %(msisdn)s": "Enviouse unha mensaxe de texto a %(msisdn)s", + "Please enter the code it contains:": "Por favor introduza o código que contén:", + "Start authentication": "Inicie a autenticación", + "powered by Matrix": "funciona grazas a Matrix", + "Username on %(hs)s": "Nome de usuaria en %(hs)s", + "User name": "Nome de usuaria", + "Mobile phone number": "Número de teléfono móbil", + "Forgot your password?": "Esqueceu o contrasinal?", + "%(serverName)s Matrix ID": "Matrix ID en %(serverName)s", + "Sign in with": "Conectarse con", + "Email address": "Enderezo de correo", + "Sign in": "Conectar", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Si non indica un enderezo de correo non poderá restablecer o contrasinal, está segura?", + "Email address (optional)": "Enderezo de correo (opcional)", + "You are registering with %(SelectedTeamName)s": "Estase a rexistrar con %(SelectedTeamName)s", + "Mobile phone number (optional)": "Número de teléfono móbil (opcional)", + "Register": "Rexistar", + "Default server": "Servidor por omisión", + "Custom server": "Servidor personalizado", + "Home server URL": "URL do servidor de inicio", + "Identity server URL": "URL do servidor de identidade", + "What does this mean?": "Qué significa esto?", + "Remove from community": "Eliminar da comunidade", + "Disinvite this user from community?": "Retirar o convite a comunidade a esta usuaria?", + "Remove this user from community?": "Quitar a esta usuaria da comunidade?", + "Failed to withdraw invitation": "Fallo ao retirar o convite", + "Failed to remove user from community": "Fallo ao quitar a usuaria da comunidade", + "Filter community members": "Filtrar membros da comunidade", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Está segura de que quere eliminar '%(roomName)s' de %(groupId)s?", + "Removing a room from the community will also remove it from the community page.": "Eliminar unha sala da comunidade tamén a quitará da páxina da comunidade.", + "Remove": "Eliminar", + "Failed to remove room from community": "Fallo ao quitar a sala da comunidade", + "Failed to remove '%(roomName)s' from %(groupId)s": "Fallo ao quitar '%(roomName)s' de %(groupId)s", + "Something went wrong!": "Algo fallou!", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "A visibilidade de '%(roomName)s' en %(groupId)s non se puido actualizar.", + "Visibility in Room List": "Visibilidade na Lista de Salas", + "Visible to everyone": "Visible para todo o mundo", + "Only visible to community members": "Só visible para membros da comunidade", + "Filter community rooms": "Filtrar salas da comunidade", + "Something went wrong when trying to get your communities.": "Algo fallou ao intentar obter as súas comunidades.", + "You're not currently a member of any communities.": "Ate o momento non é membro de ningunha comunidade.", + "Unknown Address": "Enderezo descoñecido", + "NOTE: Apps are not end-to-end encrypted": "NOTA: As Apps non están cifradas de extremo-a-extremo", + "Do you want to load widget from URL:": "Quere cargar o widget da URL:", + "Allow": "Permitir", + "Delete Widget": "Eliminar Widget", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Quitando un widget eliminao para todas as usuarias de esta sala. Está segura de querer eliminar este widget?", + "Delete widget": "Eliminar widget", + "Revoke widget access": "Retirar acceso ao widget", + "Minimize apps": "Minimizar apps", + "Edit": "Editar", + "Create new room": "Crear unha nova sala", + "Unblacklist": "Quitar da lista negra", + "Blacklist": "Por na lista negra", + "Unverify": "Retirar verificación", + "Verify...": "Verificar...", + "No results": "Sen resultados", + "Delete": "Eliminar", + "Communities": "Comunidades", + "Home": "Inicio", + "Integrations Error": "Fallo nas integracións", + "Could not connect to the integration server": "Non se puido conectar ao servidor de integración", + "Manage Integrations": "Xestionar integracións", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s uníronse %(count)s veces", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s uníronse", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s uniuse %(count)s veces", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s uníuse", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s saíron %(count)s veces", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s saíron", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s saiu %(count)s veces", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s saiu", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s uníronse e saíron %(count)s veces", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s uníronse e saíron", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s uniuse e saiu %(count)s veces", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s uníuse e saiu", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s saíron e voltaron %(count)s veces", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s saíron e voltaron", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s saiu e voltou %(count)s veces", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s saiu e voltou", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s rexeitaron convites %(count)s veces", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s rexeitaron os seus convites", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s rexeitou o seu convite %(count)s veces", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s rexeitou o seu convite", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "retiróuselle o convite a %(severalUsers)s %(count)s veces", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "retirouselle o convite a %(severalUsers)s", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "retiróuselle o convite a %(oneUser)s %(count)s veces", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "retiróuselle o convite a %(oneUser)s", + "were invited %(count)s times|other": "foron convidados %(count)s veces", + "were invited %(count)s times|one": "foron convidados", + "was invited %(count)s times|other": "foi convidada %(count)s veces", + "was invited %(count)s times|one": "foi convidada", + "were banned %(count)s times|other": "foron prohibidas %(count)s veces", + "were banned %(count)s times|one": "foron prohibidas", + "was banned %(count)s times|other": "foi prohibida %(count)s veces", + "was banned %(count)s times|one": "foi prohibida", + "were unbanned %(count)s times|other": "retirouselle a prohibición %(count)s veces", + "were unbanned %(count)s times|one": "retirouselle a prohibición", + "was unbanned %(count)s times|other": "retirouselle a prohibición %(count)s veces", + "was unbanned %(count)s times|one": "retiróuselle a prohibición", + "were kicked %(count)s times|other": "foron expulsadas %(count)s veces", + "were kicked %(count)s times|one": "foron expulsadas", + "was kicked %(count)s times|other": "foi expulsada %(count)s veces", + "was kicked %(count)s times|one": "foi expulsada", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s cambiaron o seu nome %(count)s veces", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s cambiaron o seu nome", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s cambiou o seu nome %(count)s veces", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s cambiou o seu nome", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s cambiaron o seu avatar %(count)s veces", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s cambiaron o seu avatar", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s cambiou o seu avatar %(count)s veces", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s cambiou o seu avatar", + "%(items)s and %(count)s others|other": "%(items)s e %(count)s outras", + "%(items)s and %(count)s others|one": "%(items)s e outra máis", + "%(items)s and %(lastItem)s": "%(items)s e %(lastItem)s", + "collapse": "comprimir", + "expand": "expandir", + "Custom of %(powerLevel)s": "Personalización de %(powerLevel)s", + "Custom level": "Nivel personalizado", + "Room directory": "Directorio de salas", + "Start chat": "Iniciar conversa", + "And %(count)s more...|other": "E %(count)s máis...", + "ex. @bob:example.com": "ex. @pepe:exemplo.com", + "Add User": "Engadir usuaria", + "Matrix ID": "ID Matrix", + "Matrix Room ID": "ID sala Matrix", + "email address": "enderezo de correo", + "Try using one of the following valid address types: %(validTypesList)s.": "Intentar utilizar algún dos seguintes tipos de enderezo válidos: %(validTypesList)s.", + "You have entered an invalid address.": "Introduxo un enderezo non válido.", + "Create a new chat or reuse an existing one": "Crear un novo chat ou reutilizar un xa existente", + "Start new chat": "Iniciar un novo chat", + "You already have existing direct chats with this user:": "Xa ten unha conversa directa con esta usuaria:", + "Start chatting": "Iniciar a conversar", + "Click on the button below to start chatting!": "Pulse non botón inferior para iniciar a conversar!", + "Start Chatting": "Iniciar a conversa", + "Confirm Removal": "Confirme a retirada", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Está certa de que quere quitar (eliminar) este evento? Sepa que si elimina un nome de sala ou cambia o asunto, podería desfacer o cambio.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Os ID de comunidade só poden conter caracteres a-z, 0-9, or '=_-./'", + "Community IDs cannot not be empty.": "O ID de comunidade non pode quedar baldeiro.", + "Something went wrong whilst creating your community": "Algo fallou mentras se creaba a súa comunidade", + "Create Community": "Crear comunidade", + "Community Name": "Nome da comunidade", + "Example": "Exemplo", + "Community ID": "ID da comunidade", + "example": "exemplo", + "Create": "Crear", + "Create Room": "Crear sala", + "Room name (optional)": "Nome da sala (opcional)", + "Advanced options": "Axustes avanzados", + "Block users on other matrix homeservers from joining this room": "Evitar que usuarias de outros servidores matrix se unan a esta sala", + "This setting cannot be changed later!": "Esta preferencia non se pode cambiar máis tarde!", + "Unknown error": "Fallo descoñecido", + "Incorrect password": "Contrasinal incorrecto", + "Deactivate Account": "Desactivar conta", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Non se pode determinar si o enderezo ao que foi enviado este convite coincide con un dos asociados a súa conta.", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Para verificar que se pode confiar en este dispositivo, contacte co seu dono utilizando algún outro medio (ex. en persoa ou chamada de teléfono) e pregúntelle si a chave que ven nos Axustes de Usuaria do se dispositivo coincide coa chave inferior:", + "Device name": "Nome do dispositivo", + "Device key": "Chave do dispositivo", + "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.": "Si concorda, pulse o botón verificar. Si non, entón alguén está interceptando este dispositivo e probablemente vostede desexe pulsar o botón lista negra.", + "In future this verification process will be more sophisticated.": "No futuro este proceso de verificación será máis sofisticado.", + "Verify device": "Verificar dispositivo", + "I verify that the keys match": "Certifico que coinciden as chaves", + "An error has occurred.": "Algo fallou.", + "OK": "OK", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Engadeu un novo dispositivo '%(displayName)s', que está a solicitar as chaves de cifrado.", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "O seu dispositivo non verificado '%(displayName)s' está solicitando chaves de cifrado.", + "Start verification": "Iniciar verificación", + "Share without verifying": "Compartir sin verificar", + "Ignore request": "Ignorar petición", + "Loading device info...": "Cargando información do dispositivo...", + "Encryption key request": "Petición de chave de cifrado", + "Unable to restore session": "Non se puido restaurar a sesión", + "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.": "Si anteriormente utilizou unha versión máis recente de Riot, a súa sesión podería non ser compatible con esta versión. Peche esta ventá e volte a versión máis recente.", + "Invalid Email Address": "Enderezo de email non válido", + "This doesn't appear to be a valid email address": "Este non semella ser un enderezo de email válido", + "Verification Pending": "Verificación pendente", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor comprobe o seu email e pulse na ligazón que contén. Unha vez feito, pulse continuar.", + "Unable to add email address": "Non se puido engadir enderezo de email", + "Unable to verify email address.": "Non se puido verificar enderezo de email.", + "This will allow you to reset your password and receive notifications.": "Esto permitiralle restablecer o seu contrasinal e recibir notificacións.", + "Skip": "Saltar", + "User names may only contain letters, numbers, dots, hyphens and underscores.": "Os nomes de usuaria só poden conter letras, números, puntos e guión alto e baixo.", + "Username not available": "Nome de usuaria non dispoñible", + "Username invalid: %(errMessage)s": "Nome de usuaria non válido: %(errMessage)s", + "An error occurred: %(error_string)s": "Algo fallou: %(error_string)s", + "Username available": "Nome de usuaria dispoñible", + "To get started, please pick a username!": "Para comezar, escolla un nome de usuaria!", + "This will be your account name on the homeserver, or you can pick a different server.": "Este será o nome da súa conta no servidor, ou pode escoller un servidor diferente.", + "If you already have a Matrix account you can log in instead.": "Si xa ten unha conta Matrix entón pode conectarse.", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "En este momento está por na lista negra os dispositivos non verificados; para enviar mensaxes a eses dispositivos debe verificalos.", + "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.": "Recomendámoslle que vaia ao proceso de verificación para cada dispositivo para confirmar que pertencen ao seu dono lexítimos, pero se o prefire pode enviar a mensaxe sen ter verificado.", + "Room contains unknown devices": "A sala contén dispositivos descoñecidos", + "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contén dispositivos que vostede non vira antes.", + "Unknown devices": "Dispositivos descoñecidos", + "Private Chat": "Conversa privada", + "Public Chat": "Conversa pública", + "Custom": "Personalizada", + "Alias (optional)": "Alias (opcional)", + "Name": "Nome", + "Topic": "Asunto", + "Make this room private": "Facer que esta sala sexa privada", + "Share message history with new users": "Compartir o histórico de mensaxes coas novas usuarias", + "Encrypt room": "Cifrar sala", + "You must register to use this functionality": "Debe rexistrarse para utilizar esta función", + "You must join the room to see its files": "Debe unirse a sala para ver os seus ficheiros", + "There are no visible files in this room": "Non hai ficheiros visibles en esta sala", + "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    HTML para a páxina da súa comunidade

    \n

    \n Utilice a descrición longa para presentar novos membros a comunidade, ou publicar algunha ligazón importante\n \n

    \n

    \n Tamén pode utilizar etiquetas 'img'\n

    \n", + "Add rooms to the community summary": "Engadir salas ao resumo da comunidade", + "Which rooms would you like to add to this summary?": "Qué salas desexa engadir a este resumo?", + "Add to summary": "Engadir ao resumo", + "Failed to add the following rooms to the summary of %(groupId)s:": "Algo fallou ao engadir estas salas ao resumo de %(groupId)s:", + "Add a Room": "Engadir unha sala", + "Failed to remove the room from the summary of %(groupId)s": "Algo fallou ao quitar a sala do resumo de %(groupId)s", + "The room '%(roomName)s' could not be removed from the summary.": "A sala '%(roomName)s' non se puido eliminar do resumo.", + "Add users to the community summary": "Engadir usuarias ao resumo da comunidade", + "Who would you like to add to this summary?": "A quén desexa engadir a este resumo?", + "Failed to add the following users to the summary of %(groupId)s:": "Algo fallou ao engadir as seguintes usuarias ao resumo de %(groupId)s:", + "Add a User": "Engadir unha usuaria", + "Failed to remove a user from the summary of %(groupId)s": "Algo fallou ao eliminar a usuaria do resumo de %(groupId)s", + "The user '%(displayName)s' could not be removed from the summary.": "A usuaria '%(displayName)s' non se puido eliminar do resumo.", + "Failed to upload image": "Fallo ao subir a páxina", + "Failed to update community": "Fallo ao actualizar a comunidade", + "Unable to accept invite": "Non puido aceptar o convite", + "Unable to reject invite": "Non puido rexeitar o convite", + "Leave Community": "Deixar a comunidade", + "Leave %(groupName)s?": "Deixar %(groupName)s?", + "Leave": "Saír", + "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", + "Featured Rooms:": "Salas destacadas:", + "Featured Users:": "Usuarias destacadas:", + "%(inviter)s has invited you to join this community": "%(inviter)s convidouna a unirse a esta comunidade", + "You are an administrator of this community": "Vostede administra esta comunidade", + "You are a member of this community": "Vostede é membro de esta comunidade", + "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "A súa comunidade non ten unha Descrición Longa, unha páxina HTML para mostrar aos membros.
    Pulse aquí para abrir os axustes e publicar unha!", + "Long Description (HTML)": "Descrición longa (HTML)", + "Description": "Descrición", + "Community %(groupId)s not found": "Non se atopou a comunidade %(groupId)s", + "This Home server does not support communities": "Este servidor non soporta comunidades", + "Failed to load %(groupId)s": "Fallo ao cargar %(groupId)s", + "Reject invitation": "Rexeitar convite", + "Are you sure you want to reject the invitation?": "Seguro que desexa rexeitar o convite?", + "Failed to reject invitation": "Fallo ao rexeitar o convite", + "Are you sure you want to leave the room '%(roomName)s'?": "Seguro que desexa saír da sala '%(roomName)s'?", + "Failed to leave room": "Algo fallou ao saír da sala", + "Signed Out": "Desconectada", + "For security, this session has been signed out. Please sign in again.": "Por seguridade, pechouse a sesión. Por favor, conéctese de novo.", + "Old cryptography data detected": "Detectouse o uso de criptografía sobre datos antigos", + "Logout": "Desconectar", + "Your Communities": "As súas Comunidades", + "Error whilst fetching joined communities": "Fallo mentras se obtiñas as comunidades unidas", + "Create a new community": "Crear unha nova comunidade", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crear unha comunidade para agrupar usuarias e salas! Poña unha páxina de inicio personalizada para destacar o seu lugar no universo Matrix.", + "Join an existing community": "Unirse a unha comunidade existente", + "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Para unirse a unha comunidade existente deberá coñecer o identificador de esa comunidade; terá un aspecto como +exemplo:matrix.org.", + "You have no visible notifications": "Non ten notificacións visibles", + "Scroll to bottom of page": "Desplácese ate o final da páxina", + "Message not sent due to unknown devices being present": "Non se enviou a mensaxe porque hai dispositivos non coñecidos", + "Show devices, send anyway or cancel.": "Mostrar dispositivos, enviar igualmente ou cancelar.", + "%(count)s of your messages have not been sent.|other": "Algunha das súas mensaxes non foron enviadas.", + "%(count)s of your messages have not been sent.|one": "A súa mensaxe non foi enviada.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Reenviar todo ou bencancelar todo. Tamén pode seleccionar mensaxes individuais para reenviar ou cancelar.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Reenviar mensaxe ou cancelar mensaxe agora.", + "Warning": "Aviso", + "Connectivity to the server has been lost.": "Perdeuse a conexión ao servidor.", + "Sent messages will be stored until your connection has returned.": "As mensaxes enviadas gardaránse ate que retome a conexión.", + "%(count)s new messages|other": "%(count)s novas mensaxes", + "%(count)s new messages|one": "%(count)s nova mensaxe", + "Active call": "Chamada activa", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Non hai ninguén por aquí! Desexa convidar a outras ou deixar de informar sobre a sala baldeira?", + "You seem to be uploading files, are you sure you want to quit?": "Semella estar a subir ficheiros, seguro que desexa deixalo?", + "You seem to be in a call, are you sure you want to quit?": "Semella estar en unha chamada, seguro que quere saír?", + "Failed to upload file": "Fallo ao subir ficheiro", + "Server may be unavailable, overloaded, or the file too big": "O servidor podería non estar dispoñible, sobrecargado ou o ficheiro ser demasiado grande", + "Search failed": "Fallou a busca", + "Server may be unavailable, overloaded, or search timed out :(": "O servidor podería non estar dispoñible, sobrecargado, ou caducou a busca :(", + "No more results": "Sen máis resultados", + "Unknown room %(roomId)s": "Sala descoñecida %(roomId)s", + "Room": "Sala", + "Failed to save settings": "Fallo ao gardar os axustes", + "Failed to reject invite": "Fallo ao rexeitar o convite", + "Fill screen": "Encher pantalla", + "Click to unmute video": "Pulse para escoitar vídeo", + "Click to mute video": "Pulse para acalar video", + "Click to unmute audio": "Pulse para escoitar audio", + "Click to mute audio": "Pulse para acalar audio", + "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Intentouse cargar un punto concreto do historial de esta sala, pero vostede non ten permiso para ver a mensaxe en cuestión.", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "Intentouse cargar un punto específico do historial de esta sala, pero non se puido atopar.", + "Failed to load timeline position": "Fallo ao cargar posición da liña temporal", + "Uploading %(filename)s and %(count)s others|other": "Subindo %(filename)s e %(count)s máis", + "Uploading %(filename)s and %(count)s others|zero": "Subindo %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Subindo %(filename)s e %(count)s máis", + "Light theme": "Decorado claro", + "Dark theme": "Decorado oscuro", + "Status.im theme": "Decorado Status.im", + "Can't load user settings": "Non se puideron cargar os axustes de usuaria", + "Server may be unavailable or overloaded": "O servidor podería non está dispoñible ou sobrecargado", + "Sign out": "Desconectar", + "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 seguridade, ao desconectarse borrará todas as chaves de cifrado extremo-a-extremo en este navegador. Si quere poder descifrar o historial da conversa en futuras sesións en Riot, por favor exporte as chaves da sala e gárdeas en lugar seguro.", + "Failed to change password. Is your password correct?": "Fallo ao cambiar o contrasinal. É correcto o contrasinal?", + "Success": "Parabéns", + "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "O seu contrasinal cambiouse correctamente. Non recibirá notificacións tipo push en outros dispositivos ate que se conecte novamente en eles", + "Remove Contact Information?": "Eliminar información do contacto?", + "Remove %(threePid)s?": "Eliminar %(threePid)s?", + "Unable to remove contact information": "Non se puido eliminar a información do contacto", + "Refer a friend to Riot:": "Convide a un amigo a Riot:", + "Interface Language": "Idioma da Interface", + "User Interface": "Interface de usuaria", + "Autocomplete Delay (ms):": "Retraso no autocompletado (ms):", + "": "", + "Import E2E room keys": "Importar chaves E2E da sala", + "Cryptography": "Criptografía", + "Device ID:": "ID de dispositivo:", + "Device key:": "Chave do dispositivo:", + "Ignored Users": "Usuarias ignoradas", + "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.", + "Learn more about how we use analytics.": "Saber máis sobre cómo utilizamos analytics.", + "Labs": "Labs", + "These are experimental features that may break in unexpected ways": "Estas son características experimentais que poderían dar lugar a fallos non agardados", + "Use with caution": "Utilice con precaución", + "Deactivate my account": "Desactivar a miña conta", + "Clear Cache": "Limpar caché", + "Clear Cache and Reload": "Limpar caché e recargar", + "Updates": "Actualizacións", + "Check for update": "Comprobar actualización", + "Reject all %(invitedRooms)s invites": "Rexeitar todos os %(invitedRooms)s convites", + "Bulk Options": "Opcións en bloque", + "Desktop specific": "Específicas de escritorio", + "Start automatically after system login": "Iniciar automáticamente despóis de iniciar sesión", + "No media permissions": "Sen permisos de medios", + "You may need to manually permit Riot to access your microphone/webcam": "Igual ten que permitir manualmente a Riot acceder ao seus micrófono e cámara", + "Missing Media Permissions, click here to request.": "Faltan permisos de medios, pulse aquí para solicitalos.", + "No Microphones detected": "Non se detectaron micrófonos", + "No Webcams detected": "Non se detectaron cámaras", + "Default Device": "Dispositivo por omisión", + "Microphone": "Micrófono", + "Camera": "Cámara", + "VoIP": "VoIP", + "Email": "Correo-e", + "Add email address": "Engadir enderezo correo-e", + "Notifications": "Notificacións", + "Profile": "Perfil", + "Display name": "Nome mostrado", + "Account": "Conta", + "To return to your account in future you need to set a password": "Estableza un contrasinal para voltar a súa conta con posterioridade", + "Logged in as:": "Conectada como:", + "Access Token:": "Testemuño de acceso:", + "click to reveal": "pulse para revelar", + "Homeserver is": "O servidor de inicio é", + "Identity Server is": "O servidor de identidade é", + "matrix-react-sdk version:": "versión matrix-react-sdk:", + "riot-web version:": "versión riot-web:", + "olm version:": "versión olm:", + "Failed to send email": "Fallo ao enviar correo-e", + "The email address linked to your account must be entered.": "Debe introducir o correo-e ligado a súa conta.", + "A new password must be entered.": "Debe introducir un novo contrasinal.", + "New passwords must match each other.": "Os novos contrasinais deben ser coincidentes.", + "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.": "Detectáronse datos de una versión anterior de Riot. Esto causará un mal funcionamento da criptografía extremo-a-extremo na versión antiga. As mensaxes cifradas extremo-a-extremo intercambiadas mentras utilizaba a versión anterior poderían non ser descifrables en esta versión. Esto tamén podería causar que mensaxes intercambiadas con esta versión tampouco funcionasen. Si ten problemas, desconéctese e conéctese de novo. Para manter o historial de mensaxes, exporte e reimporte as súas chaves.", + "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.": "O restablecemento do contrasinal restablecerá tamén as chaves de cifrado extremo-a-extremo en todos os dispositivos, facendo o historial de chat cifrado non lexible, a menos que primeiro exporte as chaves da sala e as reimporte posteriormente. No futuro melloraremos esto.", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Enviouse un email a %(emailAddress)s. Unha vez siga a ligazón que contén, pulse abaixo.", + "I have verified my email address": "Validei o meu enderezo de correo-e", + "Your password has been reset": "Restableceuse o seu contrasinal", + "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": "Foi desconectado de todos os seus dispositivos e xa non recibirá notificacións push. Para reactivar as notificacións, conéctese de novo en cada dispositivo", + "Return to login screen": "Voltar a pantalla de conexión", + "To reset your password, enter the email address linked to your account": "Para restablecer o seu contrasinal, introduza o enderezo de correo electrónico ligado a súa conta", + "New password": "Novo contrasinal", + "Confirm your new password": "Confirme o seu novo contrasinal", + "Send Reset Email": "Enviar correo-e de restablecemento", + "Create an account": "Crear unha conta", + "This Home Server does not support login using email address.": "Este servidor non soporta a conexión utilizando un enderezo de correo-e.", + "Incorrect username and/or password.": "Nome de usuaria ou contrasinal non válidos.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Teña en conta que se está a conectar ao servidor %(hs)s, non a matrix.org.", + "Guest access is disabled on this Home Server.": "O acceso de convidados está deshabilitado en este servidor de inicio.", + "The phone number entered looks invalid": "O número de teléfono introducido non semella ser válido", + "This homeserver doesn't offer any login flows which are supported by this client.": "Este servidor non ofrece ningún sistema de conexión que soporte este cliente.", + "Error: Problem communicating with the given homeserver.": "Fallo: problema ao comunicarse con servidor proporcionado.", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Non se pode conectar ao servidor vía HTTP cando na barra de enderezos do navegador está HTTPS. Utilice HTTPS ou active scripts non seguros.", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Non se conectou ao servidor - por favor comprobe a conexión, asegúrese de o certificado SSL do servidor é de confianza, e que ningún engadido do navegador está bloqueando as peticións.", + "Login as guest": "Conexión como convidado", + "Sign in to get started": "Conéctese para iniciar", + "Failed to fetch avatar URL": "Fallo ao obter o URL do avatar", + "Set a display name:": "Establecer nome público:", + "Upload an avatar:": "Suba un avatar:", + "This server does not support authentication with a phone number.": "O servidor non soporta a autenticación con número de teléfono.", + "Missing password.": "Falta contrasinal.", + "Passwords don't match.": "Non coinciden os contrasinais.", + "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Contrasinal demasiado curto (min %(MIN_PASSWORD_LENGTH)s).", + "This doesn't look like a valid email address.": "Non semella ser un enderezo de correo-e válido.", + "This doesn't look like a valid phone number.": "Non semella ser un número de teléfono válido.", + "You need to enter a user name.": "É preciso que introduza un nome de usuaria.", + "An unknown error occurred.": "Aconteceu un erro descoñecido.", + "I already have an account": "Xa teño unha conta", + "Displays action": "Mostra acción", + "Bans user with given id": "Prohibe a usuaria co ID indicado", + "Unbans user with given id": "Permite de novo a usuaria co ID proporcionado", + "Define the power level of a user": "Define o nivel de permisos de unha usuaria", + "Invites user with given id to current room": "Convida a usuaria co id proporcionado a sala actual", + "Joins room with given alias": "Únese a sala co alias proporcionado", + "Sets the room topic": "Establece o asunto da sala", + "Kicks user with given id": "Expulsa usuaria co id proporcionado", + "Changes your display nickname": "Cambia o alcume mostrado", + "Searches DuckDuckGo for results": "Buscar en DuckDuckGo por resultados", + "Changes colour scheme of current room": "Cambia o esquema de cores da sala actual", + "Verifies a user, device, and pubkey tuple": "Valida o conxunto de usuaria, dispositivo e chave pública", + "Ignores a user, hiding their messages from you": "Ignora unha usuaria, agochándolle as súas mensaxes", + "Stops ignoring a user, showing their messages going forward": "Deixa de ignorar unha usuaria, mostrándolles as súas mensaxes a partir de agora", + "Commands": "Comandos", + "Results from DuckDuckGo": "Resultados desde DuckDuckGo", + "Emoji": "Emoji", + "Notify the whole room": "Notificar a toda a sala", + "Room Notification": "Notificación da Sala", + "Users": "Usuarias", + "unknown device": "dispositivo descoñecido", + "NOT verified": "Non validado", + "verified": "validado", + "Verification": "Validación", + "Ed25519 fingerprint": "pegada Ed25519", + "User ID": "ID de usuaria", + "Curve25519 identity key": "Chave de identidade Curve25519", + "none": "nada", + "Claimed Ed25519 fingerprint key": "Chave de pegada pedida Ed25519", + "Algorithm": "Algoritmo", + "unencrypted": "non cifrado", + "Decryption error": "Fallo ao descifrar", + "Session ID": "ID de sesión", + "End-to-end encryption information": "Información do cifrado extremo-a-extremo", + "Event information": "Información do evento", + "Sender device information": "Información do dispositivo do remitente", + "Passphrases must match": "As frases de paso deben coincidir", + "Passphrase must not be empty": "A frase de paso non pode quedar baldeira", + "Export room keys": "Exportar chaves da sala", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Este proceso permítelle exportar a un ficheiro local as chaves para as mensaxes que recibeu en salas cifradas. Posteriormente permitiralle importar as chaves en outro cliente Matrix no futuro, así o cliente poderá descifrar esas mensaxes.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "O ficheiro exportado permitiralle a calquera que poida lelo descifrar e cifrar mensaxes que vostede ve, así que debería ter coidado e gardalo de xeito seguro. Para axudarlle, debe introducir unha frase de paso aquí abaixo que será utilizada para cifrar os datos exportados. Só será posible importar os datos utilizando a misma frase de paso.", + "Enter passphrase": "Introduza a frase de paso", + "Confirm passphrase": "Confirme a frase de paso", + "Export": "Exportar", + "Import room keys": "Importar chaves de sala", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Este proceso permítelle importar chaves de cifrado que vostede exportou de outro cliente Matrix. Así poderá descifrar calquer mensaxe que o outro cliente puidese cifrar.", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "O ficheiro exportado estará protexido con unha frase de paso. Debe introducir aquí esa frase de paso para descifrar o ficheiro.", + "File to import": "Ficheiro a importar", + "Import": "Importar", + "The information being sent to us to help make Riot.im better includes:": "A información enviada a Riot.im para axudarnos a mellorar inclúe:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Si esta páxina inclúe información identificable como ID de grupo, usuario ou sala, estes datos son eliminados antes de ser enviados ao servidor.", + "The platform you're on": "A plataforma na que está", + "The version of Riot.im": "A versión de Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Si está ou non conectada (non gardamos o nome de usuaria)", + "Your language of choice": "A súa preferencia de idioma", + "Which officially provided instance you are using, if any": "Qué instancia oficial está a utilizar, si algunha", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Si utiliza o modo Richtext ou non do Editor Rich Text", + "Your homeserver's URL": "O URL do seu servidor de inicio", + "Your identity server's URL": "O URL da súa identidade no servidor", + "In reply to ": "En resposta a ", + "This room is not public. You will not be able to rejoin without an invite.": "Esta sala non é pública. Non poderá voltar a ela sin un convite.", + "This room is not showing flair for any communities": "Esta sala non mostra popularidade para as comunidades", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s cambiou o seu nome mostrado a %(displayName)s.", + "Clear filter": "Quitar filtro", + "Failed to set direct chat tag": "Fallo ao establecer etiqueta do chat directo", + "Failed to remove tag %(tagName)s from room": "Fallo ao eliminar a etiqueta %(tagName)s da sala", + "Failed to add tag %(tagName)s to room": "Fallo ao engadir a etiqueta %(tagName)s a sala", + "Failed to lookup current room": "Fallo ao bloquear a sala actual", + "Disable Community Filter Panel": "Deshabilitar o panel de filtro de comunidades", + "Your key share request has been sent - please check your other devices for key share requests.": "Enviouse a solicitude de compartir chave - por favor comprobe as peticións de compartir chaves nos seus outros dispositivos.", + "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.": "As peticións de compartir chaves envíanse de xeito automático aos seus outros dispositivos. Si rexeita o obvia estas peticións nos outros dispositivos, pulse aquí para solicitar novamente as chaves para esta sesión.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Si os seus outros dispositivos non teñen as chaves para est mensaxe non poderán descifrala.", + "Key request sent.": "Petición de chave enviada.", + "Re-request encryption keys from your other devices.": "Voltar a pedir chaves de cifrado desde os outros dispositivos.", + "%(user)s is a %(userRole)s": "%(user)s é %(userRole)s", + "Flair": "Aura", + "Showing flair for these communities:": "Mostrar o aura para estas comunidades:", + "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.", + "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", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Visto por %(displayName)s(%(userName)s en %(dateTime)s", + "Code": "Código", + "Unable to join community": "Non se puido unir a comunidade", + "Unable to leave community": "Non se puido deixar a comunidade", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Os cambios realizados a súa comunidade name e avatarset a password": "Para voltar a súa conta no futuro debe establecer un contrasinal>/u>", + "Forget": "Esquecer", + "#example": "#exemplo", + "Hide panel": "Agochar panel", + "You cannot delete this image. (%(code)s)": "Non pode eliminar esta imaxe. (%(code)s)", + "Cancel Sending": "Cancelar o envío", + "This Room": "Esta sala", + "The Home Server may be too old to support third party networks": "O servidor de inicio podería ser demasiando antigo como para aceptar redes de terceiros", + "Noisy": "Ruidoso", + "Error saving email notification preferences": "Fallo ao cargar os axustes de notificacións", + "Messages containing my display name": "Mensaxes que conteñen o meu nome público", + "Messages in one-to-one chats": "Mensaxes en chats un-a-un", + "Unavailable": "Non dispoñible", + "View Decrypted Source": "Ver a fonte descifrada", + "Failed to update keywords": "Fallo ao actualizar as palabras chave", + "Notes:": "Notas:", + "remove %(name)s from the directory.": "eliminar %(name)s do directorio.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Notificacións das reglas de seguimento das seguintes palabras que non se mostrarán aquí:", + "Safari and Opera work too.": "Safari e Opera tamén funcionan.", + "Please set a password!": "Por favor estableza un contrasinal!", + "You have successfully set a password!": "Mudou con éxito o seu contrasinal!", + "An error occurred whilst saving your email notification preferences.": "Algo fallou mentras se gardaban as súas preferencias de notificaicón.", + "Explore Room State": "Explorar estado da sala", + "Search for a room": "Buscar unha sala", + "Source URL": "URL fonte", + "Messages sent by bot": "Mensaxes enviadas por bot", + "Filter results": "Filtrar resultados", + "Members": "Membresía", + "No update available.": "Sen actualizacións.", + "Resend": "Voltar a enviar", + "Files": "Ficheiros", + "Collecting app version information": "Obtendo información sobre a versión da app", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Eliminar o alcume da sala %(alias)s e borrar %(name)s do directorio?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Esto permitiralle voltar a súa conta tras desconectarse, e conectarse en outros dispositivos.", + "Keywords": "Palabras chave", + "Enable notifications for this account": "Habilitar notificacións para esta conta", + "Directory": "Directorio", + "Invite to this community": "Convidar a esta comunidade", + "Failed to get public room list": "Fallo ao obter a lista de salas públicas", + "Messages containing keywords": "Mensaxes que conteñen palabras chave", + "Room not found": "Non se atopou a sala", + "Tuesday": "Martes", + "Enter keywords separated by a comma:": "Introduza palabras chave separadas por vírgulas:", + "Search…": "Buscar…", + "Remove %(name)s from the directory?": "Eliminar %(name)s do directorio?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utiliza características avanzadas do navegador, algunhas das cales non están dispoñibles ou son experimentales no seu navegador actual.", + "Developer Tools": "Ferramentas para desenvolver", + "Preparing to send logs": "Preparándose para enviar informe", + "Enable desktop notifications": "Habilitar notificacións de escritorio", + "Remember, you can always set an email address in user settings if you change your mind.": "Lembre, sempre poderá poñer un enderezo de correo nos axustes de usuario si cambia de idea.", + "Explore Account Data": "Explorar datos da conta", + "All messages (noisy)": "Todas as mensaxes (alto)", + "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:", + "You must specify an event type!": "Debe indicar un tipo de evento!", + "(HTTP status %(httpStatus)s)": "(Estado HTTP %(httpStatus)s)", + "All Rooms": "Todas as Salas", + "State Key": "Chave do estado", + "Please install Chrome or Firefox for the best experience.": "Por favor instale Chrome ou Firefox para a mellor experiencia de usuaria.", + "Wednesday": "Mércores", + "Quote": "Cita", + "Send logs": "Enviar informes", + "All messages": "Todas as mensaxes", + "Call invitation": "Convite de chamada", + "Downloading update...": "Descargando actualización...", + "You have successfully set a password and an email address!": "Estableceu correctamente un contrasinal e enderezo de correo!", + "Failed to send custom event.": "Fallo ao enviar evento personalizado.", + "What's new?": "Qué hai de novo?", + "Notify me for anything else": "Notificarme todo o demáis", + "When I'm invited to a room": "Cando son convidado a unha sala", + "Can't update user notification settings": "Non se poden actualizar os axutes de notificación", + "Notify for all other messages/rooms": "Notificar para todas as outras mensaxes/salas", + "Unable to look up room ID from server": "Non se puido atopar o ID da sala do servidor", + "Couldn't find a matching Matrix room": "Non coincide con ningunha sala de Matrix", + "Invite to this room": "Convidar a esta sala", + "You cannot delete this message. (%(code)s)": "Non pode eliminar esta mensaxe. (%(code)s)", + "Thursday": "Xoves", + "Forward Message": "Reenviar mensaxe", + "Logs sent": "Informes enviados", + "Back": "Atrás", + "Reply": "Resposta", + "Show message in desktop notification": "Mostrar mensaxe nas notificacións de escritorio", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Os informes de depuración conteñen datos de utilización do aplicativo como o seu nome de usuaria, os IDs ou alcumes de salas e grupos que vostede visitou e os nomes de usuaria de outras usuarias. Non conteñen mensaxes.", + "Unhide Preview": "Desagochar a vista previsa", + "Unable to join network": "Non se puido conectar a rede", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Pode que os configurase nun cliente diferente de Riot. Non pode establecelos desde Riot pero aínda así aplicaranse", + "Sorry, your browser is not able to run Riot.": "Desculpe, o seu navegador non pode executar Riot.", + "Uploaded on %(date)s by %(user)s": "Subido a %(date)s por %(user)s", + "Messages in group chats": "Mensaxes en grupos de chat", + "Yesterday": "Onte", + "Error encountered (%(errorDetail)s).": "Houbo un erro (%(errorDetail)s).", + "Login": "Conectar", + "Low Priority": "Baixa prioridade", + "Unable to fetch notification target list": "Non se puido procesar a lista de obxetivo de notificacións", + "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í", + "Every page you use in the app": "Cada páxina que vostede utiliza no aplicativo", + "e.g. ": "ex. ", + "Your User Agent": "User Agent", + "Your device resolution": "Resolución do dispositivo", + "Missing roomId.": "Falta o id da sala.", + "Always show encryption icons": "Mostra sempre iconas de cifrado", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "En este intre non é posible respostar con un ficheiro así que este será enviado sin ser considerado resposta.", + "Unable to reply": "Non puido respostar", + "At this time it is not possible to reply with an emote.": "En este intre non é posible respostar con un emote.", + "Popout widget": "Widget emerxente", + "Picture": "Imaxe", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Non se cargou o evento ao que respostaba, ou non existe ou non ten permiso para velo.", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Os fallos de Riot séguense en GitHub: crear un informe en GitHub.", + "Log out and remove encryption keys?": "Desconectar e eliminar as chaves de cifrado?", + "Send Logs": "Enviar informes", + "Clear Storage and Sign Out": "Limpar o almacenamento e Desconectar", + "Refresh": "Actualizar", + "We encountered an error trying to restore your previous session.": "Atopamos un fallo intentando restablecer a súa sesión anterior.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Limpando o almacenamento do navegador podería resolver o problema, pero desconectarao e non poderá ler o historial cifrado da conversa.", + "Collapse Reply Thread": "Comprimir o fío de respostas" } diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index bd96159ae1..dbae2858a9 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -54,5 +54,192 @@ "Which rooms would you like to add to this community?": "אילו חדרים תרצה להוסיף לקהילה?", "Show these rooms to non-members on the community page and room list?": "הצג חדרים אלה לחסרי-חשבון על דף הקהילה ורשימת החדרים?", "Add rooms to the community": "הוסף חדרים לקהילה", - "Room name or alias": "שם חדר או כינוי" + "Room name or alias": "שם חדר או כינוי", + "Warning": "התראה", + "Submit debug logs": "הזן יומני ניפוי שגיאה (דבאג)", + "Edit": "ערוך", + "Unpin Message": "שחרר צימוד הודעה", + "Online": "מקוון", + "Register": "רשום", + "Rooms": "חדרי שיחוח", + "Add rooms to this community": "הוסף חדר שיחוח לקהילה זו", + "OK": "בסדר", + "Operation failed": "פעולה נכשלה", + "Search": "חפש", + "Custom Server Options": "הגדרות שרת מותאמות אישית", + "Dismiss": "שחרר", + "powered by Matrix": "מופעל ע\"י Matrix", + "Error": "שגיאה", + "Remove": "הסר", + "Close": "סגור", + "Cancel": "ביטול", + "Send": "שלח", + "Continue": "המשך", + "Failed to change password. Is your password correct?": "נכשל בשינוי סיסמא, האם הסיסמא נכונה?", + "unknown error code": "קוד שגיאה לא מוכר", + "Failed to forget room %(errCode)s": "נכשל בעת בקשה לשכוח חדר %(errCode)s", + "Mute": "השתק", + "Leave": "לעזוב", + "Favourite": "מועדף", + "Notifications": "התראות", + "Unnamed room": "חדר ללא שם", + "World readable": "העולם קריא", + "Guests can join": "אורחים יכולים להצטרף", + "No rooms to show": "אין חדרים להצגה", + "Fetching third party location failed": "נסיון להביא מיקום צד שלישי נכשל", + "A new version of Riot is available.": "יצאה גרסה חדשה של Riot.", + "Couldn't load home page": "כשל בטעינת דף הבית", + "Send Account Data": "שלח נתוני משתמש", + "All notifications are currently disabled for all targets.": "התראות מנוטרלות לכלל המערכת.", + "Uploading report": "מעדכן דוח", + "Sunday": "ראשון", + "Failed to add tag %(tagName)s to room": "נכשל בעת הוספת תג %(tagName)s לחדר", + "Notification targets": "יעדי התראה", + "Failed to set direct chat tag": "נכשל בעת סימון תג לשיחה ישירה", + "Today": "היום", + "Files": "קבצים", + "You are not receiving desktop notifications": "אתה לא מקבל התראות משולחן העבודה", + "Friday": "שישי", + "Update": "עדכון", + "What's New": "מה חדש", + "Add an email address above to configure email notifications": "הוסף כתובת דואר אלקטורני למעלה בכדי להגדיר התראות", + "Expand panel": "הרחב מסגרת", + "On": "דלוק", + "%(count)s Members|other": "‭ ‭ ‮‭ םישמתשמ %(count)s", + "Filter room names": "סנן שמות חדרים", + "Changelog": "דו\"ח שינויים", + "Waiting for response from server": "ממתין לתשובה מהשרת", + "Send Custom Event": "שלח אירוע מותאם אישית", + "Advanced notification settings": "הגדרות מתקדמות להתראות", + "Failed to send logs: ": "כשל במשלוח יומנים: ", + "delete the alias.": "מחיקת כינוי.", + "To return to your account in future you need to set a password": "להשתמש בחשבונך בעתיד, עליך להגדיר סיסמא", + "Forget": "שכח", + "#example": "#דוגמא", + "Hide panel": "הסתר מסגרת", + "You cannot delete this image. (%(code)s)": "אי אפשר למחוק את התמונה. (%(code)s)", + "Cancel Sending": "ביטול שליחה", + "This Room": "החדר הזה", + "The Home Server may be too old to support third party networks": "שרת הבית ישן ואינו יכול לתמוך ברשתות צד שלישי", + "Noisy": "רועש", + "Error saving email notification preferences": "שגיאה בעת שמירת הגדרות התראה באמצעות הדואר האלקטרוני", + "Messages containing my display name": "הודעות המכילות את שם התצוגה שלי", + "Messages in one-to-one chats": "הודעות בשיחות פרטיות", + "Unavailable": "לא זמין", + "View Decrypted Source": "הצג מקור מפוענח", + "Failed to update keywords": "נכשל עדכון מילים", + "Notes:": "הערות:", + "remove %(name)s from the directory.": "הסר את %(name)s מהרשימה.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "התראה על מילות המפתח הבאות עוקבת אחר החוקים שאינם יכולים להיות מוצגים כאן:", + "Safari and Opera work too.": "Safari וגם Opera עובדים.", + "Please set a password!": "נא להגדיר סיסמא!", + "You have successfully set a password!": "שינוי סיסמא בוצע בהצלחה!", + "An error occurred whilst saving your email notification preferences.": "קרתה שגיאה בזמן שמירת הגדרות התראה באמצעות הדואר האלקטרוני.", + "Explore Room State": "גלה מצב החדר", + "Source URL": "כתובת URL אתר המקור", + "Messages sent by bot": "הודעות שנשלחו באמצעות בוט", + "Filter results": "סנן התוצאות", + "Members": "חברים", + "No update available.": "אין עדכון זמין.", + "Resend": "שלח מחדש", + "Failed to get protocol list from Home Server": "נכשל בעת נסיון קבלת רשימת פרוטוקולים משרת הבית", + "Collecting app version information": "אוסף מידע על גרסת היישום", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "מחק כינוי %(alias)s של החדר והסר את %(name)s מהרשימה?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "זה יאפשר לך לחזור לחשבונך אחרי התנתקות ולהתחבר באמצעות התקנים אחרים.", + "Keywords": "מילות מפתח", + "Enable notifications for this account": "אפשר התראות לחשבון זה", + "Directory": "ספרייה", + "Invite to this community": "הזמן לקהילה זו", + "Failed to get public room list": "נכשלה קבלת רשימת חדרים ציבוריים", + "Messages containing keywords": "הודעות המכילות מילות מפתח ", + "Room not found": "חדר לא נמצא", + "Tuesday": "שלישי", + "Enter keywords separated by a comma:": "הכנס מילים מופרדות באמצעות פסיק:", + "Forward Message": "העבר הודעה", + "Remove %(name)s from the directory?": "הסר את %(name)s מהרשימה?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot משתמש במספר רב של אפשרויות מתקדמות בדפדפן, חלק מהן לא זמינות או בשלבי נסיון בדפדפן שבשימושך כרגע.", + "Event sent!": "ארוע נשלח!", + "Preparing to send logs": "מתכונן לשלוח יומנים", + "Enable desktop notifications": "אפשר התראות בשולחן העבודה", + "Remember, you can always set an email address in user settings if you change your mind.": "להזכירך: תמיד ניתן לשנות כתובת אימייל בהגדרות משתש. למקרה שתתחרט/י.", + "Explore Account Data": "גלה פרטי משתמש", + "All messages (noisy)": "כל ההודעות (רועש)", + "Saturday": "שבת", + "I understand the risks and wish to continue": "אני מבין את הסיכונים אבל מבקש להמשיך", + "Direct Chat": "שיחה ישירה", + "The server may be unavailable or overloaded": "השרת אינו זמין או עמוס", + "Reject": "דחה", + "Failed to set Direct Message status of room": "נכשל בעת סימון מצב הודעה ישירה של החדר", + "Monday": "שני", + "Remove from Directory": "הסר מהרשימה", + "Enable them now": "אפשר אותם כעת", + "Messages containing my user name": "הודעות המכילות את שם המשתמש שלי", + "Toolbox": "תיבת כלים", + "Collecting logs": "אוסף יומנים לנפוי שגיאה (דבאג)", + "more": "עוד", + "GitHub issue link:": "קישור לדווח תקלה בGitHub:", + "Search for a room": "חפש חדר", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "יומני ניפוי שגיאה (דבאג) מכילים מידע על שימוש ביישום, כולל שם משתמש, מזהים או כינויים שהתמשת בהם. בחדרי שיחוח, או קבוצות בהם השתתפת. וגם שמות משתמשים אחרים. אך אינם כוללים הודעות.", + "(HTTP status %(httpStatus)s)": "(מצב HTTP %(httpStatus)s )", + "All Rooms": "כל החדרים", + "State Key": "מקש מצב", + "Please install Chrome or Firefox for the best experience.": "אנא התקן Firefox או Chrome לחוויה מיטבית.", + "Wednesday": "רביעי", + "Quote": "ציטוט", + "Send logs": "שלח יומנים", + "All messages": "כל ההודעות", + "Call invitation": "הזמנה לשיחה", + "Downloading update...": "מוריד עדכון...", + "You have successfully set a password and an email address!": "הצלחת להגדיר סיסמא וכתובת אימייל!", + "Failed to send custom event.": "כשל במשלוח ארוע מותאם אישית.", + "What's new?": "מה חדש?", + "Notify me for anything else": "התראה לי על כל דבר אחר", + "When I'm invited to a room": "מתי אני מוזמן לחדר", + "Can't update user notification settings": "לא ניתן לעדכן הגדרות התראה למשתמש", + "Notify for all other messages/rooms": "התראה לכל שאר ההודעות/החדרים", + "Unable to look up room ID from server": "לא ניתן לאתר מזהה חדר על השרת", + "Couldn't find a matching Matrix room": "לא נמצא חדר כזה ב מטריקס", + "Invite to this room": "הזמן לחדר זה", + "You cannot delete this message. (%(code)s)": "לא ניתן למחוק הודעה זו. (%(code)s)", + "Thursday": "חמישי", + "Search…": "חפש…", + "Logs sent": "יומנים נשלחו", + "Back": "אחורה", + "Reply": "תשובה", + "Show message in desktop notification": "הצג הודעה בהתראות שולחן עבודה", + "You must specify an event type!": "חובה להגדיר סוג ארוע!", + "Unhide Preview": "הצג מחדש תצוגה מקדימה", + "Unable to join network": "לא ניתן להצטרף לרשת", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "יתכן כי בצעת את ההגדרות בצד לקוח ולא ב Riot. לא תוכל לעדכן אותם ב Riot אבל הם עדיין תקפים", + "Sorry, your browser is not able to run Riot.": "מצטערים, הדפדפן שלך הוא אינו יכול להריץ את Riot.", + "Uploaded on %(date)s by %(user)s": "עודכן ב %(date)s ע\"י %(user)s", + "Messages in group chats": "הודעות בקבוצות השיחה", + "Yesterday": "אתמול", + "Error encountered (%(errorDetail)s).": "ארעה שגיעה %(errorDetail)s .", + "Login": "התחבר", + "Low Priority": "עדיפות נמוכה", + "Unable to fetch notification target list": "לא ניתן לאחזר רשימת יעדי התראה", + "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..eb73d65a78 --- /dev/null +++ b/src/i18n/strings/hi.json @@ -0,0 +1,19 @@ +{ + "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!": "आपने सफलतापूर्वक एक पासवर्ड और एक ईमेल एड्रेस सेट कर लिया है!", + "This email address is already in use": "यह ईमेल आईडी पहले से इस्तेमाल में है", + "This phone number is already in use": "यह फ़ोन नंबर पहले से इस्तेमाल में है", + "Failed to verify email address: make sure you clicked the link in the email": "ईमेल आईडी सत्यापित नही हो पाया: कृपया सुनिश्चित कर लें कि आपने ईमेल में मौजूद लिंक पर क्लिक किया है", + "The platform you're on": "आप जिस प्लेटफार्म पर हैं", + "The version of Riot.im": "रायट.आई एम का जो संस्करण", + "Whether or not you're logged in (we don't record your user name)": "चाहे आप लॉग इन हों या ना हों( हम आपका खाता नाम दर्ज नहीं करते )", + "Your language of choice": "आपकी चयन की भाषा", + "Which officially provided instance you are using, if any": "क्या आप कोई अधिकृत संस्करण इस्तेमाल कर रहे हैं? अगर हां, तो कौन सा", + "Your homeserver's URL": "आपके होमसर्वर का यू. आर. एल.", + "Every page you use in the app": "हर पृष्ठ जिसका आप इस एप में इस्तेमाल करते हैं", + "Your User Agent": "आपका उपभोक्ता प्रतिनिधि" +} diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index b03f47c875..d63b6055a3 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2,18 +2,18 @@ "Cancel": "Mégse", "Search": "Keresés", "OK": "Rendben", - "Custom Server Options": "Egyedi szerver beállítások", - "Dismiss": "Eltűntet", + "Custom Server Options": "Egyedi szerverbeállítások", + "Dismiss": "Eltüntet", "Error": "Hiba", - "Failed to forget room %(errCode)s": "Nem lehet eltávolítani a szobát: %(errCode)s", + "Failed to forget room %(errCode)s": "Nem sikerült elfelejteni a szobát: %(errCode)s", "Favourite": "Kedvenc", "Mute": "Elnémít", "Notifications": "Értesítések", - "Operation failed": "Művelet sikertelen", - "powered by Matrix": "Matrixon alapul", - "Remove": "Törlés", + "Operation failed": "Sikertelen művelet", + "powered by Matrix": "Matrix hajtja", + "Remove": "Kitakarás", "Settings": "Beállítások", - "unknown error code": "ismeretlen hiba kód", + "unknown error code": "ismeretlen hibakód", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Elküldtük a szöveges üzenetet ide: +%(msisdn)s. Kérlek add meg az ellenőrző kódot ami benne van", "Accept": "Elfogad", "%(targetName)s accepted an invitation.": "%(targetName)s elfogadta a meghívást.", @@ -45,7 +45,7 @@ "Failed to change password. Is your password correct?": "Nem sikerült megváltoztatni a jelszót. Helyesen írtad be a jelszavadat?", "Continue": "Folytatás", "Create new room": "Új szoba létrehozása", - "Close": "Bezár", + "Close": "Bezárás", "Room directory": "Szobák listája", "Start chat": "Csevegés indítása", "%(items)s and %(lastItem)s": "%(items)s és %(lastItem)s", @@ -69,14 +69,12 @@ "Banned users": "Kitiltott felhasználók", "Bans user with given id": "Kitiltja a felhasználót a megadott ID-vel", "Blacklisted": "Fekete listára téve", - "Bug Report": "Hiba jelentés", "Bulk Options": "Tömeges beállítások", "Call Timeout": "Hívás időtúllépés", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nem lehet kapcsolódni a saját szerverhez - ellenőrizd a kapcsolatot, biztosítsd, hogy a saját szerver tanúsítványa hiteles legyen, és a böngésző kiterjesztések ne blokkolják a kéréseket.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Nem lehet csatlakozni a saját szerverhez HTTP-n keresztül ha HTTPS van a böngésző címsorában. Vagy használj HTTPS-t vagy engedélyezd a nem biztonságos script-et.", "Can't load user settings": "A felhasználói beállítások nem tölthetők be", "Change Password": "Jelszó megváltoztatása", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s megváltoztatta a nevét erről: %(oldDisplayName)s erre: %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s megváltoztatta a profil képét.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s megváltoztatta a hozzáférési szintjét erre: %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s megváltoztatta a szoba nevét erre: %(roomName)s.", @@ -193,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.", @@ -282,7 +279,6 @@ "olm version:": "olm verzió:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Ha egyszer bekapcsolod a titkosítást a szobába utána nem lehet kikapcsolni (egyenlőre)", "Only people who have been invited": "Csak akiket meghívtak", - "Otherwise, click here to send a bug report.": "Különben hiba jelentés küldéséhez kattints ide.", "Password": "Jelszó", "Password:": "Jelszó:", "Passwords can't be empty": "A jelszó nem lehet üres", @@ -300,7 +296,7 @@ "Reason: %(reasonText)s": "Ok: %(reasonText)s", "Revoke Moderator": "Moderátor visszahívása", "Refer a friend to Riot:": "Ismerős meghívása a Riotba:", - "Register": "Regisztrál", + "Register": "Regisztráció", "%(targetName)s rejected the invitation.": "%(targetName)s elutasította a meghívót.", "Reject invitation": "Meghívó elutasítása", "Rejoin": "Újracsatlakozás", @@ -310,7 +306,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", @@ -366,7 +361,7 @@ "This email address was not found": "Az e-mail cím nem található", "The email address linked to your account must be entered.": "A fiókodhoz kötött e-mail címet add meg.", "Press to start a chat with someone": "Nyomd meg a gombot ha szeretnél csevegni valakivel", - "Privacy warning": "Magánéleti figyelmeztetés", + "Privacy warning": "Adatvédelmi figyelmeztetés", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "'%(fileName)s' fájl túllépte a Saját szerverben beállított feltöltési méret határt", "The file '%(fileName)s' failed to upload": "'%(fileName)s' fájl feltöltése sikertelen", "The remote side failed to pick up": "A hívott fél nem vette fel", @@ -424,7 +419,6 @@ "Use with caution": "Használd körültekintéssel", "User ID": "Felhasználói azonosító", "User Interface": "Felhasználói felület", - "%(user)s is a": "%(user)s egy", "User name": "Felhasználói név", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (szint: %(powerLevelNumber)s)", "Username invalid: %(errMessage)s": "Felhasználói név érvénytelen: %(errMessage)s", @@ -538,7 +532,6 @@ "Start automatically after system login": "Rendszerindításkor automatikus elindítás", "Desktop specific": "Asztali használatra jellemző", "Analytics": "Analitika", - "Opt out of analytics": "Ne gyűjtsön analitikai adatokat", "Options": "Opciók", "Riot collects anonymous analytics to allow us to improve the application.": "Riot személytelen analitikai adatokat gyűjt annak érdekében, hogy fejleszteni tudjuk az alkalmazást.", "Passphrases must match": "A jelmondatoknak meg kell egyezniük", @@ -557,8 +550,6 @@ "Confirm Removal": "Törlés megerősítése", "Unknown error": "Ismeretlen hiba", "Incorrect password": "Helytelen jelszó", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "A fiókodat véglegesen használhatatlanná teszi. Ez után ugyanazzal az azonosítóval már nem fogsz tudni vissza regisztrálni.", - "This action is irreversible.": "Ez a művelet visszafordíthatatlan.", "To continue, please enter your password.": "A folytatáshoz, kérlek add meg a jelszavadat.", "Device name": "Eszköz neve", "Device Name": "Eszköz neve", @@ -567,7 +558,6 @@ "Verify device": "Eszköz ellenőrzése", "I verify that the keys match": "Megerősítem, hogy a kulcsok egyeznek", "Unable to restore session": "A kapcsolatot nem lehet visszaállítani", - "Continue anyway": "Mindenképpen tovább", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" szobában olyan eszközök vannak amiket még nem láttál.", "Unknown devices": "Ismeretlen eszköz", "Unknown Address": "Ismeretlen cím", @@ -590,8 +580,6 @@ "What does this mean?": "Ez mit jelent?", "Error decrypting audio": "Hiba a hang visszafejtésénél", "Error decrypting image": "Hiba a kép visszafejtésénél", - "Image '%(Body)s' cannot be displayed.": "'%(Body)s' képet nem lehet megjeleníteni.", - "This image cannot be displayed.": "Ezt a képet nem lehet megjeleníteni.", "Error decrypting video": "Hiba a videó visszafejtésénél", "Add an Integration": "Integráció hozzáadása", "Removed or unknown message type": "Eltávolított üzenet vagy ismeretlen üzenet típus", @@ -599,7 +587,7 @@ "Drop file here to upload": "Feltöltéshez húzz ide egy fájlt", " (unsupported)": " (nem támogatott)", "Ongoing conference call%(supportedText)s.": "Folyamatban lévő konferencia hívás %(supportedText)s.", - "Online": "Elérhető", + "Online": "Online", "Idle": "Várakozik", "Offline": "Nem érhető el", "Start chatting": "Csevegés indítása", @@ -626,7 +614,6 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Biztos hogy eltávolítod (törlöd) ezt az eseményt? Figyelem, ha törlöd vagy megváltoztatod a szoba nevét vagy a témát ez a változtatás érvényét vesztheti.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Az eszköz megbízhatóságának ellenőrzéséhez, lépj kapcsolatba a tulajdonossal valami más csatornán (pl. személyesen vagy telefon hívással) és kérdezd meg, hogy a kulcs amit a Felhasználói Beállításoknál látnak az eszközhöz megegyezik-e a kulccsal itt:", "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.": "Ha megegyezik, nyomd meg az megerősítő gombot alul. Ha nem akkor valaki más használja az eszközt és inkább a Feketelista gombot szeretnéd használni.", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Az előző kapcsolat visszaállításánál hibára akadtunk. Ha folytatod újra be kell jelentkezned és a titkosított csevegések olvashatatlanok lesznek.", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ha egy újabb Riot verziót használtál valószínűleg ez kapcsolat nem lesz kompatibilis vele. Zárd be az ablakot és térj vissza az újabb verzióhoz.", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Jelenleg fekete listára teszel minden ismeretlen eszközt. Ha üzenetet szeretnél küldeni ezekre az eszközökre először ellenőrizned kell őket.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Azt javasoljuk, hogy menj végig ellenőrző folyamaton minden eszköznél, hogy meg megerősítsd minden eszköz a jogos tulajdonosához tartozik, de újraküldheted az üzenetet ellenőrzés nélkül, ha úgy szeretnéd.", @@ -654,13 +641,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", @@ -704,24 +689,23 @@ "Disable Emoji suggestions while typing": "Emoji ajánlások kikapcsolása gépelés közben", "Banned by %(displayName)s": "Kitiltotta: %(displayName)s", "Message removed by %(userId)s": "Üzenetet törölte: %(userId)s", - "To send messages, you must be a": "Ahhoz, hogy üzenetet tudj küldeni, neked ilyen szinten kell lenned:", + "To send messages, you must be a": "Ahhoz, hogy üzenetet tudj küldeni, ilyen szinten kell lenned:", "To invite users into the room, you must be a": "Hogy meghívj valakit a szobába, ilyen szinten kell lenned:", "To configure the room, you must be a": "A szoba beállításához ilyen szinten kell lenned:", "To kick users, you must be a": "Felhasználó kirúgásához ilyen szinten kell lenned:", "To ban users, you must be a": "Felhasználó kizárásához ilyen szinten kell lenned:", - "To remove other users' messages, you must be a": "Más üzenetének a törléséhez ilyen szinten kell lenned:", + "To remove other users' messages, you must be a": "Más üzenetének a kitakarásához ilyen szinten kell lenned:", "To send events of type , you must be a": " esemény küldéséhez ilyen szinten kell lenned:", "To change the room's avatar, you must be a": "A szoba avatarjának a megváltoztatásához ilyen szinten kell lenned:", "To change the room's name, you must be a": "A szoba nevének megváltoztatásához ilyen szinten kell lenned:", "To change the room's main address, you must be a": "A szoba elsődleges címének a megváltoztatásához ilyen szinten kell lenned:", - "To change the room's history visibility, you must be a": "A szoba naplója elérhetőségének a megváltoztatásához ilyen szinten kell lenned:", + "To change the room's history visibility, you must be a": "A szoba napló elérhetőségének a megváltoztatásához ilyen szinten kell lenned:", "To change the permissions in the room, you must be a": "A szobában a jogosultság megváltoztatásához ilyen szinten kell lenned:", "To change the topic, you must be a": "A téma megváltoztatásához ilyen szinten kell lenned:", "To modify widgets in the room, you must be a": "A szoba kisalkalmazásainak megváltoztatásához ilyen szinten kell lenned:", "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", @@ -738,7 +722,7 @@ "Failed to remove the room from the summary of %(groupId)s": "Az alábbi szobákat nem sikerült eltávolítani a(z) %(groupId)s csoport összefoglalójából", "The room '%(roomName)s' could not be removed from the summary.": "Nem sikerült törölni az összefoglalóból ezt a szobát: '%(roomName)s'.", "Failed to remove a user from the summary of %(groupId)s": "Nem sikerült törölni az összefoglalóból ezt a felhasználót: %(groupId)s", - "The user '%(displayName)s' could not be removed from the summary.": "Nem sikerült törölni az összefoglalóból ezt a felhasználót: %(groupId)s.", + "The user '%(displayName)s' could not be removed from the summary.": "Nem sikerült törölni az összefoglalóból a(z) %(displayName)s felhasználót", "Light theme": "Világos téma", "Dark theme": "Sötét téma", "Unknown": "Ismeretlen", @@ -772,7 +756,7 @@ "Unnamed room": "Névtelen szoba", "World readable": "Nyilvános", "Guests can join": "Vendégek is csatlakozhatnak", - "No rooms to show": "Nincsenek megjelenítendő szobák", + "No rooms to show": "Nincsenek megjeleníthető szobák", "Invalid community ID": "Érvénytelen közösségi azonosító", "'%(groupId)s' is not a valid community ID": "%(groupId)s nem egy érvényes közösségi azonosító", "New community ID (e.g. +foo:%(localDomain)s)": "Új közösségi azonosító (pl.: +foo:%(localDomain)s)", @@ -891,7 +875,7 @@ "%(items)s and %(count)s others|other": "%(items)s és még %(count)s másik", "%(items)s and %(count)s others|one": "%(items)s és még egy másik", "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Az e-mail leküldésre került ide: %(emailAddress)s. Ha követte a levélben lévő linket kattints alább.", - "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "%(roomName)s szoba láthatóságát nem lehet frissíteni ebben a közösségben: %(groupId)s", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "%(roomName)s szoba láthatóságát nem lehet frissíteni ebben a közösségben: %(groupId)s.", "Visibility in Room List": "Láthatóság a szoba listában", "Visible to everyone": "Mindenki számára látható", "Only visible to community members": "Csak a közösség számára látható", @@ -903,16 +887,15 @@ "Room Notification": "Szoba értesítések", "Show these rooms to non-members on the community page and room list?": "Mutassuk meg ezeket a szobákat kívülállóknak a közösségi oldalon és a szobák listájában?", "Sign in to get started": "Az induláshoz jelentkezz be", - "Status.im theme": "Állapot.im téma", + "Status.im theme": "Status.im téma", "Please note you are logging into the %(hs)s server, not matrix.org.": "Figyelem, a %(hs)s szerverre jelentkezel be és nem a matrix.org szerverre.", "Username on %(hs)s": "Felhasználónév a %(hs)s szerveren", "Restricted": "Korlátozott", "Custom of %(powerLevel)s": "Egyedi beállítás: %(powerLevel)s", - "Presence Management": "Jelenlét menedzsment", "Hide avatar changes": "Avatar változások elrejtése", "Hide display name changes": "Név változások elrejtése", "Enable inline URL previews by default": "Beágyazott URL előnézetek alapértelmezett engedélyezése", - "Enable URL previews for this room (only affects you)": "URL előnézet engedélyezése ebben a szobában (csak téged érint)", + "Enable URL previews for this room (only affects you)": "URL előnézet ebben a szobában (csak téged érint)", "Enable URL previews by default for participants in this room": "URL előnézet alapértelmezett engedélyezése a szoba tagságának", "URL previews are enabled by default for participants in this room.": "Az URL előnézetek alapértelmezetten engedélyezve vannak a szobában jelenlévőknek.", "URL previews are disabled by default for participants in this room.": "Az URL előnézet alapértelmezetten tiltva van a szobában jelenlévőknek.", @@ -948,10 +931,241 @@ "Call": "Hívás", "Answer": "Felvesz", "Send": "Elküld", - "Cryptography data migrated": "Titkosítási adatok migrálva", - "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.": "A titkosítási adatok egyszeri migrációja megtörtént. Ha egy régebbi Riot verzióra állsz vissza a végponttól-végpontig titkosítás nem fog működni. Ha régi verzióval szeretnéd használni a végponttól-végpontig titkosítást először jelentkezz ki a Riotból. A régi üzenetek későbbi eléréséhez először mentsd ki a kulcsokat majd töltsd be újra.", "Old cryptography data detected": "Régi titkosítási adatot találhatók", "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Régebbi Riot verzióból származó adatok találhatók. Ezek hibás működéshez vezethettek a végponttól-végpontig titkosításban régebbi verzióknál. A nemrég küldött/fogadott titkosított üzenetek ha a régi adatokat használták lehetséges hogy nem lesznek visszafejthetők ebben a verzióban. Ha problémákba ütközöl jelentkezz ki és vissza. A régi üzenetek elérésének biztosításához mentsd ki a kulcsokat és töltsd be újra.", - "Show devices or cancel all.": "Eszközök megmutatása vagy mind elutasítása.", - "Warning": "Figyelmeztetés" + "Warning": "Figyelmeztetés", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Ahogy lefokozod magad a változás visszafordíthatatlan, ha te vagy az utolsó jogosultságokkal bíró felhasználó a szobában a jogok már nem szerezhetők vissza.", + "%(count)s of your messages have not been sent.|one": "Az üzeneted nem lett elküldve.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Újraküldöd mind vagy elveted mind. Az üzeneteket egyenként is elküldheted vagy elvetheted.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Üzenet újraküldése vagy üzenet elvetése most.", + "Message Replies": "Üzenet válaszok", + "Send an encrypted reply…": "Titkosított válasz küldése…", + "Send a reply (unencrypted)…": "Válasz küldése (titkosítatlanul)…", + "Send an encrypted message…": "Titkosított üzenet küldése…", + "Send a message (unencrypted)…": "Üzenet küldése (titkosítás nélkül)…", + "Replying": "Válaszolni", + "Minimize apps": "Alkalmazás összecsukása", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "A személyes adatok védelme fontos számunkra, így mi nem gyűjtünk személyes és személyhez köthető adatokat az analitikánkhoz.", + "Learn more about how we use analytics.": "Tudj meg többet arról hogyan használjuk az analitikai adatokat.", + "The information being sent to us to help make Riot.im better includes:": "Az adatok amiket a Riot.im javításához felhasználunk az alábbiak:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Minden azonosításra alkalmas adatot mint a szoba, felhasználó vagy csoport azonosítót mielőtt az adatokat elküldenénk eltávolításra kerülnek.", + "The platform you're on": "A platform amit használsz", + "The version of Riot.im": "Riot.im verziója", + "Whether or not you're logged in (we don't record your user name)": "Be vagy-e jelentkezve vagy nem (a felhasználói nevedet nem tároljuk)", + "Your language of choice": "A használt nyelv", + "Which officially provided instance you are using, if any": "Milyen hivatalosan nyújtott verziót használsz", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Használod-e a Richtext módot a szerkesztőben vagy nem", + "Your homeserver's URL": "Az egyedi szerver URL-t", + "Your identity server's URL": "Az azonosítási szerver URL-t", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(fullYear)s. %(monthName)s %(day)s, %(weekDayName)s", + "This room is not public. You will not be able to rejoin without an invite.": "Ez a szoba nem nyilvános. Kilépés után csak újabb meghívóval tudsz újra belépni a szobába.", + "Show devices, send anyway or cancel.": "Eszközök listája, mindenképpen küld vagy szakítsd meg.", + "Community IDs cannot not be empty.": "A közösségi azonosító nem lehet üres.", + "In reply to ": "Válaszolva neki ", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s megváltoztatta a nevét erre: %(displayName)s.", + "Failed to set direct chat tag": "Nem sikerült a közvetlen beszélgetés jelzést beállítani", + "Failed to remove tag %(tagName)s from room": "Nem sikerült a szobáról eltávolítani ezt: %(tagName)s", + "Failed to add tag %(tagName)s to room": "Nem sikerült hozzáadni a szobához ezt: %(tagName)s", + "Clear filter": "Szűrő törlése", + "Disable Community Filter Panel": "Közösség keresési panel tiltása", + "Did you know: you can use communities to filter your Riot.im experience!": "Tudtad, hogy a Riot.im élmény fokozásához használhatsz közösségeket?", + "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.": "A szűrő beállításához húzd a közösség avatarját a szűrő panel fölé a képernyő bal szélén. A szűrő panelen az avatarra kattintva bármikor leszűrheted azokat a szobákat és embereket akik a megadott közösséghez tartoznak.", + "Your key share request has been sent - please check your other devices for key share requests.": "A kulcs megosztási kérést elküldtük - ellenőrizd a többi eszközödön a kulcs megosztási kéréseket.", + "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.": "A kulcs megosztási kérelem automatikusan el lett küldve a többi eszközödre. Ha elutasítottad vagy törölted a kérést a másik eszközön ide kattintva újra kérheted a kulcsokat.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Ha a másik eszközödön nincs meg a kulcs az üzenet visszafejtéséhez akkor nem tudod visszafejteni.", + "Key request sent.": "Kulcs kérés elküldve.", + "Re-request encryption keys from your other devices.": "Kulcsok újrakérése a többi eszközödtől.", + "%(user)s is a %(userRole)s": "%(user)s egy %(userRole)s", + "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 contain 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.", + "Submit debug logs": "Hibakeresési napló küldése", + "Opens the Developer Tools dialog": "Megnyitja a fejlesztői eszközök ablakát", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) az alábbi időpontban látta: %(dateTime)s", + "Unable to join community": "Nem sikerült csatlakozni a közösséghez", + "Unable to leave community": "Nem sikerült elhagyni a közösséget", + "Join this community": "Csatlakozás ehhez a közösséghez", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "A közösséget name és avatar érintő változások legfeljebb 30 percig nem lesznek láthatók más felhasználók számára.", + "Leave this community": "Közösség elhagyása", + "Stickerpack": "Matrica csomag", + "You don't currently have any stickerpacks enabled": "Nincs engedélyezett matrica csomagod", + "Add a stickerpack": "Matrica csomag hozzáadása", + "Hide Stickers": "Matricák elrejtése", + "Show Stickers": "Matricák megjelenítése", + "Who can join this community?": "Ki tud csatlakozni ehhez a közösséghez?", + "Everyone": "Mindenki", + "Fetching third party location failed": "Nem sikerült lekérdezni a harmadik fél helyét", + "A new version of Riot is available.": "Elérhető egy új Riot verzió.", + "Couldn't load home page": "Nem sikerült betölteni a kezdőlapot", + "Send Account Data": "Fiókadatok küldése", + "All notifications are currently disabled for all targets.": "Minden céleszközön minden értesítés tiltva van.", + "Uploading report": "Jelentés feltöltése", + "Sunday": "Vasárnap", + "Notification targets": "Értesítések célpontja", + "Today": "Ma", + "Files": "Fájlok", + "You are not receiving desktop notifications": "Nem fogadsz asztali értesítéseket", + "Friday": "Péntek", + "Update": "Frissítés", + "What's New": "Újdonságok", + "Add an email address above to configure email notifications": "E-mail értesítések beállításához adj meg egy e-mail címet", + "Expand panel": "Panel kinyitása", + "On": "Be", + "%(count)s Members|other": "%(count)s tag", + "Filter room names": "Szobanevek szűrése", + "Changelog": "Változások", + "Waiting for response from server": "Várakozás a szerver válaszára", + "Send Custom Event": "Egyéni esemény elküldése", + "Advanced notification settings": "Haladó értesítési beállítások", + "Failed to send logs: ": "Hiba a napló küldésénél: ", + "delete the alias.": "becenév törlése.", + "To return to your account in future you need to set a password": "Hogy később visszaléphess a fiókodba, be kell állítanod egy jelszót", + "Forget": "Elfelejt", + "#example": "#példa", + "Hide panel": "Panel elrejtése", + "You cannot delete this image. (%(code)s)": "Nem törölheted ezt a képet. (%(code)s)", + "Cancel Sending": "Küldés megszakítása", + "This Room": "Ebben a szobában", + "The Home Server may be too old to support third party networks": "Lehet, hogy a saját szerver túl régi és nem támogatja a csatlakozást más hálózatokhoz", + "Resend": "Küldés újra", + "Room not found": "A szoba nem található", + "Messages containing my display name": "A profilnevemet tartalmazó üzenetek", + "Messages in one-to-one chats": "Személyes beszélgetések üzenetei", + "Unavailable": "Elérhetetlen", + "View Decrypted Source": "Visszafejtett forrás megjelenítése", + "Failed to update keywords": "Nem lehet frissíteni a kulcsszavakat", + "Notes:": "Jegyzetek:", + "remove %(name)s from the directory.": "%(name)s szoba törlése a listából.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Az alábbi kulcsszavakról jövő értesítések szabályait nem lehet itt megjeleníteni:", + "Safari and Opera work too.": "Safarival és Operával is működik.", + "Please set a password!": "Állíts be egy jelszót!", + "You have successfully set a password!": "Sikerült beállítani a jelszót!", + "An error occurred whilst saving your email notification preferences.": "Hiba történt az e-mail értesítési beállításaid mentése közben.", + "Explore Room State": "Szoba állapot felderítése", + "Source URL": "Forrás URL", + "Messages sent by bot": "Botok üzenetei", + "Filter results": "Találatok szűrése", + "Members": "Résztvevők", + "No update available.": "Nincs elérhető frissítés.", + "Noisy": "Hangos", + "Failed to get protocol list from Home Server": "Nem sikerült a protokoll listát lekérni a saját szerverről", + "Collecting app version information": "Alkalmazás verzió információk összegyűjtése", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Törlöd a szoba nevét (%(alias)s) és eltávolítod a listából ezt: %(name)s?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Így kijelentkezés után is vissza tudsz lépni a fiókodba, illetve más készülékekről is be tudsz lépni.", + "Keywords": "Kulcsszavak", + "Enable notifications for this account": "Értesítések engedélyezése ehhez a fiókhoz", + "Directory": "Könyvtár", + "Invite to this community": "Meghívás ebbe a közösségbe", + "Search for a room": "Szoba keresése", + "Messages containing keywords": "Kulcsszavakat tartalmazó üzenetek", + "Error saving email notification preferences": "Hiba az e-mail értesítési beállítások mentésekor", + "Tuesday": "Kedd", + "Enter keywords separated by a comma:": "Kulcsszavak vesszővel elválasztva:", + "Forward Message": "Üzenet továbbítása", + "You have successfully set a password and an email address!": "Sikerült beállítani a jelszavad és e-mail címed!", + "Remove %(name)s from the directory?": "Törlöd ezt a szobát a listából: %(name)s?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "A Riot sok fejlett böngészőfunkciót használ, amelyeknek egy része egyáltalán nem, vagy csak kísérleti jelleggel érhető el a jelenlegi böngésződben.", + "Developer Tools": "Fejlesztői eszközök", + "Preparing to send logs": "Előkészülés napló küldéshez", + "Enable desktop notifications": "Asztali értesítések engedélyezése", + "Remember, you can always set an email address in user settings if you change your mind.": "Ha meggondolod magad, bármikor beállíthatod az e-mail címed a felhasználói beállításoknál.", + "Explore Account Data": "Fiókadatok felderítése", + "Remove from Directory": "Törlés a listából", + "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:", + "You must specify an event type!": "Meg kell jelölnöd az eseménytípust!", + "(HTTP status %(httpStatus)s)": "(HTTP állapot: %(httpStatus)s)", + "Invite to this room": "Meghívás a szobába", + "Please install Chrome or Firefox for the best experience.": "A legjobb élmény érdekében telepíts Chrome vagy Firefox böngészőt.", + "Failed to get public room list": "Nem sikerült lekérdezni a nyilvános szobák listáját", + "Quote": "Idéz", + "Send logs": "Naplófájlok elküldése", + "All messages": "Minden üzenet", + "Call invitation": "Hívás meghívó", + "Downloading update...": "Frissítés letöltése...", + "State Key": "Állapotkulcs", + "Failed to send custom event.": "Nem sikerült elküldeni az egyéni eseményt.", + "What's new?": "Mik az újdonságok?", + "Notify me for anything else": "Értesíts minden egyéb esetben", + "When I'm invited to a room": "Amikor meghívnak egy szobába", + "Can't update user notification settings": "Nem lehet frissíteni az értesítési beállításokat", + "Notify for all other messages/rooms": "Értesítés minden más üzenethez/szobához", + "Unable to look up room ID from server": "Nem lehet a szoba azonosítóját megkeresni a szerveren", + "Couldn't find a matching Matrix room": "Nem található a keresett Matrix szoba", + "All Rooms": "Minden szobában", + "You cannot delete this message. (%(code)s)": "Nem törölheted ezt az üzenetet. (%(code)s)", + "Thursday": "Csütörtök", + "Search…": "Keresés…", + "Logs sent": "Napló elküldve", + "Back": "Vissza", + "Reply": "Válasz", + "Show message in desktop notification": "Üzenetek megjelenítése az asztali értesítéseknél", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "A hibakereső napló alkalmazás használati adatokat tartalmaz beleértve a felhasználói nevedet, az általad meglátogatott szobák és csoportok azonosítóit alternatív neveit és más felhasználói neveket. Csevegés üzenetek szövegét nem tartalmazza.", + "Unhide Preview": "Előnézet mutatása", + "Unable to join network": "Nem sikerült kapcsolódni a hálózathoz", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Egy másik, nem Riot-klienssel állítothattad be. A Riotban módosítani nem tudod ezeket, de érvényben vannak", + "Sorry, your browser is not able to run Riot.": "Elnézést, a böngésződben nem fut a Riot.", + "Uploaded on %(date)s by %(user)s": "Feltöltötte %(user)s ekkor: %(date)s", + "Messages in group chats": "Csoportszobák üzenetei", + "Yesterday": "Tegnap", + "Error encountered (%(errorDetail)s).": "Hiba történt (%(errorDetail)s).", + "Login": "Bejelentkezés", + "Low Priority": "Alacsony prioritás", + "Unable to fetch notification target list": "Nem sikerült letölteni az értesítési célok listáját", + "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", + "Missing roomId.": "Hiányzó szoba azonosító.", + "Picture": "Kép", + "Popout widget": "Kiugró kisalkalmazás", + "Every page you use in the app": "Minden oldal, amit az alkalmazásban használsz", + "e.g. ": "pl.: ", + "Your User Agent": "Felhasználói ügynököd", + "Your device resolution": "Eszközöd felbontása", + "Always show encryption icons": "Titkosítási ikon folyamatos megjelenítése", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Riot hibák a GItHubon követhetők: hiba bejelentés a GitHubon.", + "Log out and remove encryption keys?": "Kijelentkezel és töröljük a titkosítási kulcsokat?", + "Send Logs": "Naplók küldése", + "Clear Storage and Sign Out": "Tárhely törlése és kijelentkezés", + "Refresh": "Frissítés", + "We encountered an error trying to restore your previous session.": "Hibába ütköztünk megpróbáljuk visszaállítani az előző munkamenetet.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "A böngésződ tárhelyének a törlése megoldhatja a problémát, de ezzel kijelentkezel és a titkosított beszélgetések előzményei olvashatatlanná válnak.", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Jelenleg válaszban nem lehet fájlt küldeni, így most úgy lesz elküldve, hogy ez nem egy válasz.", + "Unable to reply": "Nem lehet válaszolni", + "At this time it is not possible to reply with an emote.": "Jelenleg nem lehet emodzsival válaszolni.", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Nem lehet betölteni azt az eseményt amire válaszoltál, mert vagy nem létezik, vagy nincs jogod megnézni.", + "Collapse Reply Thread": "Beszélgetés szál becsukása", + "Enable widget screenshots on supported widgets": "Ahol az a kisalkalmazásban támogatott ott képernyőkép készítés engedélyezése" } diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json index 2c45314a6e..9db1a4a99c 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", @@ -178,7 +175,6 @@ "Banned users": "Pengguna yang diblokir", "Bulk Options": "Opsi Massal", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Tidak dapat terhubung ke server Home - harap cek koneksi anda, pastikan sertifikat SSL server Home Anda terpercaya, dan ekstensi dari browser tidak memblokir permintaan.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s mengubah tampilan namanya dari %(oldDisplayName)s menjadi %(displayName)s.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Tidak dapat terhubung ke server Home melalui HTTP ketika URL di browser berupa HTTPS. Pilih gunakan HTTPS atau aktifkan skrip yang tidak aman.", "%(senderName)s changed their profile picture.": "%(senderName)s telah mengubah foto profilnya.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s telah mengubah tingkat kekuatan dari %(powerLevelDiffText)s.", @@ -202,5 +198,150 @@ "Device key:": "Kunci Perangkat:", "Devices will not yet be able to decrypt history from before they joined the room": "Perangkat tidak akan dapat mendekripsi sejarah sebelum gabung ke ruang", "Ban": "Blokir", - "Bans user with given id": "Blokir pengguna dengan id" + "Bans user with given id": "Blokir pengguna dengan id", + "Fetching third party location failed": "Gagal mengambil lokasi pihak ketiga", + "A new version of Riot is available.": "Riot versi baru telah tersedia.", + "Couldn't load home page": "Tidak dapat memuat halaman utama", + "All notifications are currently disabled for all targets.": "Semua notifikasi saat ini dinonaktifkan untuk semua target.", + "Uploading report": "Unggah laporan", + "Sunday": "Minggu", + "Guests can join": "Tamu dapat gabung", + "Messages sent by bot": "Pesan dikirim oleh bot", + "Notification targets": "Target notifikasi", + "Failed to set direct chat tag": "Gagal mengatur tag obrolan langsung", + "Today": "Hari Ini", + "Failed to get protocol list from Home Server": "Gagal mendapatkan daftar protokol dari Server Home", + "You are not receiving desktop notifications": "Anda tidak menerima notifikasi desktop", + "Dismiss": "Abaikan", + "Update": "Perbarui", + "Notifications": "Notifikasi", + "What's New": "Apa Yang Baru", + "Add an email address above to configure email notifications": "Tambahkan alamat email di atas untuk konfigurasi notifikasi email", + "Expand panel": "Luaskan panel", + "On": "Nyala", + "Filter room names": "Saring nama ruang", + "Changelog": "Daftar perubahan", + "Waiting for response from server": "Menunggu respon dari server", + "Leave": "Tinggalkan", + "Advanced notification settings": "Pengaturan notifikasi lanjutan", + "delete the alias.": "hapus alias.", + "To return to your account in future you need to set a password": "Untuk kembali ke akun di lain waktu, Anda perlu mengisi password", + "Forget": "Lupakan", + "World readable": "Terpublikasi Umum", + "#example": "#contoh", + "Hide panel": "Sembunyikan panel", + "You cannot delete this image. (%(code)s)": "Anda tidak dapat menghapus gambar ini. (%(code)s)", + "Cancel Sending": "Batalkan pengiriman", + "Warning": "Peringatan", + "This Room": "Ruang ini", + "The Home Server may be too old to support third party networks": "Server Home mungkin terlalu kuno untuk mendukung jaringan pihak ketiga", + "Noisy": "Berisik", + "Error saving email notification preferences": "Terjadi kesalahan saat menyimpan pilihan notifikasi email", + "Messages containing my display name": "Pesan mengandung nama tampilan saya", + "Messages in one-to-one chats": "Pesan di obrolan satu-ke-satu", + "Unavailable": "Tidak Tersedia", + "View Decrypted Source": "Tampilkan Sumber Terdekripsi", + "Failed to update keywords": "Gagal memperbarui kata kunci", + "remove %(name)s from the directory.": "hapus %(name)s dari direktori.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Notifikasi pada kata kunci berikut mengikuti aturan dimana tidak dapat ditampilkan di sini:", + "Please set a password!": "Mohon isi password!", + "powered by Matrix": "didukung oleh Matrix", + "You have successfully set a password!": "Anda berhasil mengubah password!", + "An error occurred whilst saving your email notification preferences.": "Terjadi kesalahan saat menyimpan preferensi notifikasi email Anda.", + "All Rooms": "Semua Ruang", + "Source URL": "URL sumber", + "Failed to add tag %(tagName)s to room": "Gagal menambahkan tag %(tagName)s ke ruang", + "Members": "Anggota", + "No update available.": "Tidak ada pembaruan.", + "Resend": "Kirim Ulang", + "Files": "Files", + "Collecting app version information": "Mengumpukan informasi versi aplikasi", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Hapus alias ruang %(alias)s dan hapus %(name)s dari direktori?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Hal ini akan memperbolehkan anda kembali ke akun setelah keluar dan masuk kembali di perangkat lain.", + "Enable notifications for this account": "Aktifkan notifikasi untuk akun ini", + "Directory": "Direktori", + "Failed to get public room list": "Gagal mendapatkan daftar ruang publik", + "Messages containing keywords": "Pesan mengandung kata kunci", + "Room not found": "Ruang tidak ditemukan", + "Tuesday": "Selasa", + "Enter keywords separated by a comma:": "Masukkan kata kunci dipisahkan oleh koma:", + "Search…": "Cari…", + "Remove %(name)s from the directory?": "Hapus %(name)s dari direktori?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot menggunakan banyak fitur terdepan dari browser, dimana tidak tersedia atau dalam fase eksperimen di browser Anda.", + "Enable desktop notifications": "Aktifkan notifikasi desktop", + "Unnamed room": "Ruang tanpa nama", + "Friday": "Jumat", + "Remember, you can always set an email address in user settings if you change your mind.": "Ingat, Anda selalu dapat mengubah alamat email di pengaturan pengguna jika anda berubah pikiran.", + "All messages (noisy)": "Semua pesan (keras)", + "Saturday": "Sabtu", + "I understand the risks and wish to continue": "Saya mengerti resikonya dan berharap untuk melanjutkan", + "Direct Chat": "Obrolan Langsung", + "The server may be unavailable or overloaded": "Server mungkin tidak tersedia atau kelebihan muatan", + "Reject": "Tolak", + "Failed to set Direct Message status of room": "Gagal mengatur status Pesan Langsung dari ruang", + "Monday": "Senin", + "Remove from Directory": "Hapus dari DIrektori", + "Enable them now": "Aktifkan sekarang", + "Messages containing my user name": "Pesan mengandung nama pengguna saya", + "Collecting logs": "Mengumpulkan catatan", + "more": "lagi", + "(HTTP status %(httpStatus)s)": "(status HTTP %(httpStatus)s)", + "Failed to forget room %(errCode)s": "Gagal melupakan ruang %(errCode)s", + "Wednesday": "Rabu", + "You cannot delete this message. (%(code)s)": "Anda tidak dapat menghapus pesan ini. (%(code)s)", + "Quote": "Kutip", + "Send": "Kirim", + "Error": "Terjadi Kesalahan", + "Send logs": "Kirim catatan", + "All messages": "Semua pesan", + "Call invitation": "Undangan panggilan", + "Downloading update...": "Unduh pembaruan...", + "You have successfully set a password and an email address!": "Anda telah berhasil mengubah password dan alamat email!", + "What's new?": "Apa yang baru?", + "Notify me for anything else": "Beritau saya untuk lainnya", + "When I'm invited to a room": "Ketika Saya diundang ke ruang", + "Cancel": "Batal", + "Can't update user notification settings": "Tidak dapat memperbarui pengaturan notifikasi pengguna", + "Notify for all other messages/rooms": "Beritau semua pesan/ruang", + "Unable to look up room ID from server": "Tidak dapat mencari ID ruang dari server", + "Couldn't find a matching Matrix room": "Tidak dapat menemukan ruang Matrix yang sesuai", + "Invite to this room": "Undang ke ruang ini", + "Search for a room": "Cari ruang obrolan", + "Thursday": "Kamis", + "Forward Message": "Teruskan Pesan", + "Back": "Kembali", + "Show message in desktop notification": "Tampilkan pesan pada desktop", + "Unhide Preview": "Tampilkan Pratinjau", + "Unable to join network": "Tidak dapat bergabung di jaringan", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Anda mungkin sudah konfigurasi di klien selain Riot. Anda tidak dapat setel di Riot tetap berlaku", + "Sorry, your browser is not able to run Riot.": "Maaf, browser Anda tidak dapat menjalankan Riot.", + "Uploaded on %(date)s by %(user)s": "Diunggah pada %(date)s oleh %(user)s", + "Messages in group chats": "Pesan di obrolan grup", + "Yesterday": "Kemarin", + "Error encountered (%(errorDetail)s).": "Terjadi kesalahan (%(errorDetail)s).", + "Keywords": "Kata Kunci", + "Low Priority": "Prioritas Rendah", + "Unable to fetch notification target list": "Tidak dapat mengambil daftar notifikasi target", + "Set Password": "Ubah Password", + "Enable audible notifications in web client": "Aktifkan notifikasi suara di klien web", + "Permalink": "Permalink", + "Off": "Mati", + "Riot does not know how to join a room on this network": "Riot tidak tau bagaimana gabung ruang di jaringan ini", + "Mentions only": "Hanya jika disinggung", + "Failed to remove tag %(tagName)s from room": "Gagal menghapus tag %(tagName)s dari ruang", + "Remove": "Hapus", + "You can now return to your account after signing out, and sign in on other devices.": "Anda dapat kembali ke akun setelah keluar dan masuk kembali di perangkat lain.", + "Enable email notifications": "Aktifkan notifikasi email", + "Login": "Masuk", + "No rooms to show": "Tidak ada ruang ditunjukkan", + "Download this file": "Unduh file ini", + "Failed to change settings": "Gagal mengubah pengaturan", + "Failed to change password. Is your password correct?": "Gagal untuk mengubah password. Apakah password Anda benar?", + "View Source": "Tampilkan Sumber", + "Custom Server Options": "Pilihan Server Khusus", + "Thank you!": "Terima kasih!", + "Collapse panel": "Lipat panel", + "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Dengan browser ini, tampilan dari aplikasi mungkin tidak sesuai, dan beberapa atau bahkan semua fitur mungkin tidak berjalan. Jika Anda ingin tetap mencobanya, Anda bisa melanjutkan, tapi Anda tanggung sendiri jika muncul masalah yang terjadi!", + "Checking for an update...": "Cek pembaruan...", + "There are advanced notifications which are not shown here": "Ada notifikasi lanjutan yang tidak ditampilkan di sini" } diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 0da7cf704b..50121c7059 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -53,7 +53,7 @@ "You cannot place VoIP calls in this browser.": "Non puoi effettuare chiamate VoIP con questo browser.", "You cannot place a call with yourself.": "Non puoi chiamare te stesso.", "Conference calls are not supported in this client": "Le chiamate di gruppo non sono supportate da questo client", - "Conference calls are not supported in encrypted rooms": "Le chiamate di gruppo non sono supportate nelle stanze con crittografia", + "Conference calls are not supported in encrypted rooms": "Le chiamate di gruppo non sono supportate nelle stanze criptate", "Warning!": "Attenzione!", "Sun": "Dom", "Mon": "Lun", @@ -85,5 +85,1061 @@ "Unable to capture screen": "Impossibile acquisire lo schermo", "Call": "Chiama", "Answer": "Rispondi", - "Invite to Community": "Invita alla community" + "Invite to Community": "Invita alla community", + "Unpin Message": "Sblocca messaggio", + "Add rooms to this community": "Aggiungi stanze a questa community", + "Warning": "Attenzione", + "Unnamed room": "Stanza senza nome", + "Online": "Online", + "The platform you're on": "La piattaforma in cui sei", + "The version of Riot.im": "La versione di Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Se hai eseguito l'accesso o meno (non registriamo il tuo nome utente)", + "Your language of choice": "La lingua scelta", + "Which officially provided instance you are using, if any": "Quale istanza fornita ufficialmente stai usando, se presente", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Se stai usando o meno la modalità Richtext dell'editor Rich Text", + "Your homeserver's URL": "L'URL del tuo homeserver", + "Your identity server's URL": "L'URL del tuo server di identità", + "Analytics": "Statistiche", + "The information being sent to us to help make Riot.im better includes:": "Le informazioni inviate per aiutarci a migliorare Riot.im includono:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Se questa pagina include informazioni identificabili, come una stanza, utente o ID di gruppo, questi dati sono rimossi prima che vengano inviati al server.", + "Call Failed": "Chiamata fallita", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Ci sono dispositivi sconosciuti in questa stanza: se procedi senza verificarli, qualcuno avrà la possibilità di intercettare la tua chiamata.", + "Review Devices": "Revisiona i dispositivi", + "Call Anyway": "Chiama comunque", + "Answer Anyway": "Rispondi comunque", + "Call Timeout": "Scadenza chiamata", + "Existing Call": "Chiamata esistente", + "You are already in a call.": "Partecipi già ad una chiamata.", + "Conference calling is in development and may not be reliable.": "Le chiamate di gruppo sono in sviluppo e potrebbero essere inaffidabili.", + "Failed to set up conference call": "Impostazione della chiamata di gruppo fallita", + "Conference call failed.": "Chiamata di gruppo fallita.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s ha richiesto una conferenza VoIP.", + "VoIP conference started.": "Conferenza VoIP iniziata.", + "VoIP conference finished.": "Conferenza VoIP terminata.", + "Ongoing conference call%(supportedText)s.": "Chiamata di gruppo in corso%(supportedText)s.", + "The file '%(fileName)s' failed to upload": "Invio del file '%(fileName)s' fallito", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Il file '%(fileName)s' supera il limite di dimensione inviabile da questo home server", + "Upload Failed": "Invio fallito", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", + "Who would you like to add to this community?": "Chi vuoi aggiungere a questa comunità?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Attenzione: qualsiasi persona aggiungi ad una comunità sarà visibile pubblicamente a chiunque conosca l'ID della comunità", + "Invite new community members": "Invita nuovi membri nella comunità", + "Name or matrix ID": "Nome o ID matrix", + "Which rooms would you like to add to this community?": "Quali stanze vuoi aggiungere a questa comunità?", + "Show these rooms to non-members on the community page and room list?": "Mostrare queste stanze ai non membri nella pagina comunità e all'elenco stanze?", + "Add rooms to the community": "Aggiungi stanze alla comunità", + "Room name or alias": "Nome stanza o alias", + "Add to community": "Aggiungi alla comunità", + "Failed to invite the following users to %(groupId)s:": "Invito ad unirsi in %(groupId)s fallito per i seguenti utenti:", + "Failed to invite users to community": "Invito degli utenti alla comunità fallito", + "Failed to invite users to %(groupId)s": "Invito degli utenti a %(groupId)s fallito", + "Failed to add the following rooms to %(groupId)s:": "Aggiunta a %(groupId)s fallita per le seguenti stanze:", + "Riot does not have permission to send you notifications - please check your browser settings": "Riot non ha l'autorizzazione ad inviarti notifiche - controlla le impostazioni del browser", + "Riot was not given permission to send notifications - please try again": "Non è stata data a Riot l'autorizzazione ad inviare notifiche - riprova", + "Unable to enable Notifications": "Impossibile attivare le notifiche", + "This email address was not found": "Indirizzo email non trovato", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Il tuo indirizzo email sembra non essere associato ad un ID Matrix su questo homeserver.", + "Default": "Predefinito", + "Restricted": "Limitato", + "Moderator": "Moderatore", + "Start a chat": "Inizia una conversazione", + "Who would you like to communicate with?": "Con chi vorresti comunicare?", + "Email, name or matrix ID": "Email, nome o ID matrix", + "Start Chat": "Inizia conversazione", + "Invite new room members": "Invita nuovi membri nella stanza", + "Who would you like to add to this room?": "Chi vorresti aggiungere a questa stanza?", + "Send Invites": "Manda inviti", + "Failed to invite user": "Invito dell'utente fallito", + "Failed to invite": "Invito fallito", + "Failed to invite the following users to the %(roomName)s room:": "Invito nella stanza %(roomName)s fallito per i seguenti utenti:", + "You need to be logged in.": "Devi aver eseguito l'accesso.", + "You need to be able to invite users to do that.": "Devi potere invitare utenti per completare l'azione.", + "Unable to create widget.": "Impossibile creare il widget.", + "Failed to send request.": "Invio della richiesta fallito.", + "This room is not recognised.": "Stanza non riconosciuta.", + "You are not in this room.": "Non sei in questa stanza.", + "You do not have permission to do that in this room.": "Non hai l'autorizzazione per farlo in questa stanza.", + "Missing room_id in request": "Manca l'id_stanza nella richiesta", + "Must be viewing a room": "Devi vedere una stanza", + "Room %(roomId)s not visible": "Stanza %(roomId)s non visibile", + "Missing user_id in request": "Manca l'id_utente nella richiesta", + "Failed to lookup current room": "Impossibile cercare la stanza attuale", + "Usage": "Utilizzo", + "/ddg is not a command": "/ddg non è un comando", + "To use it, just wait for autocomplete results to load and tab through them.": "Per usarlo, attendi l'autocompletamento dei risultati e selezionali con tab.", + "Unrecognised room alias:": "Alias della stanza non riconosciuto:", + "Ignored user": "Utente ignorato", + "You are now ignoring %(userId)s": "Ora stai ignorando %(userId)s", + "Unignored user": "Utente non più ignorato", + "You are no longer ignoring %(userId)s": "Non stai più ignorando %(userId)s", + "Unknown (user, device) pair:": "Coppia (utente, dispositivo) sconosciuta:", + "Device already verified!": "Dispositivo già verificato!", + "WARNING: Device already verified, but keys do NOT MATCH!": "ATTENZIONE: dispositivo già verificato, ma le chiavi NON CORRISPONDONO!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATTENZIONE: VERIFICA CHIAVI FALLITA! La chiave per %(userId)s e il dispositivo %(deviceId)s è \"%(fprint)s\" , la quale non corrisponde con la chiave fornita \"%(fingerprint)s\". Potrebbe significare che le tue comunicazioni vengono intercettate!", + "Verified key": "Chiave verificata", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La chiave che hai fornito corrisponde alla chiave che hai ricevuto dal dispositivo %(deviceId)s di %(userId)s . Dispositivo segnato come verificato.", + "Unrecognised command:": "Comando non riconosciuto:", + "Reason": "Motivo", + "%(senderName)s invited %(targetName)s.": "%(senderName)s ha invitato %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s ha bandito %(targetName)s.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ha modificato il proprio nome in %(displayName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ha impostato il proprio nome a %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha rimosso il proprio nome visibile (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s ha rimosso la propria immagine del profilo.", + "%(senderName)s changed their profile picture.": "%(senderName)s ha cambiato la propria immagine del profilo.", + "%(senderName)s set a profile picture.": "%(senderName)s ha impostato un'immagine del profilo.", + "%(targetName)s joined the room.": "%(targetName)s è entrato nella stanza.", + "%(targetName)s rejected the invitation.": "%(targetName)s ha rifiutato l'invito.", + "%(targetName)s left the room.": "%(targetName)s è uscito dalla stanza.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ha rimosso il ban a %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s ha cacciato %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha revocato l'invito per %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ha modificato l'argomento in \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha rimosso il nome della stanza.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ha modificato il nome della stanza in %(roomName)s.", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s ha inviato un'immagine.", + "Someone": "Qualcuno", + "(not supported by this browser)": "(non supportato da questo browser)", + "%(senderName)s answered the call.": "%(senderName)s ha risposto alla chiamata.", + "(could not connect media)": "(connessione del media non riuscita)", + "(no answer)": "(nessuna risposta)", + "(unknown failure: %(reason)s)": "(errore sconosciuto: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s ha terminato la chiamata.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s ha avviato una chiamata %(callType)s .", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s ha mandato un invito a %(targetDisplayName)s per unirsi alla stanza.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento del loro invito.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento in cui sono entrati.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha reso visibile la futura cronologia della stanza a (%(visibility)s) sconosciuto.", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha attivato la crottografia end-to-end (algoritmo %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s da %(fromPowerLevel)s a %(toPowerLevel)s", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ha cambiato il messaggio ancorato della stanza.", + "%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modificato da %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s aggiunto da %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s rimosso da %(senderName)s", + "%(displayName)s is typing": "%(displayName)s sta scrivendo", + "%(names)s and %(count)s others are typing|other": "%(names)s e altri %(count)s stanno scrivendo", + "%(names)s and %(count)s others are typing|one": "%(names)s e un altro stanno scrivendo", + "%(names)s and %(lastPerson)s are typing": "%(names)s e %(lastPerson)s stanno scrivendo", + "Failure to create room": "Creazione della stanza fallita", + "Server may be unavailable, overloaded, or you hit a bug.": "Il server potrebbe essere non disponibile, sovraccarico o hai trovato un errore.", + "Send anyway": "Invia comunque", + "Send": "Invia", + "Unnamed Room": "Stanza senza nome", + "Your browser does not support the required cryptography extensions": "Il tuo browser non supporta l'estensione crittografica richiesta", + "Not a valid Riot keyfile": "Non è una chiave di Riot valida", + "Authentication check failed: incorrect password?": "Controllo di autenticazione fallito: password sbagliata?", + "Failed to join room": "Accesso alla stanza fallito", + "Tag Panel": "Pannello etichette", + "Disable Emoji suggestions while typing": "Disattiva i suggerimenti delle emoji durante la digitazione", + "Use compact timeline layout": "Usa impaginazione cronologia compatta", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Nascondi i messaggi di entrata/uscita (inviti/kick/ban esclusi)", + "Hide avatar changes": "Nascondi le modifiche dell'avatar", + "Hide display name changes": "Nascondi le modifiche del nome", + "Hide read receipts": "Nascondi le ricevute di lettura", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "Mostra gli orari nel formato 12 ore (es. 2:30pm)", + "Autoplay GIFs and videos": "Riproduzione automatica di GIF e video", + "Enable automatic language detection for syntax highlighting": "Attiva la rilevazione automatica della lingua per l'evidenziazione della sintassi", + "Hide avatars in user and room mentions": "Nascondi gli avatar nelle citazioni di utente e stanza", + "Disable big emoji in chat": "Disattiva gli emoji grandi in chat", + "Don't send typing notifications": "Non inviare notifiche di composizione", + "Automatically replace plain text Emoji": "Sostituisci automaticamente le emoji testuali", + "Disable Community Filter Panel": "Disattiva il pannello filtro comunità", + "Disable Peer-to-Peer for 1:1 calls": "Disattiva il peer-to-peer per chiamate 1:1", + "Never send encrypted messages to unverified devices from this device": "Non inviare mai da questo dispositivo messaggi cifrati a dispositivi non verificati", + "Never send encrypted messages to unverified devices in this room from this device": "Non inviare mai da questo dispositivo messaggi cifrati a dispositivi non verificati in questa stanza", + "Enable inline URL previews by default": "Attiva le anteprime URL in modo predefinito", + "Enable URL previews for this room (only affects you)": "Attiva le anteprime URL in questa stanza (riguarda solo te)", + "Enable URL previews by default for participants in this room": "Attiva le anteprime URL in modo predefinito per i partecipanti in questa stanza", + "Room Colour": "Colore della stanza", + "Active call (%(roomName)s)": "Chiamata attiva (%(roomName)s)", + "unknown caller": "Chiamante sconosciuto", + "Incoming voice call from %(name)s": "Chiamata vocale in arrivo da %(name)s", + "Incoming video call from %(name)s": "Chiamata video in arrivo da %(name)s", + "Incoming call from %(name)s": "Chiamata in arrivo da %(name)s", + "Decline": "Rifiuta", + "Accept": "Accetta", + "Incorrect verification code": "Codice di verifica sbagliato", + "Enter Code": "Inserisci il codice", + "Submit": "Invia", + "Phone": "Telefono", + "Failed to upload profile picture!": "Invio dell'immagine profilo fallito!", + "Upload new:": "Invia nuovo:", + "No display name": "Nessun nome visibile", + "New passwords don't match": "Le nuove password non corrispondono", + "Passwords can't be empty": "Le password non possono essere vuote", + "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "La modifica della password ripristinerà qualsiasi chiave di cifratura end-to-end su tutti i dispositivi, rendendo illeggibile la cronologia delle chat, a meno che prima non esporti le tue chiavi della stanza e poi le importi. In futuro ciò verrà migliorato.", + "Export E2E room keys": "Esporta chiavi E2E della stanza", + "Do you want to set an email address?": "Vuoi impostare un indirizzo email?", + "Current password": "Password attuale", + "Password": "Password", + "New Password": "Nuova password", + "Confirm password": "Conferma password", + "Change Password": "Modifica password", + "Your home server does not support device management.": "Il tuo home server non supporta la gestione dei dispositivi.", + "Unable to load device list": "Impossibile caricare l'elenco dei dispositivi", + "Delete %(count)s devices|other": "Elimina %(count)s dispositivi", + "Delete %(count)s devices|one": "Elimina dispositivo", + "Device ID": "ID dispositivo", + "Device Name": "Nome dispositivo", + "Last seen": "Visto l'ultima volta", + "Select devices": "Seleziona i dispositivi", + "Failed to set display name": "Impostazione nome visibile fallita", + "Disable Notifications": "Disattiva le notifiche", + "Enable Notifications": "Attiva le notifiche", + "Cannot add any more widgets": "Impossibile aggiungere altri widget", + "The maximum permitted number of widgets have already been added to this room.": "Il numero massimo consentito di widget è già stato raggiunto in questa stanza.", + "Drop File Here": "Trascina file qui", + "Drop file here to upload": "Trascina un file qui per l'invio", + " (unsupported)": " (non supportato)", + "Join as voice or video.": "Unisciti come voce o video.", + "%(senderName)s sent an image": "%(senderName)s ha inviato un'immagine", + "%(senderName)s sent a video": "%(senderName)s ha inviato un video", + "%(senderName)s uploaded a file": "%(senderName)s ha inviato un file", + "Options": "Opzioni", + "Your key share request has been sent - please check your other devices for key share requests.": "Richiesta di condivisione chiavi inviata - controlla i tuoi altri dispositivi per richieste di condivisione chiavi.", + "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.": "Le richieste di condivisione chiavi sono inviate automaticamente ai tuoi altri dispositivi. Se hai rifiutato o annullato la richiesta negli altri dispositivi, clicca qui per richiederle nuovamente.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Se i tuoi altri dispositivi non hanno la chiave per questo messaggio non potrai decriptarli.", + "Key request sent.": "Richiesta chiave inviata.", + "Re-request encryption keys from your other devices.": "Chiedi di nuovo le chiavi di cifratura dai tuoi altri dispositivi.", + "Undecryptable": "Indecifrabile", + "Encrypted by a verified device": "Criptato da un dispositivo verificato", + "Encrypted by an unverified device": "Criptato da un dispositivo non verificato", + "Unencrypted message": "Messaggio non criptato", + "Please select the destination room for this message": "Seleziona la stanza di destinazione per questo messaggio", + "Blacklisted": "In lista nera", + "Verified": "Verificato", + "Unverified": "Non verificato", + "device id: ": "ID dispositivo: ", + "Disinvite": "Revoca invito", + "Kick": "Caccia fuori", + "Disinvite this user?": "Revocare l'invito a questo utente?", + "Kick this user?": "Cacciare questo utente?", + "Failed to kick": "Espulsione fallita", + "Unban": "Togli ban", + "Ban": "Bandisci", + "Unban this user?": "Togliere il ban a questo utente?", + "Ban this user?": "Bandire questo utente?", + "Failed to ban user": "Ban utente fallito", + "Failed to mute user": "Impossibile silenziare l'utente", + "Failed to toggle moderator status": "Cambio di stato moderatore fallito", + "Failed to change power level": "Cambio di livello poteri fallito", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Non potrai annullare questa modifica dato che ti stai declassando, se sei l'ultimo utente privilegiato nella stanza sarà impossibile ottenere di nuovo i privilegi.", + "Are you sure?": "Sei sicuro?", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Non potrai annullare questa modifica dato che stai promuovendo l'utente al tuo stesso grado.", + "No devices with registered encryption keys": "Nessun dispositivo con chiavi di cifratura registrate", + "Devices": "Dispositivi", + "Unignore": "Non ignorare più", + "Ignore": "Ignora", + "Mention": "Cita", + "Invite": "Invita", + "User Options": "Opzioni utente", + "Direct chats": "Conversazioni dirette", + "Unmute": "Togli silenzio", + "Revoke Moderator": "Declassa moderatore", + "Make Moderator": "Promuovi a moderatore", + "Level:": "Livello:", + "and %(count)s others...|other": "e altri %(count)s ...", + "and %(count)s others...|one": "e un altro...", + "Invited": "Invitato", + "Filter room members": "Filtra membri della stanza", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (poteri %(powerLevelNumber)s)", + "Attachment": "Allegato", + "Upload Files": "Invia file", + "Are you sure you want to upload the following files?": "Sei sicuro di volere inviare i seguenti file?", + "Encrypted room": "Stanza criptata", + "Unencrypted room": "Stanza non criptata", + "Hangup": "Riaggancia", + "Voice call": "Chiamata vocale", + "Video call": "Chiamata video", + "Upload file": "Invia file", + "Show Text Formatting Toolbar": "Mostra barra di formattazione testo", + "Send an encrypted reply…": "Invia una risposta criptata…", + "Send a reply (unencrypted)…": "Invia una risposta (non criptata)…", + "Send an encrypted message…": "Invia un messaggio criptato…", + "Send a message (unencrypted)…": "Invia un messaggio (non criptato)…", + "You do not have permission to post to this room": "Non hai il permesso di inviare in questa stanza", + "Turn Markdown on": "Attiva markdown", + "Turn Markdown off": "Disattiva markdown", + "Hide Text Formatting Toolbar": "Nascondi barra di formattazione testo", + "Server error": "Errore del server", + "Server unavailable, overloaded, or something else went wrong.": "Server non disponibile, sovraccarico o qualcos'altro è andato storto.", + "Command error": "Errore nel comando", + "bold": "grassetto", + "italic": "corsivo", + "strike": "barrato", + "underline": "sottolineato", + "code": "codice", + "quote": "citazione", + "bullet": "elenco", + "numbullet": "elenco numerato", + "Markdown is disabled": "Il markdown è disattivato", + "Markdown is enabled": "Il markdown è attivato", + "Jump to message": "Salta al messaggio", + "No pinned messages.": "Nessun messaggio ancorato.", + "Loading...": "Caricamento...", + "Pinned Messages": "Messaggi ancorati", + "%(duration)ss": "%(duration)ss", + "%(duration)sm": "%(duration)sm", + "%(duration)sh": "%(duration)so", + "%(duration)sd": "%(duration)sg", + "Online for %(duration)s": "Online per %(duration)s", + "Idle for %(duration)s": "Inattivo per %(duration)s", + "Offline for %(duration)s": "Offline per %(duration)s", + "Unknown for %(duration)s": "Sconosciuto per %(duration)s", + "Idle": "Inattivo", + "Offline": "Offline", + "Unknown": "Sconosciuto", + "Seen by %(userName)s at %(dateTime)s": "Visto da %(userName)s alle %(dateTime)s", + "No rooms to show": "Nessuna stanza da mostrare", + "World readable": "Leggibile da tutti", + "Guests can join": "Gli ospiti possono entrare", + "Failed to set avatar.": "Impostazione avatar fallita.", + "Save": "Salva", + "(~%(count)s results)|other": "(~%(count)s risultati)", + "(~%(count)s results)|one": "(~%(count)s risultato)", + "Join Room": "Entra nella stanza", + "Upload avatar": "Invia avatar", + "Remove avatar": "Rimuovi avatar", + "Forget room": "Dimentica la stanza", + "Show panel": "Mostra il pannello", + "Drop here to favourite": "Trascina qui per preferire", + "Drop here to tag direct chat": "Trascina qui per taggare chat diretta", + "Drop here to restore": "Trascina qui per ripristinare", + "Drop here to demote": "Trascina qui per declassare", + "Drop here to tag %(section)s": "Trascina qui per taggare %(section)s", + "Press to start a chat with someone": "Premi per iniziare una conversazione con qualcuno", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Non sei ancora in alcuna stanza! Premi per crearne una o per sfogliare l'elenco", + "Community Invites": "Inviti della comunità", + "Invites": "Inviti", + "Favourites": "Preferiti", + "People": "Persone", + "Low priority": "Bassa priorità", + "Historical": "Cronologia", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Impossibile verificare che l'indirizzo al quale questo invito è stato inviato corrisponda a uno associato al tuo account.", + "Power level must be positive integer.": "Il livello di poteri deve essere un intero positivo.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha modificato il livello di poteri di %(powerLevelDiffText)s.", + "Jump to read receipt": "Salta alla ricevuta di lettura", + "This invitation was sent to an email address which is not associated with this account:": "Questo invito è stato mandato a un indirizzo email non associato a questo account:", + "You may wish to login with a different account, or add this email to this account.": "Dovresti accedere con un account diverso, o aggiungere questa email all'account.", + "You have been invited to join this room by %(inviterName)s": "Sei stato invitato ad entrare in questa stanza da %(inviterName)s", + "Would you like to accept or decline this invitation?": "Vuoi accettare o rifiutare l'invito?", + "Reason: %(reasonText)s": "Motivo: %(reasonText)s", + "Rejoin": "Rientra", + "You have been kicked from %(roomName)s by %(userName)s.": "Sei stato cacciato fuori da %(roomName)s da %(userName)s.", + "You have been kicked from this room by %(userName)s.": "Sei stato cacciato fuori da questa stanza da %(userName)s.", + "You have been banned from %(roomName)s by %(userName)s.": "Sei stato bandito da %(roomName)s da %(userName)s.", + "You have been banned from this room by %(userName)s.": "Sei stato bandito da questa stanza da %(userName)s.", + "This room": "Questa stanza", + "%(roomName)s does not exist.": "%(roomName)s non esiste.", + "%(roomName)s is not accessible at this time.": "%(roomName)s non è al momento accessibile.", + "You are trying to access %(roomName)s.": "Stai provando ad entrare in %(roomName)s.", + "You are trying to access a room.": "Stai provando ad entrare in questa stanza.", + "Click here to join the discussion!": "Clicca qui per unirti alla discussione!", + "This is a preview of this room. Room interactions have been disabled": "Questa è un'anteprima della stanza. Le interazioni nella stanza sono state disattivate", + "To change the room's avatar, you must be a": "Per cambiare l'avatar della stanza, devi essere un", + "To change the room's name, you must be a": "Per modificare il nome della stanza, devi essere un", + "To change the room's main address, you must be a": "Per modificare l'indirizzo principale della stanza, devi essere un", + "To change the room's history visibility, you must be a": "Per cambiare la visibilità della cronologia della stanza, devi essere un", + "To change the permissions in the room, you must be a": "Per cambiare le autorizzazioni nella stanza, devi essere un", + "To change the topic, you must be a": "Per cambiare l'argomento, devi essere un", + "To modify widgets in the room, you must be a": "Per modificare i widget nella stanza, devi essere un", + "Failed to unban": "Rimozione ban fallita", + "Banned by %(displayName)s": "Bandito da %(displayName)s", + "Privacy warning": "Avviso sulla privacy", + "Changes to who can read history will only apply to future messages in this room": "Le modifiche a chi può leggere la cronologia sono applicate solo ai messaggi futuri della stanza", + "The visibility of existing history will be unchanged": "La visibilità della cronologia esistente rimarrà invariata", + "End-to-end encryption is in beta and may not be reliable": "La cifratura end-to-end è in beta e potrebbe essere inaffidabile", + "You should not yet trust it to secure data": "Non dovresti ancora fidartene per proteggere i dati", + "Devices will not yet be able to decrypt history from before they joined the room": "I dispositivi non potranno ancora decifrare la cronologia da prima che entrassero nella stanza", + "Once encryption is enabled for a room it cannot be turned off again (for now)": "Una volta attivata la cifratura per una stanza non può più essere disattivata (per ora)", + "Encrypted messages will not be visible on clients that do not yet implement encryption": "I messaggi criptati non saranno visibili nei client che non implementano ancora la cifratura", + "Enable encryption": "Attiva la cifratura", + "(warning: cannot be disabled again!)": "(attenzione: non può più essere disattivato!)", + "Encryption is enabled in this room": "La cifratura è attiva in questa stanza", + "Encryption is not enabled in this room": "La cifratura non è attiva in questa stanza", + "The default role for new room members is": "Il ruolo predefinito per i nuovi membri della stanza è", + "To send messages, you must be a": "Per inviare messaggi, devi essere un", + "To invite users into the room, you must be a": "Per invitare utenti nella stanza, devi essere un", + "To configure the room, you must be a": "Per configurare la stanza, devi essere un", + "To kick users, you must be a": "Per cacciare fuori utenti, devi essere un", + "To ban users, you must be a": "Per bandire utenti, devi essere un", + "To remove other users' messages, you must be a": "Per rimuovere messaggi di altri utenti, devi essere un", + "Privileged Users": "Utenti privilegiati", + "%(user)s is a %(userRole)s": "%(user)s è un %(userRole)s", + "No users have specific privileges in this room": "Nessun utente ha privilegi specifici in questa stanza", + "Banned users": "Utenti banditi", + "This room is not accessible by remote Matrix servers": "Questa stanza non è accessibile da server di Matrix remoti", + "Leave room": "Esci dalla stanza", + "Tagged as: ": "Etichettato come: ", + "To link to a room it must have an address.": "Per linkare una stanza deve avere un indirizzo.", + "Guests cannot join this room even if explicitly invited.": "Gli ospiti non possono entrare in questa stanza anche se esplicitamente invitati.", + "Click here to fix": "Clicca qui per correggere", + "To send events of type , you must be a": "Per inviare eventi di tipo , devi essere un", + "Who can access this room?": "Chi può accedere a questa stanza?", + "Only people who have been invited": "Solo chi è stato invitato", + "Anyone who knows the room's link, apart from guests": "Chiunque conosca il link della stanza, eccetto gli ospiti", + "Anyone who knows the room's link, including guests": "Chiunque conosca il link della stanza, inclusi gli ospiti", + "Publish this room to the public in %(domain)s's room directory?": "Pubblicare questa stanza nell'elenco pubblico delle stanze in %(domain)s ?", + "Who can read history?": "Chi può leggere la cronologia?", + "Anyone": "Chiunque", + "Members only (since the point in time of selecting this option)": "Solo i membri (dal momento in cui selezioni questa opzione)", + "Members only (since they were invited)": "Solo i membri (da quando sono stati invitati)", + "Members only (since they joined)": "Solo i membri (da quando sono entrati)", + "Permissions": "Autorizzazioni", + "This room's internal ID is": "L'ID interno di questa stanza è", + "Scroll to unread messages": "Scorri ai messaggi non letti", + "Jump to first unread message.": "Salta al primo messaggio non letto.", + "Invalid alias format": "Formato alias non valido", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' non è un formato valido per un alias", + "Invalid address format": "Formato indirizzo non valido", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' non è un formato valido per un indirizzo", + "not specified": "non specificato", + "not set": "non impostato", + "Remote addresses for this room:": "Indirizzi remoti di questa stanza:", + "Addresses": "Indirizzi", + "The main address for this room is": "L'indirizzo principale di questa stanza è", + "Local addresses for this room:": "Indirizzi locali di questa stanza:", + "This room has no local addresses": "Questa stanza non ha indirizzi locali", + "New address (e.g. #foo:%(localDomain)s)": "Nuovo indirizzo (es. #foo:%(localDomain)s)", + "Invalid community ID": "ID comunità non valido", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' non è un ID comunità valido", + "Showing flair for these communities:": "Predisposizione della stanza per queste comunità:", + "Flair": "Predisposizione", + "This room is not showing flair for any communities": "Questa stanza non mostra predisposizione per alcuna comunità", + "New community ID (e.g. +foo:%(localDomain)s)": "Nuovo ID comunità (es. +foo:%(localDomain)s)", + "You have enabled URL previews by default.": "Hai attivato le anteprime degli URL in modo predefinito.", + "You have disabled URL previews by default.": "Hai disattivato le anteprime degli URL in modo predefinito.", + "URL previews are enabled by default for participants in this room.": "Le anteprime degli URL sono attive in modo predefinito per i partecipanti di questa stanza.", + "URL previews are disabled by default for participants in this room.": "Le anteprime degli URL sono inattive in modo predefinito per i partecipanti di questa stanza.", + "URL Previews": "Anteprime URL", + "Error decrypting audio": "Errore decifratura audio", + "Error decrypting attachment": "Errore decifratura allegato", + "Decrypt %(text)s": "Decifra %(text)s", + "Download %(text)s": "Scarica %(text)s", + "Invalid file%(extra)s": "File non valido %(extra)s", + "Error decrypting image": "Errore decifratura immagine", + "Error decrypting video": "Errore decifratura video", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ha cambiato l'avatar per %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s ha rimosso l'avatar della stanza.", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s ha cambiato l'avatar della stanza a ", + "Copied!": "Copiato!", + "Failed to copy": "Copia fallita", + "Add an Integration": "Aggiungi un'integrazione", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Stai per essere portato in un sito di terze parti per autenticare il tuo account da usare con %(integrationsUrl)s. Vuoi continuare?", + "Removed or unknown message type": "Tipo messaggio rimosso o sconosciuto", + "Message removed by %(userId)s": "Messaggio rimosso da %(userId)s", + "Message removed": "Messaggio rimosso", + "Robot check is currently unavailable on desktop - please use a web browser": "Il controllo robot non è al momento disponibile per desktop - usa un browser web", + "This Home Server would like to make sure you are not a robot": "Questo home server vorrebbe assicurarsi che non sei un robot", + "Sign in with CAS": "Accedi con CAS", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Puoi usare l'opzione server personalizzato per accedere ai server Matrix specificando un URL di home server diverso.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Ciò ti consente di usare questa app con un account di Matrix esistente su un home server diverso.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Puoi anche specificare un server di identità diverso ma ciò solitamente impedisce l'interazione con utenti basandosi sull'indirizzo email.", + "To continue, please enter your password.": "Per continuare, inserisci la tua password.", + "Password:": "Password:", + "An email has been sent to %(emailAddress)s": "È stata inviata un'email a %(emailAddress)s", + "Please check your email to continue registration.": "Controlla la tua email per continuare la registrazione.", + "Token incorrect": "Token errato", + "A text message has been sent to %(msisdn)s": "È stato inviato un messaggio di testo a %(msisdn)s", + "Please enter the code it contains:": "Inserisci il codice contenuto:", + "Start authentication": "Inizia l'autenticazione", + "Username on %(hs)s": "Nome utente su %(hs)s", + "User name": "Nome utente", + "Mobile phone number": "Numero di cellulare", + "Forgot your password?": "Hai dimenticato la password?", + "%(serverName)s Matrix ID": "%(serverName)s ID Matrix", + "Sign in with": "Accedi con", + "Email address": "Indirizzo email", + "Sign in": "Accedi", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Se non specifichi un indirizzo email, non potrai reimpostare la password. Sei sicuro?", + "Email address (optional)": "Indirizzo email (facoltativo)", + "You are registering with %(SelectedTeamName)s": "Ti stai registrando con %(SelectedTeamName)s", + "Mobile phone number (optional)": "Numero di cellulare (facoltativo)", + "Default server": "Server predefinito", + "Custom server": "Server personalizzato", + "Home server URL": "URL home server", + "Identity server URL": "URL server di identità", + "What does this mean?": "Cosa significa?", + "Remove from community": "Rimuovi dalla comunità", + "Disinvite this user from community?": "Revocare l'invito di questo utente alla comunità?", + "Remove this user from community?": "Rimuovere questo utente dalla comunità?", + "Code": "Codice", + "Failed to withdraw invitation": "Revoca dell'invito fallita", + "Failed to remove user from community": "Rimozione utente dalla comunità fallita", + "Filter community members": "Filtra i membri della comunità", + "Flair will appear if enabled in room settings": "La predisposizione apparirà se attiva nelle impostazioni della stanza", + "Flair will not appear": "La predisposizione non apparirà", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Sei sicuro di volere rimuovere '%(roomName)s' da %(groupId)s?", + "Removing a room from the community will also remove it from the community page.": "La rimozione di una stanza dalla comunità la toglierà anche dalla pagina della comunità.", + "Failed to remove room from community": "Rimozione della stanza dalla comunità fallita", + "Failed to remove '%(roomName)s' from %(groupId)s": "Rimozione di '%(roomName)s' da %(groupId)s fallita", + "Something went wrong!": "Qualcosa è andato storto!", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Impossibile aggiornare la visibilità di '%(roomName)s' in %(groupId)s .", + "Visibility in Room List": "Visibilità nell'elenco stanze", + "Visible to everyone": "Visibile a chiunque", + "Only visible to community members": "Visibile solo ai membri della comunità", + "Filter community rooms": "Filtra stanze della comunità", + "Something went wrong when trying to get your communities.": "Qualcosa è andato storto cercando di ricevere le tue comunità.", + "Display your community flair in rooms configured to show it.": "Mostra la tua predisposizione di comunità nelle stanze configurate per mostrarla.", + "You're not currently a member of any communities.": "Attualmente non sei membro di alcuna comunità.", + "Unknown Address": "Indirizzo sconosciuto", + "NOTE: Apps are not end-to-end encrypted": "NOTA: le app non sono criptate end-to-end", + "Do you want to load widget from URL:": "Vuoi caricare il widget dall'URL:", + "Allow": "Permetti", + "Delete Widget": "Elimina widget", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "L'eliminazione di un widget lo rimuove per tutti gli utenti della stanza. Sei sicuro di eliminare il widget?", + "Delete widget": "Elimina widget", + "Revoke widget access": "Revoca l'accesso al widget", + "Minimize apps": "Riduci le app", + "Unblacklist": "Togli dalla lista nera", + "Blacklist": "Lista nera", + "Unverify": "Togli la verifica", + "Verify...": "Verifica...", + "No results": "Nessun risultato", + "Delete": "Elimina", + "Communities": "Comunità", + "Home": "Inizio", + "Integrations Error": "Errore di integrazioni", + "Could not connect to the integration server": "Impossibile connettere al server di integrazione", + "Manage Integrations": "Gestisci integrazioni", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)ssono entrati %(count)s volte", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)ssono entrati", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)sè entrato %(count)s volte", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)sè entrato", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)ssono usciti %(count)s volte", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)ssono usciti", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)sè uscito %(count)s volte", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)sè uscito", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)ssono entrati e usciti %(count)s volte", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)ssono entrati e usciti", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)sè entrato e uscito %(count)s volte", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sè entrato e uscito", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)ssono usciti e rientrati %(count)s volte", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)ssono usciti e rientrati", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)sè uscito e rientrato %(count)s volte", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sè uscito e rientrato", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)shanno rifiutato i loro inviti %(count)s volte", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)shanno rifiutato i loro inviti", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)sha rifiutato il suo invito %(count)s volte", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)sha rifiutato il suo invito", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)shanno visto revocato il loro invito %(count)s volte", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)shanno visto revocato il loro invito", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)sha visto revocato il suo invito %(count)s volte", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)sha visto revocato il suo invito", + "were invited %(count)s times|other": "sono stati invitati %(count)s volte", + "were invited %(count)s times|one": "sono stati invitati", + "was invited %(count)s times|other": "è stato invitato %(count)s volte", + "was invited %(count)s times|one": "è stato invitato", + "were banned %(count)s times|other": "sono stati banditi %(count)s volte", + "were banned %(count)s times|one": "sono stati banditi", + "was banned %(count)s times|other": "è stato bandito %(count)s volte", + "was banned %(count)s times|one": "è stato bandito", + "were unbanned %(count)s times|other": "sono stati riammessi %(count)s volte", + "were unbanned %(count)s times|one": "sono stati riammessi", + "was unbanned %(count)s times|other": "è stato riammesso %(count)s volte", + "was unbanned %(count)s times|one": "è stato riammesso", + "were kicked %(count)s times|other": "sono stati cacciati via %(count)s volte", + "were kicked %(count)s times|one": "sono stati cacciati via", + "was kicked %(count)s times|other": "è stato cacciato via %(count)s volte", + "was kicked %(count)s times|one": "è stato cacciato via", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)shanno modificato il loro nome %(count)s volte", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)shanno modificato il loro nome", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sha modificato il suo nome %(count)s volte", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sha modificato il suo nome", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)shanno cambiato il loro avatar %(count)s volte", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)shanno cambiato il loro avatar", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)sha cambiato il suo avatar %(count)s volte", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)sha cambiato il suo avatar", + "%(items)s and %(count)s others|other": "%(items)s e altri %(count)s", + "%(items)s and %(count)s others|one": "%(items)s e un altro", + "%(items)s and %(lastItem)s": "%(items)s e %(lastItem)s", + "collapse": "richiudi", + "expand": "espandi", + "Custom of %(powerLevel)s": "%(powerLevel)s personalizzato", + "Custom level": "Livello personalizzato", + "In reply to ": "In risposta a ", + "And %(count)s more...|other": "E altri %(count)s ...", + "ex. @bob:example.com": "es. @mario:esempio.it", + "Add User": "Aggiungi utente", + "Matrix ID": "ID Matrix", + "Matrix Room ID": "ID stanza Matrix", + "email address": "indirizzo email", + "Try using one of the following valid address types: %(validTypesList)s.": "Prova ad usare uno dei seguenti tipi di indirizzo validi: %(validTypesList)s.", + "You have entered an invalid address.": "Hai inserito un indirizzo non valido.", + "Create a new chat or reuse an existing one": "Crea una nuova conversazione o riutilizzane una esistente", + "Start new chat": "Inizia una nuova conversazione", + "You already have existing direct chats with this user:": "Hai già conversazioni dirette con questo utente:", + "Start chatting": "Inizia a chattare", + "Click on the button below to start chatting!": "Clicca sul pulsante sotto per iniziare a chattare!", + "Start Chatting": "Inizia a chattare", + "Confirm Removal": "Conferma la rimozione", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Sei sicuro di volere rimuovere (eliminare) questo evento? Nota che se elimini il nome di una stanza o la modifica di un argomento, potrebbe annullare la modifica.", + "Community IDs cannot not be empty.": "Gli ID della comunità non possono essere vuoti.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Gli ID della comunità devono contenere solo caratteri a-z, 0-9, or '=_-./'", + "Something went wrong whilst creating your community": "Qualcosa è andato storto nella creazione della tua comunità", + "Create Community": "Crea una comunità", + "Community Name": "Nome della comunità", + "Example": "Esempio", + "Community ID": "ID comunità", + "example": "esempio", + "Create": "Crea", + "Create Room": "Crea una stanza", + "Room name (optional)": "Nome della stanza (facoltativo)", + "Advanced options": "Opzioni avanzate", + "Block users on other matrix homeservers from joining this room": "Vieta agli utenti degli altri homeserver di matrix di entrare in questa stanza", + "This setting cannot be changed later!": "Questa impostazione non potrà più essere cambiata!", + "Unknown error": "Errore sconosciuto", + "Incorrect password": "Password sbagliata", + "Deactivate Account": "Disattiva l'account", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Per verificare se questo dispositivo è fidato, contatta il suo proprietario usando altri metodi (es. di persona o telefonando) e chiedigli se la chiave che vede nelle sue impostazioni utente per questo dispositivo coincide con la chiave sotto:", + "Device name": "Nome del dispositivo", + "Device key": "Chiave del dispositivo", + "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.": "Se coincide, premi il pulsante di verifica sotto. Se non coincide, allora qualcuno sta intercettando questo dispositivo e dovresti premere il pulsante di lista nera.", + "In future this verification process will be more sophisticated.": "In futuro questo processo di verifica sarà più sofisticato.", + "Verify device": "Verifica dispositivo", + "I verify that the keys match": "Confermo che le chiavi coincidono", + "An error has occurred.": "Si è verificato un errore.", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Hai aggiunto un nuovo dispositivo '%(displayName)s', che sta richiedendo chiavi di cifratura.", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "Il dispositivo non verificato '%(displayName)s' sta richiedendo chiavi di cifratura.", + "Start verification": "Inizia la verifica", + "Share without verifying": "Condividi senza verificare", + "Ignore request": "Ignora la richiesta", + "Loading device info...": "Caricamento info dispositivo...", + "Encryption key request": "Richiesta chiave di cifratura", + "Unable to restore session": "Impossibile ripristinare la sessione", + "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Se hai usato precedentemente una versione più recente di Riot, la tua sessione potrebbe essere incompatibile con questa versione. Chiudi questa finestra e torna alla versione più recente.", + "Invalid Email Address": "Indirizzo email non valido", + "This doesn't appear to be a valid email address": "Questo non sembra essere un indirizzo email valido", + "Verification Pending": "In attesa di verifica", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Controlla la tua email e clicca il link contenuto. Una volta fatto, clicca continua.", + "Unable to add email address": "Impossibile aggiungere l'indirizzo email", + "Unable to verify email address.": "Impossibile verificare l'indirizzo email.", + "This will allow you to reset your password and receive notifications.": "Ciò ti permetterà di reimpostare la tua password e ricevere notifiche.", + "Skip": "Salta", + "User names may only contain letters, numbers, dots, hyphens and underscores.": "I nomi utente devono contenere solo lettere, numeri, punti, trattini alti e bassi.", + "Username not available": "Nome utente non disponibile", + "Username invalid: %(errMessage)s": "Nome utente non valido: %(errMessage)s", + "An error occurred: %(error_string)s": "Si è verificato un errore: %(error_string)s", + "Username available": "Nome utente disponibile", + "To get started, please pick a username!": "Per iniziare, scegli un nome utente!", + "This will be your account name on the homeserver, or you can pick a different server.": "Questo sarà il tuo account nell'homeserver , o puoi scegliere un server diverso.", + "If you already have a Matrix account you can log in instead.": "Se invece hai già un account Matrix puoi accedere.", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Attualmente stai bloccando i dispositivi non verificati; per inviare messaggi a questi dispositivi devi verificarli.", + "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.": "Ti consigliamo di eseguire il processo di verifica per ogni dispositivo per confermare che appartiene al legittimo proprietario, ma puoi reinviare il messaggio senza verifica se lo preferisci.", + "Room contains unknown devices": "La stanza contiene dispositivi sconosciuti", + "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contiene dispositivi che non hai mai visto prima.", + "Unknown devices": "Dispositivi sconosciuti", + "Private Chat": "Conversazione privata", + "Public Chat": "Chat pubblica", + "Custom": "Personalizzato", + "Name": "Nome", + "Topic": "Argomento", + "Make this room private": "Rendi privata questa stanza", + "Share message history with new users": "Condividi la cronologia dei messaggi con i nuovi utenti", + "Encrypt room": "Cripta la stanza", + "You must register to use this functionality": "Devi registrarti per usare questa funzionalità", + "You must join the room to see its files": "Devi entrare nella stanza per vederne i file", + "There are no visible files in this room": "Non ci sono file visibili in questa stanza", + "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    HTML per la pagina della tua comunità

    \n

    \n Usa la descrizione estesa per introdurre i nuovi membri alla comunità, o distribuisci\n alcuni link importanti\n

    \n

    \n Puoi anche usare i tag 'img'\n

    \n", + "Add rooms to the community summary": "Aggiungi stanze nel sommario della comunità", + "Which rooms would you like to add to this summary?": "Quali stanze vorresti aggiungere a questo sommario?", + "Add to summary": "Aggiungi al sommario", + "Failed to add the following rooms to the summary of %(groupId)s:": "Impossibile aggiungere le seguenti stanze al sommario di %(groupId)s:", + "Add a Room": "Aggiungi una stanza", + "Failed to remove the room from the summary of %(groupId)s": "Impossibile rimuovere la stanza dal sommario di %(groupId)s", + "The room '%(roomName)s' could not be removed from the summary.": "Non è stato possibile rimuovere la stanza '%(roomName)s' dal sommario.", + "Add users to the community summary": "Aggiungi utenti al sommario della comunità", + "Who would you like to add to this summary?": "Chi vorresti aggiungere a questo sommario?", + "Failed to add the following users to the summary of %(groupId)s:": "Impossibile aggiungere i seguenti utenti al sommario di %(groupId)s:", + "Add a User": "Aggiungi un utente", + "Failed to remove a user from the summary of %(groupId)s": "Impossibile rimuovere un utente dal sommario di %(groupId)s", + "The user '%(displayName)s' could not be removed from the summary.": "Non è stato possibile rimuovere l'utente '%(displayName)s' dal sommario.", + "Failed to upload image": "Invio dell'immagine fallito", + "Failed to update community": "Aggiornamento comunità fallito", + "Unable to accept invite": "Impossibile accettare l'invito", + "Unable to reject invite": "Impossibile rifiutare l'invito", + "Leave Community": "Esci dalla comunità", + "Leave %(groupName)s?": "Uscire da %(groupName)s?", + "Leave": "Esci", + "Community Settings": "Impostazioni comunità", + "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:", + "%(inviter)s has invited you to join this community": "%(inviter)s ti ha invitato ad unirti a questa comunità", + "You are an administrator of this community": "Sei un amministratore di questa comunità", + "You are a member of this community": "Sei un membro di questa comunità", + "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "La tua comunità non ha una descrizione estesa, una pagina HTML da mostrare ai membri della comunità.
    Clicca qui per aprire le impostazioni e scriverne una!", + "Long Description (HTML)": "Descrizione estesa (HTML)", + "Description": "Descrizione", + "Community %(groupId)s not found": "Comunità %(groupId)s non trovata", + "This Home server does not support communities": "Questo Home server non supporta le comunità", + "Failed to load %(groupId)s": "Caricamento %(groupId)s fallito", + "Reject invitation": "Rifiuta l'invito", + "Are you sure you want to reject the invitation?": "Sei sicuro di volere rifiutare l'invito?", + "Failed to reject invitation": "Rifiuto dell'invito fallito", + "This room is not public. You will not be able to rejoin without an invite.": "Questa stanza non è pubblica. Non potrai rientrare senza un invito.", + "Are you sure you want to leave the room '%(roomName)s'?": "Sei sicuro di volere uscire dalla stanza '%(roomName)s'?", + "Failed to leave room": "Uscita dalla stanza fallita", + "Signed Out": "Disconnesso", + "For security, this session has been signed out. Please sign in again.": "Per sicurezza questa sessione è stata disconnessa. Accedi di nuovo.", + "Old cryptography data detected": "Rilevati dati di cifratura obsoleti", + "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.": "Sono stati rilevati dati da una vecchia versione di Riot. Ciò avrà causato malfunzionamenti della crittografia end-to-end nella vecchia versione. I messaggi cifrati end-to-end scambiati di recente usando la vecchia versione potrebbero essere indecifrabili in questa versione. Anche i messaggi scambiati con questa versione possono fallire. Se riscontri problemi, disconnettiti e riaccedi. Per conservare la cronologia, esporta e re-importa le tue chiavi.", + "Logout": "Disconnetti", + "Your Communities": "Le tue comunità", + "Did you know: you can use communities to filter your Riot.im experience!": "Sapevi che: puoi usare le comunità per filtrare la tua esperienza su 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.": "Per impostare un filtro, trascina l'avatar di una comunità sul pannello dei filtri a sinistra dello schermo. Puoi cliccare un avatar nel pannello dei filtri quando vuoi per vedere solo le stanze e le persone associate a quella comunità.", + "Error whilst fetching joined communities": "Errore nella rilevazione delle comunità a cui ti sei unito", + "Create a new community": "Crea una nuova comunità", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crea una comunità per raggruppare utenti e stanze! Crea una pagina iniziale personalizzata per stabilire il tuo spazio nell'universo di Matrix.", + "Join an existing community": "Unisciti ad una comunità esistente", + "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Per unirti ad una comunità esistente devi conoscere il suo identificativo; è qualcosa del tipo +esempio:matrix.org.", + "You have no visible notifications": "Non hai alcuna notifica visibile", + "Scroll to bottom of page": "Scorri in fondo alla pagina", + "Message not sent due to unknown devices being present": "Messaggio non inviato data la presenza di dispositivi sconosciuti", + "Show devices, send anyway or cancel.": "Mostra dispositivi, invia comunque o annulla.", + "%(count)s of your messages have not been sent.|other": "Alcuni dei tuoi messaggi non sono stati inviati.", + "%(count)s of your messages have not been sent.|one": "Il tuo messaggio non è stato inviato.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Reinvia tutti o annulla tutti adesso. Puoi anche selezionare i singoli messaggi da reinviare o annullare.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Reinvia messaggio o annulla messaggio adesso.", + "Connectivity to the server has been lost.": "Connessione al server persa.", + "Sent messages will be stored until your connection has returned.": "I messaggi inviati saranno salvati fino al ritorno della connessione.", + "%(count)s new messages|other": "%(count)s messaggi nuovi", + "%(count)s new messages|one": "%(count)s messaggio nuovo", + "Active call": "Chiamata attiva", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Non c'è nessun altro qui! Vorresti invitare altri o fermare l'avviso sulla stanza vuota?", + "You seem to be uploading files, are you sure you want to quit?": "Sembra che tu stia inviando file, sei sicuro di volere uscire?", + "You seem to be in a call, are you sure you want to quit?": "Sembra che tu sia in una chiamata, sei sicuro di volere uscire?", + "Failed to upload file": "Invio del file fallito", + "Server may be unavailable, overloaded, or the file too big": "Il server potrebbe essere non disponibile, sovraccarico o il file è troppo grande", + "Search failed": "Ricerca fallita", + "Server may be unavailable, overloaded, or search timed out :(": "Il server potrebbe essere non disponibile, sovraccarico o la ricerca è scaduta :(", + "No more results": "Nessun altro risultato", + "Unknown room %(roomId)s": "Stanza %(roomId)s sconosciuta", + "Room": "Stanza", + "Failed to save settings": "Salvataggio impostazioni fallito", + "Failed to reject invite": "Rifiuto dell'invito fallito", + "Fill screen": "Riempi schermo", + "Click to unmute video": "Clicca per attivare l'audio del video", + "Click to mute video": "Clicca per silenziare il video", + "Click to unmute audio": "Clicca per attivare l'audio", + "Click to mute audio": "Clicca per silenziare l'audio", + "Clear filter": "Annulla filtro", + "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Si è tentato di caricare un punto specifico nella cronologia della stanza, ma non hai l'autorizzazione per vedere il messaggio in questione.", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "Si è tentato di caricare un punto specifico nella cronologia della stanza, ma non si è trovato.", + "Failed to load timeline position": "Caricamento posizione cronologica fallito", + "Uploading %(filename)s and %(count)s others|other": "Invio di %(filename)s e altri %(count)s", + "Uploading %(filename)s and %(count)s others|zero": "Invio di %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Invio di %(filename)s e altri %(count)s", + "Light theme": "Tema chiaro", + "Dark theme": "Tema scuro", + "Status.im theme": "Tema Status.im", + "Can't load user settings": "Impossibile caricare le impostazioni utente", + "Server may be unavailable or overloaded": "Il server potrebbe non essere disponibile o sovraccarico", + "Sign out": "Disconnetti", + "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.": "Per sicurezza la disconnessione eliminerà le chiavi di cifratura end-to-end da questo browser. Se desideri decifrare la tua cronologia di conversazione da sessioni future di Riot, esporta e conserva le tue chiavi della stanza.", + "Success": "Successo", + "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "La tua password è stata cambiata correttamente. Non riceverai notifiche push su altri dispositivi finchè non riesegui l'accesso su di essi", + "Remove Contact Information?": "Rimuovere le informazioni di contatto?", + "Remove %(threePid)s?": "Rimuovere %(threePid)s?", + "Unable to remove contact information": "Impossibile rimuovere le informazioni di contatto", + "Refer a friend to Riot:": "Informa un amico riguardo Riot:", + "Interface Language": "Lingua dell'interfaccia", + "User Interface": "Interfaccia utente", + "Autocomplete Delay (ms):": "Ritardo autocompletamento (ms):", + "": "", + "Import E2E room keys": "Importa chiavi E2E stanza", + "Cryptography": "Crittografia", + "Device ID:": "ID dispositivo:", + "Device key:": "Chiave dispositivo:", + "Ignored Users": "Utenti ignorati", + "Debug Logs Submission": "Invio dei log di debug", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Se hai segnalato un errore via Github, i log di debug possono aiutarci a identificare il problema. 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.", + "Submit debug logs": "Invia log di debug", + "Riot collects anonymous analytics to allow us to improve the application.": "Riot raccoglie statistiche anonime per permetterci di migliorare l'applicazione.", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Diamo importanza alla privacy, perciò non raccogliamo dati personali o identificabili per le nostre statistiche.", + "Learn more about how we use analytics.": "Ulteriori informazioni su come usiamo le statistiche.", + "Labs": "Laboratori", + "These are experimental features that may break in unexpected ways": "Queste sono funzioni sperimentali che potrebbero fallire in modi imprevisti", + "Use with caution": "Usa con prudenza", + "Deactivate my account": "Disattiva il mio account", + "Clear Cache": "Svuota la cache", + "Clear Cache and Reload": "Svuota la cache e ricarica", + "Updates": "Aggiornamenti", + "Check for update": "Controlla aggiornamenti", + "Reject all %(invitedRooms)s invites": "Rifiuta tutti gli inviti da %(invitedRooms)s", + "Desktop specific": "Specifico per desktop", + "Start automatically after system login": "Esegui automaticamente all'avvio del sistema", + "No media permissions": "Nessuna autorizzazione per i media", + "Missing Media Permissions, click here to request.": "Autorizzazioni per i media mancanti, clicca qui per richiederle.", + "Email": "Email", + "Profile": "Profilo", + "Display name": "Nome visualizzato", + "To return to your account in future you need to set a password": "Per tornare al tuo account in futuro, devi impostare una password", + "Logged in as:": "Acceduto come:", + "click to reveal": "clicca per mostrare", + "Homeserver is": "L'homeserver è", + "Identity Server is": "Il server di identità è", + "matrix-react-sdk version:": "versione matrix-react-sdk:", + "riot-web version:": "versione riot-web:", + "olm version:": "versione olm:", + "Failed to send email": "Invio dell'email fallito", + "The email address linked to your account must be entered.": "Deve essere inserito l'indirizzo email collegato al tuo account.", + "A new password must be entered.": "Deve essere inserita una nuova password.", + "New passwords must match each other.": "Le nuove password devono coincidere.", + "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.": "Ripristinando la password si reimposteranno le chiavi di cifratura end-to-end su tutti i dispositivi, rendendo illeggibile la cronologia chat, a meno che prima non esporti le tue chiavi della stanza e le importi successivamente. In futuro questo verrà migliorato.", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "È stata inviata un'email a %(emailAddress)s. Una volta seguito il link contenuto, clicca sotto.", + "I have verified my email address": "Ho verificato il mio indirizzo email", + "Your password has been reset": "La tua password è stata ripristinata", + "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": "Sei stato disconnesso da tutti i dispositivi e non riceverai più notifiche push. Per riattivare le notifiche, accedi di nuovo in ogni dispositivo", + "Return to login screen": "Torna alla schermata di accesso", + "To reset your password, enter the email address linked to your account": "Per ripristinare la password, inserisci l'indirizzo email collegato al tuo account", + "New password": "Nuova password", + "Confirm your new password": "Conferma la tua nuova password", + "Send Reset Email": "Invia email di ripristino", + "Create an account": "Crea un account", + "This Home Server does not support login using email address.": "Questo home server non supporta l'accesso tramite indirizzo email.", + "Incorrect username and/or password.": "Nome utente e/o password sbagliati.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Nota che stai accedendo nel server %(hs)s , non matrix.org.", + "Guest access is disabled on this Home Server.": "L'accesso ospiti è disattivato in questo home server.", + "The phone number entered looks invalid": "Il numero di telefono inserito sembra non valido", + "This homeserver doesn't offer any login flows which are supported by this client.": "Questo home server non offre alcuna procedura di accesso supportata da questo client.", + "Error: Problem communicating with the given homeserver.": "Errore: problema di comunicazione con l'homeserver dato.", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Impossibile connettersi all'homeserver via HTTP quando c'è un URL HTTPS nella barra del tuo browser. Usa HTTPS o attiva gli script non sicuri.", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Impossibile connettersi all'homeserver - controlla la tua connessione, assicurati che il certificato SSL dell'homeserver sia fidato e che un'estensione del browser non stia bloccando le richieste.", + "Login as guest": "Accedi come ospite", + "Sign in to get started": "Accedi per iniziare", + "Failed to fetch avatar URL": "Ricezione URL dell'avatar fallita", + "Set a display name:": "Imposta un nome visualizzato:", + "Upload an avatar:": "Invia un avatar:", + "This server does not support authentication with a phone number.": "Questo server non supporta l'autenticazione tramite numero di telefono.", + "Missing password.": "Password mancante.", + "Passwords don't match.": "Le password non coincidono.", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Visto da %(displayName)s (%(userName)s) alle %(dateTime)s", + "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Password troppo corta (min %(MIN_PASSWORD_LENGTH)s).", + "This doesn't look like a valid email address.": "Questo non sembra un indirizzo email valido.", + "This doesn't look like a valid phone number.": "Questo non sembra un numero di telefono valido.", + "You need to enter a user name.": "Devi inserire un nome utente.", + "An unknown error occurred.": "Si è verificato un errore sconosciuto.", + "I already have an account": "Ho già un account", + "Displays action": "Mostra l'azione", + "Bans user with given id": "Bandisce l'utente per ID", + "Unbans user with given id": "Toglie il ban di un utente per ID", + "Define the power level of a user": "Definisce il livello di poteri di un utente", + "Deops user with given id": "Toglie privilegi all'utente per ID", + "Invites user with given id to current room": "Invita l'utente per ID alla stanza attuale", + "Joins room with given alias": "Entra nella stanza con l'alias definito", + "Sets the room topic": "Imposta l'argomento della stanza", + "Kicks user with given id": "Caccia un utente per ID", + "Changes your display nickname": "Modifica il tuo nick visualizzato", + "Searches DuckDuckGo for results": "Cerca risultati su DuckDuckGo", + "Changes colour scheme of current room": "Cambia lo schema di colori della stanza attuale", + "Verifies a user, device, and pubkey tuple": "Verifica una tupla di utente, dispositivo e chiave pubblica", + "Ignores a user, hiding their messages from you": "Ignora un utente, non mostrandoti i suoi messaggi", + "Stops ignoring a user, showing their messages going forward": "Smetti di ignorare un utente, mostrando i suoi messaggi successivi", + "Opens the Developer Tools dialog": "Apre la finestra di strumenti per sviluppatori", + "Commands": "Comandi", + "Results from DuckDuckGo": "Risultati da DuckDuckGo", + "Emoji": "Emoji", + "Notify the whole room": "Notifica l'intera stanza", + "Room Notification": "Notifica della stanza", + "Users": "Utenti", + "unknown device": "dispositivo sconosciuto", + "NOT verified": "NON verificato", + "verified": "verificato", + "Verification": "Verifica", + "Ed25519 fingerprint": "Impronta ed25519", + "User ID": "ID utente", + "Curve25519 identity key": "Chiave di identità curve25519", + "none": "nessuno", + "Claimed Ed25519 fingerprint key": "Chiave di impronta ed25519 dichiarata", + "unencrypted": "non criptato", + "Decryption error": "Errore di decifrazione", + "Session ID": "ID sessione", + "End-to-end encryption information": "Informazioni di cifratura end-to-end", + "Event information": "Informazioni evento", + "Sender device information": "Informazioni dispositivo mittente", + "Passphrases must match": "Le password devono coincidere", + "Passphrase must not be empty": "La password non può essere vuota", + "Export room keys": "Esporta chiavi della stanza", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Questa procedura ti permette di esportare in un file locale le chiavi per i messaggi che hai ricevuto nelle stanze criptate. Potrai poi importare il file in un altro client Matrix in futuro, in modo che anche quel client possa decifrare quei messaggi.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Il file esportato permetterà a chiunque possa leggerlo di decifrare tutti i messaggi criptati che vedi, quindi dovresti conservarlo in modo sicuro. Per aiutarti, potresti inserire una password sotto, che verrà usata per criptare i dati esportati. Sarà possibile importare i dati solo usando la stessa password.", + "Enter passphrase": "Inserisci password", + "Confirm passphrase": "Conferma password", + "Export": "Esporta", + "Import room keys": "Importa chiavi della stanza", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Questa procedura ti permette di importare le chiavi di cifratura precedentemente esportate da un altro client Matrix. Potrai poi decifrare tutti i messaggi che quel client poteva decifrare.", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Il file esportato sarà protetto da una password. Dovresti inserire la password qui, per decifrarlo.", + "File to import": "File da importare", + "Import": "Importa", + "Failed to set direct chat tag": "Impostazione etichetta chat diretta fallita", + "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", + "Hide Stickers": "Nascondi gli adesivi", + "Show Stickers": "Mostra gli adesivi", + "Unable to join community": "Impossibile unirsi alla comunità", + "Unable to leave community": "Impossibile uscire dalla comunità", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Le modifiche al nome e all'avatar effettuate alla tua comunità potrebbero non essere visibili agli altri utenti per i prossimi 30 minuti.", + "Join this community": "Unisciti a questa comunità", + "Leave this community": "Esci da questa comunità", + "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", + "Fetching third party location failed": "Rilevazione posizione di terze parti fallita", + "A new version of Riot is available.": "È disponibile una nuova versione di Riot.", + "Couldn't load home page": "Impossibile caricare la pagina principale", + "Send Account Data": "Invia dati account", + "Advanced notification settings": "Impostazioni di notifica avanzate", + "Uploading report": "Sto caricando il report", + "Sunday": "Domenica", + "Notification targets": "Obiettivi di notifica", + "Today": "Oggi", + "Files": "File", + "You are not receiving desktop notifications": "Non stai ricevendo le notifiche sul desktop", + "Friday": "Venerdì", + "Update": "Aggiornamento", + "Riot does not know how to join a room on this network": "Riot non sa come entrare nella stanza su questa rete", + "Add an email address above to configure email notifications": "Aggiungi un indirizzo email sopra per configurare le notifiche via email", + "Expand panel": "Espandi il pannello", + "On": "Acceso", + "%(count)s Members|other": "%(count)s membri", + "Filter room names": "Filtra i nomi delle stanze", + "Changelog": "Cambiamenti", + "Waiting for response from server": "In attesa di una risposta dal server", + "Send Custom Event": "Invia Evento Personalizzato", + "All notifications are currently disabled for all targets.": "Tutte le notifiche sono disabilitate per tutti gli obbiettivi.", + "Failed to send logs: ": "Invio dei log fallito: ", + "delete the alias.": "elimina l'alias.", + "To return to your account in future you need to set a password": "Per tornare nel tuo account in futuro devi impostare una password", + "Forget": "Dimentica", + "Hide panel": "Nascondi pannello", + "You cannot delete this image. (%(code)s)": "Non puoi eliminare quest'immagine. (%(code)s)", + "Cancel Sending": "Annulla invio", + "This Room": "Questa stanza", + "The Home Server may be too old to support third party networks": "Il server Home potrebbe essere troppo vecchio per supportare reti di terze parti", + "Noisy": "Rumoroso", + "Error saving email notification preferences": "Errore nel salvataggio delle preferenze di notifica email", + "Messages containing my display name": "Messaggi contenenti il mio nome visualizzato", + "Messages in one-to-one chats": "Messaggi in chat uno-a-uno", + "Unavailable": "Non disponibile", + "View Decrypted Source": "Visualizza sorgente decifrato", + "Failed to update keywords": "Impossibile aggiornare le parole chiave", + "Notes:": "Note:", + "remove %(name)s from the directory.": "rimuovi %(name)s dalla lista.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Le notifiche alle seguenti parole chiave seguono regole che non possono essere mostrate qui:", + "Safari and Opera work too.": "Anche Safari e Opera vanno bene.", + "Please set a password!": "Imposta una password!", + "You have successfully set a password!": "Hai impostato una password con successo!", + "An error occurred whilst saving your email notification preferences.": "Si è verificato un errore durante il salvataggio delle tue preferenze sulle notifiche email.", + "Explore Room State": "Esplora Stato Stanza", + "Source URL": "URL d'origine", + "Messages sent by bot": "Messaggi inviati dai bot", + "Filter results": "Filtra risultati", + "Members": "Membri", + "No update available.": "Nessun aggiornamento disponibile.", + "Resend": "Reinvia", + "Failed to get protocol list from Home Server": "Impossibile ottenere la lista di protocolli dal server Home", + "Collecting app version information": "Raccolta di informazioni sulla versione dell'applicazione", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Eliminare l'alias %(alias)s e rimuovere %(name)s dalla lista?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Questo ti permetterà di ritornare al tuo account dopo esserti disconnesso e accedere in altri dispositivi.", + "Keywords": "Parole chiave", + "Enable notifications for this account": "Abilita le notifiche per questo account", + "Directory": "Lista", + "Invite to this community": "Invita a questa comunità", + "Failed to get public room list": "Impossibile ottenere la lista delle stanze pubbliche", + "Messages containing keywords": "Messaggi contenenti parole chiave", + "Room not found": "Stanza non trovata", + "Tuesday": "Martedì", + "Enter keywords separated by a comma:": "Inserisci le parole chiave separate da virgole:", + "Search…": "Cerca…", + "You have successfully set a password and an email address!": "Hai impostato con successo una password e un indirizzo email!", + "Remove %(name)s from the directory?": "Rimuovere %(name)s dalla lista?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utilizza molte funzioni avanzate del browser, alcune delle quali non sono disponibili o sono sperimentali nel tuo browser attuale.", + "Developer Tools": "Strumenti per Sviluppatori", + "Preparing to send logs": "Preparazione invio dei log", + "Enable desktop notifications": "Abilita le notifiche desktop", + "Remember, you can always set an email address in user settings if you change your mind.": "Ricorda, puoi sempre specificare un indirizzo email nelle impostazioni utente se cambi idea.", + "Explore Account Data": "Esplora dati account", + "All messages (noisy)": "Tutti i messaggi (rumoroso)", + "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:", + "You must specify an event type!": "Devi specificare un tipo di evento!", + "(HTTP status %(httpStatus)s)": "(stato HTTP %(httpStatus)s)", + "All Rooms": "Tutte le stanze", + "Please install Chrome or Firefox for the best experience.": "Installa Chrome o Firefox per la migliore esperienza d'uso.", + "Wednesday": "Mercoledì", + "You cannot delete this message. (%(code)s)": "Non puoi eliminare questo messaggio. (%(code)s)", + "Quote": "Cita", + "Send logs": "Invia i log", + "All messages": "Tutti i messaggi", + "Call invitation": "Invito ad una chiamata", + "Downloading update...": "Scaricamento aggiornamento...", + "State Key": "Chiave dello Stato", + "Failed to send custom event.": "Impossibile inviare evento personalizzato.", + "What's new?": "Cosa c'è di nuovo?", + "Notify me for anything else": "Notificami per qualsiasi altra cosa", + "When I'm invited to a room": "Quando vengo invitato/a in una stanza", + "Can't update user notification settings": "Impossibile aggiornare le impostazioni di notifica dell'utente", + "Notify for all other messages/rooms": "Notifica per tutti gli altri messaggi/stanze", + "Unable to look up room ID from server": "Impossibile consultare l'ID stanza dal server", + "Couldn't find a matching Matrix room": "Impossibile trovare una stanza Matrix corrispondente", + "Invite to this room": "Invita in questa stanza", + "Search for a room": "Cerca una stanza", + "Thursday": "Giovedì", + "Forward Message": "Inoltra messaggio", + "Logs sent": "Log inviati", + "Back": "Indietro", + "Failed to change settings": "Impossibile modificare le impostazioni", + "Reply": "Rispondi", + "Show message in desktop notification": "Mostra i messaggi nelle notifiche desktop", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "I log di debug contengono dati di utilizzo dell'applicazione inclusi il nome utente, gli ID o alias delle stanze o gruppi visitati e i nomi degli altri utenti. Non contengono messaggi.", + "Unhide Preview": "Mostra anteprima", + "Unable to join network": "Impossibile collegarsi alla rete", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Potresti averli configurati in un client diverso da Riot. Non puoi cambiarli in Riot ma sono comunque applicati", + "Sorry, your browser is not able to run Riot.": "Spiacenti, ma il tuo browser non è in grado di utilizzare Riot.", + "Uploaded on %(date)s by %(user)s": "Caricato il %(date)s da %(user)s", + "Messages in group chats": "Messaggi nelle chat di gruppo", + "Yesterday": "Ieri", + "Error encountered (%(errorDetail)s).": "Errore riscontrato (%(errorDetail)s).", + "Login": "Entra", + "Low Priority": "Priorità bassa", + "What's New": "Novità", + "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 032dacd1aa..80bd4f1ff5 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -43,7 +43,6 @@ "Use compact timeline layout": "会話表示の行間を狭くする", "(warning: cannot be disabled again!)": "(警告: 再び元に戻すことは出来ません!)", "Start Chat": "対話へ招待", - "Opt out of analytics": "匿名分析情報を収集しない", "Riot collects anonymous analytics to allow us to improve the application.": "Riotはアプリケーションを改善するために匿名の分析情報を収集しています。", "Start chatting": "対話開始", "Start Chatting": "対話開始", @@ -54,5 +53,193 @@ "Camera": "カメラ", "Are you sure?": "本当によろしいですか?", "OK": "OK", - "Operation failed": "操作に失敗しました" + "Operation failed": "操作に失敗しました", + "Custom Server Options": "カスタムサーバのオプション", + "Dismiss": "やめる", + "powered by Matrix": "Matrixによって動作しています", + "Error": "エラー", + "Remove": "取り除く", + "Submit debug logs": "デバッグログを送信する", + "Edit": "編集", + "Continue": "続ける", + "Unpin Message": "メッセージの固定を外す", + "Online": "オンライン", + "unknown error code": "不明なエラーコード", + "Failed to forget room %(errCode)s": "部屋の記憶を消すのに失敗しました %(errCode)s", + "Register": "登録", + "Rooms": "部屋", + "Add rooms to this community": "このコミュニティに部屋を追加する", + "Unnamed room": "名前のない部屋", + "World readable": "誰でも読むことができます", + "Guests can join": "ゲストが参加できます", + "No rooms to show": "表示する部屋がありません", + "This email address is already in use": "このメールアドレスは既に使われています", + "This phone number is already in use": "この電話番号は既に使われています", + "Failed to verify email address: make sure you clicked the link in the email": "メールアドレスの認証に失敗しました。メール中のリンクをクリックしたか、確認してください", + "The platform you're on": "利用中のプラットフォーム", + "The version of Riot.im": "Riot.imのバージョン", + "Whether or not you're logged in (we don't record your user name)": "ログインしているか否か(私達はあなたのユーザ名を記録しません)", + "Your language of choice": "選択した言語", + "Which officially provided instance you are using, if any": "どの公式に提供されたインスタンスを利用していますか(もしあれば)", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "リッチテキストエディタのリッチテキストモードを利用しているか否か", + "Your homeserver's URL": "あなたのホームサーバのURL", + "Your identity server's URL": "あなたのアイデンティティサーバのURL", + "Analytics": "分析", + "The information being sent to us to help make Riot.im better includes:": "Riot.imをよりよくするために私達に送信される情報は以下を含みます:", + "Thursday": "木曜日", + "Messages in one-to-one chats": "一対一のチャットでのメッセージ", + "A new version of Riot is available.": "新しいバージョンのRiotが利用可能です。", + "All Rooms": "全ての部屋", + "You cannot delete this message. (%(code)s)": "あなたはこの発言を削除できません (%(code)s)", + "Send": "送信", + "All messages": "全ての発言", + "Uploading report": "レポートのアップロード", + "Sunday": "日曜日", + "Direct Chat": "対話", + "Today": "今日", + "Files": "添付ファイル", + "Room not found": "部屋が見つかりません", + "Set Password": "パスワードを設定", + "Sorry, your browser is not able to run Riot.": "申し訳ありません。あなたのブラウザではRiotは動作できません。", + "Monday": "月曜日", + "Messages in group chats": "グループチャットのメッセージ", + "Friday": "金曜日", + "All messages (noisy)": "全ての発言(通知音あり)", + "Yesterday": "昨日", + "Messages sent by bot": "ボットから送信されたメッセージ", + "Low Priority": "低優先度", + "Messages containing my user name": "自身のユーザー名を含むメッセージ", + "Members": "参加者", + "Add an email address above to configure email notifications": "メール通知を設定するためには、メールアドレスを追加してください", + "Collecting logs": "ログの収集", + "No update available.": "更新はありません。", + "An error occurred whilst saving your email notification preferences.": "電子メール通知設定を保存中にエラーが発生しました。", + "Failed to change settings": "設定の変更に失敗しました", + "Mentions only": "呼び掛けられた時のみ", + "Collecting app version information": "アプリのバージョン情報を収集", + "Filter room names": "部屋名検索", + "Changelog": "変更履歴", + "Invite to this room": "この部屋へ招待", + "Waiting for response from server": "サーバからの応答を待っています", + "Wednesday": "水曜日", + "Leave": "退室", + "Enable notifications for this account": "このアカウントで通知を行う", + "Failed to update keywords": "キーワードの更新に失敗しました", + "Enable email notifications": "電子メールでの通知を行う", + "Directory": "部屋一覧", + "Download this file": "この添付ファイルをダウンロード", + "Failed to get public room list": "公開部屋一覧の取得に失敗しました", + "Call invitation": "通話への招待", + "Forget": "忘れる", + "Messages containing keywords": "keywordsを含むメッセージ", + "Error saving email notification preferences": "電子メール通知設定の保存エラー", + "Tuesday": "火曜日", + "Enter keywords separated by a comma:": "キーワードをコンマで区切って入力:", + "Search…": "検索…", + "Saturday": "土曜日", + "Hide panel": "右欄を非表示", + "Warning": "警告", + "This Room": "この部屋", + "When I'm invited to a room": "部屋に招待された時", + "Keywords": "キーワード", + "Resend": "再送信", + "Can't update user notification settings": "ユーザー通知の設定を更新できません", + "Messages containing my display name": "自身の表示名を含むメッセージ", + "Enable desktop notifications": "デスクトップ画面に通知を行う", + "Fetching third party location failed": "サードパーティの記憶場所の取得に失敗しました", + "Couldn't load home page": "ホームページを読み込めませんでした", + "Send Account Data": "アカウントのデータを送信する", + "Advanced notification settings": "通知の詳細設定", + "Notification targets": "通知先", + "Failed to get protocol list from Home Server": "ホームサーバからのプロトコル一覧の入手に失敗しました", + "You are not receiving desktop notifications": "デスクトップ通知を受け取っていません", + "Update": "アップデート", + "Unable to fetch notification target list": "通知先リストを取得できませんでした", + "Expand panel": "パネルを展開する", + "%(count)s Members|other": "%(count)s 名の参加者", + "Uploaded on %(date)s by %(user)s": "%(date)s に %(user)s によりアップロードされました", + "Send Custom Event": "カスタムイベントを送信する", + "All notifications are currently disabled for all targets.": "現在すべての対象についての全通知が無効です。", + "Failed to send logs: ": "ログの送信に失敗しました: ", + "delete the alias.": "エイリアスを削除する。", + "To return to your account in future you need to set a password": "今後アカウントを回復するには、 パスワードを設定 する必要があります", + "You cannot delete this image. (%(code)s)": "この画像を消すことはできません。 (%(code)s)", + "Cancel Sending": "送信を取り消す", + "The Home Server may be too old to support third party networks": "ホームサーバがサードパーティネットワークをサポートするには古すぎる可能性があります", + "Remember, you can always set an email address in user settings if you change your mind.": "利用者設定でいつでもメールアドレスを設定できます。", + "Unavailable": "使用できません", + "View Decrypted Source": "復号されたソースを表示する", + "Notes:": "注:", + "Notifications on the following keywords follow rules which can’t be displayed here:": "ルールにより、次のキーワードについての通知はここに表示されません:", + "Safari and Opera work too.": "SafariOpera でも機能します。", + "Please set a password!": "パスワードを設定してください!", + "You have successfully set a password!": "パスワードの設定に成功しました!", + "Explore Room State": "部屋の状態を調べる", + "Source URL": "ソースのURL", + "Filter results": "フィルター結果", + "Noisy": "音量大", + "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.": "これにより、サインアウト後にあなたのアカウントに戻る、また、他の端末でサインインすることができます。", + "Invite to this community": "このコミュニティに招待する", + "Search for a room": "部屋を検索", + "View Source": "ソースコードを表示する", + "Back": "戻る", + "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": "ログを送信する準備をしています", + "Explore Account Data": "アカウントのデータを調べる", + "The server may be unavailable or overloaded": "サーバは使用できないか、オーバーロードされています", + "Reject": "やめる", + "Failed to set Direct Message status of room": "部屋のダイレクトメッセージステータスの設定に失敗しました", + "Remove from Directory": "ディレクトリから消去する", + "Enable them now": "今有効化する", + "Forward Message": "メッセージを転送する", + "Toolbox": "ツールボックス", + "more": "もっと", + "GitHub issue link:": "Githubの問題へのリンク:", + "You must specify an event type!": "イベントの形式を特定してください!", + "(HTTP status %(httpStatus)s)": "(HTTPステータス %(httpStatus)s)", + "State Key": "ステータスキー", + "Please install Chrome or Firefox for the best experience.": "最高のエクスペリエンスのために Chrome または Firefox をインストールしてください。", + "Quote": "引用", + "Send logs": "ログを送信する", + "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": "他の場合についても通知する", + "Notify for all other messages/rooms": "他のすべてのメッセージ又は部屋について通知する", + "Unable to look up room ID from server": "サーバから部屋IDを検索できません", + "Couldn't find a matching Matrix room": "一致するMatrixの部屋を見つけることができませんでした", + "I understand the risks and wish to continue": "リスクを理解し続ける", + "Logs sent": "ログが送信されました", + "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やエイリアス、他のユーザのユーザ名を含むアプリの使用データを含みます。メッセージは含みません。", + "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で設定することはできませんが、引き続き使用可能です", + "Error encountered (%(errorDetail)s).": "エラーが発生しました (%(errorDetail)s)。", + "Event Type": "イベントの形式", + "What's New": "新着", + "Enable audible notifications in web client": "ウェブクライアントで音による通知を有効化", + "Permalink": "パーマリンク", + "remove %(name)s from the directory.": "ディレクトリから %(name)s を消去する。", + "Riot does not know how to join a room on this network": "Riotはこのネットワークで部屋に参加する方法を知りません", + "You can now return to your account after signing out, and sign in on other devices.": "サインアウト後にあなたの\nアカウントに戻る、また、他の端末でサインインすることができます。", + "Login": "ログイン", + "Pin Message": "メッセージを固定する", + "Thank you!": "ありがとうございます!", + "View Community": "コミュニティを表示する", + "%(count)s Members|one": "%(count)s 名の参加者", + "Developer Tools": "開発者ツール", + "Unhide Preview": "プレビューを表示する", + "Event Content": "イベントの内容", + "#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": "ここに表示されない詳細な通知があります", + "Call": "通話", + "Answer": "応答" } diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 8a92e0f496..4e0a988223 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": "보여줄 별명을 바꾸기", @@ -96,7 +95,6 @@ "Call Timeout": "전화 대기 시간 초과", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "홈 서버에 연결할 수 없어요 - 연결을 확인해주시고, 홈 서버의 SSL 인증서가 믿을 수 있는지 확인하시고, 브라우저 확장기능이 요청을 차단하고 있는지 확인해주세요.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "주소창에 HTTPS URL이 있을 때는 HTTP로 홈 서버를 연결할 수 없어요. HTTPS를 쓰거나 안전하지 않은 스크립트를 허용해주세요.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s님이 별명을 %(oldDisplayName)s에서 %(displayName)s로 바꾸셨어요.", "%(senderName)s changed their profile picture.": "%(senderName)s님이 자기 소개 사진을 바꾸셨어요.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s님이 %(powerLevelDiffText)s의 권한 등급을 바꾸셨어요.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s님이 방 이름을 %(roomName)s로 바꾸셨어요.", @@ -194,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.": "손님은 분명하게 초대받았어도 이 방에 들어가실 수 없어요.", @@ -289,7 +286,6 @@ "Phone": "전화", "Once encryption is enabled for a room it cannot be turned off again (for now)": "방을 암호화하면 암호화를 도중에 끌 수 없어요. (현재로서는)", "Only people who have been invited": "초대받은 사람만", - "Otherwise, click here to send a bug report.": "그 밖에는, 여기를 눌러 오류 보고서를 보내주세요.", "%(senderName)s placed a %(callType)s call.": "%(senderName)s님이 %(callType)s 전화를 걸었어요.", "Please check your email and click on the link it contains. Once this is done, click continue.": "이메일을 확인하시고 그 안에 있는 주소를 누르세요. 이 일을 하고 나서, 계속하기를 누르세요.", "Power level must be positive integer.": "권한 등급은 양의 정수여야만 해요.", @@ -315,7 +311,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": "로그인 화면으로 돌아가기", @@ -428,7 +423,6 @@ "Use with caution": "조심해주세요", "User ID": "사용자 ID", "User Interface": "사용자 인터페이스", - "%(user)s is a": "%(user)s는", "User name": "사용자 이름", "Username invalid: %(errMessage)s": "사용자 이름을 인식할 수 없어요: %(errMessage)s", "Users": "사용자들", @@ -541,7 +535,6 @@ "Start automatically after system login": "컴퓨터를 시작할 때 자동으로 실행하기", "Desktop specific": "컴퓨터 설정", "Analytics": "정보 수집", - "Opt out of analytics": "정보 수집 거부", "Options": "선택권", "Riot collects anonymous analytics to allow us to improve the application.": "라이엇은 익명의 정보를 수집해 응용 프로그램을 개선한답니다.", "Passphrases must match": "암호가 일치해야 해요", @@ -558,8 +551,6 @@ "Confirm Removal": "삭제 확인", "Unknown error": "알 수 없는 오류", "Incorrect password": "맞지 않는 비밀번호", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "계정을 영원히 쓸 수 없게 할 거에요. 같은 사용자 ID를 다시 등록하실 수 없을 거고요.", - "This action is irreversible.": "되돌릴 수 없는 일이에요.", "To continue, please enter your password.": "계속하시려면, 비밀번호를 입력해주세요.", "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "이 과정으로 암호화한 방에서 받은 메시지의 키를 로컬 파일로 내보낼 수 있어요. 너중에 다른 매트릭스 클라이언트로 파일을 불러올 수 있기 때문에, 그 클라이언트에서 메시지를 해독할 수도 있지요.", "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "내보낸 파일은 누구든지 암호화한 메시지를 해독해서 읽을 수 있게 하므로, 보안에 신경 써 주세요. 이를 위해, 내보낸 파일을 암호화하려하니, 아래에 암호를 입력해주세요. 같은 암호를 쓰셔야만 자료를 불러올 수 있어요.", @@ -574,10 +565,8 @@ "In future this verification process will be more sophisticated.": "앞으로는 이 확인 과정이 더 정교해질 거에요.", "Verify device": "인증한 장치", "I verify that the keys match": "키가 맞는 걸 확인했어요", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "이전 세션을 복구하는 도중 오류가 일어났어요. 계속하시려면, 다시 로그인하셔야 하고, 암호화한 기록은 읽을 수 없게 될 거에요.", "Unable to restore session": "세션을 복구할 수 없어요", "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.": "이전에 더 최근 버전의 라이엇을 쓰셨다면, 이 버전과 맞지 않을 거에요. 창을 닫고 더 최근 버전으로 돌아가세요.", - "Continue anyway": "무시하고 계속하기", "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.": "각 장치가 알맞은 소유자에게 속해 있는지 인증 과정을 거치길 추천하지만, 원하신다면 그러지 않고 메시지를 다시 보내실 수 있어요.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\"에 본 적 없는 장치가 있어요.", @@ -606,8 +595,6 @@ "Identity server URL": "ID 서버 URL", "Error decrypting audio": "음성 해독 오류", "Error decrypting image": "사진 해독 오류", - "Image '%(Body)s' cannot be displayed.": "'%(Body)s' 사진을 보여드릴 수 없어요.", - "This image cannot be displayed.": "이 사진을 보여드릴 수 없어요.", "Error decrypting video": "영상 해독 오류", "Add an Integration": "통합 추가", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "타사 사이트로 이동하는데 %(integrationsUrl)s에서 쓰도록 계정을 인증할 수 있어요. 계속하시겠어요?", @@ -646,5 +633,143 @@ "You added a new device '%(displayName)s', which is requesting encryption keys.": "새 장치 '%(displayName)s'를 추가했고 암호화 키를 요청하고 있어요.", "Your unverified device '%(displayName)s' is requesting encryption keys.": "인증하지 않은 장치 '%(displayName)s'가 암호화 키를 요청하고 있어요.", "Encryption key request": "암호화 키 요청", - "Edit": "수정하기" + "Edit": "수정하기", + "Fetching third party location failed": "타사 위치를 불러오지 못했어요", + "A new version of Riot is available.": "라이엇의 새 버전을 사용하실 수 있어요.", + "Couldn't load home page": "중심 화면을 불러올 수 없어요", + "All notifications are currently disabled for all targets.": "현재 모든 알림이 모든 상대에게서 꺼졌어요.", + "Uploading report": "보고를 올리는 중", + "Sunday": "일요일", + "Guests can join": "손님이 들어올 수 있어요", + "Messages sent by bot": "봇이 보낸 메시지", + "Notification targets": "알림 대상", + "Failed to set direct chat tag": "직접 이야기 지정을 설정하지 못했어요", + "Today": "오늘", + "Failed to get protocol list from Home Server": "홈 서버에서 프로토콜 목록을 얻지 못했어요", + "You are not receiving desktop notifications": "컴퓨터 알림을 받지 않고 있어요", + "Friday": "금요일", + "Update": "업데이트", + "What's New": "새로운 점", + "Add an email address above to configure email notifications": "이메일 알림을 설정하기 위해 이메일 주소를 추가해주세요", + "Expand panel": "확장 패널", + "On": "켜기", + "Filter room names": "방 이름 거르기", + "Changelog": "바뀐 점", + "Waiting for response from server": "서버에서 응답을 기다리는 중", + "Leave": "떠나기", + "Advanced notification settings": "고급 알림 설정", + "delete the alias.": "가명을 지울게요.", + "To return to your account in future you need to set a password": "나중에 계정으로 돌아가려면 비밀번호 설정을 해야만 해요", + "Forget": "잊기", + "World readable": "세계에 보이기", + "Hide panel": "패널 숨기기", + "You cannot delete this image. (%(code)s)": "이 사진을 지우실 수 없어요. (%(code)s)", + "Cancel Sending": "보내기 취소", + "Warning": "주의", + "This Room": "방", + "The Home Server may be too old to support third party networks": "타사 네트워크를 지원하기에는 홈 서버가 너무 오래된 걸 수 있어요", + "Resend": "다시 보내기", + "Error saving email notification preferences": "이메일 알림을 설정하는데 오류가 일어났어요", + "Messages containing my display name": "내 별명이 적힌 메시지", + "Messages in one-to-one chats": "1:1 이야기의 메시지", + "Unavailable": "이용할 수 없음", + "View Decrypted Source": "해독된 출처 보기", + "Send": "보내기", + "remove %(name)s from the directory.": "목록에서 %(name)s을 지웠어요.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "여기 표시될 수 없는 규칙에 따라 다음 키워드는 알리지 않아요:", + "Please set a password!": "비밀번호를 설정해주세요!", + "You have successfully set a password!": "비밀번호를 설정했어요!", + "An error occurred whilst saving your email notification preferences.": "이메일 알림을 설정하다가 오류가 일어났어요.", + "Source URL": "출처 URL", + "Failed to add tag %(tagName)s to room": "방에 %(tagName)s로 지정하지 못했어요", + "Members": "구성원", + "No update available.": "업데이트가 없어요.", + "Noisy": "소리", + "Files": "파일", + "Collecting app version information": "앱 버전 정보를 수집하는 중", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "방 가명 %(alias)s 을 지우고 목록에서 %(name)s를 지우시겠어요?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "이런 식으로 로그아웃한 뒤 계정으로 돌아가, 다른 장치에서 로그인하실 수 있어요.", + "Enable notifications for this account": "이 계정의 알림 받기", + "Directory": "목록", + "Search for a room": "방에서 찾기", + "Messages containing keywords": "키워드가 적힌 메시지", + "Room not found": "방을 찾지 못했어요", + "Tuesday": "화요일", + "Enter keywords separated by a comma:": "키워드를 쉼표로 구분해 입력해주세요:", + "Search…": "찾기…", + "Remove %(name)s from the directory?": "목록에서 %(name)s을 지우시겠어요?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "라이엇은 많은 고급 브라우저 기능을 사용해요. 일부는 현재 브라우저에서 쓸 수 없거나 실험적이에요.", + "Developer Tools": "개발자 도구", + "Enable desktop notifications": "컴퓨터에서 알림 받기", + "Unnamed room": "이름없는 방", + "Remove from Directory": "목록에서 지우기", + "Saturday": "토요일", + "Remember, you can always set an email address in user settings if you change your mind.": "잊지마세요, 마음이 바뀌면 언제라도 사용자 설정에서 이메일 주소를 바꾸실 수 있다는 걸요.", + "Direct Chat": "직접 이야기하기", + "The server may be unavailable or overloaded": "서버를 쓸 수 없거나 과부하일 수 있어요", + "Reject": "거절하기", + "Failed to set Direct Message status of room": "방의 쪽지 상태를 설정하지 못했어요", + "Monday": "월요일", + "All messages (noisy)": "모든 메시지 (크게)", + "Enable them now": "지금 켜기", + "Forward Message": "메시지 전달", + "Messages containing my user name": "내 사용자 이름이 적힌 메시지", + "Toolbox": "도구상자", + "Collecting logs": "로그 수집 중", + "more": "더 보기", + "(HTTP status %(httpStatus)s)": "(HTTP 상태 %(httpStatus)s)", + "All Rooms": "모든 방", + "Failed to get public room list": "공개한 방 목록을 얻지 못했어요", + "Quote": "인용하기", + "Failed to update keywords": "키워드를 갱신하지 못했어요", + "Send logs": "로그 보내기", + "All messages": "모든 메시지", + "Call invitation": "전화가 왔어요", + "Downloading update...": "업데이트를 받는 중...", + "You have successfully set a password and an email address!": "비밀번호와 이메일 주소를 설정했어요!", + "What's new?": "새로운 점은?", + "Notify me for anything else": "모든 걸 알리기", + "When I'm invited to a room": "방에 초대받았을 때", + "Keywords": "키워드", + "Can't update user notification settings": "사용자 알림 설정을 갱신할 수 없어요", + "Notify for all other messages/rooms": "다른 모든 메시지/방 알리기", + "Unable to look up room ID from server": "서버에서 방 ID를 찾아볼 수 없어요", + "Couldn't find a matching Matrix room": "일치하는 매트릭스 방을 찾을 수 없어요", + "Invite to this room": "이 방에 초대하기", + "You cannot delete this message. (%(code)s)": "이 메시지를 지우실 수 없어요. (%(code)s)", + "Thursday": "목요일", + "I understand the risks and wish to continue": "위험할 수 있는 걸 알고 계속하기를 바라요", + "Back": "돌아가기", + "Failed to change settings": "설정을 바꾸지 못했어요", + "Show message in desktop notification": "컴퓨터 알림에서 내용 보이기", + "Unhide Preview": "미리보기를 숨기지 않기", + "Unable to join network": "네트워크에 들어갈 수 없어요", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "라이엇이 아닌 다른 클라이언트에서 구성하셨을 수도 있어요. 라이엇에서 조정할 수는 없지만 여전히 적용되있을 거에요", + "Sorry, your browser is not able to run Riot.": "죄송해요. 브라우저에서 라이엇을 켤 수가 없어요.", + "Uploaded on %(date)s by %(user)s": "by %(user)s가 %(date)s에 올림", + "Messages in group chats": "이야기 모임의 메시지", + "Yesterday": "어제", + "Error encountered (%(errorDetail)s).": "오류가 일어났어요 (%(errorDetail)s).", + "Low Priority": "낮은 우선순위", + "Riot does not know how to join a room on this network": "라이엇이 이 네트워크에서 방에 들어가는 법을 알 수 없어요", + "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 new file mode 100644 index 0000000000..bd46c25ed8 --- /dev/null +++ b/src/i18n/strings/lt.json @@ -0,0 +1,192 @@ +{ + "This email address is already in use": "Šis el. pašto adresas jau naudojamas", + "This phone number is already in use": "Šis telefono numeris jau naudojamas", + "Failed to verify email address: make sure you clicked the link in the email": "Nepavyko patvirtinti el. pašto adreso: įsitikinkite, kad gautame el. laiške spustelėjote nuorodą", + "The platform you're on": "Jūsų naudojama platforma", + "The version of Riot.im": "Riot.im versija", + "Whether or not you're logged in (we don't record your user name)": "Nesvarbu ar esate prisijungę ar ne (mes neįrašome jūsų naudotojo vardo)", + "Your language of choice": "Jūsų pasirinkta kalba", + "Which officially provided instance you are using, if any": "Kurį oficialiai pateiktą egzempliorių naudojate", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Nesvarbu jūs naudojate ar ne raiškiojo teksto režimą Raiškiojo tekto redaktoriuje", + "Your homeserver's URL": "Jūsų serverio URL adresas", + "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:", + "Fetching third party location failed": "Nepavyko gauti trečios šalies vietos", + "A new version of Riot is available.": "Yra nauja Riot versija.", + "I understand the risks and wish to continue": "Aš suprantu riziką ir noriu tęsti", + "Couldn't load home page": "Nepavyksta užkrauti namų puslapio", + "Send Account Data": "Siųsti paskyros duomenis", + "Advanced notification settings": "Išplėstiniai pranešimų nustatymai", + "Uploading report": "Išsiunčiama ataskaita", + "Sunday": "Sekmadienis", + "Guests can join": "Svečiai gali prisijungti", + "Notification targets": "Pranešimo objektai", + "Today": "Šiandien", + "Files": "Failai", + "You are not receiving desktop notifications": "Jūs negaunate darbalaukio pranešimų", + "Friday": "Penktadienis", + "Update": "Atnaujinti", + "Notifications": "Pranešimai", + "Unable to fetch notification target list": "Nėra galimybės rasti pranešimo objektų sąrašui", + "Add an email address above to configure email notifications": "Norėdami gauti pranešimus el. paštu įveskite į aukščiau esantį laukelį el. pašto adresą", + "Expand panel": "Išskleisti skydelį", + "On": "Įjungta", + "%(count)s Members|other": "%(count)s nariai", + "Filter room names": "Filtruoti kambarių pavadinimus", + "Changelog": "Keitinių žurnalas", + "Waiting for response from server": "Laukiama atsakymo iš serverio", + "Failed to change password. Is your password correct?": "Nepavyko pakeisti slaptažodžio. Ar Jūsų slaptažodis teisingas?", + "Uploaded on %(date)s by %(user)s": "Atnaujinta %(date)s vartotojo %(user)s", + "OK": "Gerai", + "Send Custom Event": "Siųsti pasirinktinį įvykį", + "All notifications are currently disabled for all targets.": "Šiuo metu visi pranešimai visiems objektams yra išjungti.", + "Operation failed": "Operacija nepavyko", + "delete the alias.": "ištrinti slapyvardį.", + "To return to your account in future you need to set a password": "Ateityje norėdami prisijungti prie savo paskyros turite susigalvoti slaptažodį", + "Forget": "Pamiršti", + "World readable": "Visiems skaitomas", + "Mute": "Užtildyti", + "Hide panel": "Slėpti skydelį", + "You cannot delete this image. (%(code)s)": "Jūs negalite ištrinti šio paveikslėlio. (%(code)s)", + "Cancel Sending": "Atšaukti siuntimą", + "Warning": "Įspėjimas", + "This Room": "Šis pokalbių kambarys", + "The Home Server may be too old to support third party networks": "Serveris gali būti per senas ir negali palaikyti trečių šalių tinklų", + "Resend": "Siųsti iš naujo", + "Room not found": "Kambarys nerastas", + "Downloading update...": "Atsiunčiamas atnaujinimas...", + "Messages in one-to-one chats": "Žinutės asmeniniuose pokalbiuose", + "Unavailable": "Neprieinamas", + "Error saving email notification preferences": "Klaida, įrašant pranešimų el. paštu nuostatas", + "View Decrypted Source": "Peržiūrėti iššifruotą šaltinį", + "Failed to update keywords": "Nepavyko atnaujinti raktažodžių", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Pranešimai šiems raktažodžiams yra uždrausti taisyklėmis:", + "Safari and Opera work too.": "Naudojant Safari ir Opera taip pat gerai veikia.", + "Please set a password!": "Prašau įrašykite slaptažodį!", + "powered by Matrix": "palaikomas Matrix", + "You have successfully set a password!": "Jūs sėkmingai įrašėte slaptažodį!", + "Favourite": "Svarbūs", + "All Rooms": "Visi pokalbių kambariai", + "Explore Room State": "Peržiūrėti pokalbių kambario būseną", + "Source URL": "Šaltinio URL adresas", + "Messages sent by bot": "Roboto siunčiamos žinutės", + "Cancel": "Atšaukti", + "Filter results": "Išfiltruoti rezultatus", + "Members": "Nariai", + "No update available.": "Nėra prieinamų atnaujinimų.", + "Noisy": "Triukšmingas", + "Failed to get protocol list from Home Server": "Nepavyko gauti protokolų sąrašo iš serverio", + "Collecting app version information": "Renkama programėlės versijos informacija", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ar ištrinti kambarį %(alias)s ir %(name)s kambario pavadinimą iš katalogo?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Tai leis Jums grįžti prie paskyros po atsijungimo ir prisijungti kituose įrenginiuose.", + "Keywords": "Raktažodžiai", + "Unpin Message": "Atsegti žinutę", + "Enable notifications for this account": "Įjungti pranešimus šiai paskyrai", + "Remove": "Šalinti", + "Directory": "Katalogas", + "Invite to this community": "Pakviesti į šią bendruomenę", + "Search for a room": "Ieškoti kambario", + "Messages containing keywords": "Žinutės, kuriose yra raktažodžiai", + "When I'm invited to a room": "Kai aš esu pakviestas į pokalbių kambarį", + "Tuesday": "Antradienis", + "Enter keywords separated by a comma:": "Įveskite kableliais atskirtus raktažodžius:", + "Search…": "Paieška…", + "You have successfully set a password and an email address!": "Jūs sėkmingai įrašėte slaptažodį ir el. pašto adresą!", + "Remove %(name)s from the directory?": "Ar ištrinti %(name)s iš katalogo?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot naudoja daug išplėstinių naršyklės funkcionalumų, kai kurie iš jų yra neprieinami ar eksperimentinei Jūsų naršyklėje.", + "Event sent!": "Įvykis išsiųstas!", + "Unnamed room": "Kambarys be pavadinimo", + "Dismiss": "Nutraukti", + "Explore Account Data": "Peržiūrėti paskyros duomenis", + "Remove from Directory": "Šalinti iš katalogo", + "Download this file": "Atsisiųsti šį failą", + "Saturday": "Šeštadienis", + "Remember, you can always set an email address in user settings if you change your mind.": "Nepamirškite, kad galite, bet kada įrašyti savo el. pašto adresą paskyros nustatymuose.", + "Direct Chat": "Tiesioginis pokalbis", + "The server may be unavailable or overloaded": "Gali būti, kad serveris yra neprieinamas arba perkrautas", + "Online": "Prisijungęs", + "Failed to set Direct Message status of room": "Nepavyko nustatyti tiesioginio pranešimo kambario būklės", + "Monday": "Pirmadienis", + "All messages (noisy)": "Visos žinutės (triukšmingas)", + "Enable them now": "Įgalinti juos dabar", + "Enable audible notifications in web client": "Įgalinti garsinius pranešimus internetinėje aplinkoje", + "Messages containing my user name": "Žinutės, kuriose paminėtas mano naudotojo vardas", + "Toolbox": "Įrankinė", + "Collecting logs": "Renkami žurnalai", + "more": "daugiau", + "Rooms": "Kambariai", + "Failed to get public room list": "Nepavyko gauti viešų pokalbių kambarių sąrašo", + "Search": "Ieškoti", + "You must specify an event type!": "Privalote nurodyti įvykio tipą!", + "(HTTP status %(httpStatus)s)": "(HTTP būsena %(httpStatus)s)", + "Failed to forget room %(errCode)s": "Nepavyko pašalinti pokalbių kambario %(errCode)s", + "What's New": "Kas naujo", + "Please install Chrome or Firefox for the best experience.": "Prašau įdiekite Chrome arba Firefox geriausiam rezultatui gauti.", + "Wednesday": "Trečiadienis", + "Send": "Siųsti", + "Error": "Klaida", + "Send logs": "Siųsti žurnalus", + "All messages": "Visos žinutės", + "unknown error code": "nežinomas klaidos kodas", + "Call invitation": "Pakvietimas skambinant", + "Messages containing my display name": "Žinutės, kuriose paminėtas mano vardas", + "State Key": "Būklės raktas", + "Failed to send custom event.": "Nepavyko išsiųsti pasirinktinio įvykio.", + "What's new?": "Kas naujo?", + "Notify me for anything else": "Pranešti man apie visa kita", + "View Source": "Peržiūrėti šaltinį", + "Close": "Užverti", + "Can't update user notification settings": "Nepavyksta atnaujinti naudotojo pranešimų nustatymų", + "Notify for all other messages/rooms": "Pranešti apie visas kitas žinutes/pokalbių kambarius", + "Unable to look up room ID from server": "Nepavyko gauti kambario ID iš serverio", + "Couldn't find a matching Matrix room": "Nepavyko rasti atitinkamo Matrix kambario", + "Invite to this room": "Pakviesti į šį kambarį", + "You cannot delete this message. (%(code)s)": "Jūs negalite trinti šios žinutės. (%(code)s)", + "Thursday": "Ketvirtadienis", + "Forward Message": "Persiųsti žinutę", + "Back": "Atgal", + "Reply": "Atsakyti", + "Show message in desktop notification": "Rodyti žinutes darbalaukio pranešimuose", + "Reject": "Atmesti", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Jūs turbūt juos sukonfigūravote kitoje programėlėje nei Riot. Negalite jų koreguoti Riot programėlėje, bet jie vistiek yra taikomi", + "Sorry, your browser is not able to run Riot.": "Atleiskite, jūsų naršyklė negali paleisti Riot.", + "Quote": "Citata", + "Messages in group chats": "Žinutės grupės pokalbiuose", + "Yesterday": "Vakar", + "Error encountered (%(errorDetail)s).": "Gauta klaida (%(errorDetail)s).", + "Login": "Prisijungti", + "Low Priority": "Nesvarbūs", + "Riot does not know how to join a room on this network": "Riot nežino kaip prisijungti prie kambario šiame tinkle", + "Set Password": "Nustatyti slaptažodį", + "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 71cfdc5110..01e3ae5c6d 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -1,27 +1,27 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Teksta ziņa tika nosūtīta +%(msisdn)s. Lūdzu ievadi tajā atrodamo verifikācijas kodu", - "Accept": "Apstiprināt", + "Accept": "Pieņemt", "%(targetName)s accepted an invitation.": "%(targetName)s apstiprināja uzaicinājumu.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s apstiprināja uzaicinājumu no %(displayName)s.", "Account": "Konts", - "Access Token:": "Pieejas atslēga:", + "Access Token:": "Pieejas tokens:", "Active call (%(roomName)s)": "Aktīvs zvans (%(roomName)s)", "Add": "Pievienot", - "Add a topic": "Pievieno tematu", - "Add email address": "Pievieno Epasta adresi", - "Add phone number": "Pievieno tālruņa numuru", + "Add a topic": "Pievienot tematu", + "Add email address": "šeit ieraksti savu epasta adresi", + "Add phone number": "šeit ieraksti telefona numuru", "Admin": "Administrators", "Admin Tools": "Administratora rīki", "VoIP": "VoIP", - "Missing Media Permissions, click here to request.": "Nav pieejas medija saturam. Klikšķini šeit, lai pieprasītu.", - "No Microphones detected": "Mikrofoni nav atrasti", - "No Webcams detected": "Webkameras nav atrastas", - "No media permissions": "Nav pieejas mediju saturam", + "Missing Media Permissions, click here to request.": "Nav atļauju piekļūt ierīcei. Klikšķini šeit, lai tās pieprasītu.", + "No Microphones detected": "Nav mikrofonu", + "No Webcams detected": "Nav webkameru", + "No media permissions": "Nav datu nesēju, kuriem atļauta piekļuve", "You may need to manually permit Riot to access your microphone/webcam": "Tev varētu būt nepieciešams manuāli atļaut Riot pieslēgties tavam mikrofonam/webkamerai", "Default Device": "Noklusējuma ierīce", "Microphone": "Mikrofons", "Camera": "Kamera", - "Advanced": "Īpašie", + "Advanced": "Papildus", "Algorithm": "Algoritms", "Hide removed messages": "Slēpt dzēstos ziņojumus", "Always show message timestamps": "Vienmēr rādīt ziņojumu laika zīmogu", @@ -35,213 +35,210 @@ "Anyone": "Ikviens", "Anyone who knows the room's link, apart from guests": "Ikviens, kurš zina adreses saiti uz istabu, izņemot viesus", "Anyone who knows the room's link, including guests": "Ikviens, kurš zina adreses saiti uz istabu, tai skaitā arī viesi", - "Are you sure?": "Esi pārliecināts/a?", - "Are you sure you want to leave the room '%(roomName)s'?": "Vai tiešām vēlies pamest istabas: '%(roomName)s'?", + "Are you sure?": "Vai tiešām to vēlies?", + "Are you sure you want to leave the room '%(roomName)s'?": "Vai tiešām vēlies pamest istabu: '%(roomName)s'?", "Are you sure you want to reject the invitation?": "Vai tiešām vēlies noraidīt šo uzaicinājumu?", "Are you sure you want to upload the following files?": "Vai tiešām vēlies augšuplādēt sekojošos failus?", "Attachment": "Pielikums", - "Autoplay GIFs and videos": "Automātiski atskaņot GIF animācijas un video", + "Autoplay GIFs and videos": "Automātiski rādīt GIF animācijas un video", "%(senderName)s banned %(targetName)s.": "%(senderName)s liedza pieeju %(targetName)s.", - "Ban": "Liegt pieeju (Bans)", - "Banned users": "Lietotāji, kuriem ir liegta pieeja (banotie)", - "Bans user with given id": "Liedz pieeju lietotājam pēc uzdotā ID (Bans)", + "Ban": "Nobanot/liegt pieeju", + "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": "Lielapjoma darbības", - "Call Timeout": "Zvana noilgums", - "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Neizdevās savienoties ar serveri. Lūdzu pārbaudi savu tīkla savienējumu un pārliecinies, ka tava servera SSL sertifikāts ir uzticams, kā arī pārlūkā instalētie paplašinājumi nebloķē pieprasījumus.", - "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Neizdevās savienoties ar serveri izmantojot HTTP protokolu, kad tava pārlūka adreses laukā ir HTTPS saite. Tā vietā izmanto HTTPS savienojumu vai iespējo nedrošos skriptus.", - "Can't load user settings": "Neizdevās ielādēt lietotāja uzstādījumus", + "Bulk Options": "Grupveida darbību parametri", + "Call Timeout": "Savienojuma gaidīšanas noilgums", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Neizdodas savienoties ar bāzes serveri. Pārbaudi tīkla savienojumu un pārliecinies, ka bāzes servera SSL sertifikāts ir uzticams, kā arī pārlūkā instalētie paplašinājumi nebloķē pieprasījumus.", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Neizdodas savienoties ar bāzes serveri izmantojot HTTP protokolu, kad Tava pārlūka adreses laukā norādīts HTTPS protokols. Tā vietā izmanto HTTPS vai iespējo nedrošos skriptus.", + "Can't load user settings": "Neizdevās ielādēt lietotāja iestatījumus", "Change Password": "Paroles maiņa", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s nomainīja redzamo vārdu no %(oldDisplayName)s uz %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s nomainīja profila attēlu.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s nomainīja statusa līmeni %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s nomainīja istabas nosaukumu uz %(roomName)s.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s dzēsa istabas nosaukumu.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s nomainīja tēmas nosaukumu uz \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Izmaiņas attiecībā uz to, kurš varēs lasīt vēstures ziņas, stāsies spēkā tikai uz ziņām,kuras vēl tiks pievienotas šajā istabā", - "Changes your display nickname": "Nomaina tavu publisko segvārdu (niku)", + "Changes your display nickname": "Nomaina Tavu publisko segvārdu (niku)", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Paroles maiņa dzēsīs pašreizējās šifrēšanas atslēgas visās savstarpēji saistītajās ierīcēs, padarot čata vēsturi neizlasāmu, ja vien vien istabas atslēgas nav tikušas iepriekš eksportētas un no jauna importētas atpakaļ. Nākotnē to plānojam uzlabot.", - "Claimed Ed25519 fingerprint key": "Norādīta Ed25519 identificējošās zīmju virknes atslēga", + "Claimed Ed25519 fingerprint key": "Ed25519 pieprasītā nospieduma (fingerprint) atslēga", "Clear Cache and Reload": "Iztīri kešatmiņu un pārlādē", "Clear Cache": "Iztīri kešatmiņu", "Click here to join the discussion!": "Klikšķini šeit lai pievienotos diskusijai!", - "Click here to fix": "Klikšķini šeit, lai izlabotu", - "Click to mute audio": "Klikšķini, lai izslēgtu skaņu", - "Click to mute video": "Klikšķini, lai izslēgtu video skaņu", - "click to reveal": "Klikšķini, lai atvērtu", - "Click to unmute video": "Klikšķini, lai ieslēgtu video skaņu", - "Click to unmute audio": "Klikšķini, lai ieslēgtu audio skaņu", + "Click here to fix": "Klikšķini šeit, lai salabotu", + "Click to mute audio": "Klikšķini, lai audio skaņu izslēgtu", + "Click to mute video": "Klikšķini, lai video skaņu izslēgtu", + "click to reveal": "Klikšķini, lai atsegtu", + "Click to unmute video": "Klikšķini, lai video skaņu ieslēgtu", + "Click to unmute audio": "Klikšķini, lai audio skaņu ieslēgtu", "Close": "Aizvērt", "Command error": "Komandas kļūda", "Commands": "Komandas", "Conference call failed.": "Konferences zvans neizdevās.", "Conference calling is in development and may not be reliable.": "Konferences zvans šobrīd atrodas izstrādes stadijā un var būt nestabils.", "Conference calls are not supported in encrypted rooms": "Konferences zvani nav iespējami istabās, kurās tiek izmantota šifrēšana", - "Conference calls are not supported in this client": "Konferences zvani netiek atbalstīti šajā programmā", + "Conference calls are not supported in this client": "Konferences zvani šajā klienta programmā netiek atbalstīti", "Confirm password": "Apstiprini paroli", "Confirm your new password": "Apstiprini jauno paroli", "Continue": "Turpināt", - "Could not connect to the integration server": "Neizdevās savienoties ar integrācijas serveri", + "Could not connect to the integration server": "Neizdevās savienoties ar Integrācijas serveri", "%(count)s new messages|one": "jaunu ziņu skaits: %(count)s", "%(count)s new messages|other": "%(count)s jaunas ziņas", - "Create a new chat or reuse an existing one": "Izveidot jaunu čatu vai izmantot eksistējošu", + "Create a new chat or reuse an existing one": "Izveidot jaunu čalu vai izmantot jau esošu", "Create an account": "Reģistrēt kontu", "Create Room": "Izveidot istabu", "Cryptography": "Kriptogrāfija", "Current password": "Pašreizējā parole", "Curve25519 identity key": "Curve25519 identifikācijas atslēga", "Custom": "Pielāgots", - "Custom level": "Speciāls līmenis", + "Custom level": "Īpašais līmenis", "/ddg is not a command": "/ddg nav komanda", - "Deactivate Account": "Deaktivizēt kontu", - "Deactivate my account": "Deaktivizēt manu kontu", + "Deactivate Account": "Deaktivēt kontu", + "Deactivate my account": "Deaktivēt manu kontu", "Decline": "Noraidīt", "Decrypt %(text)s": "Atšifrēt %(text)s", "Decryption error": "Atšifrēšanas kļūda", "Delete": "Dzēst", - "Deops user with given id": "Noņemt operatora statusu lietotājam ar norādīto id", + "Deops user with given id": "Atceļ operatora statusu lietotājam ar norādīto Id", "Default": "Noklusējuma", "Device already verified!": "Ierīce ir jau verificēta!", - "Device ID": "Ierīces ID", - "Device ID:": "Ierīces ID:", + "Device ID": "Ierīces Id", + "Device ID:": "Ierīces Id:", "device id: ": "ierīces id: ", "Device key:": "Ierīces atslēga:", "Devices": "Ierīces", "Devices will not yet be able to decrypt history from before they joined the room": "Ierīces nevarēs atšifrēt to ziņu vēsturi, kuras ir tikušas pievienotas, pirms ierīce pieslēdzās istabai", "Direct chats": "Tiešie čati", - "Disable Notifications": "Atslēgt paziņojumus", + "Disable Notifications": "Izslēgt paziņojumus", "Disinvite": "Atsaukt", - "Display name": "Redzamais vārds", + "Display name": "Attēlojamais vārds", "Displays action": "Parāda darbību", - "Don't send typing notifications": "Nesūtīt paziņojumus", + "Don't send typing notifications": "Nerādīt, kad es rakstu", "Download %(text)s": "Lejupielādēt tekstu: %(text)s", "Drop File Here": "Ievelc failu šeit", - "Drop here to tag %(section)s": "Ievelc šeit uz birkas %(section)s", - "Ed25519 fingerprint": "Ed25519 identificējošā zīmju virkne", + "Drop here to tag %(section)s": "Atvilkt uz šejieni (nomest šeit), lai birkotu %(section)s", + "Ed25519 fingerprint": "Ed25519 nospiedums (fingerprint), zīmju virkne", "Email": "Epasts", "Email address": "Epasta adrese", "Email address (optional)": "Epasta adrese (neobligāta)", "Email, name or matrix ID": "Epasts, vārds vai Matrix identifikators (ID)", - "Emoji": "Emocijzīmes (Emoji)", - "Enable encryption": "Iespējot šifrēšanu", - "Enable Notifications": "Iespējot paziņojumus", + "Emoji": "Emocīši (emoji)", + "Enable encryption": "Ieslēgt šifrēšanu", + "Enable Notifications": "Ieslēgt paziņojumus", "Encrypted by a verified device": "Šifrēts ar verificētu ierīci", "Encrypted by an unverified device": "Šifrēts ar neverificētu ierīci", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Šifrētas ziņas nebūs redzamas tajās klienta programmās, kuras neatbalsta šifrēšanu", "Encrypted room": "Šifrēta istaba", - "Encryption is enabled in this room": "Šajā istabā ir iespējota šifrēšana", - "Encryption is not enabled in this room": "Šajā istabā nav iespējota šifrēšana", + "Encryption is enabled in this room": "Šajā istabā šifrēšana ir ieslēgta", + "Encryption is not enabled in this room": "Šajā istabā šifrēšana ir izslēgta", "%(senderName)s ended the call.": "%(senderName)s beidza zvanu.", - "End-to-end encryption information": "Ierīce-ierīce šifrēšanas informācija", - "End-to-end encryption is in beta and may not be reliable": "Ierīce-ierīce šifrēšana šobrīd ir beta stadijā, un var nebūt stabila", + "End-to-end encryption information": "\"End-to-End\" (ierīce-ierīce) šifrēšanas informācija", + "End-to-end encryption is in beta and may not be reliable": "\"End-to-end\" (ierīce-ierīce) šifrēšana šobrīd ir beta stadijā, un var nebūt stabila", "Enter Code": "Ievadi kodu", "Enter passphrase": "Ievadi paroles frāzi", "Error": "Kļūda", "Error decrypting attachment": "Kļūda atšifrējot pielikumu", - "Error: Problem communicating with the given homeserver.": "Kļūda: Radās komunikācijas problēma ar norādīto serveri.", + "Error: Problem communicating with the given homeserver.": "Kļūda: Saziņas problēma ar norādīto bāzes serveri.", "Event information": "Notikuma informācija", - "Existing Call": "Eksistējošs zvans", + "Existing Call": "Pašreizējā saruna (zvans)", "Export": "Eksportēt", "Export E2E room keys": "Eksportēt E2E istabas atslēgas", - "Failed to ban user": "Neizdevās liegt pieeju lietotājam", - "Failed to change password. Is your password correct?": "Neizdevās mainīt paroli. Vai tava parole ir pareiza?", - "Failed to change power level": "Neizdevās mainīt statusa līmeni", + "Failed to ban user": "Neizdevās nobanot/bloķēt (liegt pieeju) lietotāju", + "Failed to change password. Is your password correct?": "Neizdevās nomainīt paroli. Vai tā ir pareiza?", + "Failed to change power level": "Neizdevās nomainīt statusa līmeni", "Power level must be positive integer.": "Statusa līmenim ir jābūt pozitīvam skaitlim.", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Tu nevarēsi atcelt šo darbību, jo šim lietotājam piešķir tādu pašu statusa līmeni, kāds ir Tev.", "Failed to fetch avatar URL": "Neizdevās noteikt avatara URL adresi", "Failed to forget room %(errCode)s": "Neizdevās \"aizmirst\" istabu %(errCode)s", "Failed to join room": "Neizdevās pievienoties istabai", - "Failed to kick": "Neizdevās veikt \"kick\" darbību", + "Failed to kick": "Neizdevās izspert/padzīt (kick)", "Failed to leave room": "Neizdevās pamest istabu", "Failed to load timeline position": "Neizdevās ielādēt laikpaziņojumu pozīciju", - "Failed to lookup current room": "Neizdevās pārlūkot pašreizējo istabu", + "Failed to lookup current room": "Neizdevās uziet pašreizējo istabu", "Failed to mute user": "Neizdevās apklusināt lietotāju", "Failed to reject invite": "Neizdevās noraidīt uzaicinājumu", "Failed to reject invitation": "Neizdevās noraidīt uzaicinājumu", "Failed to save settings": "Neizdevās saglabāt uzstādījumus", "Failed to send email": "Neizdevās nosūtīt epastu", "Failed to send request.": "Neizdevās nosūtīt pieprasījumu.", - "Failed to set avatar.": "Neizdevās iestatīt profila attēlu.", + "Failed to set avatar.": "Neizdevās iestatīt avataru (profila attēlu).", "Failed to set display name": "Neizdevās iestatīt redzamo vārdu", "Failed to set up conference call": "Neizdevās iestatīt konferences zvanu", - "Failed to toggle moderator status": "Neizdevās pārslēgt moderatora statusu", - "Failed to unban": "Neizdevās atcelt pieejas liegumu (atbanot)", - "Failed to upload file": "Neizdevās augšuplādēt failu", + "Failed to toggle moderator status": "Neizdevās nomainīt moderatora statusu", + "Failed to unban": "Neizdevās atbanot/atbloķēt (atcelt pieejas liegumu)", + "Failed to upload file": "Neizdevās augšupielādēt failu", "Failed to upload profile picture!": "Neizdevās augšuplādēt profila attēlu!", "Failed to verify email address: make sure you clicked the link in the email": "Neizdevās apstiprināt epasta adresi. Pārbaudi, vai Tu esi noklikšķinājis/usi saiti epasta ziņā", "Failure to create room": "Neizdevās izveidot istabu", - "Favourite": "Favorīts", + "Favourite": "Favorīti (izlase)", "Favourites": "Favorīti", "Fill screen": "Aizpildīt ekrānu", "Filter room members": "Filtrēt istabas biedrus", "Forget room": "\"Aizmirst\" istabu", - "Forgot your password?": "Aizmirsi savu paroli?", + "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ā 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.", - "Hangup": "Aizturēt", - "Hide read receipts": "Slēpt izlasītās receptes", + "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.", + "Hangup": "Beigt zvanu", + "Hide read receipts": "Slēpt atzīmes par izlasīšanu", "Hide Text Formatting Toolbar": "Slēpt teksta formatēšanas rīkjoslu", - "Historical": "Vēsturiskais", + "Historical": "Bijušie", "Home": "Mājup", - "Homeserver is": "Serveris ir", + "Homeserver is": "Bāzes serveris ir", "Identity Server is": "Indentifikācijas serveris ir", "I have verified my email address": "Mana epasta adrese ir verificēta", "Import": "Importēt", "Import E2E room keys": "Importēt E2E istabas atslēgas", "Incoming call from %(name)s": "Ienākošs zvans no %(name)s", - "Incoming video call from %(name)s": "Ienākošs video zvans no %(name)s", - "Incoming voice call from %(name)s": "Ienākošs balss zvans no %(name)s", + "Incoming video call from %(name)s": "Ienākošs VIDEO zvans no %(name)s", + "Incoming voice call from %(name)s": "Ienākošs AUDIO zvans no %(name)s", "Incorrect username and/or password.": "Nepareizs lietotājvārds un/vai parole.", "Incorrect verification code": "Nepareizs verifikācijas kods", "Interface Language": "Saskarnes valoda", - "Invalid alias format": "Nepareizs aizstājējvārda formāts", + "Invalid alias format": "Nepareizs aliases (aizstājējvārda) formāts", "Invalid address format": "Nepareizs adreses formāts", "Invalid Email Address": "Nepareiza epasta adrese", - "Invalid file%(extra)s": "Nepareizs faila %(extra)s", + "Invalid file%(extra)s": "Nederīgs fails %(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s uzaicināja %(targetName)s.", "Invite new room members": "Uzaicināt jaunus istabas biedrus", "Invited": "Uzaicināts/a", "Invites": "Uzaicinājumi", "Invites user with given id to current room": "Uzaicina lietotāju ar norādīto id uz pašreizējo istabu", "'%(alias)s' is not a valid format for an address": "'%(alias)s' nav pareizā adreses formātā", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' nav pareizā aizstājējvārda formātā", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' nav pareizā aliases (aizstājējvārda) formātā", "%(displayName)s is typing": "%(displayName)s šobrīd raksta", "Sign in with": "Pierakstīties ar", - "Join as voice or video.": "Pievienoties kā balss vai video.", + "Join as voice or video.": "Pievienoties kā AUDIO vai VIDEO.", "Join Room": "Pievienoties istabai", "%(targetName)s joined the room.": "%(targetName)s pievienojās istabai.", - "Joins room with given alias": "Pievieno istabai ar uzdoto aizstājējvārdu", - "Jump to first unread message.": "Pārlekt uz pirmo neizlasīto ziņu.", + "Joins room with given alias": "Pievienojas istabai ar minēto aliasi (pseidonīmu)", + "Jump to first unread message.": "Pāriet uz pirmo neizlasīto ziņu.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s iespēra (kick) %(targetName)s.", - "Kick": "Iespert (kick)", - "Kicks user with given id": "Iesper (kick) lietotājam pēc norādītā id", - "Labs": "Laboratorija", + "Kick": "Izspert/padzīt no istabas (kick)", + "Kicks user with given id": "Padzen (kick) lietotāju ar norādīto Id", + "Labs": "Izmēģinājumu lauciņš", "Last seen": "Pēdējo reizi redzēts/a", - "Leave room": "Pamest istabu", - "%(targetName)s left the room.": "%(targetName)s atstāja istabu.", + "Leave room": "Doties prom no istabas", + "%(targetName)s left the room.": "%(targetName)s devās prom no istabas.", "Level:": "Līmenis:", "Local addresses for this room:": "Šīs istabas lokālās adreses:", "Logged in as:": "Pierakstījās kā:", - "Login as guest": "Pierakstīties kā viesis", + "Login as guest": "Pierakstīties kā viesim", "Logout": "Izrakstīties", - "Low priority": "Zema prioritāte", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s uzstādīja nākotnes istabas ziņu vēsturi redzamu visi istabas biedri secībā, kādā tika uzaicināti.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s uzstādīja nākotnes istabas ziņu vēsturi redzamu visi istabas biedri secībā, kādā ir pievienojušies.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s uzstādīja nākotnes istabas ziņu vēsturi redzamu visi istabas biedri.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s uzstādīja nākotnes istabas ziņu vēsturi redzamu ikviens.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s uzstādīja nākotnes istabas ziņu vēsturi redzamu nezināms (%(visibility)s).", + "Low priority": "Zemas prioritātes", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem no brīža, kad tie tika uzaicināti.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem ar brīdi, kad tie pievienojās.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu ikvienam.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu nepazīstamajiem (%(visibility)s).", "Manage Integrations": "Pārvaldīt integrācijas", - "Markdown is disabled": "Formatēšanas iespēja ir atslēgta", - "Markdown is enabled": "Formatēšanas iespēja ir iespējota", + "Markdown is disabled": "\"Markdown\" formatēšana izslēgta", + "Markdown is enabled": "\"Markdown\" formatēšana ieslēgta", "Turn Markdown off": "Izslēgt formatēšanas iespēju", "Turn Markdown on": "Ieslēgt formatēšanas iespēju", - "matrix-react-sdk version:": "matrix-react-sdk versija:", - "The default role for new room members is": "Noklusējuma loma jaunam istabas biedram ir", + "matrix-react-sdk version:": "Matrix-react-sdk versija:", + "The default role for new room members is": "Jauna istabas biedra statuss pēc noklusējuma ir", "Message not sent due to unknown devices being present": "Ziņa nav nosūtīta, jo tika konstatēta nezināmu ierīču klātbūtne", "Missing room_id in request": "Iztrūkstošs room_id pieprasījumā", "Missing user_id in request": "Iztrūkstošs user_id pieprasījumā", @@ -249,17 +246,17 @@ "Mobile phone number (optional)": "Mobilā telefona numurs (nav obligāts)", "Moderator": "Moderators", "Must be viewing a room": "Jāapskata istaba", - "Mute": "Apklusināt", - "%(serverName)s Matrix ID": "%(serverName)s Matrix ID", + "Mute": "Noklusināt (izslēgt skaņu)", + "%(serverName)s Matrix ID": "%(serverName)s Matrix Id", "Name": "Vārds", - "Never send encrypted messages to unverified devices from this device": "Nekad nesūti no šīs ierīces šifrētas ziņas uz neverificētām ierīcēm", - "Never send encrypted messages to unverified devices in this room from this device": "Nekad nesūti no šīs ierīces šifrētas ziņas neverificētām ierīcēm šajā istabā", - "New address (e.g. #foo:%(localDomain)s)": "Jauna adrese (piemēram #kautkas:%(localDomain)s)", - "New password": "Jauna parole", + "Never send encrypted messages to unverified devices from this device": "Nekad nesūtīt no šīs ierīces šifrētas ziņas uz neverificētām ierīcēm", + "Never send encrypted messages to unverified devices in this room from this device": "Nekad nesūtīt no šīs ierīces šifrētas ziņas neverificētām ierīcēm šajā istabā", + "New address (e.g. #foo:%(localDomain)s)": "Jaunā adrese (piemēram #kautkas:%(localDomain)s)", + "New password": "Jaunā parole", "New passwords don't match": "Jaunās paroles nesakrīt", "New passwords must match each other.": "Jaunajām parolēm ir jāsakrīt vienai ar otru.", - "none": "nekāds", - "not set": "nav iestatījuma", + "none": "neviens", + "not set": "nav iestatīts", "not specified": "nav noteikts", "Notifications": "Paziņojumi", "(not supported by this browser)": "(netiek atbalstīts šajā pārlūkā)", @@ -269,22 +266,21 @@ "No display name": "Nav publiski redzamā vārda", "No more results": "Nav tālāko rezultātu", "No results": "Nav rezultātu", - "No users have specific privileges in this room": "Nav lietotāju ar īpašām privilēģijām šajā istabā", - "OK": "LABI", - "olm version:": "olm versija:", + "No users have specific privileges in this room": "Šajā istabā nav lietotāju ar īpašām privilēģijām", + "OK": "Lai notiek", + "olm version:": "Olm versija:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Tiklīdz istabai tiks iespējota šifrēšana, tā vairs nebūs atslēdzama (pašlaik)", - "Only people who have been invited": "Vienīgi personas, kuras ir tikušas uzaicinātas", + "Only people who have been invited": "Vienīgi cilvēki, kuri uzaicināti", "Operation failed": "Darbība neizdevās", - "Otherwise, click here to send a bug report.": "pretējā gadījumā, klikšķini šeit, lai nosūtītu paziņojumu par kļūdu.", "Password": "Parole", "Password:": "Parole:", "Passwords can't be empty": "Paroles nevar būt tukšas", - "People": "Personas", + "People": "Cilvēki", "Permissions": "Atļaujas", "Phone": "Telefons", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s nolika %(callType)s zvanu.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s veica %(callType)s zvanu.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Lūdzu pārbaudi savu epastu un noklikšķini tajā esošo saiti. Tiklīdz tas ir izdarīts, klikšķini \"turpināt\".", - "Press to start a chat with someone": "Nospied , lai uzsāktu čatu ar kādu", + "Press to start a chat with someone": "Nospied , lai ar kādu uzsāktu čalošanu", "Privacy warning": "Privātuma brīdinājums", "Private Chat": "Privātais čats", "Privileged Users": "Priviliģētie lietotāji", @@ -293,25 +289,24 @@ "Reason": "Iemesls", "Reason: %(reasonText)s": "Iemesls: %(reasonText)s", "Revoke Moderator": "Atcelt moderatoru", - "Refer a friend to Riot:": "Nosūtīt draugu uz Riot:", + "Refer a friend to Riot:": "Rekomendēt draugam Riot:", "Register": "Reģistrēties", "%(targetName)s rejected the invitation.": "%(targetName)s noraidīja uzaicinājumu.", "Reject invitation": "Noraidīt uzaicinājumu", "Rejoin": "Pievienoties atkārtoti", "Remote addresses for this room:": "Attālinātā adrese šai istabai:", "Remove Contact Information?": "Dzēst kontaktinformāciju?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s dzēsa redzamo vārdu (%(oldDisplayName)s).", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s dzēsa attēlojamo/redzamo vārdu (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s dzēsa profila attēlu.", "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", - "Riot does not have permission to send you notifications - please check your browser settings": "Riot nav atļauts nosūtīt Tev paziņojumus. Lūdzu pārbaudi sava pārlūka uzstādījumus", - "Riot was not given permission to send notifications - please try again": "Riot nav atļauts nosūtīt paziņojumus. Lūdzu mēģini vēlreiz.", - "riot-web version:": "riot-web versija:", + "Riot does not have permission to send you notifications - please check your browser settings": "Riot nav atļauts nosūtīt Tev paziņojumus. Lūdzu pārbaudi sava pārlūka iestatījumus", + "Riot was not given permission to send notifications - please try again": "Riot nav piešķirta atļauja nosūtīt paziņojumus. Lūdzu mēģini vēlreiz", + "riot-web version:": "Riot-web versija:", "Unable to enable Notifications": "Nav iespējams iespējot paziņojumus", "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": "Tu izrakstījies no visām ierīcēm un vairs nesaņemsi pašpiegādes (push) paziņojumus. Lai iespējotu paziņojumus, pieraksties atkārtoti katrā no ierīcēm", "You have no visible notifications": "Tev nav redzamo paziņojumu", @@ -320,25 +315,24 @@ "Room %(roomId)s not visible": "Istaba %(roomId)s nav redzama", "%(roomName)s does not exist.": "%(roomName)s neeksistē.", "%(roomName)s is not accessible at this time.": "%(roomName)s šobrīd nav pieejama.", - "Seen by %(userName)s at %(dateTime)s": "Redzams %(userName)s %(dateTime)s", + "Seen by %(userName)s at %(dateTime)s": "Redzējis %(userName)s %(dateTime)s", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s nosūtīja attēlu.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s nosūtīja uzaicinājumu %(targetDisplayName)s pievienoties istabai.", "%(senderName)s set a profile picture.": "%(senderName)s uzstādīja profila attēlu.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s uzstādīja redzamo vārdu uz: %(displayName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s nomainīja attēlojamo/redzamo vārdu uz: %(displayName)s.", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Tevis uzdotā pierakstīšanās atslēga sakrīt ar atslēgu, kuru Tu saņēmi no %(userId)s ierīces %(deviceId)s. Ierīce tika atzīmēta kā verificēta.", - "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Faila '%(fileName)s' izmērs pārsniedz šī mājas servera augšupielādes lieluma ierobežojumu", - "The file '%(fileName)s' failed to upload": "Failu '%(fileName)s' neizdevās augšuplādēt", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ieslēdza ierīce-ierīce šifrēšanu (algorithm %(algorithm)s).", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Faila '%(fileName)s' izmērs pārsniedz šī Bāzes servera augšupielādes lieluma ierobežojumu", + "The file '%(fileName)s' failed to upload": "Failu '%(fileName)s' neizdevās nosūtīt (augšuplādēt)", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ieslēdza \"end-to-end\" (ierīce-ierīce) šifrēšanu (algorithm %(algorithm)s).", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s atcēla pieejas ierobežojumu (atbanoja) %(targetName)s.", "Unknown room %(roomId)s": "Nezināma istaba %(roomId)s", "Uploading %(filename)s and %(count)s others|zero": "Tiek augšuplādēts %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Tiek augšuplādēts %(filename)s un %(count)s citi", "Uploading %(filename)s and %(count)s others|other": "Tiek augšuplādēts %(filename)s un %(count)s citi", - "%(user)s is a": "%(user)s ir", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)", "Username invalid: %(errMessage)s": "Neatbilstošs lietotājvārds: %(errMessage)s", "(unknown failure: %(reason)s)": "(nezināma kļūda: %(reason)s)", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "BRĪDINĀJUMS: NEIZDEVĀS VERIFICĒT ATSLĒGU! Pierakstīšanās atslēga priekš %(userId)s un ierīces %(deviceId)s ir \"%(fprint)s\", kura nesakrīt ar uzdoto atslēgu \"%(fingerprint)s\". Tas var nozīmēt, ka Tava saziņa var tikt pārtverta!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "BRĪDINĀJUMS: NEIZDEVĀS VERIFICĒT ATSLĒGU! Pierakstīšanās atslēga priekš %(userId)s un ierīces %(deviceId)s ir \"%(fprint)s\", kura nesakrīt ar ievadīto atslēgu \"%(fingerprint)s\". Tas var nozīmēt, ka Tava saziņa var tikt pārtverta!", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s atsauca %(targetName)s uzaicinājumu.", "You are trying to access %(roomName)s.": "Tu mēģini piekļūt %(roomName)s.", "You have been banned from %(roomName)s by %(userName)s.": "Tev ir liegta pieeja istabai %(roomName)s no %(userName)s.", @@ -355,11 +349,10 @@ "Failed to invite the following users to the %(roomName)s room:": "Neizdevās uzaicināt sekojošos lietotājus uz %(roomName)s istabu:", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" atrodas ierīces, kuras Tu neesi iepriekš redzējis/usi.", "You are registering with %(SelectedTeamName)s": "Tu reģistrējies ar %(SelectedTeamName)s", - "Image '%(Body)s' cannot be displayed.": "Attēlu '%(Body)s' nav iespējams parādīt.", - "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Notiek tevis novirzīšana uz ārēju trešās puses vietni. Tu vari atļaut savam kontam piekļuvi ar %(integrationsUrl)s. Vai vēlies turpināt?", - "Ongoing conference call%(supportedText)s.": "Ienākošs konferences zvans %(supportedText)s.", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s dzēsa istabas attēlu.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s nomainīja istabas attēlu %(roomName)s", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Notiek Tevis novirzīšana uz ārēju trešās puses vietni. Tu vari atļaut savam kontam piekļuvi ar %(integrationsUrl)s. Vai vēlies turpināt?", + "Ongoing conference call%(supportedText)s.": "Notiekošs konferences zvans %(supportedText)s.", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s dzēsa istabas avataru.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s nomainīja istabas avataru %(roomName)s", "You added a new device '%(displayName)s', which is requesting encryption keys.": "Tu pievienoji jaunu ierīci '%(displayName)s', kas prasa šifrēšanas atslēgas.", "Your unverified device '%(displayName)s' is requesting encryption keys.": "Tava neverificētā ierīce '%(displayName)s' pieprasa šifrēšanas atslēgas.", "Room Colour": "Istabas krāsa", @@ -371,18 +364,18 @@ "Scroll to unread messages": "Aizritināt uz nelasītajām ziņām", "Search": "Meklēt", "Search failed": "Meklēšana neizdevās", - "Searches DuckDuckGo for results": "Meklē DuckDuckGo rezultātus", + "Searches DuckDuckGo for results": "Meklēšanai izmanto DuckDuckGo", "Send anyway": "Nosūtīt jebkurā gadījumā", "Sender device information": "Nosūtītāja ierīces informācija", "Send Invites": "Nosūtīt uzaicinājumus", "Send Reset Email": "Nosūtīt atiestatīšanas epastu", "Server error": "Servera kļūda", - "Server may be unavailable or overloaded": "Serveris var nebūt pieejams vai ir pārslogots", - "Server may be unavailable, overloaded, or search timed out :(": "Serveris var nebūt pieejams, ir pārslogots, vai arī meklēšana beidzās ar savienojuma noilgumu :(", - "Server may be unavailable, overloaded, or the file too big": "Serveris var nebūt pieejams, ir pārslogots, vai arī faila izmērs ir par lielu", - "Server may be unavailable, overloaded, or you hit a bug.": "Serveris var nebūt pieejams, ir pārslogots, vai arī sastapi neparedzētu kļūdu.", - "Server unavailable, overloaded, or something else went wrong.": "Serveris nav pieejams, ir pārslogots, vai arī ir notikusi cita, neparedzēta, kļūda.", - "Session ID": "Sesijas identifikators (ID)", + "Server may be unavailable or overloaded": "Serveris ir nesasniedzams vai pārslogots", + "Server may be unavailable, overloaded, or search timed out :(": "Serveris izskatās nesasniedzams, ir pārslogots, vai arī meklēšana beigusies ar savienojuma noildzi :(", + "Server may be unavailable, overloaded, or the file too big": "Serveris ir nesasniedzams, ir pārslogots, vai arī faila izmērs ir par lielu", + "Server may be unavailable, overloaded, or you hit a bug.": "Serveris ir nesasniedzams, pārslogots, vai arī esi uzdūries kļūdai programmā.", + "Server unavailable, overloaded, or something else went wrong.": "Serveris ir nesasniedzams, pārslogots, vai arī esi uzdūries kļūdai.", + "Session ID": "Sesijas Id", "Settings": "Iestatījumi", "Show panel": "Rādīt paneli", "Show Text Formatting Toolbar": "Rādīt teksta formatēšanas rīkjoslu", @@ -396,37 +389,37 @@ "Start authentication": "Sākt autentifikāciju", "Start Chat": "Sākt čatu", "Submit": "Iesniegt", - "Success": "Veiksmīgi", - "Tagged as: ": "Atzīmēts,kā: ", + "Success": "Izdevās", + "Tagged as: ": "Pievienotas birkas: ", "The main address for this room is": "Galvenā šīs istabas adrese ir", "The phone number entered looks invalid": "Ievadītais telefona numurs izskatās nepareizs", "This email address is already in use": "Šī epasta adrese jau tiek izmantota", "This email address was not found": "Šāda epasta adrese nav atrasta", - "The email address linked to your account must be entered.": "Ir jāievada tavam kontam piesaistītā epasta adrese.", - "The remote side failed to pick up": "Neizdevās uzņemt attālināto pusi", - "This Home Server does not support login using email address.": "Šis serveris neatbalsta pierakstīšanos ar epasta adresi.", + "The email address linked to your account must be entered.": "Ir jāievada Tavam kontam piesaistītā epasta adrese.", + "The remote side failed to pick up": "Zvana adresāts neatbild", + "This Home Server does not support login using email address.": "Šis Bāzes serveris nenodrošina pierakstīšanos ar epasta adresi.", "This invitation was sent to an email address which is not associated with this account:": "Šis uzaicinājums tika nosūtīts uz epasta adresi, kura nav piesaistīta šim kontam:", "This room has no local addresses": "Šai istabai nav lokālo adrešu", "This room is not recognised.": "Šī istaba netika atpazīta.", - "These are experimental features that may break in unexpected ways": "Šīs ir eksperimentālās iespējas, kuras var būt dažādos veidos nestrādājošas", + "These are experimental features that may break in unexpected ways": "Šīs ir eksperimentālas funkcijas, kuras reizēm var novest pie pārsteidzošiem rezultātiem", "The visibility of existing history will be unchanged": "Esošās ziņu vēstures redzamība paliks nemainīga", "This doesn't appear to be a valid email address": "Šī neizskatās pēc derīgas epasta adreses", - "This is a preview of this room. Room interactions have been disabled": "Šis ir esošās istabas priekšskatījums. Istabas mijiedarbība ir atspējota", + "This is a preview of this room. Room interactions have been disabled": "Šis ir esošās istabas priekšskats. Istabas mijiedarbība ir atspējota", "This phone number is already in use": "Šis telefona numurs jau tiek izmantots", - "This room": "Šī istaba", + "This room": "šajā istabā", "This room is not accessible by remote Matrix servers": "Šī istaba nav pieejama no attālinātajiem Matrix serveriem", - "This room's internal ID is": "Šīs istabas iekšējais ID ir", + "This room's internal ID is": "Šīs istabas iekšējais Id ir", "To link to a room it must have an address.": "Lai ieliktu saiti uz istabu, tai ir jābūt piešķirtai adresei.", - "To reset your password, enter the email address linked to your account": "Lai atiestatītu savu paroli, ievadi tavam kontam piesaistīto epasta adresi", + "To reset your password, enter the email address linked to your account": "Lai atiestatītu savu paroli, ievadi savam kontam piesaistīto epasta adresi", "To use it, just wait for autocomplete results to load and tab through them.": "Lai to izmantotu, vienkārši gaidi, kamēr ielādējas automātiski ieteiktie rezultāti, un pārvietojies caur tiem.", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Notika mēģinājums ielādēt šīs istabas specifisku laikpaziņojumu sadaļu, bet Tev nav atļaujas skatīt šo ziņu.", - "Tried to load a specific point in this room's timeline, but was unable to find it.": "Notika mēģinājums ielādēt šīs istabas specifisku laikpaziņojumu sadaļu, bet tā netika atrasta.", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "Mēģinājums ielādēt šīs istabas čata vēstures izvēlēto posmu neizdevās, jo tas netika atrasts.", "Unable to add email address": "Nav iespējams pievienot epasta adresi", "Unable to remove contact information": "Nav iespējams dzēst kontaktinformāciju", "Unable to verify email address.": "Nav iespējams apstiprināt epasta adresi.", - "Unban": "Atbanot", - "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Nav iespējams pārliecināties, ka šis uzaicinājums tika nosūtīts uz to pašu adresi, kura ir piesaistīta tavam kontam.", - "Unable to capture screen": "Nav iespējams uzņemt ekrānattēlu", + "Unban": "Atbanot/atcelt pieejas liegumu", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Nav iespējams pārliecināties, ka šis uzaicinājums tika nosūtīts uz to pašu adresi, kura ir piesaistīta Tavam kontam.", + "Unable to capture screen": "Neizdevās uzņemt ekrānattēlu", "Unable to load device list": "Nav iespējams ielādēt ierīču sarakstu", "Undecryptable": "Neatšifrējams", "Unencrypted room": "Nešifrēta istaba", @@ -440,21 +433,21 @@ "Unnamed Room": "Istaba bez nosaukuma", "Cancel": "Atcelt", "Create new room": "Izveidot jaunu istabu", - "Custom Server Options": "Īpaši servera uzstādījumi", - "Dismiss": "Noņemt", - "You have enabled URL previews by default.": "Tev ir pēc noklusējuma iespējots URL adrešu priekšskatījums.", + "Custom Server Options": "Iestatāmās servera opcijas", + "Dismiss": "Atteikt", + "You have enabled URL previews by default.": "URL priekšskats pēc noklusējuma Tev iriespējots .", "Unrecognised command:": "Neatpazīta komanda:", - "Unrecognised room alias:": "Neatpazīts istabas aizstājējvārds:", + "Unrecognised room alias:": "Neatpazīta istabas aliase:", "Unverified": "Neverificēts", - "Upload avatar": "Augšuplādē profila attēlu", - "Upload Failed": "Augšupielāde neizdevās", - "Upload Files": "Augšuplādē failus", - "Upload file": "Augšuplādē failu", - "Upload new:": "Augšuplādē jaunu:", + "Upload avatar": "Augšuplādēt avataru (profila attēlu)", + "Upload Failed": "Augšupielāde (nosūtīšana) neizdevās", + "Upload Files": "Augšuplādēt failus", + "Upload file": "Augšuplādēt failu", + "Upload new:": "Augšuplādēt jaunu:", "Usage": "Lietojums", "Use compact timeline layout": "Izmanto kompaktu laikpaziņojumu skatu", "Use with caution": "Izmanto piesardzīgi", - "User ID": "Lietotāja ID", + "User ID": "Lietotāja Id", "User Interface": "Lietotāja saskarne", "User name": "Lietotāja vārds", "Users": "Lietotāji", @@ -465,41 +458,41 @@ "Verified key": "Verificēta atslēga", "WARNING: Device already verified, but keys do NOT MATCH!": "BRĪDINĀJUMS: Ierīce ir jau verificēta, bet NESAKRĪT atslēgas!", "In future this verification process will be more sophisticated.": "Nākotnē šis verifikācijas process būs draudzīgāks.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Tu šobrīd esi iekļāvis/usi neverificētas ierīces melnajā sarakstā. Lai nosūtītu ziņas uz šādām ierīcēm, Tev viņas ir jāverificē.", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Tu šobrīd esi iekļāvis/usi neverificētas ierīces melnajā sarakstā. Lai nosūtītu ziņas uz šādām ierīcēm, Tev tās ir jāverificē.", "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.": "Mēs rekomendējam Tev pārskatīt verifikācijas procesu katrai ierīcei, lai apstiprinātu tās piederību īstajam īpašniekam, bet Tu vari nosūtīt ziņu vēlreiz bez verificēšanas, ja vēlies.", "Start verification": "Sākt verifikāciju", - "Video call": "Video zvans", - "Voice call": "Balss zvans", - "VoIP conference finished.": "VoIP konference ir beigusies.", - "VoIP conference started.": "VoIP konference ir sākusies.", + "Video call": "VIDEO zvans", + "Voice call": "AUDIO zvans", + "VoIP conference finished.": "VoIP konference beidzās.", + "VoIP conference started.": "VoIP konference sākās.", "VoIP is unsupported": "VoIP netiek atbalstīts", "(could not connect media)": "(nav iespējams savienoties ar mediju)", "(no answer)": "(nav atbildes)", - "(warning: cannot be disabled again!)": "(brīdinājums: nav iespējams atspējot atkārtoti!)", + "(warning: cannot be disabled again!)": "(brīdinājums: to nebūs iespējams atslēgt!)", "Warning!": "Brīdinājums!", "Who can access this room?": "Kurš var piekļūt istabai?", - "Who can read history?": "Kurš var lasīt vēsturi?", - "Who would you like to add to this room?": "Kuru vēlies pievienot šai istabai?", + "Who can read history?": "Kas var lasīt vēsturi?", + "Who would you like to add to this room?": "Ko Tu vēlies pievienot šai istabai?", "Who would you like to communicate with?": "Ar kuru vēlies komunicēt?", "Would you like to accept or decline this invitation?": "Vai vēlies apstiprināt vai noraidīt šo uzaicinājumu?", - "You already have existing direct chats with this user:": "Tev jau ir eksistējošs tiešais čats ar šo lietotāju:", - "You are already in a call.": "Tu jau šobrīd atrodies zvanā.", + "You already have existing direct chats with this user:": "Tev jau ir viens tiešais čats ar šo lietotāju:", + "You are already in a call.": "Tu jau šobrīd esi sarunā.", "You're not in any rooms yet! Press to make a room or to browse the directory": "Šobrīd Tu vēl neatrodies nevienā istabā! Klikšķini lai izveidotu istabu, vai , lai skatītu istabu katalogu", - "You cannot place a call with yourself.": "Tu nevari veikt zvanu sev.", - "You cannot place VoIP calls in this browser.": "Tu nevari veikt VoIP zvanus šajā pārlūkā.", - "You do not have permission to post to this room": "Tev nav vajadzīgās atļaujas pievienot ziņas šajā istabā", - "You have disabled URL previews by default.": "URL priekšskatījums pēc noklusējuma Tev ir atspējots.", + "You cannot place a call with yourself.": "Nav iespējams piezvanīt sev.", + "You cannot place VoIP calls in this browser.": "VoIP zvani šajā pārlūkā netiek atbalstīti.", + "You do not have permission to post to this room": "Tev nav vajadzīgo atļauju, lai rakstītu ziņas šajā istabā", + "You have disabled URL previews by default.": "URL priekšskats pēc noklusējuma Tev ir atspējots.", "You may wish to login with a different account, or add this email to this account.": "Tu varētu, iespējams, vēlēties pierakstīties no cita konta vai piesaistīt šo epastu šim kontam.", "You must register to use this functionality": "Lai izmantotu šo funkcionalitāti, Tev ir jāreģistrējas", "You need to be able to invite users to do that.": "Lai to darītu, Tev ir jāspēj uzaicināt lietotājus.", "You need to be logged in.": "Tev ir jāpierakstās.", "You need to enter a user name.": "Tev ir jāievada lietotāja vārds.", - "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Tava epasta adrese nav piesaistīta pie Matrix ID šajā mājas serverī.", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Tava epasta adrese nav piesaistīta pie Matrix Id šajā Bāzes serverī.", "Your password has been reset": "Tava parole tika atiestatīta", "You seem to be in a call, are you sure you want to quit?": "Izskatās, ka atrodies zvana režīmā. Vai tiešām vēlies iziet?", "You seem to be uploading files, are you sure you want to quit?": "Izskatās, ka šobrīd augšuplādē failus. Vai tiešām vēlies iziet?", "You should not yet trust it to secure data": "Tev nevajadzētu uz to vēl paļauties, lai saglabātu datu drošību", - "Your home server does not support device management.": "Tavs mājas serveris neatbalsta ierīču pārvaldīšanu.", + "Your home server does not support device management.": "Tavs Bāzes serveris neatbalsta ierīču pārvaldīšanu.", "Sun": "Sv.", "Mon": "P.", "Tue": "O.", @@ -519,10 +512,9 @@ "Oct": "Okt.", "Nov": "Nov.", "Dec": "Dec.", - "Set a display name:": "Iestatīt redzamo vārdu:", - "This image cannot be displayed.": "Šo attēlu nav iespējams parādīt.", - "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s nomainīja istabas attēlu uz ", - "Upload an avatar:": "Augšuplādē profila attēlu:", + "Set a display name:": "Iestatīt attēloto vārdu:", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s nomainīja istabas avataru uz ", + "Upload an avatar:": "Augšuplādē avataru (profila attēlu):", "This server does not support authentication with a phone number.": "Šis serveris neatbalsta autentifikāciju pēc telefona numura.", "Missing password.": "Trūkst parole.", "Passwords don't match.": "Paroles nesakrīt.", @@ -531,33 +523,32 @@ "User names may only contain letters, numbers, dots, hyphens and underscores.": "Lietotājvārdi drīkst saturēt vienīgi alfabēta burtus, skaitļus, punktus, defises un apakšsvītras.", "An unknown error occurred.": "Notikusi neparedzēta kļūda.", "I already have an account": "Man jau ir konts", - "Topic": "Tēma", - "Make Moderator": "Piešķirt moderatora līmeni", + "Topic": "Temats", + "Make Moderator": "Piešķirt moderatora statusu", "Make this room private": "Padarīt šo istabu privātu", "Share message history with new users": "Kopīgot ziņu vēsturi ar jauniem lietotājiem", "Encrypt room": "Šifrēt istabu", "There are no visible files in this room": "Nav redzamu failu šajā istabā", "Room": "Istaba", - "Connectivity to the server has been lost.": "Savienojums ar serveri tika zaudēts.", + "Connectivity to the server has been lost.": "Savienojums ar serveri pārtrūka.", "Sent messages will be stored until your connection has returned.": "Nosūtītās ziņas tiks saglabātas tiklīdz savienojums tiks atjaunots.", "Active call": "Aktīvs zvans", - "bold": "trekns", - "italic": "itāļu", - "strike": "svītrots", + "bold": "treknraksts", + "italic": "kursīvs", + "strike": "caursvītrots", "underline": "pasvītrots", "code": "kods", "quote": "citāts", - "bullet": "lode", - "numbullet": "lode ar numuru", + "bullet": "bumbulis", + "numbullet": "numurēts bumbulis", "Please select the destination room for this message": "Lūdzu izvēlies šīs ziņas mērķa istabu", "Room directory": "Istabu katalogs", - "Start chat": "Uzsākt čatu", - "New Password": "Jauna parole", - "Start automatically after system login": "Uzsākt automātiski pēc pierakstīšanās sistēmā", - "Desktop specific": "Darbvirsmai specifiski", + "Start chat": "Uzsākt čalošanu", + "New Password": "Jaunā parole", + "Start automatically after system login": "Startēt pie ierīces ielādes", + "Desktop specific": "Darbvirsmai specifiskie", "Analytics": "Analītika", - "Opt out of analytics": "Atteikties no analītikas", - "Options": "Iespējas", + "Options": "Opcijas/iestatījumi", "Riot collects anonymous analytics to allow us to improve the application.": "Riot ievāc anonīmus analītikas datus, lai varētu uzlabot aplikācijas darbību.", "Passphrases must match": "Paroles frāzēm ir jāsakrīt", "Passphrase must not be empty": "Paroles frāze nevar būt tukša", @@ -565,20 +556,18 @@ "Confirm passphrase": "Apstiprināt paroles frāzi", "Import room keys": "Importēt istabas atslēgas", "File to import": "Importējamais fails", - "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Šī darbība atļauj Tev eksportēt lokālā failā atslēgas tām ziņām, kuras Tu saņēmi šifrētās istabās. Pēc tam nākotnē Tu varēsi importēt šo failu citā Matrix klienta aplikācijā, lai tajā būtu iespējams atšifrēt šīs ziņas.", - "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Eksportētais fails atļaus ikvienam, kurš to ir nolasījis, atšifrēt jebkuras tev redzamās šifrētās ziņas, tāpēc ievēro piesardzību, un glabā šo failu drošā vietā. Lai palīdzētu to nodrošināt, Tev ir jāievada paroles frāze, kura tiks izmantota eksportēto datu šifrēšanai. Datu importēšana būs iespējama tikai izmantojot šo pašu paroles frāzi.", - "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Šis process ļauj Tev importēt tās šifrēšanas atslēgas, kuras Tu iepriekš eksportēji no citas Matrix klienta aplikācijas. Importētās atslēgas ļaus vajadzīgajā klienta aplikācijā lasīt atšifrētās ziņas.", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Šī darbība ļauj Tev uz lokālo failu eksportēt atslēgas priekš tām ziņām, kuras Tu saņēmi šifrētās istabās. Tu varēsi importēt šo failu citā Matrix klientā, lai tajā būtu iespējams lasīt šīs ziņas atšifrētas.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Eksportētais fails ļaus ikvienam, kurš to spēj lasīt, atšifrēt jebkuras Tavas šifrētās ziņas, tāpēc ievēro piesardzību, un glabā šo failu drošā vietā. Lai palīdzētu to nodrošināt, Tev jāievada paroles frāze, kura tiks izmantota eksportēto datu šifrēšanai. Datu importēšana būs iespējama tikai izmantojot šo pašu paroles frāzi.", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Šis process ļaus Tev importēt šifrēšanas atslēgas, kuras Tu iepriekš eksportēji no cita Matrix klienta. Tas ļaus Tev atšifrēt čata vēsturi.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Eksporta fails būs aizsargāts ar paroles frāzi. Tā ir jāievada šeit, lai atšifrētu failu.", "You must join the room to see its files": "Tev ir jāpievienojas istabai, lai redzētu tās failus", - "Start new chat": "Uzsākt jaunu čatu", + "Start new chat": "Uzsākt jaunu čalu", "Failed to invite": "Neizdevās uzaicināt", "Failed to invite user": "Neizdevās uzaicināt lietotāju", "Confirm Removal": "Apstiprini dzēšanu", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Vai tiešām vēlies dzēst šo notikumu? Ņem vērā, ka istabas nosaukuma vai tēmas nosaukuma maiņa var ietekmēt (atsaukt) izmaiņas.", "Unknown error": "Nezināma kļūda", "Incorrect password": "Nepareiza parole", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Tas uz visiem laikiem padarīs tavu kontu neizmantojamu, un Tu vairs nevarēsi atkārtoti reģistrēt šo pašu lietotāja ID.", - "This action is irreversible.": "Šī darbība ir neatgriezeniska.", "To continue, please enter your password.": "Lai turpinātu, ievadi savu paroli.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Lai verificētu šīs ierīces uzticamību, lūdzu sazinies ar tās īpašnieku, izmantojot citu saziņas veidu (piemēram, sazinoties personiski vai telefoniski) un pajautā, vai atslēga, kuru īpašnieks redz savos lietotāja iestatījumos, sakrīt ar šo atslēgu:", "Device name": "Ierīces nosaukums", @@ -586,89 +575,85 @@ "Device key": "Ierīces atslēga", "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.": "Ja tā sakrīt, tad nospied zemāk esošo verifikācijas pogu . Ja nesakrīt, tad kāds cits ir piekļuvis šai ierīcei un šādā gadījumā Tu, iespējams, vēlies izmantot \"melnais saraksts\" iespēju.", "Verify device": "Verificēt ierīci", - "I verify that the keys match": "Es pārbaudu, vai atslēgas sakrīt", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Mēs sastapāmies ar kļūdu, mēģinot atjaunot tavu iepriekšējo sesiju. Ja vēlies turpināt, tev ir jāpierakstās par jaunu un šifrēta čata ziņu vēsture nebūs izlasāma.", + "I verify that the keys match": "Es apstiprinu, ka atslēgas sakrīt", "Unable to restore session": "Nav iespējams atjaunot sesiju", "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.": "Ja Tu iepriekš izmantoji jaunāku Riot versiju, tava sesija var nebūt saderīga ar šo versiju. Aizver šo logu un atgriezies jaunākajā versijā.", - "Continue anyway": "Turpināt jebkurā gadījumā", "Unknown devices": "Nezināmas ierīces", "Unknown Address": "Nezināma adrese", "Unblacklist": "Atbloķēšanas saraksts", "Blacklist": "Melnais saraksts", "Unverify": "Atverificēt", "Verify...": "Verificē...", - "ex. @bob:example.com": "piemēram, @janis:majaslapa.lv", + "ex. @bob:example.com": "piemēram, @valters:smaidu.lv", "Add User": "Pievienot lietotāju", - "This Home Server would like to make sure you are not a robot": "Šis mājas serveris vēlas pārliecināties, ka Tu neesi robots", + "This Home Server would like to make sure you are not a robot": "Šis Bāzes serveris vēlas pārliecināties, ka neesi robots", "Sign in with CAS": "Pierakstīties ar CAS", - "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Tu vari izmantot īpašos servera uzstādījumus, lai pierakstītos citos Matrix serveros, norādot citu mājas servera URL adresi.", - "This allows you to use this app with an existing Matrix account on a different home server.": "Tas atļauj Tev izmantot šo aplikāciju ar eksistējošu Matrix kontu citā mājas serverī.", - "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Tu vari arī iestatīt īpašu identitātes serveri, bet tas parasti liedz iespēju mijiedarboties ar lietotājiem, kuri izmanto epasta adresi.", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Tu vari izmantot īpašos servera uzstādījumus, lai pierakstītos citos Matrix serveros, norādot citu Bāzes servera URL adresi.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Tas atļauj Tev izmantot šo aplikāciju ar esošu Matrix kontu citā Bāzes serverī.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Tu vari arī iestatīt īpašu Identitātes serveri, bet tas parasti liedz iespēju mijiedarboties ar lietotājiem, kuri izmanto epasta adresi.", "Please check your email to continue registration.": "Lūdzu pārbaudi savu epastu lai turpinātu reģistrāciju.", - "Token incorrect": "Nepareizs autentifikācijas kods", + "Token incorrect": "Nepareizs autentifikācijas tokens", "Please enter the code it contains:": "Lūdzu ievadi tajā ietverto kodu:", - "powered by Matrix": "spēcināts ar Matrix", - "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ja Tu nenorādīsi epasta adresi, tev nebūs iespējams izmantot paroles atiestatīšanu. Vai esi pārliecināts/a?", - "Default server": "Noklusējuma serveris", - "Custom server": "Īpašs serveris", - "Home server URL": "Mājas servera URL adrese", + "powered by Matrix": "Tiek darbināta ar Matrix", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ja Tu nenorādīsi epasta adresi, tev nebūs iespējams izmantot paroles atiestatīšanu. Vai to vēlies?", + "Default server": "Serveris pēc noklusējuma", + "Custom server": "Nestandarta serveris", + "Home server URL": "Bāzes servera URL adrese", "Identity server URL": "Identitātes servera URL adrese", "What does this mean?": "Ko tas nozīmē?", "Error decrypting audio": "Kļūda atšifrējot audio", "Error decrypting image": "Kļūda atšifrējot attēlu", "Error decrypting video": "Kļūda atšifrējot video", "Add an Integration": "Pievienot integrāciju", - "Removed or unknown message type": "Dzēsts vai nezināms ziņas veids", - "URL Previews": "URL adrešu priekšskatījumi", + "Removed or unknown message type": "Dzēsts vai nezināms ziņas tips", + "URL Previews": "URL priekšskats", "Drop file here to upload": "Ievelc failu šeit lai augšuplādētu", " (unsupported)": " (netiek atbalstīts)", - "Online": "Tiešsaistē", - "Idle": "Dīkstāve", - "Offline": "Nav tiešsaistē", - "Updates": "Atjauninājumi", - "Check for update": "Pārbaudīt, vai ir atjauninājumi", - "Start chatting": "Sākt čatošanu", - "Start Chatting": "Sākt čatošanu", - "Click on the button below to start chatting!": "Klikšķini uz zemāk esošās pogas, lai uzsāktu čatošanu!", + "Online": "Onlainā", + "Idle": "Dīkstāvē", + "Offline": "Atsaistē (ārpus tīkla)", + "Updates": "Aktualizācijas", + "Check for update": "Pārbaudīt, vai ir aktualizācijas", + "Start chatting": "Sākt čalošanu", + "Start Chatting": "Sākt čalošanu", + "Click on the button below to start chatting!": "Klikšķini uz zemāk esošās pogas, lai uzsāktu čalošanu!", "Username available": "Lietotājvārds ir pieejams", "Username not available": "Lietotājvārds nav pieejams", "Something went wrong!": "Kaut kas nogāja greizi!", - "This will be your account name on the homeserver, or you can pick a different server.": "Tas būs tava konta vārds mājas serverī, vai arī vari izvēlēties citu serveri.", + "This will be your account name on the homeserver, or you can pick a different server.": "Šis būs Tavs konta vārds Bāzes serverī, vai arī vari izvēlēties citu serveri.", "If you already have a Matrix account you can log in instead.": "Vai arī, ja Tev jau ir Matrix konts, tu vari pierakstīties tajā.", "Your browser does not support the required cryptography extensions": "Tavs pārlūks neatbalsta vajadzīgos kriptogrāfijas paplašinājumus", "Not a valid Riot keyfile": "Nederīgs Riot atslēgfails", "Authentication check failed: incorrect password?": "Autentifikācijas pārbaude neizdevās. Nepareiza parole?", "Disable Peer-to-Peer for 1:1 calls": "Atspējot Peer-to-Peer iespēju 1:1 zvaniem", - "Do you want to set an email address?": "Vai vēlies iestatīt epasta adresi?", + "Do you want to set an email address?": "Vai vēlies norādīt epasta adresi?", "To return to your account in future you need to set a password": "Lai nākotnē atgrieztos savā kontā, tev ir nepieciešams iestatīt paroli", "Skip": "Izlaist", "Share without verifying": "Kopīgot bez verificēšanas", "Ignore request": "Ignorēt pieprasījumu", "Encryption key request": "Šifrēšanas atslēgas pieprasījums", - "Add a widget": "Pievienot Widžetu", + "Add a widget": "Pievienot vidžetu", "Allow": "Atļaut", "and %(count)s others...|other": "un vēl %(count)s citi...", "and %(count)s others...|one": "un vēl viens cits...", - "Cannot add any more widgets": "Nav iespējams pievienot vairāk vidžetu", + "Cannot add any more widgets": "Nav iespējams pievienot vairāk vidžetus", "Changes colour scheme of current room": "Nomaina pašreizējās istabas krāsu paleti", - "Delete widget": "Dzēst widžetu", - "Define the power level of a user": "Definēt lietotāja pakāpes līmeni", + "Delete widget": "Dzēst vidžetu", + "Define the power level of a user": "Definē lietotāja statusu", "Do you want to load widget from URL:": "Vai vēlies ielādēt widžetu no URL:", - "Edit": "Labot", + "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 pievienoties/pamest ziņas (tas neietekmē uzaicinājumus, vai kick/bana darbības)", + "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ā?", "AM": "AM", - "PM": "PZ", + "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": "Uzstāda istabas tēmas nosaukumu", - "Show Apps": "Rādīt aplikācijas", - "The maximum permitted number of widgets have already been added to this room.": "Atļautais vidžetu skaits jau ir sasniegts šai istabai.", + "Sets the room topic": "Iestata istabas tematu", + "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.", - "Unbans user with given id": "Atceļ pieejas liegumu (atbano) lietotāju pēc norādītā id", + "Unbans user with given id": "Atbloķē (atceļ pieejas liegumu) lietotāju pēc norādītā ID (atbano)", "You are not in this room.": "Tu neatrodies šajā istabā.", "You do not have permission to do that in this room.": "Tev nav atļaujas šai darbībai šajā istabā.", "Verifies a user, device, and pubkey tuple": "Verificē lietotāju, ierīci, un publiskās atslēgas", @@ -678,11 +663,476 @@ "Create": "Izveidot", "Featured Rooms:": "Ieteiktās istabas:", "Featured Users:": "Ieteiktie lietotāji:", - "Automatically replace plain text Emoji": "Automātiski aizvieto tekstu ar emocijikonu (emoji)", + "Automatically replace plain text Emoji": "Automātiski aizvietot tekstu ar emocīšiem (emoji)", "Failed to upload image": "Neizdevās augšupielādēt attēlu", - "Hide avatars in user and room mentions": "Slēpt profila attēlus lietotāja un istabas pieminējumatzīmēs (@mention)", + "Hide avatars in user and room mentions": "Slēpt profila attēlus lietotāja un istabas pieminējumos", "%(widgetName)s widget added by %(senderName)s": "%(senderName)s pievienoja %(widgetName)s vidžetu", "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s dzēsa vidžetu %(widgetName)s", "Robot check is currently unavailable on desktop - please use a web browser": "Robotu pārbaude šobrīd nav pieejama darbvirsmas versijā. Lūdzu izmanto web pārlūku", - "Revoke widget access": "Atsaukt vidžeta piekļuvi" + "Revoke widget access": "Atsaukt vidžeta piekļuvi", + "Unpin Message": "Atkabināt ziņu", + "Add rooms to this community": "Pievienot istabas šai kopienai", + "Failed to set direct chat tag": "Neizdevās tiešajam čatam uzstādīt birku", + "Warning": "Brīdinājums", + "Send": "Sūtīt", + "Leave": "Doties prom (atstāt)", + "Unnamed room": "Nenosaukta istaba", + "Guests can join": "Var pievienoties viesi", + "The platform you're on": "Izmantotā operētājsistēma", + "The version of Riot.im": "Riot.im versija", + "Whether or not you're logged in (we don't record your user name)": "Neatkarīgi no tā, vai esi vai neesi iegājis sistēmā (netiek fiksēts Tavs lietotājvārds)", + "Your language of choice": "Izvēlētā valoda", + "Which officially provided instance you are using, if any": "Kuru oficiāli izlaisto versiju izmantojat (ja to darat)", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Neatkarīgi no tā, vai izmantojat Richtext režīmu redaktorā Rich Text Editor", + "Your homeserver's URL": "Bāzes servera URL adrese", + "Your identity server's URL": "Tava Identitātes servera URL adrese", + "The information being sent to us to help make Riot.im better includes:": "Informācija, kura mums tiek nosūtīta, lai ļautu padarīt Riot.im labāku, ietver:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Ja šī lapa ietver identificējamu informāciju, tādu kā istaba, lietotājs, grupas Id, šie dati tiek noņemti pirms nosūtīšanas uz serveri.", + "Call Failed": "Zvans neizdevās", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Šajā istabā ir nepazīstamas ierīces: ja Tu turpināsi bez to pārbaudes, ir iespējams, ka kāda nepiederoša persona var noklausīties Tavas sarunas.", + "Review Devices": "Ierīču pārskats", + "Call Anyway": "Vienalga zvanīt", + "Answer Anyway": "Vienalga atbildēt", + "Call": "Zvans", + "Answer": "Atbildēt", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", + "Who would you like to add to this community?": "Kurus cilvēkus Tu vēlētos pievienot šai kopienai?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Brīdinājums: ikviens, kurš tiek pievienots kopienai būs publiski redzams visiem, kuri zin kopienas Id", + "Invite new community members": "Uzaicināt jaunus kopienas biedrus", + "Name or matrix ID": "Vārds vai Matrix Id", + "Invite to Community": "Uzaicināt kopienā", + "Which rooms would you like to add to this community?": "Kuras istabas vēlies pievienot šai kopienai?", + "Show these rooms to non-members on the community page and room list?": "Vai ne-biedriem rādīt kopienas lapā un istabu sarakstā šīs istabas?", + "Add rooms to the community": "Istabu pievienošana kopienai", + "Room name or alias": "Istabas nosaukums vai aliase", + "Add to community": "Pievienot kopienai", + "Failed to invite the following users to %(groupId)s:": "Neizdevās uzaicināt sekojošus lietotājus grupā %(groupId)s:", + "Failed to invite users to community": "Neizdevās uzaicināt lietotājus komūnā", + "Failed to invite users to %(groupId)s": "Neizdevās uzaicināt lietotājus grupā %(groupId)s", + "Failed to add the following rooms to %(groupId)s:": "Neizdevās pievienot sekojošas istabas grupai %(groupId)s:", + "Restricted": "Ierobežots", + "Ignored user": "Ignorēts lietotājs", + "You are now ignoring %(userId)s": "Tagad Tu ignorē %(userId)s", + "Unignored user": "Atignorēts lietotājs", + "You are no longer ignoring %(userId)s": "Tu vairāk neignorē %(userId)s", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s nomainīja savu attēlojamo/redzamo vārdu uz %(displayName)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s šai istabai nomainīja piestiprinātās ziņas.", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s vidžets, kuru mainīja %(senderName)s", + "%(names)s and %(count)s others are typing|other": "%(names)s un %(count)s citi raksta", + "%(names)s and %(count)s others are typing|one": "%(names)s un vēl kāds raksta", + "Message Replies": "Atbildes uz ziņām", + "Message Pinning": "Ziņu piekabināšana", + "Tag Panel": "Birku panelis", + "Disable Emoji suggestions while typing": "Atspējot Emoji ieteikumus teksta rakstīšanas laikā", + "Hide avatar changes": "Slēpt avatara izmaiņas", + "Hide display name changes": "Slēpt attēlojamā/redzamā vārda izmaiņas", + "Disable big emoji in chat": "Atspējot čatā lielos emocīšus (emoji)", + "Mirror local video feed": "Spoguļot vietējā video barotni", + "Enable inline URL previews by default": "URL priekšskats pēc noklusējuma", + "Enable URL previews for this room (only affects you)": "URL priekšskati šai istabai (ietekmē tikai Tevi pašu)", + "Enable URL previews by default for participants in this room": "URL priekšskati pēc noklusējuma visiem šīs istabas dalībniekiem", + "Delete %(count)s devices|other": "Dzēst %(count)s ierīces", + "Delete %(count)s devices|one": "Dzēst ierīci", + "Select devices": "Izvēlēties ierīces", + "%(senderName)s sent an image": "%(senderName)s nosūtīja bildi", + "%(senderName)s sent a video": "%(senderName)s nosūtīja video", + "%(senderName)s uploaded a file": "%(senderName)s augšupielādēja failu", + "Disinvite this user?": "Atsaukt ielūgumu šim lietotājam?", + "Kick this user?": "Izspert/padzīt (kick) šo lietotāju?", + "Unban this user?": "Atbanot/atbloķēt šo lietotāju (atcelt liegumu šim lietotājam)?", + "Ban this user?": "Nobanot/bloķēt šo lietotāju (uzlikt liegumu šim lietotājam)?", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Jūs nevarēsiet atcelt šīs izmaiņas pēc sava statusa pazemināšanas. Gadījumā, ja esat pēdējais priviliģētais lietotājs istabā, būs neiespējami atgūt šīs privilēģijas.", + "Unignore": "Atcelt ignorēšanu", + "Ignore": "Ignorēt", + "Jump to read receipt": "Pāriet uz izlasīšanas apstiprinājumu", + "Mention": "Pieminējums/atsauce", + "Invite": "Uzaicināt", + "User Options": "Lietotāja uzstādījumi/opcijas", + "Send an encrypted reply…": "sūtīt šifrētu atbildi…", + "Send a reply (unencrypted)…": "sūtīt NEšifrētu atbildi…", + "Send an encrypted message…": "rakstīt ziņu (šifrētu)…", + "Send a message (unencrypted)…": "rakstīt ziņu (NEšifrētu)…", + "Jump to message": "Pāriet uz ziņu", + "No pinned messages.": "Nav piekabinātu ziņu.", + "Loading...": "Ielāde...", + "Pinned Messages": "Piekabinātās ziņas", + "%(duration)ss": "%(duration)s sek", + "%(duration)sm": "%(duration)smin", + "%(duration)sh": "%(duration)sstundas", + "%(duration)sd": "%(duration)sdienas", + "Online for %(duration)s": "Pieslēgumā %(duration)s", + "Idle for %(duration)s": "Dīkstāvē (neaktīvs) %(duration)s", + "Offline for %(duration)s": "Atslēgumā %(duration)s", + "Unknown for %(duration)s": "Neskaidrā statusā %(duration)s", + "Unknown": "Neskaidrs statuss", + "Replying": "Atbildot uz", + "No rooms to show": "Nav istabu, kuras parādīt", + "World readable": "Pieejama ikvienam un no visurienes", + "Remove avatar": "Dzēst avataru (profila attēlu)", + "Drop here to favourite": "Atvilkt uz šejieni (nomest šeit), lai iekļautu favorītos (izlasē)", + "Drop here to tag direct chat": "Atvilkt uz šejieni (nomest šeit), lai pievienotu atzīmi \"Tiešais čats\"", + "Drop here to restore": "Atvilkt uz šejieni (nomest šeit), lai atjaunotu/atgrieztu", + "Drop here to demote": "Atvilkt uz šejieni (nomest šeit), lai pazeminātu statusā", + "Failed to remove tag %(tagName)s from room": "Neizdevās istabai noņemt birku %(tagName)s", + "Failed to add tag %(tagName)s to room": "Neizdevās istabai pievienot birku %(tagName)s", + "Community Invites": "Uzaicinājums uz kopienu", + "You have been kicked from this room by %(userName)s.": "%(userName)s padzina Tevi no šīs istabas.", + "You have been banned from this room by %(userName)s.": "%(userName)s nobanoja/nobloķēja Tevi (liedza piekļuvi) šajā istabā.", + "You are trying to access a room.": "Tu centies gūt piekļuvi istabai.", + "To change the room's avatar, you must be a": "Lai izmainītu istabas avatāru, Tev jābūt", + "To change the room's name, you must be a": "Lai izmainītu istabas nosaukumu, Tev jābūt", + "To change the room's main address, you must be a": "Lai izmainītu istabas pamatadresi, Tev jābūt", + "To change the room's history visibility, you must be a": "Lai izmainītu istabas vēstures redzamību, Tev jābūt", + "To change the permissions in the room, you must be a": "Lai istabā izmainītu atļaujas, Tev jābūt", + "To change the topic, you must be a": "Lai izmainītu tematu, Tev jābūt", + "To modify widgets in the room, you must be a": "Lai istabā izmainītu vidžetus, Tev jābūt", + "Banned by %(displayName)s": "Nobanojis/bloķējis (liedzis piekļuvi) %(displayName)s", + "Members only (since the point in time of selecting this option)": "Tikai biedri (no šī parametra iestatīšanas brīža)", + "Members only (since they were invited)": "Tikai biedri (no to uzaicināšanas brīža)", + "Members only (since they joined)": "Tikai biedri (kopš pievienošanās)", + "To send messages, you must be a": "Lai sūtītu ziņas, Tev jābūt", + "To invite users into the room, you must be a": "Lai aicinātu istabā lietotājus, ir jābūt", + "To configure the room, you must be a": "Lai konfigurētu istabu, ir jābūt", + "To kick users, you must be a": "Lai padzītu lietotājus, ir jābūt", + "To ban users, you must be a": "Lai bloķētu (liegtu pieeju) lietotājiem, ir jābūt", + "To remove other users' messages, you must be a": "Lai dzēstu citu lietotāju ziņas, ir jābūt", + "To send events of type , you must be a": "Lai sūtītu tipa notikumus, ir jābūt", + "Addresses": "Adreses", + "Invalid community ID": "Nederīgs kopienas Id", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' nav derīgs kopienas Id", + "Flair": "Gaidas (nojauta)", + "Showing flair for these communities:": "Parādīt Tavas gaidas šajās kopienās:", + "This room is not showing flair for any communities": "Šajā istabā neparādās gaidas, kas uzstādītas kopienās", + "New community ID (e.g. +foo:%(localDomain)s)": "Jaunās kopienas Id (piem. +foo:%(localDomain)s)", + "URL previews are enabled by default for participants in this room.": "URL priekšskats šīs istabas dalībniekiem pēc noklusējuma ir iespējots.", + "URL previews are disabled by default for participants in this room.": "ULR priešskats šīs istabas dalībniekiem pēc noklusējuma ir atspējots.", + "Copied!": "Nokopēts!", + "Failed to copy": "Nokopēt neizdevās", + "Message removed by %(userId)s": "Ziņu dzēsis %(userId)s", + "Message removed": "Ziņa dzēsta", + "An email has been sent to %(emailAddress)s": "Vēstule tika nosūtīta uz %(emailAddress)s", + "A text message has been sent to %(msisdn)s": "Teksta ziņa tika nosūtīta uz %(msisdn)s", + "Username on %(hs)s": "Lietotājvārds uz %(hs)s", + "Remove from community": "Izdzēst no kopienas", + "Disinvite this user from community?": "Atcelt šim lietotājam nosūtīto uzaicinājumu pievienoties kopienai?", + "Remove this user from community?": "Izdzēst šo lietotāju no kopienas?", + "Failed to withdraw invitation": "Neizdevās atcelt uzaicinājumu", + "Failed to remove user from community": "Neizdevās izdzēst lietotāju no kopienas", + "Filter community members": "Kopienas biedru filtrs", + "Flair will appear if enabled in room settings": "Gaidas parādīsies, ja tās iespējotas istabas iestatījumos", + "Flair will not appear": "Gaidas neparādīsies", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Vai tiešām vēlies izdzēst '%(roomName)s' no %(groupId)s?", + "Removing a room from the community will also remove it from the community page.": "Dzēšot istabu no kopienas tā tiks dzēsta arī no kopienas lapas.", + "Failed to remove room from community": "Neizdevās dzēst istabu no kopienas", + "Failed to remove '%(roomName)s' from %(groupId)s": "Neizdevās dzēst '%(roomName)s' no %(groupId)s", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Istabas '%(roomName)s' redzamību %(groupId)s nebija iespējams atjaunot.", + "Visibility in Room List": "Redzamība istabu sarakstā", + "Visible to everyone": "Redzama visiem", + "Only visible to community members": "Tikai kopienas dalībniekiem", + "Filter community rooms": "Kopienas istabu filtrs", + "Something went wrong when trying to get your communities.": "Kaut kas nogāja greizi, kad tika mēģināts attēlot Tavas kopienas.", + "Display your community flair in rooms configured to show it.": "Parādīt Tavas gaidas istabās, kurās to parādīšana iespējota.", + "You're not currently a member of any communities.": "Pašreiz Tu neesi neesi nevienas kopienas piederīgais.", + "Delete Widget": "Dzēst vidžetu", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Vidžeta dzēšana to dzēš visiem šīs istabas lietotājiem. Vai tiešām vēlies dzēst šo vidžetu?", + "Minimize apps": "Minimizēt programmas", + "Communities": "Kopienas", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)spievienojās %(count)s reizes", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)spievienojās", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)spievienojās %(count)s reizes", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s pievienojās", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s izgāja %(count)s reizes", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s izgāja (atvienojās)", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s izgāja (atvienojās) %(count)s reizes", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s izgāja", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s pievienojās un izgāja %(count)s reizes", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s pievienojās un izgāja", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s pievienojās un izgāja %(count)s reizes", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s pievienojās un izgāja", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s izgāja un atkalpievienojās %(count)s reizes", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s noraidīja uzaicinājumus %(count)s reizes", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s atsauca izsniegtos uzaicinājumus %(count)s reizes", + "were banned %(count)s times|other": "tika bloķēti (liegta piekļuve) %(count)s reizes", + "was banned %(count)s times|other": "tika bloķēts (liegta piekļuve) %(count)s reizes", + "were unbanned %(count)s times|other": "tika atbloķēti (atgriezta pieeja) %(count)s reizes", + "were kicked %(count)s times|other": "tika padzīti %(count)s reizes", + "collapse": "sakļaut", + "expand": "izvērst", + "Custom of %(powerLevel)s": "Lietotāja līmenis %(powerLevel)s", + "In reply to ": "Atbildē uz ", + "And %(count)s more...|other": "Un par %(count)s vairāk...", + "Matrix ID": "Matrix Id", + "Matrix Room ID": "Matrix istabas Id", + "email address": "e-pasta adrese", + "Try using one of the following valid address types: %(validTypesList)s.": "Mēģiniet izmantot vienu no sekojošiem pieļautajiem adrešu tipiem: %(validTypesList)s.", + "You have entered an invalid address.": "Ievadīta nederīga adrese.", + "Community IDs cannot not be empty.": "Kopienu IDs nevar būt tukši.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Kopienas ID var saturēt tikai simbolus a-z, 0-9, or '=_-./'", + "Something went wrong whilst creating your community": "Radot Tavu kopienu kaut kas nogāja greizi", + "Create Community": "Radīt kopienu", + "Community Name": "Kopienas nosaukums", + "Community ID": "Kopienas ID", + "example": "piemērs", + "Advanced options": "Papildus opcijas", + "Block users on other matrix homeservers from joining this room": "Neļaut lietotājiem no citiem Bāzes serveriem pievienoties šai istabai", + "This setting cannot be changed later!": "Šo parametru vēlāk izmainīt nebūs iespējams!", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s aizgājuši un atgriezušies", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s aizgājis un atgriezies %(count)s reizes", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s aizgājis un atgriezies", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s nepieņēma uzaicinājumus", + "were invited %(count)s times|one": "tika uzaicināti", + "was invited %(count)s times|other": "tika uzaicināta %(count)s reizes", + "was invited %(count)s times|one": "tika uzaicināts(a)", + "were unbanned %(count)s times|one": "tika atbloķēti (atcelts pieejas liegums)", + "was unbanned %(count)s times|other": "tika atbloķēts %(count)s reizes", + "was banned %(count)s times|one": "tika bloķēts", + "were banned %(count)s times|one": "tika bloķēti", + "was unbanned %(count)s times|one": "tika atbloķēts", + "were kicked %(count)s times|one": "tika padzīti (izsperti)", + "was kicked %(count)s times|other": "tika padzīts %(count)s reizes", + "was kicked %(count)s times|one": "tika padzīts", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s izmainīja savu lietotājvārdu %(count)s reizes", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s izmainīja savu lietotājvārdu", + "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    Tavas kopienas lapas HTML

    \n

    \n Izmanto garāku aprakstu, lai iepazīstinātu jaunos lietoājus ar kopienu, \n vai padalies ar kādām attiecināmām web-saitēm\n

    \n

    \n Vari izmantot arī 'img' birkas\n

    \n", + "Add rooms to the community summary": "Pievienot istabas kopienas informatīvajā kopsavilkumā", + "Which rooms would you like to add to this summary?": "Kuras istabas vēlaties pievienot šim kopsavilkumam?", + "Add to summary": "Pievienot kopsavilkumam", + "Failed to add the following rooms to the summary of %(groupId)s:": "Neizdevās sekojošās istabas pievienot %(groupId)s kopsavilkumam:", + "Add a Room": "Pievienot istabu", + "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", + "Community Settings": "Kopienas iestatījumi", + "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Šīs istabas tiek rādītas kopienas dalībniekiem šīs kopienas lapā. Kopienas dalībnieki var pievienoties istabām, uzklikšķinot uz tām.", + "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "Jūsu kopienai nav plašāka HTML-lapas apraksta ko parādīt dalībniekiem.
    Klikšķini šeit, lai atvērtu iestatījumus un to pievienotu!", + "Description": "Apraksts", + "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.", + "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.", + "Error whilst fetching joined communities": "Ielādējot kopienas radās kļūda", + "%(count)s of your messages have not been sent.|one": "Tava ziņa netika nosūtīta.", + "Show devices, send anyway or cancel.": "Parādīt ierīces, vienalga nosūtīt vai sūtīšanu atcelt.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Atkārtoti sūtīt ziņu vai atcelt sūtīšanu.", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Šeit neviena nav. Ja vēlies kādu uzaicināt vai atslēgt paziņojumu par tukšu istabu?", + "Light theme": "Gaiša ādiņa", + "Dark theme": "Tumša ādiņa", + "Status.im theme": "Status.im ādiņa", + "Ignored Users": "Ignorētie lietotāji", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privātumu augstu respektējam, tādēļ analītikas mērķiem nevācam nekādus personas un identificējamus datus.", + "Learn more about how we use analytics.": "Sīkāk par to, kā tiek izmantota analītika.", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Epasts ir nosūtīts uz %(emailAddress)s. Izmanto epastā nosūtīto tīmekļa saiti un tad noklikšķini zemāk.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Lūdzu ņem vērā, ka Tu pieraksties %(hs)s serverī, nevis matrix.org serverī.", + "This homeserver doesn't offer any login flows which are supported by this client.": "Šis bāzes serveris neatbalsta nevienu pierakstīšanās metodi, kuru piedāvā šis Riot klients.", + "Sign in to get started": "Pierakstīties, lai sāktu", + "Ignores a user, hiding their messages from you": "Ignorē lietotāju, Tev nerādot viņa sūtītās ziņas", + "Stops ignoring a user, showing their messages going forward": "Atceļ lietotāja ignorēšanu, rādot viņa turpmāk sūtītās ziņas", + "Notify the whole room": "Paziņot visai istabai", + "Room Notification": "Istabas paziņojums", + "Disable Community Filter Panel": "Atspējot kopienas filtra paneli", + "Your key share request has been sent - please check your other devices for key share requests.": "Tavs atslēgu apmaiņas pieprasījums nosūtīts - lūdzu pārbaudi citas savas ierīces attiecībā uz atslēgu apmaiņu.", + "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.": "Atslēgu apmaiņas pieprasījumi Tavām citām ierīcēm tiek nosūtīti automātiski. Ja citās savās ierīcēs atslēdzi vai noraidīji atslēgu apmaiņas pieprasījumu, spiediet šeit lai pieprasītu atslēgas šai sesijai atkārtoti.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Ja citās Tavās ierīcēs nav atslēgas priekš šīs ziņas, Tu nevarēsi to atšifrēt.", + "Key request sent.": "Atslēgas pieprasījums nosūtīts.", + "Re-request encryption keys from your other devices.": "Atkārtoti pieprasīt šifrēšanas atslēgas no citām savām ierīcēm.", + "%(user)s is a %(userRole)s": "%(user)s ir %(userRole)s", + "Code": "Kods", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)snoraidīja viņu uzaicinājumu %(count)s reizes", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)snoraidīja uzaicinājumu", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)satsauca uzaicinājumus", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)satsauca savus uzaicinājumus %(count)s reizes", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)satsauca savu uzaicinājumu", + "were invited %(count)s times|other": "bija uzaicināti %(count)s reizes", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s izmainīja savu vārdu %(count)s reizes", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s izmainīja savu vārdu", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s nomainīja savu avataru %(count)s reizes", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)snomainīja savu avataru", + "%(items)s and %(count)s others|one": "%(items)s un viens cits", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)snomainīja savu avataru %(count)s reizes", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)snomainīja savu avataru", + "%(items)s and %(count)s others|other": "%(items)s un %(count)s citus", + "Add users to the community summary": "Pievienot lietotājus kopienas kopsavilkumam", + "Who would you like to add to this summary?": "Kuru lietotāju Tu vēlies pievienot šim kopsavilkumam?", + "Failed to add the following users to the summary of %(groupId)s:": "%(groupId)s kopsavilkumam neizdevās pievienot šādus lietotājus:", + "Add a User": "Pievienot lietotāju", + "Failed to remove a user from the summary of %(groupId)s": "Neizdevās dzēst lietotāju no %(groupId)s kopsavilkuma", + "The user '%(displayName)s' could not be removed from the summary.": "Lietotājs '%(displayName)s' nevarēja tikt dzēsts no kopsavilkuma.", + "Failed to update community": "Neizdevās aktualizēt kopienu", + "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?", + "%(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", + "Long Description (HTML)": "Garais apraksts (HTML)", + "Community %(groupId)s not found": "Kopiena %(groupId)s nav atrasta", + "Your Communities": "Tavas kopienas", + "Did you know: you can use communities to filter your Riot.im experience!": "Vai zināji: Tu vari izmantot kopienas, lai filtrētu (atlasītu) savu Riot.im pieredzi!", + "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.": "Lai uzstādītu filtru, uzvelc kopienas avataru uz filtru paneļa ekrāna kreisajā malā. Lai redzētu tikai istabas un cilvēkus, kas saistīti ar šo kopienu, Tu vari klikšķināt uz avatara filtru panelī jebkurā brīdī.", + "Create a new community": "Izveidot jaunu kopienu", + "Join an existing community": "Pievienoties esošai kopienai", + "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Lai pievienotos esošai kopienai Tev jāzina tā ID; tas izskatīties piemēram šādi +paraugs:matrix.org.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Tagadvisas atkārtoti sūtīt vai visas atcelt. Tu vari atzīmēt arī individuālas ziņas, kuras atkārtoti sūtīt vai atcelt.", + "Clear filter": "Attīrīt filtru", + "Debug Logs Submission": "Iesniegt atutošanas logfailus", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "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", + "Fetching third party location failed": "Neizdevās iegūt trešās puses atrašanās vietu", + "A new version of Riot is available.": "Pieejama jauna Riot versija.", + "Couldn't load home page": "Neizdevās ielādēt sākumlapu", + "Send Account Data": "Sūtīt konta datus", + "All notifications are currently disabled for all targets.": "Visiem saņēmējiem visi paziņojumi ir atspējoti.", + "Uploading report": "Augšuplādē atskaiti", + "Sunday": "svētdiena", + "Notification targets": "Paziņojuma mērķi", + "Today": "šodien", + "Failed to get protocol list from Home Server": "Neizdevās iegūt protokolu sarakstu no Bāzes servera", + "You are not receiving desktop notifications": "Darbvirsmas paziņojumi netiek saņemti", + "Friday": "piektdiena", + "Update": "Aktualizēt", + "What's New": "Kas jauns", + "Add an email address above to configure email notifications": "Lai konfigurētu epasta paziņojumus, pievieno epasta adresi", + "Expand panel": "Izvērst paneli", + "On": "ieslēgts", + "%(count)s Members|other": "%(count)s biedru", + "Filter room names": "Filtrēt pēc istabu nosaukuma", + "Changelog": "Izmaiņu saraksts (vēsture)", + "Waiting for response from server": "Gaidām atbildi no servera", + "Send Custom Event": "Sūtīt individuālu notikumu", + "Advanced notification settings": "Paziņojumu papildus iestatījumi", + "Failed to send logs: ": "Neizdevās nosūtīt logfailus: ", + "delete the alias.": "dzēst aliasi/aizstājējvārdu.", + "To return to your account in future you need to set a password": "Lai nākotnē atgrieztos savā kontā, nepieciešams iestatīt paroli", + "Forget": "Aizmirst", + "#example": "#piemērs", + "Hide panel": "Slēpt paneli", + "You cannot delete this image. (%(code)s)": "Šo attēlu nevar izdzēst (%(code)s)", + "Cancel Sending": "Atcelt sūtīšanu", + "This Room": "šajā istabā", + "The Home Server may be too old to support third party networks": "Bāzes serveris var būt pārāk novecojis, lai ļautu izmantot trešo pušu tīmekļa resursus", + "Noisy": "ar skaņu", + "Error saving email notification preferences": "Kļūda saglabājot epasta notifikāciju paziņojumu uzstādījumus", + "Messages containing my display name": "Ziņas, kuras satur manu redzamo vārdu", + "Messages in one-to-one chats": "Ziņas viens-pret-vienu čatos", + "Unavailable": "Nesasniedzams", + "View Decrypted Source": "Skatīt atšifrētu avotu", + "Failed to update keywords": "Neizdevās aktualizēt atslēgvārdus", + "Notes:": "Piezīmes:", + "remove %(name)s from the directory.": "dzēst %(name)s no kataloga.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Paziņojumi par šādiem atslēgvārdiem atbilst noteikumiem, kurus šeit nevar parādīt:", + "Safari and Opera work too.": "Safari un Opera arī nav skādējami.", + "Please set a password!": "Lūdzu iestati paroli!", + "You have successfully set a password!": "Esi veiksmīgi iestatījis(usi) paroli!", + "An error occurred whilst saving your email notification preferences.": "Saglabājot Tavus epasta paziņojumu uzstādījumus, radās kļūda.", + "Explore Room State": "Noskaidrot istabas statusu", + "Source URL": "Avota URL adrese", + "Messages sent by bot": "Botu nosūtītās ziņas", + "Filter results": "Filtrēt rezultātus", + "Members": "Biedri", + "No update available.": "Nav pieejamu aktualizāciju.", + "Resend": "Nosūtīt atkārtoti", + "Files": "Faili", + "Collecting app version information": "Tiek iegūta programmas versijas informācija", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Dzēst istabas aliasi/aizstājējvārdu %(alias)s un dzēst %(name)s no kataloga?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Tas atļaus Tev atgriezties savā kontā pēc izrakstīšanās, un pierakstīties no citām ierīcēm.", + "Keywords": "Atslēgvārdi", + "Enable notifications for this account": "Iespējot paziņojumus šim kontam", + "Directory": "Katalogs", + "Invite to this community": "Uzaicināt šajā kopienā", + "Failed to get public room list": "Neizdevās iegūt publisko istabu sarakstu", + "Messages containing keywords": "Ziņas, kuras satur atslēgvārdus", + "Room not found": "Istaba netika atrasta", + "Tuesday": "otrdiena", + "Enter keywords separated by a comma:": "Ievadi atslēgvārdus, atdalītus ar komatu:", + "Search…": "Meklēju…", + "You have successfully set a password and an email address!": "Esi veiksmīgi iestatījis(usi) paroli un epasta adresi!", + "Remove %(name)s from the directory?": "Dzēst %(name)s no kataloga?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot izmanto daudzas advancētas tīmekļa pārlūka iespējas, no kurām dažas var nebūt pieejamas vai ir eksperimentālas Tavā pašreizējajā pārlūkā.", + "Event sent!": "Notikums nosūtīts!", + "Preparing to send logs": "Gatavojos nosūtīt atutošanas logfailus", + "Enable desktop notifications": "Iespējot darbvirsmas paziņojumus", + "Explore Account Data": "Aplūkot konta datus", + "All messages (noisy)": "Visas ziņas (ar skaņu)", + "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:", + "You must specify an event type!": "Jānorāda notikuma tips!", + "(HTTP status %(httpStatus)s)": "(HTTP statuss %(httpStatus)s)", + "All Rooms": "visās istabās", + "Please install Chrome or Firefox for the best experience.": "Labāko lietošanas pieredzi gūsi uzstādot pārlūkprogrammu Chromium vai Firefox.", + "Wednesday": "trešdiena", + "You cannot delete this message. (%(code)s)": "Tu nevari dzēst šo ziņu. (%(code)s)", + "Quote": "Citāts", + "Send logs": "Nosūtīt logfailus", + "All messages": "Visas ziņas", + "Call invitation": "Uzaicinājuma zvans", + "Downloading update...": "Lejupielādēju aktualizāciju...", + "State Key": "Stāvokļa atslēga", + "Failed to send custom event.": "Individuālo notikumu nosūtīt neizdevās.", + "What's new?": "Kas jauns?", + "Notify me for anything else": "Paziņot man par jebko citu", + "When I'm invited to a room": "Kad esmu uzaicināts/a istabā", + "Can't update user notification settings": "Neizdodas atjaunot lietotāja paziņojumu iestatījumus", + "Notify for all other messages/rooms": "Paziņot par visām citām ziņām/istabām", + "Unable to look up room ID from server": "Nav iespējams no servera iegūt istabas Id", + "Couldn't find a matching Matrix room": "Atbilstoša Matrix istaba netika atrasta", + "Invite to this room": "Uzaicināt uz šo istabu", + "Search for a room": "Meklēt istabu", + "Thursday": "ceturtdiena", + "I understand the risks and wish to continue": "Apzinos riskus un vēlos turpināt", + "Logs sent": "Logfaili nosūtīti", + "Back": "Atpakaļ", + "Reply": "Atbildēt", + "Show message in desktop notification": "Parādīt ziņu darbvirsmas paziņojumos", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Atutošanas logfaili satur programmas datus, ieskaitot Tavu lietotājvārdu, istabu/grupu ID vai aliases, kuras esi apmeklējis un citu lietotāju lietotājvārdus. Tie nesatur pašas ziņas.", + "Unhide Preview": "Rādīt priekšskatījumu", + "Unable to join network": "Nav iespējams pievienoties tīklam", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Droši vien Tu konfigurēji tās kādā citā Matrix klientā, nevis Riot. Nav iespējams tos pārkonfigurēt ar Riot, bet tie joprojām tiek izmantoti", + "Sorry, your browser is not able to run Riot.": "Atvaino, diemžēl tavs tīmekļa pārlūks nespēj darbināt Riot.", + "Uploaded on %(date)s by %(user)s": "Augšuplādēja %(user)s %(date)s", + "Messages in group chats": "Ziņas grupas čatos", + "Yesterday": "vakar", + "Error encountered (%(errorDetail)s).": "Gadījās kļūda (%(errorDetail)s).", + "Login": "Ierakstīties", + "Low Priority": "Zemas prioritātes", + "Unable to fetch notification target list": "Neizdevās iegūt paziņojumu mērķu sarakstu", + "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..6de7e92df7 100644 --- a/src/i18n/strings/ml.json +++ b/src/i18n/strings/ml.json @@ -21,5 +21,138 @@ "Failed to change password. Is your password correct?": "രഹസ്യവാക്ക് മാറ്റാന്‍ സാധിച്ചില്ല. രഹസ്യവാക്ക് ശരിയാണോ ?", "Continue": "മുന്നോട്ട്", "Microphone": "മൈക്രോഫോൺ", - "Camera": "ക്യാമറ" + "Camera": "ക്യാമറ", + "Fetching third party location failed": "തേഡ് പാര്‍ട്ടി ലൊക്കേഷന്‍ ഫെച്ച് ചെയ്യാന്‍ കഴിഞ്ഞില്ല", + "A new version of Riot is available.": "റയട്ടിന്റെ ഒരു പുതിയ പതിപ്പ് ലഭ്യമാണ്.", + "All notifications are currently disabled for all targets.": "അറിയിപ്പുകളെല്ലാം നിര്‍ത്തിയിരിയ്ക്കുന്നു.", + "Uploading report": "റിപ്പോര്‍ട്ട് അപ്ലോഡ് ചെയ്യുന്നു", + "Sunday": "ഞായര്‍", + "Guests can join": "അതിഥികള്‍ക്കും പ്രവേശിക്കാം", + "Messages sent by bot": "ബോട്ട് അയയ്ക്കുന്ന സന്ദേശങ്ങള്‍ക്ക്", + "Notification targets": "നോട്ടിഫിക്കേഷന്‍ ടാര്‍ഗെറ്റുകള്‍", + "Failed to set direct chat tag": "ഡയറക്റ്റ് ചാറ്റ് ടാഗ് സെറ്റ് ചെയ്യാനായില്ല", + "Today": "ഇന്ന്", + "Failed to get protocol list from Home Server": "ഹോം സെര്‍വറില്‍ നിന്ന് പ്രോട്ടോക്കോള്‍ ലിസ്റ്റ് നേടാന്‍ സാധിച്ചില്ല", + "You are not receiving desktop notifications": "നിങ്ങള്‍ക്ക് ഇപ്പോള്‍ ഡെസ്ക്ടോപ്പ് നോട്ടിഫിക്കേഷനുകള്‍ ലഭിക്കുന്നില്ല", + "Friday": "വെള്ളി", + "Update": "പുതുക്കുക", + "What's New": "പുതിയ വിശേഷങ്ങള്‍", + "Add an email address above to configure email notifications": "ഇ മെയില്‍ അറിയിപ്പുകൾ ലഭിക്കാന്‍ മുകളില്‍ ഇ-മെയില്‍ വിലാസം നല്‍കൂ", + "Expand panel": "പാനല്‍ വലുതാക്കുക", + "On": "ഓണ്‍", + "Filter room names": "റൂം പേരുകള്‍ ഫില്‍ട്ടര്‍ ചെയ്യുക", + "Changelog": "മാറ്റങ്ങളുടെ നാള്‍വഴി", + "Waiting for response from server": "സെര്‍വറില്‍ നിന്നുള്ള പ്രതികരണത്തിന് കാക്കുന്നു", + "Leave": "വിടവാങ്ങുക", + "Advanced notification settings": "അറിയപ്പുകളുടെ സങ്കീര്‍ണമായ സജ്ജീകരണങ്ങള്‍", + "delete the alias.": "ഏലിയാസ് നീക്കം ചെയ്യുക.", + "To return to your account in future you need to set a password": "വീണ്ടും ഈ അക്കൌണ്ട് ഉപയോഗിക്കണമെങ്കില്‍ ഒരു രഹസ്യവാക്ക് സെറ്റ് ചെയ്യുക", + "Forget": "മറക്കുക", + "World readable": "ആർക്കും വായിക്കാവുന്നത്", + "#example": "#ഉദാഹരണം", + "Hide panel": "പാനല്‍ ഒളിപ്പിക്കുക", + "You cannot delete this image. (%(code)s)": "നിങ്ങള്‍ക്ക് ഈ ചിത്രം നീക്കം ചെയ്യാനാകില്ല. (%(code)s)", + "Cancel Sending": "അയയ്ക്കുന്നത് റദ്ദാക്കുക", + "Warning": "മുന്നറിയിപ്പ്", + "This Room": "ഈ മുറി", + "The Home Server may be too old to support third party networks": "തേഡ് പാര്‍ട്ടി നെറ്റ്‍വര്‍ക്കുകളെ പിന്തുണക്കാത്ത വളരെ പഴയ ഹോം സെര്‍വര്‍ ആയേക്കാം", + "Noisy": "ഉച്ചത്തില്‍", + "Room not found": "റൂം കണ്ടെത്താനായില്ല", + "Messages containing my display name": "എന്റെ പേര് അടങ്ങിയിരിക്കുന്ന സന്ദേശങ്ങള്‍ക്ക്", + "Messages in one-to-one chats": "നേര്‍ക്കുനേര്‍ ചാറ്റിലെ സന്ദേശങ്ങള്‍ക്ക്", + "Unavailable": "ലഭ്യമല്ല", + "View Decrypted Source": "ഡീക്രിപ്റ്റ് ചെയ്ത സോഴ്സ് കാണുക", + "Failed to update keywords": "കീവേഡുകള്‍ പുതുക്കുവാന്‍ സാധിച്ചില്ല", + "Notifications on the following keywords follow rules which can’t be displayed here:": "ഈ പറയുന്ന കീവേർഡുകളെ പറ്റിയുള്ള അറിയിപ്പുകൾ പിൻതുടരുന്ന നിയമങ്ങൾ ഇവിടെ കാണിക്കുവാൻ സാധ്യമല്ല:", + "Please set a password!": "ദയവായി ഒരു രഹസ്യവാക്ക് ക്രമീകരിക്കുക!", + "You have successfully set a password!": "രഹസ്യവാക്ക് സജ്ജീകരിച്ചിരിക്കുന്നു!", + "An error occurred whilst saving your email notification preferences.": "ഇ-മെയില്‍ വഴി അറിയിയ്ക്കാനുള്ള നിങ്ങളുടെ സജ്ജീകരണങ്ങള്‍ സൂക്ഷിക്കുന്നതില്‍ ഒരു പ്രശ്നമുണ്ടായി.", + "Source URL": "സോഴ്സ് യു ആര്‍ എല്‍", + "Failed to add tag %(tagName)s to room": "റൂമിന് %(tagName)s എന്ന ടാഗ് ആഡ് ചെയ്യുവാന്‍ സാധിച്ചില്ല", + "Members": "അംഗങ്ങള്‍", + "No update available.": "അപ്ഡേറ്റുകള്‍ ലഭ്യമല്ല.", + "Resend": "വീണ്ടും അയയ്ക്കുക", + "Files": "ഫയലുകള്‍", + "Collecting app version information": "ആപ്പ് പതിപ്പു വിവരങ്ങള്‍ ശേഖരിക്കുന്നു", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "റൂം ഏലിയാസ് %(alias)s നീക്കം ചെയ്യുകയും %(name)s കള്‍ ഡയറക്ടറിയില്‍ നിന്നും നീക്കം ചെയ്യുകയും ചെയ്യുക ?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "സൈന്‍ ഔട്ട് ചെയ്ത ശേഷം വീണ്ടും നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് മടങ്ങി വരാനും, മറ്റ് ഡിവൈസുകളില്‍ സൈന്‍ ഇന്‍ ചെയ്യാനും ഇത് സഹായിക്കും.", + "Keywords": "കീവേഡുകള്‍", + "Enable notifications for this account": "ഈ അക്കൌണ്ടില്‍ നോട്ടിഫിക്കേഷനുകള്‍ ഇനേബിള്‍ ചെയ്യുക", + "Directory": "ഡയറക്ടറി", + "Failed to get public room list": "പബ്ലിക്ക് റൂം ലിസ്റ്റ് നേടാന്‍ സാധിച്ചില്ല", + "Messages containing keywords": "കീവേഡുകള്‍അടങ്ങിയ സന്ദേശങ്ങള്‍ക്ക്", + "Error saving email notification preferences": "ഇമെയില്‍ നോട്ടിഫിക്കേഷന്‍ സജ്ജീകരണങ്ങള്‍ സൂക്ഷിക്കവേ എറര്‍ നേരിട്ടു", + "Tuesday": "ചൊവ്വ", + "Enter keywords separated by a comma:": "കീവേഡുകളെ കോമ കൊണ്ട് വേര്‍ത്തിരിച്ച് ടൈപ്പ് ചെയ്യുക :", + "I understand the risks and wish to continue": "കുഴപ്പമാകാന്‍ സാധ്യതയുണ്ടെന്നെനിയ്ക്കു് മനസ്സിലായി, എന്നാലും മുന്നോട്ട് പോകുക", + "Remove %(name)s from the directory?": "%(name)s കള്‍ ഡയറക്റ്ററിയില്‍ നിന്നും മാറ്റണോ ?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "റയട്ട് നൂതന ബ്രൌസര്‍ ഫീച്ചറുകള്‍ ഉപയോഗിക്കുന്നു. നിങ്ങളുടെ ബ്രൌസറില്‍ അവയില്‍ പലതും ഇല്ല / പൂര്‍ണ്ണമല്ല .", + "Unnamed room": "പേരില്ലാത്ത റൂം", + "All messages (noisy)": "എല്ലാ സന്ദേശങ്ങളും (ഉച്ചത്തിൽ)", + "Saturday": "ശനി", + "Remember, you can always set an email address in user settings if you change your mind.": "ഓര്‍ക്കുക, വേണ്ട സമയത്ത് യൂസര്‍ സെറ്റിങ്സില്‍ ഒരു ഇമെയില്‍ വിലാസം നല്‍കാം.", + "Direct Chat": "നേരിട്ടുള്ള ചാറ്റ്", + "The server may be unavailable or overloaded": "സെര്‍വര്‍ ലഭ്യമല്ല അല്ലെങ്കില്‍ ഓവര്‍ലോഡഡ് ആണ്", + "Reject": "നിരസിക്കുക", + "Failed to set Direct Message status of room": "റൂമില്‍ നിന്നും ഡയറക്റ്റ് മെസേജ് സ്റ്റാറ്റസ് സജ്ജീകരിക്കാന്‍ കഴിഞ്ഞില്ല", + "Monday": "തിങ്കള്‍", + "Remove from Directory": "ഡയറക്റ്ററിയില്‍ നിന്നും നീക്കം ചെയ്യുക", + "Enable them now": "ഇപ്പോള്‍ ഇനേബിള്‍ ചെയ്യുക", + "Forward Message": "സന്ദേശം ഫോര്‍വേഡ് ചെയ്യുക", + "Messages containing my user name": "എന്റെ യൂസര്‍ നെയിം അടങ്ങിയിരിക്കുന്ന സന്ദേശങ്ങള്‍ക്ക്", + "Collecting logs": "നാള്‍വഴി ശേഖരിക്കുന്നു", + "more": "കൂടുതല്‍", + "(HTTP status %(httpStatus)s)": "(HTTP സ്റ്റാറ്റസ് %(httpStatus)s)", + "All Rooms": "എല്ലാ മുറികളും കാണുക", + "Wednesday": "ബുധന്‍", + "You cannot delete this message. (%(code)s)": "നിങ്ങള്‍ക്ക് ഈ സന്ദേശം നീക്കം ചെയ്യാനാകില്ല. (%(code)s)", + "Quote": "ഉദ്ധരിക്കുക", + "Send": "അയയ്ക്കുക", + "Send logs": "നാള്‍വഴി അയയ്ക്കുക", + "All messages": "എല്ലാ സന്ദേശങ്ങളും", + "Call invitation": "വിളിയ്ക്കുന്നു", + "Downloading update...": "അപ്ഡേറ്റ് ഡൌണ്‍ലോഡ് ചെയ്യുന്നു...", + "You have successfully set a password and an email address!": "ഇമെയില്‍ വിലാസവും രഹസ്യവാക്കും വിജയകരമായി ക്രമീകരിച്ചിരിക്കുന്നു!", + "What's new?": "എന്തൊക്കെ പുതിയ വിശേഷങ്ങള്‍ ?", + "Notify me for anything else": "ബാക്കി ഏതിനും എനിക്ക് അറിയിപ്പു നൽകുക", + "When I'm invited to a room": "ഞാന്‍ ഒരു റൂമിലേക്ക് ക്ഷണിക്കപ്പെടുമ്പോള്‍", + "Can't update user notification settings": "ഉപയോക്താവിനെ അറിയിയ്ക്കാനുള്ള സജ്ജീകരണം പുതുക്കാനായില്ല", + "Notify for all other messages/rooms": "ബാക്കി എല്ലാ സന്ദേശങ്ങൾക്കും/റൂമുകൾക്കും അറിയിപ്പു നൽകുക", + "Unable to look up room ID from server": "സെര്‍വറില്‍ നിന്നും റൂം ഐഡി കണ്ടെത്താനായില്ല", + "Couldn't find a matching Matrix room": "ആവശ്യപ്പെട്ട മാട്രിക്സ് റൂം കണ്ടെത്താനായില്ല", + "Invite to this room": "ഈ റൂമിലേക്ക് ക്ഷണിക്കുക", + "Search for a room": "ഒരു റൂം തിരയുക", + "Thursday": "വ്യാഴം", + "Search…": "തിരയുക…", + "Back": "തിരികെ", + "Unhide Preview": "പ്രിവ്യു കാണിക്കുക", + "Unable to join network": "നെറ്റ്‍വര്‍ക്കില്‍ ജോയിന്‍ ചെയ്യാന്‍ കഴിയില്ല", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "ഇവ റയട്ടല്ലാതെ മറ്റൊരു ക്ലയന്റില്‍ വച്ച് കോണ്‍ഫിഗര്‍ ചെയ്തതാകാം. റയട്ടില്‍ അവ ലഭിക്കില്ല, എങ്കിലും അവ നിലവിലുണ്ട്", + "Sorry, your browser is not able to run Riot.": "ക്ഷമിക്കണം, നിങ്ങളുടെ ബ്രൌസര്‍ റയട്ട് പ്രവര്‍ത്തിപ്പിക്കാന്‍ പര്യാപ്തമല്ല.", + "Uploaded on %(date)s by %(user)s": "%(date)s ല്‍ %(user)s അപ്ലോഡ് ചെയ്തത്", + "Messages in group chats": "ഗ്രൂപ്പ് ചാറ്റുകളിലെ സന്ദേശങ്ങള്‍ക്ക്", + "Yesterday": "ഇന്നലെ", + "Error encountered (%(errorDetail)s).": "എറര്‍ നേരിട്ടു (%(errorDetail)s).", + "Low Priority": "താഴ്ന്ന പരിഗണന", + "Unable to fetch notification target list": "നോട്ടിഫിക്കേഷന്‍ ടാര്‍ഗെറ്റ് ലിസ്റ്റ് നേടാനായില്ല", + "Set Password": "രഹസ്യവാക്ക് സജ്ജീകരിക്കുക", + "Enable audible notifications in web client": "വെബ് പതിപ്പിലെ അറിയിപ്പുകള്‍ കേള്‍ക്കാവുന്നതാക്കുക", + "Permalink": "പെര്‍മാലിങ്ക്", + "remove %(name)s from the directory.": "%(name)s ഡയറക്റ്ററിയില്‍ നിന്ന് നീക്കം ചെയ്യുക.", + "Off": "ഓഫ്", + "Riot does not know how to join a room on this network": "ഈ നെറ്റ്‍വര്‍ക്കിലെ ഒരു റൂമില്‍ എങ്ങനെ അംഗമാകാമെന്ന് റയട്ടിന് അറിയില്ല", + "Mentions only": "മെന്‍ഷനുകള്‍ മാത്രം", + "Failed to remove tag %(tagName)s from room": "റൂമില്‍ നിന്നും %(tagName)s ടാഗ് നീക്കം ചെയ്യുവാന്‍ സാധിച്ചില്ല", + "You can now return to your account after signing out, and sign in on other devices.": "നിങ്ങള്‍ക്ക് ഇപ്പോള്‍ സൈന്‍ ഔട്ട് ചെയ്ത ശേഷവും നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് തിരികെ വരാം, അതു പോലെ മറ്റ് ഡിവൈസുകളില്‍ സൈന്‍ ഇന്‍ ചെയ്യുകയുമാവാം.", + "Enable desktop notifications": "ഡെസ്ക്ടോപ്പ് നോട്ടിഫിക്കേഷനുകള്‍ ഇനേബിള്‍ ചെയ്യുക", + "Enable email notifications": "ഇമെയില്‍ നോട്ടിഫിക്കേഷനുകള്‍ ഇനേബിള്‍ ചെയ്യുക", + "Login": "ലോഗിന്‍", + "No rooms to show": "കാണിക്കാന്‍ റൂമുകളില്ല", + "Download this file": "ഈ ഫയല്‍ ഡൌണ്‍ലോഡ് ചെയ്യുക", + "Failed to change settings": "സജ്ജീകരണങ്ങള്‍ മാറ്റുന്നവാന്‍ സാധിച്ചില്ല", + "View Source": "സോഴ്സ് കാണുക", + "Collapse panel": "പാനല്‍ കൊളാപ്സ് ചെയ്യുക", + "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "നിങ്ങളുടെ ഇപ്പോളത്തെ ബ്രൌസര്‍ റയട്ട് പ്രവര്‍ത്തിപ്പിക്കാന്‍ പൂര്‍ണമായും പര്യാപത്മല്ല. പല ഫീച്ചറുകളും പ്രവര്‍ത്തിക്കാതെയിരിക്കാം. ഈ ബ്രൌസര്‍ തന്നെ ഉപയോഗിക്കണമെങ്കില്‍ മുന്നോട്ട് പോകാം. പക്ഷേ നിങ്ങള്‍ നേരിടുന്ന പ്രശ്നങ്ങള്‍ നിങ്ങളുടെ ഉത്തരവാദിത്തത്തില്‍ ആയിരിക്കും!", + "Checking for an update...": "അപ്ഡേറ്റ് ഉണ്ടോ എന്ന് തിരയുന്നു...", + "There are advanced notifications which are not shown here": "ഇവിടെ കാണിക്കാത്ത നൂതന നോട്ടിഫിക്കേഷനുകള്‍ ഉണ്ട്" } diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index 4d52e606eb..47da50122c 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -1,3 +1,117 @@ { - "Room directory": "Romkatalog" + "Room directory": "Romkatalog", + "This email address is already in use": "Denne e-post adressen er allerede i bruk", + "This phone number is already in use": "Dette mobilnummeret er allerede i bruk", + "Failed to verify email address: make sure you clicked the link in the email": "Klarte ikke verifisere e-post adressen: dobbelsjekk at du trykket på lenken i e-posten", + "The platform you're on": "Platformen du bruker", + "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", + "Fetching third party location failed": "Kunne ikke hente tredjeparts lokalisering", + "Advanced notification settings": "Avanserte varslingsinnstillinger", + "Sunday": "Søndag", + "Guests can join": "Gjester kan bli med", + "Messages sent by bot": "Meldinger sendt av bot", + "Notification targets": "Mål for varsel", + "Failed to set direct chat tag": "Kunne ikke angi direkte chat-tagg", + "Today": "I dag", + "Files": "Filer", + "You are not receiving desktop notifications": "Du mottar ikke skrivebords varsler", + "Friday": "Fredag", + "Notifications": "Varsler", + "Unable to fetch notification target list": "Kunne ikke hente varsel-mål liste", + "Add an email address above to configure email notifications": "Legg til en epost adresse for å sette opp epost varsling", + "Expand panel": "Utvid panel", + "On": "På", + "Filter room names": "Filtrer romnavn", + "Leave": "Forlat", + "All notifications are currently disabled for all targets.": "Alle varsler er deaktivert for alle mottakere.", + "delete the alias.": "Slett aliaset.", + "Forget": "Glem", + "World readable": "Lesbar for alle", + "You cannot delete this image. (%(code)s)": "Du kan ikke slette dette bildet. (%(code)s)", + "Source URL": "Kilde URL", + "The Home Server may be too old to support third party networks": "Hjemme-serveren kan være for gammel til å støtte tredjeparts-nettverk", + "Resend": "Send på nytt", + "Error saving email notification preferences": "Feil ved lagring av e-postvarselinnstillinger", + "Messages in one-to-one chats": "Meldinger i en-til-en samtaler", + "View Decrypted Source": "Vis dekryptert kilde", + "Failed to update keywords": "Kunne ikke oppdatere nøkkelord", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Varsler på de følgende nøkkelordene følger regler som ikke kan vises her:", + "Room not found": "Rommet ble ikke funnet", + "Favourite": "Favoritt", + "Cancel Sending": "Avbryt sending", + "Failed to add tag %(tagName)s to room": "Kunne ikke legge til tagg %(tagName)s til rom", + "Members": "Medlemmer", + "Noisy": "Bråkete", + "Failed to get protocol list from Home Server": "Kunne ikke hente protokolliste fra Hjemme-Server", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Slett rom alias %(alias)s og fjern %(name)s fra katalogen?", + "Enable notifications for this account": "Aktiver varsler for denne konto", + "Directory": "Katalog", + "Failed to get public room list": "Kunne ikke hente offentlig romliste", + "Messages containing keywords": "Meldinger som inneholder nøkkelord", + "When I'm invited to a room": "Når jeg blir invitert til et rom", + "Tuesday": "Tirsdag", + "Enter keywords separated by a comma:": "Angi nøkkelord adskilt med komma:", + "I understand the risks and wish to continue": "Jeg forstår risikoen og ønsker å fortsette", + "Remove %(name)s from the directory?": "Fjern %(name)s fra katalogen?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot benytter mange avanserte nettleserfunksjoner, og noen av disse er ikke tilgjengelige eller er eksperimentelle på din nåværende nettleser.", + "Enable desktop notifications": "Aktiver skrivebordsvarsler", + "Unnamed room": "Rom uten navn", + "All messages (noisy)": "Alle meldinger (høy)", + "Direct Chat": "Direkte Chat", + "The server may be unavailable or overloaded": "Serveren kan være utilgjengelig eller overbelastet", + "Reject": "Avvis", + "Failed to set Direct Message status of room": "Kunne ikke angi status for direkte melding i rommet", + "Monday": "Mandag", + "Remove from Directory": "Fjern fra katalogen", + "Enable them now": "Aktiver dem nå", + "Messages containing my user name": "Meldinger som inneholder mitt brukernavn", + "more": "mer", + "Search for a room": "Søk etter et rom", + "Failed to forget room %(errCode)s": "Kunne ikke glemme rommet %(errCode)s", + "Wednesday": "Onsdag", + "Error": "Feil", + "unknown error code": "ukjent feilkode", + "Call invitation": "Anropsinvitasjon", + "Messages containing my display name": "Meldinger som inneholder mitt visningsnavn", + "powered by Matrix": "benytter seg av Matrix", + "Notify me for anything else": "Varsle meg om alt annet", + "View Source": "Vis kilde", + "Keywords": "Nøkkelord", + "Close": "Lukk", + "Can't update user notification settings": "Kan ikke oppdatere brukervarsel innstillinger", + "Notify for all other messages/rooms": "Varsler om alle andre meldinger/rom", + "Unable to look up room ID from server": "Kunne ikke slå opp rom-ID fra serveren", + "Couldn't find a matching Matrix room": "Kunne ikke finne et samsvarende Matrix rom", + "Invite to this room": "Inviter til dette rommet", + "You cannot delete this message. (%(code)s)": "Du kan ikke slette denne meldingen. (%(code)s)", + "Thursday": "Torsdag", + "All messages": "Alle meldinger", + "Unable to join network": "Kunne ikke bli med i nettverket", + "Sorry, your browser is not able to run Riot.": "Beklager, din nettleser er ikke i stand til å kjøre Riot.", + "Uploaded on %(date)s by %(user)s": "Lastet opp den %(date)s av %(user)s", + "Messages in group chats": "Meldinger i gruppesamtaler", + "Yesterday": "I går", + "Low Priority": "Lav Prioritet", + "Riot does not know how to join a room on this network": "Riot vet ikke hvordan man kan komme inn på et rom på dette nettverket", + "An error occurred whilst saving your email notification preferences.": "En feil oppsto i forbindelse med lagring av epost varsel innstillinger.", + "Enable audible notifications in web client": "Aktiver lyd-varsel i webklient", + "Permalink": "Permanent lenke", + "remove %(name)s from the directory.": "fjern %(name)s fra katalogen.", + "Off": "Av", + "#example": "#eksempel", + "Failed to remove tag %(tagName)s from room": "Kunne ikke fjerne tagg %(tagName)s fra rommet", + "Remove": "Fjern", + "Enable email notifications": "Aktiver e-postvarsler", + "No rooms to show": "Ingen rom å vise", + "Download this file": "Last ned filen", + "Failed to change settings": "Kunne ikke endre innstillingene", + "Unhide Preview": "Vis forhåndsvisning", + "Custom Server Options": "Tilpassede serveralternativer", + "Quote": "Sitat", + "Collapse panel": "Skjul panel", + "Saturday": "Lørdag", + "There are advanced notifications which are not shown here": "Det er avanserte varsler som ikke vises her" } diff --git a/src/i18n/strings/ne.json b/src/i18n/strings/ne.json new file mode 100644 index 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 f440e128cb..0df2cf1bd7 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -29,20 +29,18 @@ "Banned users": "Verbannen gebruikers", "Bans user with given id": "Verbant de gebruiker met het gegeven ID", "Blacklisted": "Buitengesloten", - "Bug Report": "Bug report", "Bulk Options": "Bulk opties", "Call Timeout": "Gesprek time-out", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Kan niet met de thuisserver verbinden via HTTP wanneer er een HTTPS-URL in je browser balk staat. Gebruik HTTPS of activeer onveilige scripts.", "Can't load user settings": "Kan de gebruikersinstellingen niet laden", "Change Password": "Wachtwoord veranderen", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s heeft zijn of haar weergavenaam veranderd van %(oldDisplayName)s naar %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s heeft zijn of haar profielfoto veranderd.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s heeft het machtsniveau van %(powerLevelDiffText)s gewijzigd.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s heeft de kamernaam van %(roomName)s gewijzigd.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s heeft het onderwerp gewijzigd naar \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Veranderingen aan wie de geschiedenis kan lezen worden alleen maar toegepast op toekomstige berichten in deze ruimte", "Changes your display nickname": "Verandert jouw weergavenaam", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het veranderen van het wachtwoord zal op het moment alle eind-tot-eind encryptie sleutels resetten, wat alle versleutelde chat geschiedenis onleesbaar zou maken, behalve als je eerst je ruimtesleutels exporteert en achteraf opnieuw importeert. Dit zal worden verbeterd in de toekomst.", + "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het veranderen van het wachtwoord zal op het moment alle eind-tot-eind encryptie sleutels resetten, wat alle versleutelde gespreksgeschiedenis onleesbaar zou maken, behalve als je eerst je ruimtesleutels exporteert en achteraf opnieuw importeert. Dit zal worden verbeterd in de toekomst.", "Clear Cache and Reload": "Legen cache en herlaad", "Clear Cache": "Legen cache", "Click here to fix": "Klik hier om op te lossen", @@ -178,7 +176,7 @@ "Cryptography": "Cryptografie", "Current password": "Huidig wachtwoord", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s heeft de naam van de ruimte verwijderd.", - "Create a new chat or reuse an existing one": "Maak een nieuwe chat aan of ga verder met een bestaande", + "Create a new chat or reuse an existing one": "Maak een nieuw gesprek aan of hergebruik een al bestaand gesprek", "Create Room": "Maak een ruimte aan", "Curve25519 identity key": "Curve25519-identiteitssleutel", "/ddg is not a command": "/ddg is geen commando", @@ -263,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.", @@ -332,7 +329,6 @@ "New passwords must match each other.": "Nieuwe wachtwoorden moeten overeenkomen.", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Zodra versleuteling in een ruimte is ingeschakeld kan het niet meer worden uitgeschakeld (kan later wijzigen)", "Only people who have been invited": "Alleen personen die zijn uitgenodigd", - "Otherwise, click here to send a bug report.": "Klik anders hier om een foutmelding te versturen.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Bekijk je e-mail en klik op de link die het bevat. Zodra dit klaar is, klik op verder gaan.", "Power level must be positive integer.": "Machtsniveau moet een positief geheel getal zijn.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s heeft zijn of haar weergavenaam (%(oldDisplayName)s) verwijderd.", @@ -341,7 +337,6 @@ "Press to start a chat with someone": "Druk op om een gesprek met iemand te starten", "Remove %(threePid)s?": "%(threePid)s verwijderen?", "%(senderName)s requested a VoIP conference.": "%(senderName)s heeft een VoIP-gesprek aangevraagd.", - "Report it": "Melden", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het wachtwoord veranderen betekent momenteel dat alle end-to-endbeveiligingssleutels op alle apparaten veranderen waardoor versleutelde gespreksgeschiedenis onleesbaar wordt, behalve als je eerst de ruimte sleutels exporteert en daarna opnieuw importeert. Dit zal in de toekomst verbeterd worden.", "Results from DuckDuckGo": "Resultaten van DuckDuckGo", "Return to login screen": "Naar het inlogscherm terugkeren", @@ -451,7 +446,6 @@ "Use with caution": "Gebruik met behoedzaamheid", "User ID": "Gebruikers-ID", "User Interface": "Gebruikersinterface", - "%(user)s is a": "%(user)s is een", "User name": "Gebruikersnaam", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (macht %(powerLevelNumber)s)", "Username invalid: %(errMessage)s": "Gebruikersnaam ongeldig: %(errMessage)s", @@ -541,7 +535,6 @@ "Start automatically after system login": "Start automatisch na systeem-aanmelding", "Desktop specific": "Desktop-specifiek", "Analytics": "Gegevensanalyse", - "Opt out of analytics": "Uitschrijven voor gegevensanalyse", "Options": "Opties", "Riot collects anonymous analytics to allow us to improve the application.": "Riot verzameld anonieme gegevensanalyse die het mogelijk maakt om de applicatie te verbeteren.", "Passphrases must match": "Wachtzinnen moeten overeenkomen", @@ -556,7 +549,7 @@ "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Het te exporteren bestand zal beveiligd zijn met een wachtzin. Je moet hier een wachtzin invoeren om het bestand te ontsleutelen.", "You must join the room to see its files": "Je moet tot een ruimte toetreden om de bestanden te zien", "Reject all %(invitedRooms)s invites": "Alle %(invitedRooms)s uitnodigingen afslaan", - "Start new chat": "Nieuwe chat starten", + "Start new chat": "Nieuw gesprek starten", "Failed to invite": "Niet gelukt om uit te nodigen", "Failed to invite user": "Niet gelukt om de gebruiker uit te nodigen", "Failed to invite the following users to the %(roomName)s room:": "Niet gelukt om de volgende gebruikers voor de %(roomName)s ruimte uit te nodigen:", @@ -564,8 +557,6 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Weet je zeker dat je deze gebeurtenis wilt verwijderen? Wees er wel van bewust dat als je een ruimtenaam of onderwerp verwijderd je de verandering ongedaan kunt maken.", "Unknown error": "Onbekende fout", "Incorrect password": "Incorrect wachtwoord", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Dit zal je account permanent onbruikbaar maken. Je zal ook niet opnieuw kunnen registreren met hetzelfde gebruikers-ID.", - "This action is irreversible.": "Deze actie is onomkeerbaar.", "To continue, please enter your password.": "Om verder te gaan, voer je wachtwoord in.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Om te verifiëren dat dit apparaat vertrouwd kan worden, contacteer de eigenaar op een andere manier (bijv. persoonlijk of via een telefoontje) en vraag of de sleutel die ze zien in de Gebruikersinstellingen voor dit apparaat overeenkomt met de onderstaande sleutel:", "Device name": "Apparaat naam", @@ -578,10 +569,8 @@ "In future this verification process will be more sophisticated.": "In de toekomst zal dit verificatie proces meer geraffineerd zijn.", "Verify device": "Apparaat verifiëren", "I verify that the keys match": "Ik verifieer dat de sleutels overeenkomen", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "We ervaren een fout terwijl er wordt geprobeerd om de vorige sessie te herstellen. Als je doorgaat moet je opnieuw inloggen en versleutelde gespreksgeschiedenis zal onleesbaar zijn.", "Unable to restore session": "Het is niet mogelijk om de sessie te herstellen", "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.": "Als je eerst gebruik hebt gemaakt van een recentere versie van Riot, dan is je sessie misschien onverenigbaar met deze versie. Sluit dit scherm en ga terug naar de recentere versie.", - "Continue anyway": "Toch doorgaan", "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 raden je aan om door het verificatieproces van elk apparaat te gaan om te bevestigen dat ze tot de legitieme eigenaar behoren maar je kan het bericht versturen zonder te verifiëren als je dat liever doet.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" bevat apparaten die je nog niet eerder hebt gezien.", "Unknown devices": "Onbekende apparaten", @@ -607,8 +596,6 @@ "What does this mean?": "Wat betekent dit?", "Error decrypting audio": "Fout met het ontsleutelen van de audio", "Error decrypting image": "Fout met het ontsleutelen van de afbeelding", - "Image '%(Body)s' cannot be displayed.": "Afbeelding '%(Body)s' kan niet worden weergeven.", - "This image cannot be displayed.": "Deze afbeelding kan niet worden weergeven.", "Error decrypting video": "Fout met het ontsleutelen van de video", "Add an Integration": "Voeg een integratie toe", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Je wordt zo naar een derde-partij-website verbonden zodat je het account kan legitimeren voor gebruik met %(integrationsUrl)s. Wil je doorgaan?", @@ -656,7 +643,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?", @@ -665,7 +651,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.", @@ -722,5 +707,444 @@ "%(names)s and %(count)s others are typing|other": "%(names)s en %(count)s andere gebruikers zijn aan het typen", "%(names)s and %(count)s others are typing|one": "%(names)s en iemand anders is aan het typen", "Send": "Verstuur", - "Message Pinning": "Boodschap vastpinnen" + "Message Pinning": "Boodschap vastpinnen", + "Message Replies": "Antwoorden op bericht", + "Tag Panel": "Label Paneel", + "Disable Emoji suggestions while typing": "Emoji suggesties tijdens het typen uitzetten", + "Hide avatar changes": "Avatar veranderingen verbergen", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", + "Hide display name changes": "Weergavenaam wijzigingen verbergen", + "Enable inline URL previews by default": "Inline URL voorvertoning standaard aanzetten", + "Enable URL previews for this room (only affects you)": "URL voorvertoning in deze ruimte aanzetten (geldt alleen voor jou)", + "Enable URL previews by default for participants in this room": "URL voorvertoning standaard voor de gebruikers in deze ruimte aanzetten", + "Delete %(count)s devices|other": "Verwijder %(count)s apparaten", + "Delete %(count)s devices|one": "Verwijder apparaat", + "Select devices": "Apparaten selecteren", + "%(senderName)s sent an image": "%(senderName)s heeft een afbeelding gestuurd", + "%(senderName)s sent a video": "%(senderName)s heeft een video gestuurd", + "%(senderName)s uploaded a file": "%(senderName)s heeft een bestand geüpload", + "Disinvite this user?": "Uitnodiging van deze gebruiker intrekken?", + "Kick this user?": "Deze gebruiker er uit zetten?", + "Unban this user?": "Deze gebruiker ontbannen?", + "Ban this user?": "Deze gebruiker bannen?", + "Disable big emoji in chat": "Grote emoji in gesprekken uitzetten", + "Mirror local video feed": "Lokale video aanvoering ook op andere locaties (Mirrors) opslaan", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Je kan deze actie niet ongedaan maken omdat je jezelf degradeert. Als je het laatste persoon met rechten bent, is het onmogelijk om de rechten terug te krijgen.", + "Unignore": "Niet meer negeren", + "Ignore": "Negeren", + "Jump to read receipt": "Naar het laatst gelezen bericht gaan", + "Mention": "Vermelden", + "Invite": "Uitnodigen", + "User Options": "Gebruikersopties", + "Send an encrypted reply…": "Verstuur een versleuteld antwoord…", + "Send a reply (unencrypted)…": "Verstuur een antwoord (onversleuteld)…", + "Send an encrypted message…": "Verstuur een versleuteld bericht…", + "Send a message (unencrypted)…": "Verstuur een bericht (onversleuteld)…", + "Jump to message": "Naar bericht gaan", + "No pinned messages.": "Geen gepinde berichten.", + "Loading...": "Laden...", + "Pinned Messages": "Gepinde Berichten", + "%(duration)ss": "%(duration)ss", + "%(duration)sm": "%(duration)sm", + "%(duration)sh": "%(duration)su", + "%(duration)sd": "%(duration)sd", + "Online for %(duration)s": "Online voor %(duration)s", + "Idle for %(duration)s": "Inactief voor %(duration)s", + "Offline for %(duration)s": "Offline voor %(duration)s", + "Unknown for %(duration)s": "Onbekend voor %(duration)s", + "Unknown": "Onbekend", + "Replying": "Aan het beantwoorden", + "No rooms to show": "Geen ruimtes om weer te geven", + "Unnamed room": "Ruimte zonder naam", + "World readable": "Leesbaar voor iedereen", + "Guests can join": "Gasten kunnen toetreden", + "Remove avatar": "Avatar verwijderen", + "To change the room's avatar, you must be a": "Om de avatar van de ruimte te verwijderen, moet het volgende zijn:", + "Drop here to favourite": "Hier laten vallen om aan favorieten toe te voegen", + "Drop here to tag direct chat": "Hier laten vallen om als privégesprek te markeren", + "Drop here to restore": "Hier laten vallen om te herstellen", + "Drop here to demote": "Hier laten vallen om te degraderen", + "Community Invites": "Gemeenschapsuitnodigingen", + "You have been kicked from this room by %(userName)s.": "Je bent uit deze ruimte gezet door %(userName)s.", + "You have been banned from this room by %(userName)s.": "Je bent uit deze ruimte verbannen door %(userName)s.", + "You are trying to access a room.": "Je probeert een ruimte te betreden.", + "To change the room's name, you must be a": "Om de ruimtenaam te veranderen moet je het volgende zijn:", + "To change the room's main address, you must be a": "Om het hoofdadres van deze ruimte te wijzigen moet je het volgende zijn:", + "To change the room's history visibility, you must be a": "Om de zichtbaarheid van de geschiedenis van de ruimte te veranderen moet je het volgende zijn:", + "To change the permissions in the room, you must be a": "Om de permissies in de ruimte te veranderen moet je het volgende zijn:", + "To change the topic, you must be a": "Om het onderwerp te veranderen moet je het volgende zijn:", + "To modify widgets in the room, you must be a": "Om een widget in de ruimte aan te passen moet je het volgende zijn:", + "Banned by %(displayName)s": "Verbannen door %(displayName)s", + "Members only (since the point in time of selecting this option)": "Alleen gebruikers (vanaf het moment dat deze optie wordt geselecteerd)", + "Members only (since they were invited)": "Alleen gebruikers (vanaf het moment dat ze uitgenodigd zijn)", + "Members only (since they joined)": "Alleen gebruikers (vanaf het moment dat ze toegetreden zijn)", + "To send messages, you must be a": "Om berichten te versturen moet je het volgende zijn:", + "To invite users into the room, you must be a": "Om gebruikers in de ruimte uit te nodigen moet je het volgende zijn:", + "To configure the room, you must be a": "Om de ruimte te configureren moet je het volgende zijn:", + "To kick users, you must be a": "Om gebruikers er uit te zetten moet je het volgende zijn:", + "To ban users, you must be a": "Om gebruikers te verbannen moet je het volgende zijn:", + "To remove other users' messages, you must be a": "Om de berichten van andere gebruikers te verwijderen moet je het volgende zijn:", + "To send events of type , you must be a": "Om gebeurtenissen van het type te versturen, moet je het volgende zijn:", + "Addresses": "Adressen", + "Invalid community ID": "Ongeldig gemeenschaps-ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is niet een geldig gemeenschaps-ID", + "Flair": "Badge", + "Showing flair for these communities:": "Badges voor deze gemeenschappen weergeven:", + "This room is not showing flair for any communities": "Deze ruimte geeft geen badges voor gemeenschappen weer", + "New community ID (e.g. +foo:%(localDomain)s)": "Nieuw gemeenschaps-ID (bv. +foo:%(localDomain)s)", + "URL previews are enabled by default for participants in this room.": "URL voorvertoning staat standaard aan voor deelnemers in deze ruimte.", + "URL previews are disabled by default for participants in this room.": "URL voorvertoning staat standaard uit voor deelnemers in deze ruimte.", + "Message removed by %(userId)s": "Bericht verwijderd door %(userId)s", + "Message removed": "Bericht verwijderd", + "An email has been sent to %(emailAddress)s": "Een e-mail is naar %(emailAddress)s verstuurd", + "A text message has been sent to %(msisdn)s": "Een tekstbericht is naar %(msisdn)s versuurd", + "Username on %(hs)s": "Gebruikersnaam op %(hs)s", + "Remove from community": "Verwijder van gemeenschap", + "Disinvite this user from community?": "Uitnodiging van de gemeenschap voor deze gebruiker intrekken?", + "Remove this user from community?": "Deze gebruiker van de gemeenschap verwijderen?", + "Failed to withdraw invitation": "Niet gelukt om de uitnodiging in te trekken", + "Failed to remove user from community": "Niet gelukt om de gebruiker van de gemeenschap te verwijderen", + "Filter community members": "Filter gemeenschapsleden", + "Flair will appear if enabled in room settings": "Badge zal worden weergeven als het aangezet is in de ruimte-instellingen", + "Flair will not appear": "Badge zal niet weergeven worden", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Weet je zeker dat je '%(roomName)s' van %(groupId)s wilt verwijderen?", + "Removing a room from the community will also remove it from the community page.": "Het verwijderen van de ruimte van de gemeenschap zal de ruimte ook van de gemeenschapspagina verwijderen.", + "Failed to remove room from community": "Niet gelukt om de ruimte van de gemeenschap te verwijderen", + "Failed to remove '%(roomName)s' from %(groupId)s": "Niet gelijkt om '%(roomName)s' van %(groupId)s te verwijderen", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "De zichtbaarheid van '%(roomName)s' in %(groupId)s kon niet geüpdatet worden.", + "Visibility in Room List": "Zichtbaarheid in Ruimte Lijst", + "Visible to everyone": "Zichtbaar voor iedereen", + "Only visible to community members": "Alleen zichtbaar voor gemeenschapsleden", + "Filter community rooms": "Gemeenschapsruimtes filteren", + "Something went wrong when trying to get your communities.": "Iets ging verkeerd tijdens het ophalen van je gemeenschappen.", + "Display your community flair in rooms configured to show it.": "Geef je gemeenschapsbadge weer in ruimtes die geconfigureerd zijn om het te weergeven.", + "You're not currently a member of any communities.": "Je bent momenteel niet een lid van een gemeenschap.", + "Minimize apps": "Applicaties minimaliseren", + "Communities": "Gemeenschappen", + "%(nameList)s %(transitionList)s": "%(nameList)s%(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s traden %(count)s keer toe", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s zijn toegetreden", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s trad %(count)s keer toe", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s is toegetreden", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s gingen %(count)s keer weg", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s gingen weg", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s ging %(count)s keer weg", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s ging weg", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s traden toe en gingen weer weg voor %(count)s keer", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s traden toe en gingen weer weg", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s trad toe en ging weer weg voor %(count)s keer", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s trad toe en ging weer weg", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s ging weg en trad weer toe voor %(count)s keer", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s gingen weg en kwamen weer terug", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s ging weg en kwam weer terug voor %(count)s keer", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s ging weg en kwam weer terug", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s wezen hun uitnodiging af voor %(count)s keer", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s wezen hun uitnodiging af", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s wees %(count)s keer zijn of haar uitnodiging af", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s wees zijn of haar uitnodiging af", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "De uitnodigingen naar %(severalUsers)s zijn %(count)s keer ingetrokken", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "De uitnodigingen voor %(severalUsers)s zijn ingetrokken", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "De uitnodiging van %(oneUser)s is %(count)s keer ingetrokken", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "De uitnodiging van %(oneUser)s is ingetrokken", + "were invited %(count)s times|other": "was %(count)s keer uitgenodigd", + "were invited %(count)s times|one": "was uitgenodigd", + "was invited %(count)s times|other": "was %(count)s keer uitgenodigd", + "was invited %(count)s times|one": "was uitgenodigd", + "were banned %(count)s times|other": "was %(count)s keer verbannen", + "were banned %(count)s times|one": "was verbannen", + "was banned %(count)s times|other": "was %(count)s keer verbannen", + "was banned %(count)s times|one": "was verbannen", + "were unbanned %(count)s times|other": "zijn voor %(count)s keer ontbannen", + "was unbanned %(count)s times|other": "was %(count)s keer ontbannen", + "was unbanned %(count)s times|one": "was ontbannen", + "were kicked %(count)s times|other": "werden er %(count)s keer uitgezet", + "were kicked %(count)s times|one": "werden er uit gezet", + "was kicked %(count)s times|other": "was er %(count)s keer uitgezet", + "was kicked %(count)s times|one": "was er uit gezet", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s veranderden hun naam %(count)s keer", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s veranderden hun naam", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s veranderde zijn of haar naam %(count)s keer", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s veranderde zijn of haar naam", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s veranderden hun avatar %(count)s keer", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s veranderden hun avatar", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s veranderde zijn of haar avatar %(count)s keer", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s veranderde zijn of haar avatar", + "%(items)s and %(count)s others|other": "%(items)s en %(count)s anderen", + "%(items)s and %(count)s others|one": "%(items)s en één andere", + "collapse": "inklappen", + "expand": "openklappen", + "Custom of %(powerLevel)s": "Aangepast rank van %(powerLevel)s", + "Quote": "Citeren", + "And %(count)s more...|other": "En %(count)s meer...", + "Matrix ID": "Matrix ID", + "Matrix Room ID": "Matrix Ruimte ID", + "email address": "e-mailadres", + "Try using one of the following valid address types: %(validTypesList)s.": "Probeer één van de volgende geldige adrestypes: %(validTypesList)s.", + "You have entered an invalid address.": "Je hebt een ongeldig adres ingevoerd.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Een gemeenschaps-ID mag alleen de karakters a-z, 0-9, of '=_-./' bevatten.", + "Community IDs cannot not be empty.": "Een gemeenschaps-ID kan niet leeg zijn.", + "Something went wrong whilst creating your community": "Er is iets fout gegaan tijdens het aanmaken van je gemeenschap", + "Create Community": "Gemeenschap Aanmaken", + "Community Name": "Gemeenschapsnaam", + "Community ID": "Gemeenschap-ID", + "example": "voorbeeld", + "Advanced options": "Geavanceerde opties", + "Block users on other matrix homeservers from joining this room": "Gebruikers van andere matrix thuisservers niet toestaan om tot deze ruimte toe te treden", + "This setting cannot be changed later!": "Deze instelling kan niet later veranderd worden!", + "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    HTML voor je gemeenschapspagina

    \n

    \n Gebruik de lange beschrijving om nieuwe leden in de gemeenschap te introduceren of om belangrijke links te verspreiden\n

    \n

    \n Je kan zelfs 'img' tags gebruiken\n

    \n", + "Add rooms to the community summary": "Voeg ruimtes aan de gemeenschapssamenvatting toe", + "Which rooms would you like to add to this summary?": "Welke ruimtes zou je aan deze samenvatting willen toevoegen?", + "Add to summary": "Voeg aan samenvatting toe", + "Failed to add the following rooms to the summary of %(groupId)s:": "Het is niet gelukt om de volgende ruimtes aan de samenvatting van %(groupId)s toe te voegen:", + "Add a Room": "Voeg een ruimte toe", + "Failed to remove the room from the summary of %(groupId)s": "Het is niet gelukt om de ruimte van de samenvatting van %(groupId)s te verwijderen", + "The room '%(roomName)s' could not be removed from the summary.": "De ruimte '%(roomName)s' kan niet van de samenvatting verwijderd worden.", + "Add users to the community summary": "Voeg gebruikers aan de gemeenschapssamenvatting toe", + "Who would you like to add to this summary?": "Wie zou je aan de samenvatting toe willen voegen?", + "Failed to add the following users to the summary of %(groupId)s:": "Het is niet gelukt om de volgende gebruikers aan de samenvatting van %(groupId)s toe te voegen:", + "Add a User": "Voeg een Gebruiker toe", + "Failed to remove a user from the summary of %(groupId)s": "Het is niet gelukt om een gebruiker van de samenvatting van %(groupId)s te verwijderen", + "The user '%(displayName)s' could not be removed from the summary.": "De gebruiker '%(displayName)s' kon niet van de samenvatting verwijderd worden.", + "Failed to update community": "Het is niet gelukt om de gemeenschap te updaten", + "Unable to accept invite": "De uitnodiging kon niet geaccepteerd worden", + "Unable to reject invite": "De uitnodiging kon niet afgewezen worden", + "Leave Community": "Gemeenschap Verlaten", + "Leave %(groupName)s?": "%(groupName)s verlaten?", + "Leave": "Verlaten", + "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", + "You are an administrator of this community": "Je bent een administrator van deze gemeenschap", + "You are a member of this community": "Je bent lid van deze gemeenschap", + "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "Jouw gemeenschap heeft geen Lange Beschrijving (een HTML pagina dat aan de gemeenschapsleden wordt weergeven).
    Klik hier om de instellingen te openen en een Lange Beschrijving te maken!", + "Long Description (HTML)": "Lange Beschrijving (HTML)", + "Description": "Beschrijving", + "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", + "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", + "Error whilst fetching joined communities": "Er is een fout opgetreden tijdens het ophalen van de gemeenschappen waar je lid van bent", + "Create a new community": "Maak een nieuwe gemeenschap aan", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Maak een gemeenschap aan om gebruikers en ruimtes samen te groeperen! Bouw een aangepaste homepagina om je eigen plek in het Matrix universum te maken.", + "Join an existing community": "Treed tot een bestaande gemeenschap toe", + "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Je moet het gemeenschaps-ID weten om tot de gemeenschap toe te treden; dit zal er uitzien zoals +voorbeeld:matrix.org.", + "Show devices, send anyway or cancel.": "Toon apparaten, Toch versturen of annuleren.", + "%(count)s of your messages have not been sent.|one": "Je bericht was niet verstuurd.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Nu alles opnieuw versturen of annuleren. Je kan ook individuele berichten selecteren om opnieuw te versturen of te annuleren.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Nu bericht opnieuw versturen of bericht annuleren.", + "Warning": "Waarschuwing", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Er is niemand anders hier! Wil je anderen uitnodigen of de waarschuwing over de lege ruimte stoppen?", + "Light theme": "Licht thema", + "Dark theme": "Donker thema", + "Status.im theme": "Status.im thema", + "Ignored Users": "Genegeerde Gebruikers", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privacy is belangrijk voor ons, dus we collecteren geen persoonlijke of identificeerbare gegevens voor onze gegevensanalyse.", + "Learn more about how we use analytics.": "Leer meer over hoe we gegevensanalyse gebruiken.", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Een e-mail is naar %(emailAddress)s verstuurd. Klik hieronder zodra je de link hebt gevolgd.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Merk op dat je aan het inloggen bent in de %(hs)s server, niet matrix.org.", + "This homeserver doesn't offer any login flows which are supported by this client.": "Deze thuisserver heeft geen inlogmethodes die bij deze client ondersteunt worden.", + "Sign in to get started": "Log in om te beginnen", + "Ignores a user, hiding their messages from you": "Negeert een gebruiker, waardoor de berichten van de gebruiker onzichtbaar voor je worden", + "Stops ignoring a user, showing their messages going forward": "Stopt het negeren van een gebruiker, hierdoor worden de berichten van de gebruiker vanaf nu weer zichtbaar", + "Notify the whole room": "Notificeer de gehele ruimte", + "Room Notification": "Ruimte Notificatie", + "The information being sent to us to help make Riot.im better includes:": "De informatie dat naar ons wordt verstuurd om Riot.im beter te maken betrekt:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Waar deze pagina identificeerbare informatie bevat, zoals een ruimte, gebruiker of groep ID, zal deze data verwijderd worden voordat het naar de server gestuurd wordt.", + "The platform you're on": "Het platform waar je je op bevindt", + "The version of Riot.im": "De versie van Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Of je wel of niet ingelogd bent (we nemen niet je gebruikersnaam op)", + "Your language of choice": "De taal waarin de applicatie wordt weergeven", + "Which officially provided instance you are using, if any": "Welke officieel verschafte instantie je gebruikt, in dat het geval is", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Of je wel of niet gebruik maakt van de Richttext modus of de Rich Text Editor", + "Your homeserver's URL": "De URL van je thuisserver", + "Your identity server's URL": "De URL van je thuisserver", + "In reply to ": "Als antwoord op ", + "This room is not public. You will not be able to rejoin without an invite.": "Deze ruimte is niet publiekelijk. Je zal niet opnieuw kunnen toetreden zonder een uitnodiging.", + "were unbanned %(count)s times|one": "waren ontbant", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s heeft zijn/haar weergavenaam veranderd naar %(displayName)s.", + "Disable Community Filter Panel": "Gemeenschapsfilterpaneel uitzetten", + "Your key share request has been sent - please check your other devices for key share requests.": "Je verzoek om sleutels te delen is verzonden - controleer je andere apparaten voor het verzoek.", + "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.": "Verzoeken om sleutels te delen worden automatisch naar andere apparaten verstuurd. Als je het verzoek hebt afgewezen of weg hebt geklikt, klik dan hier voor een nieuwe verzoek voor de sleutels van deze sessie.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Het is niet mogelijk om dit bericht te ontsleutelen als je andere apparaten er geen sleutel voor hebben.", + "Key request sent.": "Sleutel verzoek verstuurd.", + "Re-request encryption keys from your other devices.": "Versleutelingssleutels opnieuw aanvragen van je andere apparaten.", + "%(user)s is a %(userRole)s": "%(user)s is een %(userRole)s", + "Did you know: you can use communities to filter your Riot.im experience!": "Wist je dat: je gemeenschappen kan gebruiken om je Riot.im ervaring te filteren!", + "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.": "Sleep een gemeenschapsavatar naar het filterpaneel helemaal aan de linkerkant van het scherm om een filter te maken. Je kan dan altijd op de avatar in het filterpaneel klikken om alleen de ruimtes en mensen te zien die met die gemeenschap geassocieerd zijn.", + "Clear filter": "Filter vrijmaken", + "Failed to set direct chat tag": "Het is niet gelukt om de 'privégesprek' label in te stellen", + "Failed to remove tag %(tagName)s from room": "Het is niet gelukt om de label %(tagName)s van de ruimte te verwijderen", + "Failed to add tag %(tagName)s to room": "Het is niet gelukt om de label %(tagName)s aan deze ruimte toe te voegen", + "Stickerpack": "Stickerpakket", + "You don't currently have any stickerpacks enabled": "Je hebt momenteel geen stickerpakketten aan staan", + "Add a stickerpack": "Stickerpakket toevoegen", + "Hide Stickers": "Stickers verbergen", + "Show Stickers": "Stickers weergeven", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Gezien door %(displayName)s (%(userName)s) op %(dateTime)s", + "Code": "Code", + "Unable to join community": "Je kon niet tot de gemeenschap toetreden", + "Unable to leave community": "Je kon de gemeenschap niet verlaten", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Veranderingen die aan je gemeenschap naam en avatar zijn aangebracht zullen misschien niet gezien worden door anderen tot maximaal 30 minuten.", + "Join this community": "Tot deze gemeenschap toetreden", + "Who can join this community?": "Wie kan tot deze gemeenschap toetreden?", + "Everyone": "Iedereen", + "Leave this community": "Deze gemeenschap verlaten", + "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 contain 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", + "Fetching third party location failed": "Het ophalen van de locatie van de derde partij is mislukt", + "A new version of Riot is available.": "Er is een nieuwe versie van Riot beschikbaar.", + "I understand the risks and wish to continue": "Ik begrijp de risico's en wil graag verder gaan", + "Couldn't load home page": "Kon de home pagina niet laden", + "Send Account Data": "Stuur account informatie", + "All notifications are currently disabled for all targets.": "Alle meldingen zijn momenteel uitgeschakeld voor alle doelen.", + "Uploading report": "Rapport uploaden", + "Sunday": "Zondag", + "Notification targets": "Meldingsdoelen", + "Today": "Vandaag", + "Files": "Bestanden", + "You are not receiving desktop notifications": "Je ontvangt momenteel geen desktopmeldingen", + "Friday": "Vrijdag", + "Update": "Bijwerken", + "What's New": "Wat is er nieuw", + "Add an email address above to configure email notifications": "Voeg een e-mailadres toe om e-mailmeldingen te ontvangen", + "Expand panel": "Paneel uitklappen", + "On": "Aan", + "%(count)s Members|other": "%(count)s Deelnemers", + "Filter room names": "Filter kamernamen", + "Changelog": "Logboek van wijzigingen", + "Waiting for response from server": "Wachten op antwoord van de server", + "Send Custom Event": "Verzend aangepast evenement", + "Advanced notification settings": "Geavanceerde meldingsinstellingen", + "delete the alias.": "verwijder de alias.", + "To return to your account in future you need to set a password": "Om in de toekomst naar je account terug te gaan moet je een wachtwoord instellen", + "Forget": "Vergeten", + "#example": "#voorbeeld", + "Hide panel": "Paneel verbergen", + "You cannot delete this image. (%(code)s)": "Je kunt deze afbeelding niet verwijderen. (%(code)s)", + "Cancel Sending": "Versturen annuleren", + "This Room": "Deze kamer", + "The Home Server may be too old to support third party networks": "De thuisserver is misschien te oud om netwerken van derde partijen te ondersteunen", + "Resend": "Opnieuw verzenden", + "Error saving email notification preferences": "Fout bij het opslaan van de meldingsvoorkeuren voor e-mail", + "Messages containing my display name": "Berichten die mijn weergavenaam bevatten", + "Messages in one-to-one chats": "Berichten in één-op-één-gesprekken", + "Unavailable": "Niet beschikbaar", + "View Decrypted Source": "Bekijk ontsleutelde bron", + "Failed to update keywords": "Trefwoorden bijwerken mislukt", + "remove %(name)s from the directory.": "verwijder %(name)s uit de kamerlijst.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Meldingen op de volgende trefwoorden volgen regels die hier niet kunnen worden getoond:", + "Safari and Opera work too.": "Safari en Opera werken ook.", + "Please set a password!": "Stel een wachtwoord in!", + "You have successfully set a password!": "U heeft met succes een wachtwoord ingesteld!", + "An error occurred whilst saving your email notification preferences.": "Er is een fout opgetreden tijdens het opslaan van uw e-mailmeldingsvoorkeuren.", + "Explore Room State": "Verken Ruimtetoestand", + "Source URL": "Bron-URL", + "Messages sent by bot": "Berichten verzonden door een bot", + "Filter results": "Resultaten filteren", + "Members": "Leden", + "No update available.": "Geen update beschikbaar.", + "Noisy": "Luidruchtig", + "Failed to get protocol list from Home Server": "Protocollijst ophalen van de homeserver mislukt", + "Collecting app version information": "App-versieinformatie verzamelen", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "De alias %(alias)s verwijderen en %(name)s uit de kamerlijst verwijderen?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Hiermee kunt u naar uw account terugkeren nadat u zich heeft afgemeld, en u aanmelden op andere apparaten.", + "Keywords": "Trefwoorden", + "Enable notifications for this account": "Meldingen voor dit account aanzetten", + "Directory": "Kamerlijst", + "Invite to this community": "Nodig uit in deze community", + "Search for a room": "Een kamer opzoeken", + "Messages containing keywords": "Berichten die trefwoorden bevatten", + "Room not found": "De kamer is niet gevonden", + "Tuesday": "Dinsdag", + "Enter keywords separated by a comma:": "Voeg trefwoorden toe, gescheiden door een komma:", + "Search…": "Zoeken…", + "You have successfully set a password and an email address!": "Het instellen van een wachtwoord en e-mailadres is geslaagd!", + "Remove %(name)s from the directory?": "%(name)s uit de kamerlijst verwijderen?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot gebrukt veel geavanceerde browserfuncties, waarvan enkele niet (of experimenteel) in uw webbrowser beschikbaar zijn.", + "Developer Tools": "Ontwikkelaarsgereedschap", + "Enable desktop notifications": "Desktopmeldingen aanzetten", + "Explore Account Data": "Bekijk account informatie", + "Remove from Directory": "Uit de kamerlijst verwijderen", + "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", + "You must specify an event type!": "Je moet een event-type specificeren!", + "(HTTP status %(httpStatus)s)": "(HTTP-status %(httpStatus)s)", + "Invite to this room": "Uitnodigen voor deze kamer", + "Please install Chrome or Firefox for the best experience.": "Installeer alstublieft Chrome of Firefox voor de beste gebruikerservaring.", + "Failed to get public room list": "Lijst met publieke kamers ophalen mislukt", + "Send logs": "Logboeken versturen", + "All messages": "Alle berichten", + "Call invitation": "Oproep-uitnodiging", + "Downloading update...": "Update aan het downloaden...", + "State Key": "Toestandssleutel", + "Failed to send custom event.": "Aangepast Event verzenden mislukt.", + "What's new?": "Wat is er nieuw?", + "Notify me for anything else": "Stuur een melding voor al het andere", + "When I'm invited to a room": "Wanneer ik uitgenodigd word voor een kamer", + "Can't update user notification settings": "Het is niet gelukt om de meldingsinstellingen van de gebruiker bij te werken", + "Notify for all other messages/rooms": "Stuur een melding voor alle andere berichten/kamers", + "Unable to look up room ID from server": "Het is mislukt om de kamer-ID op te halen van de server", + "Couldn't find a matching Matrix room": "Het is niet gelukt om een bijbehorende Matrix-kamer te vinden", + "All Rooms": "Alle kamers", + "You cannot delete this message. (%(code)s)": "Je kunt dit bericht niet verwijderen. (%(code)s)", + "Thursday": "Donderdag", + "Forward Message": "Bericht doorsturen", + "Back": "Terug", + "Reply": "Beantwoord", + "Show message in desktop notification": "Toon boodschap in bureaublad popup", + "Unhide Preview": "Zichtbaar maken preview", + "Unable to join network": "Het is mislukt om toe te treden tot dit netwerk", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Je hebt ze mogelijk ingesteld in een andere client dan Riot. Je kunt ze niet aanpassen in Riot maar ze zijn wel actief", + "Sorry, your browser is not able to run Riot.": "Sorry, uw browser werkt niet met Riot.", + "Uploaded on %(date)s by %(user)s": "Geüpload op %(date)s door %(user)s", + "Messages in group chats": "Berichten in groepsgesprekken", + "Yesterday": "Gisteren", + "Error encountered (%(errorDetail)s).": "Fout ondervonden (%(errorDetail)s).", + "Login": "Aanmelden", + "Low Priority": "Lage prioriteit", + "Unable to fetch notification target list": "Het is mislukt om de lijst van notificatiedoelen op te halen", + "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", + "Logs sent": "Logs verstuurd", + "GitHub issue link:": "GitHub opgave link:", + "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 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.", + "Failed to send logs: ": "Het is niet gelukt om de logs te versturen: ", + "Notes:": "Constateringen:", + "Preparing to send logs": "Voorbereiden om logs te versturen" } diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 2ddbf47ce6..d3dcb72f49 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -11,7 +11,6 @@ "Start chatting": "Rozpocznij konwersację", "Start Chatting": "Rozpocznij Konwersację", "Updates": "Aktualizacje", - "This image cannot be displayed.": "Ten obrazek nie może zostać wyświetlony.", "Default server": "Domyślny serwer", "Add User": "Dodaj użytkownika", "Verify...": "Zweryfikuj...", @@ -138,14 +137,12 @@ "Missing Media Permissions, click here to request.": "Brakuje uprawnień mediów. Kliknij tutaj, aby ich zażądać.", "and %(count)s others...|other": "i %(count)s innych...", "and %(count)s others...|one": "i jeden inny...", - "Bug Report": "Raport błędu", "Bulk Options": "Masowe opcje", "Call Timeout": "Upłynął limit czasu połączenia", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nie można nawiązać połączenia z serwerem - proszę sprawdź twoje połączenie, upewnij się, że certyfikat SSL serwera jest zaufany, i że dodatki przeglądarki nie blokują żądania.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Nie można nawiązać połączenia z serwerem przy użyciu HTTP podczas korzystania z HTTPS dla bieżącej strony. Użyj HTTPS lub włącz niebezpieczne skrypty.", "Can't load user settings": "Nie można załadować ustawień użytkownika", "Cannot add any more widgets": "Nie można dodać już więcej widżetów", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s zmienił swoją nazwę z %(oldDisplayName)s na %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s zmienił swoje zdjęcie profilowe.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s zmienił poziom mocy %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s zmienił nazwę pokoju na %(roomName)s.", @@ -258,7 +255,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", @@ -350,7 +346,6 @@ "olm version:": "wersja olm:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Po włączeniu szyfrowania w pokoju nie można go ponownie wyłączyć (póki co)", "Only people who have been invited": "Tylko ludzie, którzy zostali zaproszeni", - "Otherwise, click here to send a bug report.": "W przeciwnym razie, kliknij tutaj by wysłać raport o błędzie.", "Password": "Hasło", "Password:": "Hasło:", "Passwords can't be empty": "Hasła nie mogą być puste", @@ -380,9 +375,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", @@ -421,7 +414,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)", @@ -445,8 +437,8 @@ "This email address was not found": "Podany adres e-mail nie został znaleziony", "Must be viewing a room": "Musi być w trakcie wyświetlania pokoju", "The email address linked to your account must be entered.": "Musisz wpisać adres e-mail połączony z twoim kontem.", - "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Rozmiar folderu '%(fileName)s' przekracza możliwy limit do przesłania na serwer domowy", - "The file '%(fileName)s' failed to upload": "Przesyłanie folderu '%(fileName)s' nie powiodło się", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Rozmiar pliku '%(fileName)s' przekracza możliwy limit do przesłania na serwer domowy", + "The file '%(fileName)s' failed to upload": "Przesyłanie pliku '%(fileName)s' nie powiodło się", "The remote side failed to pick up": "Strona zdalna nie odebrała", "This room has no local addresses": "Ten pokój nie ma lokalnych adresów", "This room is not recognised.": "Ten pokój nie został rozpoznany.", @@ -493,7 +485,6 @@ "Upload Files": "Prześlij pliki", "Upload new:": "Prześlij nowy:", "Use with caution": "Używać ostrożnie", - "%(user)s is a": "%(user)s jest", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (moc uprawnień administratorskich %(powerLevelNumber)s)", "Username invalid: %(errMessage)s": "Niepoprawna nazwa użytkownika: %(errMessage)s", "Verification Pending": "Oczekuje weryfikacji", @@ -564,7 +555,6 @@ "Offline": "Niedostępny", "Add an Integration": "Dodaj integrację", "Token incorrect": "Niepoprawny token", - "This action is irreversible.": "Ta akcja jest nieodwracalna.", "To link to a room it must have an address.": "Aby móc stworzyć link do pokoju musi on mieć swój adres.", "unencrypted": "niezaszyfrowany", "Unknown (user, device) pair:": "Nieznana para (użytkownik, urządzenie):", @@ -609,15 +599,12 @@ "Failed to invite the following users to the %(roomName)s room:": "Wysłanie zaproszenia do następujących użytkowników do pokoju %(roomName)s nie powiodło się:", "Confirm Removal": "Potwierdź usunięcie", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Jesteś pewien że chcesz usunąć to wydarzenie? Pamiętaj, że jeśli usuniesz nazwę pokoju lub aktualizację tematu pokoju, zmiana może zostać cofnięta.", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "To sprawi, że Twoje konto będzie permamentnie nieużywalne. Nie będzie można zarejestrować się ponownie z tą samą identyfikacją użytkownika.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Aby sprawdzić czy to urządzenie jest zaufane, skontaktuj się z jego właścicielem używając innych środków (np. osobiście lub telefonicznie) i zapytaj ich czy klucz, który widzą w ustawieniach użytkownika dla tego urządzenia pasuje do klucza poniżej:", "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.": "Jeśli klucz pasuje, naciśnij na przycisk \"Zweryfikuj\" poniżej. Jeśli nie, to ktoś inny najprawdopodobniej przejmuje lub podszywa się pod to urządzenie i powinieneś nacisnąć przycisk dodania do czarnej listy.", "In future this verification process will be more sophisticated.": "W przyszłości proces weryfikacji będzie bardziej skomplikowany.", "I verify that the keys match": "Upewnię się, że klucze się zgadzają", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Napotkaliśmy błąd podczas próby przywrócenia Twojej poprzedniej sesji. Aby kontynuować, musisz zalogować się ponownie, a zaszyfrowana historia czatu nie będzie do odczytania.", "Unable to restore session": "Przywrócenie sesji jest niemożliwe", "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.": "Jeśli wcześniej używałeś/aś nowszej wersji Riot, Twoja sesja może być niekompatybilna z tą wersją. Zamknij to okno i powróć do nowszej wersji.", - "Continue anyway": "Kontynuuj mimo to", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Aktualnie wpisujesz niezweryfikowane urządzenia na czarną listę; aby wysłać wiadomość do tych urządzeń musisz je zweryfikować.", "Riot collects anonymous analytics to allow us to improve the application.": "Riot zbiera anonimowe dane analityczne, aby umożliwić nam rozwijanie aplikacji.", "Verifies a user, device, and pubkey tuple": "Weryfikuje użytkownika, urządzenie i krotkę kluczy publicznych", @@ -629,7 +616,6 @@ "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Nastąpiła próba załadowania danego punktu w historii tego pokoju, lecz nie masz uprawnień, by zobaczyć określoną wiadomość.", "Use compact timeline layout": "Użyj kompaktowego stylu linii czasu", "You have enabled URL previews by default.": "Masz domyślnie włączone podglądy linków.", - "Opt out of analytics": "Zrezygnuj z analityk", "Please check your email to continue registration.": "Sprawdź swój e-mail, aby kontynuować rejestrację.", "Please enter the code it contains:": "Wpisz kod, który jest tam zawarty:", "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Jeśli nie ustawisz adresu e-mail, nie będzie możliwe zresetowanie Twojego hasła. Kontynuować?", @@ -639,7 +625,6 @@ "What does this mean?": "Co to znaczy?", "Error decrypting audio": "Błąd deszyfrowania audio", "Error decrypting image": "Błąd deszyfrowania obrazu", - "Image '%(Body)s' cannot be displayed.": "Obraz '%(Body)s' nie może zostać wyświetlony.", "Error decrypting video": "Błąd deszyfrowania wideo", "Removed or unknown message type": "Usunięto lub nieznany typ wiadomości", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Próbowano załadować konkretny punkt na osi czasu w tym pokoju, ale nie nie można go znaleźć.", @@ -692,5 +677,250 @@ "Which rooms would you like to add to this community?": "Które pokoje chcesz dodać do tej społeczności?", "Room name or alias": "Nazwa pokoju lub alias", "Add to community": "Dodaj do społeczności", - "Call": "Połącz" + "Call": "Połącz", + "Submit debug logs": "Wyślij dzienniki błędów", + "The version of Riot.im": "Wersja Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Czy jesteś zalogowany, czy nie (nie zapisujemy twojej nazwy użytkownika)", + "Your language of choice": "Twój wybrany język", + "Your homeserver's URL": "Adres URL twojego serwera domowego", + "Your identity server's URL": "Adres URL twojego serwera tożsamości", + "The information being sent to us to help make Riot.im better includes:": "Oto informacje przesyłane do nas, służące do poprawy Riot.im:", + "The platform you're on": "Platforma na której jesteś", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "W tym pokoju są nieznane urządzenia: jeżeli będziesz kontynuować bez ich weryfikacji, możliwe będzie podsłuchiwanie Twojego połączenia.", + "Answer": "Odbierz", + "Review Devices": "Przegląd urządzeń", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Uwaga: każda osoba dodana do Społeczności będzie publicznie widoczna dla każdego, go zna identyfikator społeczności", + "Invite new community members": "Zaproś nowych członków Społeczności", + "Name or matrix ID": "Nazwa lub matrix ID", + "Show these rooms to non-members on the community page and room list?": "Pokazać te pokoje dla osób niebędących członkami na stronie Społeczności oraz liście pokoi?", + "Add rooms to the community": "Dodaj pokoje do Społeczności", + "Failed to invite the following users to %(groupId)s:": "Nie udało się zaprosić poniższych użytkowników do %(groupId)s:", + "Failed to invite users to community": "Nie udało się zaprosić użytkowników do Społeczności", + "Failed to invite users to %(groupId)s": "Nie udało się zaprosić użytkowników do %(groupId)s", + "Failed to add the following rooms to %(groupId)s:": "Nie udało się dodać poniższych pokoi do %(groupId)s:", + "Restricted": "Ograniczony", + "Ignored user": "Użytkownik ignorowany", + "You are now ignoring %(userId)s": "Ignorujesz teraz %(userId)s", + "You are no longer ignoring %(userId)s": "Nie ignorujesz już %(userId)s", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s zmienił swoją wyświetlaną nazwę na %(displayName)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s zmienił przypiętą wiadomość dla tego pokoju.", + "Message Pinning": "Przypinanie wiadomości", + "%(names)s and %(count)s others are typing|other": "%(names)s oraz %(count)s innych piszą", + "%(names)s and %(count)s others are typing|one": "%(names)s oraz jedna inna osoba piszą", + "Send": "Wyślij", + "Disable Emoji suggestions while typing": "Wyłącz podpowiedzi Emoji podczas pisania", + "Hide avatar changes": "Ukryj zmiany awatarów", + "Hide display name changes": "Ukryj zmiany wyświetlanych nazw", + "Disable big emoji in chat": "Wyłącz duże Emoji w czacie", + "Mirror local video feed": "Powiel lokalne wideo", + "Disable Community Filter Panel": "Wyłącz Panel Filtra Społeczności", + "Enable inline URL previews by default": "Włącz domyślny podgląd URL w tekście", + "Enable URL previews for this room (only affects you)": "Włącz podgląd URL dla tego pokoju (dotyczy tylko Ciebie)", + "Enable URL previews by default for participants in this room": "Włącz domyślny podgląd URL dla uczestników w tym pokoju", + "Delete %(count)s devices|other": "Usunięto %(count)s urządzeń", + "Delete %(count)s devices|one": "Usunięto urządzenie", + "Select devices": "Wybierz urządzenia", + "%(senderName)s sent an image": "%(senderName)s wysłał(a) obrazek", + "%(senderName)s sent a video": "%(senderName)s wysłał(a) wideo", + "%(senderName)s uploaded a file": "%(senderName)s wysłał(a) plik", + "Your key share request has been sent - please check your other devices for key share requests.": "Twoja prośba o podzielenie się kluczem została wysłana - sprawdź swoje inne urządzenie w celu spełnienia prośby.", + "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.": "Prośby o podzielenie się kluczem są wysyłane do Twoich innych urządzeń automatycznie. Jeżeli prośba została odrzucona na innym urządzeniu, kliknij tutaj aby ponownie poprosić o podzielenie się kluczem dla tej sesji.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Jeżeli inne Twoje urządzenia nie mają klucza dla tej wiadomości, nie będziesz w stanie ich odszyfrować.", + "Key request sent.": "Prośba o klucz wysłana.", + "Re-request encryption keys from your other devices.": "Poproś ponownie o klucze szyfrujące z Twojego innego urządzenia.", + "Kick this user?": "Wyrzucić tego użytkownika?", + "Unban this user?": "Odbanować tego użytkownika?", + "Ban this user?": "Zbanować tego użytkownika?", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Nie będziesz w stanie odwrócić tej zmiany, ponieważ degradujesz się sam(a), jeżeli jesteś ostatnim użytkownikiem z uprawnieniami w tym pokoju, niemożliwe będzie odzyskanie uprawnień.", + "Ignore": "Ignoruj", + "Mention": "Wspomnij", + "Invite": "Zaproś", + "User Options": "Opcje Użytkownika", + "Send an encrypted reply…": "Wyślij zaszyfrowaną odpowiedź…", + "Send a reply (unencrypted)…": "Wyślij odpowiedź (nieszyfrowaną)…", + "Send an encrypted message…": "Wyślij zaszyfrowaną wiadomość…", + "Send a message (unencrypted)…": "Wyślij wiadomość (niezaszyfrowaną)…", + "Jump to message": "Skocz do wiadomości", + "No pinned messages.": "Brak przypiętych wiadomości.", + "Loading...": "Ładowanie...", + "Pinned Messages": "Przypięte Wiadomości", + "Online for %(duration)s": "Online przez %(duration)s", + "Idle for %(duration)s": "Nieaktywny przez %(duration)s", + "Offline for %(duration)s": "Offline przez %(duration)s", + "Unknown for %(duration)s": "Nieznany przez %(duration)s", + "Unknown": "Nieznany", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Widziane przez %(displayName)s (%(userName)s) o %(dateTime)s", + "No rooms to show": "Brak pokoi do wyświetlenia", + "Unnamed room": "Pokój bez nazwy", + "Guests can join": "Goście mogą dołączyć", + "Remove avatar": "Usuń awatar", + "Drop here to favourite": "Upuść to aby dodać do ulubionych", + "Drop here to restore": "Upuść tu aby przywrócić", + "Drop here to demote": "Upuść tu aby zdegradować", + "You have been kicked from this room by %(userName)s.": "Zostałeś usunięty z tego pokoju przez %(userName)s.", + "You have been banned from this room by %(userName)s.": "Zostałeś zbanowany z tego pokoju przez %(userName)s.", + "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ć", + "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", + "Failed to add tag %(tagName)s to room": "Nie można dodać tagu %(tagName)s do pokoju", + "Notification targets": "Cele powiadomień", + "Failed to set direct chat tag": "Nie udało się ustawić znacznika rozmów bezpośrednich", + "Today": "Dzisiaj", + "Failed to get protocol list from Home Server": "Nie można pobrać listy protokołów z serwera domowego", + "You are not receiving desktop notifications": "Nie otrzymujesz powiadomień na pulpit", + "Friday": "Piątek", + "Update": "Uaktualnienie", + "What's New": "Co nowego", + "Add an email address above to configure email notifications": "Dodaj adres e-mail powyżej, aby skonfigurować powiadomienia e-mailowe", + "Expand panel": "Rozwiń panel", + "On": "Włącz", + "%(count)s Members|other": "%(count)s Członków", + "Filter room names": "Filtruj nazwy pokojów", + "Changelog": "Dziennik zmian", + "Waiting for response from server": "Czekam na odpowiedź serwera", + "Leave": "Opuść", + "Send Custom Event": "Wyślij niestandardowe wydarzenie", + "Advanced notification settings": "Zaawansowane ustawienia powiadomień", + "Failed to send logs: ": "Niepowodzenie wysyłki zapisu rozmów ", + "delete the alias.": "usunąć alias.", + "To return to your account in future you need to set a password": "Aby wrócić do swojego konta w przyszłości musisz ustawić hasło ", + "Forget": "Zapomnij", + "World readable": "Całkowicie publiczne", + "#example": "#przykład", + "Hide panel": "Ukryj panel", + "You cannot delete this image. (%(code)s)": "Nie możesz usunąć tego obrazka. (%(code)s)", + "Cancel Sending": "Anuluj wysyłanie", + "Warning": "Ostrzeżenie", + "This Room": "Ten pokój", + "The Home Server may be too old to support third party networks": "Serwer domowy może być za stary dla innych sieci", + "Resend": "Wyślij jeszcze raz", + "Error saving email notification preferences": "Wystąpił błąd podczas zapisywania ustawień powiadomień e-mailowych", + "Messages containing my display name": "Wiadomości zawierające moją wyświetlaną nazwę", + "Messages in one-to-one chats": "Wiadomości w rozmowach jeden-na-jeden", + "Unavailable": "Niedostępny", + "View Decrypted Source": "Pokaż zdeszyfrowane źródło", + "Notes:": "Notatki:", + "remove %(name)s from the directory.": "usuń %(name)s z katalogu.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Powiadomienia o słowach kluczowych spełniają reguły, które nie mogą być tu wyświetlone:", + "Safari and Opera work too.": "Safari i Opera również się sprawdzą.", + "Please set a password!": "Proszę, ustaw hasło!", + "You have successfully set a password!": "Hasło zostało zmienione z powodzeniem!", + "An error occurred whilst saving your email notification preferences.": "Podczas zapisywania ustawień powiadomień e-mail wystąpił błąd.", + "Explore Room State": "Przeglądaj stan pokoju", + "Source URL": "Źródłowy URL", + "Messages sent by bot": "Wiadomości wysłane przez bota", + "Filter results": "Filtruj wyniki", + "Members": "Członkowie", + "No update available.": "Brak aktualizacji.", + "Noisy": "Głośny", + "Files": "Pliki", + "Collecting app version information": "Zbieranie informacji o wersji aplikacji", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Usuń alias %(alias)s i usuń %(name)s z katalogu?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "To pozwoli Ci powrócić do Twojego konta po wylogowaniu i ponownym zalogowaniu się na innych urządzeniach.", + "Keywords": "Słowa kluczowe", + "Enable notifications for this account": "Włącz powiadomienia na tym koncie", + "Directory": "Księga adresowa", + "Invite to this community": "Zaproś do tej społeczności", + "Failed to get public room list": "Nie udało się uzyskać publicznej listy pokojowej", + "Messages containing keywords": "Wiadomości zawierające słowa kluczowe", + "Room not found": "Pokój nie znaleziony", + "Tuesday": "Wtorek", + "Enter keywords separated by a comma:": "Wpisz słowa kluczowe oddzielone przecinkami:", + "Forward Message": "Przekaż wiadomość", + "You have successfully set a password and an email address!": "Z powodzeniem ustawiono hasło i adres e-mail dla Twojego konta!", + "Remove %(name)s from the directory?": "Usunąć %(name)s z katalogu?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot używa wiele zaawansowanych technologii, które nie są dostępne lub są w fazie testów w Twojej przeglądarce.", + "Developer Tools": "Narzędzia programistyczne", + "Preparing to send logs": "Przygotowywanie do wysłania zapisu rozmów", + "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)", + "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:", + "You must specify an event type!": "Musisz określić typ wydarzenia!", + "(HTTP status %(httpStatus)s)": "(status HTTP %(httpStatus)s)", + "All Rooms": "Wszystkie pokoje", + "Please install Chrome or Firefox for the best experience.": "Zainstaluj Chrome lub Firefox dla najlepszego doświadczenia.", + "Wednesday": "Środa", + "You cannot delete this message. (%(code)s)": "Nie możesz usunąć tej wiadomości. (%(code)s)", + "Quote": "Cytat", + "Failed to update keywords": "Nie udało się zaktualizować słów kluczowych", + "Send logs": "Wyślij logi", + "All messages": "Wszystkie wiadomości", + "Call invitation": "Zaproszenie do rozmowy", + "Downloading update...": "Pobieranie aktualizacji...", + "State Key": "Klucz stanu", + "Failed to send custom event.": "Wysyłanie niestandardowego wydarzenia nie powiodło się.", + "What's new?": "Co nowego?", + "Notify me for anything else": "Powiadom mnie o całej reszcie", + "When I'm invited to a room": "Kiedy zostanę zaproszony do pokoju", + "Can't update user notification settings": "Nie można zaktualizować ustawień powiadomień użytkownika", + "Notify for all other messages/rooms": "Powiadamiaj o wszystkich innych wiadomośsciach/pokojach", + "Unable to look up room ID from server": "Nie można wyszukać ID pokoju na serwerze", + "Couldn't find a matching Matrix room": "Nie można znaleźć pasującego pokoju Matrix", + "Invite to this room": "Zaproś do tego pokoju", + "Search for a room": "Szukaj pokoju", + "Thursday": "Czwartek", + "Search…": "Szukaj…", + "Logs sent": "Zapis rozmów wysłany", + "Back": "Powrót", + "Reply": "Odpowiedz", + "Show message in desktop notification": "Pokaż wiadomość w notyfikacji na pulpicie", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Dziennik błędów zawiera dane użytkowania aplikacji, w tym: twoją nazwę użytkownika, numery ID, aliasy pokojów i grup które odwiedzałeś i loginy innych użytkowników. Nie zawiera wiadomości.", + "Unhide Preview": "Odkryj podgląd", + "Unable to join network": "Nie można dołączyć do sieci", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Możliwe, że skofigurowałeś je w innym kliencie, niż Riot. Nie możesz ich zmieniać w Riot, ale nadal mają zastosowanie", + "Sorry, your browser is not able to run Riot.": "Przepraszamy, Twoja przeglądarka nie jest w stanie uruchomić Riot.", + "Uploaded on %(date)s by %(user)s": "Wysłane %(date)s przez %(user)s", + "Messages in group chats": "Wiadomości w czatach grupowych", + "Yesterday": "Wczoraj", + "Error encountered (%(errorDetail)s).": "Wystąpił błąd (%(errorDetail)s).", + "Login": "Logowanie", + "Low Priority": "Niski priorytet", + "Unable to fetch notification target list": "Nie można pobrać listy docelowej dla powiadomień", + "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", + "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 5c55b1eddb..d165c6c057 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", @@ -207,7 +205,6 @@ "%(senderName)s answered the call.": "%(senderName)s atendeu à chamada.", "%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", "Call Timeout": "Tempo esgotado. Chamada encerrada", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s mudou seu nome público de %(oldDisplayName)s para %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s alterou sua imagem de perfil.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", @@ -406,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", @@ -415,7 +411,6 @@ "Please select the destination room for this message": "Por favor, escolha a sala para onde quer encaminhar esta mensagem", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s apagou o nome da sala.", "Analytics": "Análise", - "Opt out of analytics": "Sair da ferramenta de análise", "Options": "Opções", "Riot collects anonymous analytics to allow us to improve the application.": "Riot coleta informações anônimas de uso para nos permitir melhorar o sistema.", "Passphrases must match": "As senhas têm que ser iguais", @@ -437,8 +432,6 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Você tem certeza que quer apagar este evento? Note que se você apaga o nome de uma sala ou uma mudança de tópico, esta ação não poderá ser desfeita.", "Unknown error": "Erro desconhecido", "Incorrect password": "Senha incorreta", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Isso tornará a sua conta permanentemente inusável. Você não será capaz de registrar novamente o mesmo ID de usuário.", - "This action is irreversible.": "Esta ação é irreversível.", "To continue, please enter your password.": "Para continuar, por favor insira a sua senha.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Para verificar que este dispositivo é confiável, por favor entre em contato com a(o) sua(seu) dona(o) usando outros meios, como por exemplo pessoalmente ou por uma chamada telefônica, e pergunte a esta pessoa se a chave que ela está vendo nas suas configurações de usuário para este dispositivo é igual a esta:", "Device name": "Nome do dispositivo", @@ -447,10 +440,8 @@ "In future this verification process will be more sophisticated.": "No futuro, este processo de verificação será mais sofisticado.", "Verify device": "Verificar o dispositivo", "I verify that the keys match": "Eu confirmo que as chaves são iguais", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Encontramos um erro tentando restaurar sua sessão anterior. Se você continuar, terá que fazer login novamente, e o histórico da conversa criptografada se tornará ilegível.", "Unable to restore session": "Não foi possível restaurar a sessão", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Se você já usou antes uma versão mais recente do Riot, a sua sessão pode ser incompatível com esta versão. Feche esta janela e tente abrir com a versão mais recente.", - "Continue anyway": "Continuar de qualquer maneira", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Você está atualmente bloqueando dispositivos não verificados. Para enviar mensagens para estes dispositivos, você necessita antes verificá-los.", "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.": "Nós recomendamos que você passe pelo processo de verificação para cada dispositivo para confirmar que eles pertencem às pessoas que efetivamente são suas donas, mas você pode reenviar a mensagem sem verificar isso, se assim o desejar.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contém dispositivos que você não viu antes.", @@ -482,8 +473,6 @@ "What does this mean?": "O que isso significa?", "Error decrypting audio": "Erro ao descriptografar o áudio", "Error decrypting image": "Erro ao descriptografar a imagem", - "Image '%(Body)s' cannot be displayed.": "A imagem '%(Body)s' não pode ser exibida.", - "This image cannot be displayed.": "Esta imagem não pode ser exibida.", "Error decrypting video": "Erro ao descriptografar o vídeo", "Add an Integration": "Adicionar uma integração", "Removed or unknown message type": "Mensagem removida ou de tipo desconhecido", @@ -564,7 +553,6 @@ "You have been kicked from %(roomName)s by %(userName)s.": "Você foi removido(a) da sala %(roomName)s por %(userName)s.", "Undecryptable": "Não é possível descriptografar", "Incoming video call from %(name)s": "Chamada de vídeo de %(name)s recebida", - "Otherwise, click here to send a bug report.": "Caso contrário, clique aqui para enviar um relatório de erros.", "To link to a room it must have an address.": "Para produzir um link para uma sala, ela necessita ter um endereço.", "Your home server does not support device management.": "O seu Servidor de Base não suporta o gerenciamento de dispositivos.", "Alias (optional)": "Apelido (opcional)", @@ -612,7 +600,6 @@ "Decline": "Recusar", "Custom": "Personalizado", "Add": "Adicionar", - "%(user)s is a": "%(user)s é um(a)", "Unnamed Room": "Sala sem nome", "The phone number entered looks invalid": "O número de telefone inserido parece ser inválido", "Rejoin": "Voltar a participar da sala", @@ -634,7 +621,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?", @@ -644,7 +630,6 @@ "Press to start a chat with someone": "Clique para iniciar uma conversa com alguém", "Revoke widget access": "Revogar o acesso do wiget", "Sets the room topic": "Define o assunto da sala", - "Show Apps": "Mostrar apps", "The maximum permitted number of widgets have already been added to this room.": "O número máximo de widgets permitido já foi adicionado a esta sala.", "To get started, please pick a username!": "Para começar, escolha um nome de utilizador!", "Unable to create widget.": "Não foi possível criar o widget.", @@ -717,5 +702,149 @@ "To configure the room, you must be a": "Para configurar esta sala, tens de ser um(a)", "To ban users, you must be a": "Para banir utilizadores, tens de ser um(a)", "To remove other users' messages, you must be a": "Para remover mensagens de outros utilizadores, tens de ser um(a)", - "To send events of type , you must be a": "Para enviar eventos do tipo , tens de ser um(a)" + "To send events of type , you must be a": "Para enviar eventos do tipo , tens de ser um(a)", + "Fetching third party location failed": "Falha ao obter localização de terceiros", + "A new version of Riot is available.": "Uma nova versão do Riot está disponível.", + "I understand the risks and wish to continue": "Entendo os riscos e pretendo continuar", + "Couldn't load home page": "Não foi possível carregar a página inicial", + "Advanced notification settings": "Configurações avançadas de notificação", + "Uploading report": "A enviar o relatório", + "Sunday": "Domingo", + "Guests can join": "Convidados podem entrar", + "Messages sent by bot": "Mensagens enviadas por bots", + "Notification targets": "Alvos de notificação", + "Failed to set direct chat tag": "Falha ao definir conversa como pessoal", + "Today": "Hoje", + "Failed to get protocol list from Home Server": "Falha ao obter a lista de protocolos do servidor padrão", + "You are not receiving desktop notifications": "Não está a receber notificações de desktop", + "Friday": "Sexta-feira", + "Update": "Atualizar", + "What's New": "Novidades", + "Add an email address above to configure email notifications": "Insira um endereço de email no campo acima para configurar as notificações por email", + "Expand panel": "Expandir o painel", + "On": "Ativado", + "Filter room names": "Filtrar salas por título", + "Changelog": "Histórico de alterações", + "Waiting for response from server": "À espera de resposta do servidor", + "Uploaded on %(date)s by %(user)s": "Enviada em %(date)s por %(user)s", + "Send Custom Event": "Enviar evento personalizado", + "All notifications are currently disabled for all targets.": "Todas as notificações estão atualmente desativadas para todos os casos.", + "delete the alias.": "apagar o apelido da sala.", + "To return to your account in future you need to set a password": "Para voltar à sua conta no futuro, necessita de definir uma palavra-passe", + "Forget": "Esquecer", + "World readable": "Público", + "#example": "#exemplo", + "Hide panel": "Ocultar o painel", + "You cannot delete this image. (%(code)s)": "Não pode apagar esta imagem. (%(code)s)", + "Cancel Sending": "Cancelar o envio", + "Warning": "Aviso", + "This Room": "Esta sala", + "The Home Server may be too old to support third party networks": "O servidor pode ser muito antigo para suportar redes de terceiros", + "Resend": "Reenviar", + "Error saving email notification preferences": "Erro ao guardar as preferências de notificação por e-mail", + "Messages containing my display name": "Mensagens contendo o meu nome público", + "Messages in one-to-one chats": "Mensagens em conversas pessoais", + "Unavailable": "Indisponível", + "View Decrypted Source": "Ver a fonte desencriptada", + "Failed to update keywords": "Falha ao atualizar as palavras-chave", + "remove %(name)s from the directory.": "remover %(name)s da lista pública de salas.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Notificações sobre as seguintes palavras-chave seguem regras que não podem ser exibidas aqui:", + "Please set a password!": "Por favor, defina uma palavra-passe!", + "You have successfully set a password!": "Palavra-passe definida com sucesso!", + "An error occurred whilst saving your email notification preferences.": "Ocorreu um erro ao guardar as suas preferências de notificação por email.", + "Explore Room State": "Explorar estado da sala", + "Source URL": "URL fonte", + "Failed to add tag %(tagName)s to room": "Falha ao adicionar %(tagName)s à sala", + "Filter results": "Filtrar resultados", + "Members": "Membros", + "No update available.": "Nenhuma atualização disponível.", + "Noisy": "Barulhento", + "Files": "Ficheiros", + "Collecting app version information": "A recolher informação da versão da app", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Apagar o apelido %(alias)s da sala e remover %(name)s da lista pública?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Isto irá permitir-lhe voltar à sua conta depois de terminar sessão, assim como iniciar sessão noutros dispositivos.", + "Keywords": "Palavras-chave", + "Enable notifications for this account": "Ativar notificações para esta conta", + "Directory": "Diretório", + "Search for a room": "Pesquisar por uma sala", + "Messages containing keywords": "Mensagens contendo palavras-chave", + "Room not found": "Sala não encontrada", + "Tuesday": "Terça-feira", + "Enter keywords separated by a comma:": "Insira palavras-chave separadas por vírgula:", + "Search…": "Pesquisar…", + "Remove %(name)s from the directory?": "Remover %(name)s da lista pública de salas?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "O Riot usa muitas funcionalidades avançadas do navegador, algumas das quais não estão disponíveis ou ainda são experimentais no seu navegador atual.", + "Developer Tools": "Ferramentas de desenvolvedor", + "Enable desktop notifications": "Ativar notificações no desktop", + "Unnamed room": "Sala sem nome", + "Remove from Directory": "Remover da lista pública de salas", + "Saturday": "Sábado", + "Remember, you can always set an email address in user settings if you change your mind.": "Lembre-se, pode sempre definir um endereço de e-mail nas definições de utilizador se mudar de ideias.", + "Direct Chat": "Conversa pessoal", + "The server may be unavailable or overloaded": "O servidor pode estar inacessível ou sobrecarregado", + "Reject": "Rejeitar", + "Failed to set Direct Message status of room": "Falha em definir a mensagem de status da sala", + "Monday": "Segunda-feira", + "All messages (noisy)": "Todas as mensagens (alto)", + "Enable them now": "Ativar agora", + "Messages containing my user name": "Mensagens contendo o meu nome de utilizador", + "Collecting logs": "A recolher logs", + "more": "mais", + "You must specify an event type!": "Tem que especificar um tipo de evento!", + "(HTTP status %(httpStatus)s)": "(Estado HTTP %(httpStatus)s)", + "Invite to this room": "Convidar para esta sala", + "State Key": "Chave de estado", + "Failed to get public room list": "Falha ao obter a lista de salas públicas", + "Send": "Enviar", + "Send logs": "Enviar relatórios de erro", + "All messages": "Todas as mensagens", + "Call invitation": "Convite para chamada", + "Downloading update...": "A transferir atualização...", + "You have successfully set a password and an email address!": "Palavra passe e endereço de e-mail definidos com sucesso!", + "Failed to send custom event.": "Falha ao enviar evento personalizado.", + "What's new?": "O que há de novo?", + "Notify me for anything else": "Notificar-me sobre qualquer outro evento", + "When I'm invited to a room": "Quando sou convidado para uma sala", + "Can't update user notification settings": "Não é possível atualizar as preferências de notificação", + "Notify for all other messages/rooms": "Notificar para todas as outras mensagens/salas", + "Unable to look up room ID from server": "Não foi possível obter a identificação da sala do servidor", + "Couldn't find a matching Matrix room": "Não foi possível encontrar uma sala correspondente no servidor Matrix", + "All Rooms": "Todas as salas", + "You cannot delete this message. (%(code)s)": "Não pode apagar esta mensagem. (%(code)s)", + "Thursday": "Quinta-feira", + "Forward Message": "Encaminhar", + "Back": "Voltar", + "Unhide Preview": "Mostrar a pré-visualização novamente", + "Unable to join network": "Não foi possível juntar-se à rede", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Pode ter configurado num outro cliente sem ser o Riot. Não pode ajustá-las no Riot, mas ainda assim elas aplicam-se", + "Sorry, your browser is not able to run Riot.": "Desculpe, o seu navegador não é capaz de executar o Riot.", + "Messages in group chats": "Mensagens em salas", + "Yesterday": "Ontem", + "Error encountered (%(errorDetail)s).": "Erro encontrado (%(errorDetail)s).", + "Login": "Entrar", + "Low Priority": "Baixa prioridade", + "Unable to fetch notification target list": "Não foi possível obter a lista de alvos de notificação", + "Set Password": "Definir palavra-passe", + "Enable audible notifications in web client": "Ativar notificações de áudio no cliente web", + "Permalink": "Link permanente", + "Off": "Desativado", + "Riot does not know how to join a room on this network": "O Riot não sabe como entrar numa sala nesta rede", + "Mentions only": "Apenas menções", + "Failed to remove tag %(tagName)s from room": "Não foi possível remover a marcação %(tagName)s desta sala", + "Wednesday": "Quarta-feira", + "You can now return to your account after signing out, and sign in on other devices.": "Pode agora voltar à sua conta no fim de terminar sessão, e iniciar sessão noutros dispositivos.", + "Enable email notifications": "Ativar notificações por e-mail", + "Event Type": "Tipo de evento", + "No rooms to show": "Não existem salas a serem exibidas", + "Download this file": "Transferir este ficheiro", + "Failed to change settings": "Falha ao alterar as configurações", + "Event sent!": "Evento enviado!", + "View Source": "Ver a fonte", + "Event Content": "Conteúdo do evento", + "Thank you!": "Obrigado!", + "Quote": "Citar", + "Collapse panel": "Colapsar o painel", + "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e algumas das funcionalidades poderão não funcionar. Se quiser tentar de qualquer maneira pode continuar, mas está por sua conta com algum problema que possa encontrar!", + "Checking for an update...": "A procurar uma atualização...", + "There are advanced notifications which are not shown here": "Existem notificações avançadas que não são exibidas aqui" } diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 817d094422..0a4d847805 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\".", @@ -58,7 +57,7 @@ "Failed to change password. Is your password correct?": "Não foi possível mudar a senha. A sua senha está correta?", "Failed to leave room": "Falha ao tentar deixar a sala", "Failed to reject invitation": "Falha ao tentar rejeitar convite", - "Failed to set avatar.": "Falha ao tentar definir foto do perfil.", + "Failed to set avatar.": "Falha ao tentar definir a imagem do perfil.", "Failed to unban": "Não foi possível desfazer o banimento", "Failed to upload file": "Falha ao enviar o arquivo", "Favourite": "Favorito", @@ -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", @@ -112,7 +110,7 @@ "Privacy warning": "Alerta sobre privacidade", "Privileged Users": "Usuárias/os privilegiadas/os", "Profile": "Perfil", - "Refer a friend to Riot:": "Indicar um amigo para participar", + "Refer a friend to Riot:": "Indicar um amigo para participar:", "Reject invitation": "Rejeitar convite", "Remove Contact Information?": "Remover informação de contato?", "Remove": "Remover", @@ -155,7 +153,7 @@ "unencrypted": "não criptografado", "unknown device": "dispositivo desconhecido", "unknown error code": "código de erro desconhecido", - "Upload avatar": "Enviar icone de perfil de usuário", + "Upload avatar": "Enviar uma imagem de perfil", "Upload Files": "Enviar arquivos", "Upload file": "Enviar arquivo", "User ID": "Identificador de Usuário", @@ -207,7 +205,6 @@ "%(senderName)s answered the call.": "%(senderName)s atendeu à chamada.", "%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", "Call Timeout": "Tempo esgotado. Chamada encerrada", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s mudou seu nome público de %(oldDisplayName)s para %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s alterou sua imagem de perfil.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", @@ -408,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", @@ -417,7 +413,6 @@ "Please select the destination room for this message": "Por favor, escolha a sala para onde quer encaminhar esta mensagem", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s apagou o nome da sala.", "Analytics": "Análise", - "Opt out of analytics": "Sair da ferramenta de análise", "Options": "Opções", "Riot collects anonymous analytics to allow us to improve the application.": "Riot coleta informações anônimas de uso para nos permitir melhorar o sistema.", "Passphrases must match": "As senhas têm que ser iguais", @@ -439,8 +434,6 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Você tem certeza que quer apagar este evento? Note que se você apaga o nome de uma sala ou uma mudança de tópico, esta ação não poderá ser desfeita.", "Unknown error": "Erro desconhecido", "Incorrect password": "Senha incorreta", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Isso tornará a sua conta permanentemente inusável. Você não será capaz de registrar novamente o mesmo ID de usuário.", - "This action is irreversible.": "Esta ação é irreversível.", "To continue, please enter your password.": "Para continuar, por favor insira a sua senha.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Para verificar que este dispositivo é confiável, por favor entre em contato com a(o) sua(seu) dona(o) usando outros meios, como por exemplo pessoalmente ou por uma chamada telefônica, e pergunte a esta pessoa se a chave que ela está vendo nas suas configurações de usuário para este dispositivo é igual a esta:", "Device name": "Nome do dispositivo", @@ -449,10 +442,8 @@ "In future this verification process will be more sophisticated.": "No futuro, este processo de verificação será mais sofisticado.", "Verify device": "Verificar o dispositivo", "I verify that the keys match": "Eu confirmo que as chaves são iguais", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Encontramos um erro tentando restaurar sua sessão anterior. Se você continuar, terá que fazer login novamente, e o histórico da conversa criptografada se tornará ilegível.", "Unable to restore session": "Não foi possível restaurar a sessão", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Se você já usou antes uma versão mais recente do Riot, a sua sessão pode ser incompatível com esta versão. Feche esta janela e tente abrir com a versão mais recente.", - "Continue anyway": "Continuar de qualquer maneira", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Você está atualmente bloqueando dispositivos não verificados. Para enviar mensagens para estes dispositivos, você necessita antes verificá-los.", "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.": "Nós recomendamos que você passe pelo processo de verificação para cada dispositivo para confirmar que eles pertencem às pessoas que efetivamente são suas donas, mas você pode reenviar a mensagem sem verificar isso, se assim o desejar.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contém dispositivos que você não viu antes.", @@ -484,8 +475,6 @@ "What does this mean?": "O que isso significa?", "Error decrypting audio": "Erro ao descriptografar o áudio", "Error decrypting image": "Erro ao descriptografar a imagem", - "Image '%(Body)s' cannot be displayed.": "A imagem '%(Body)s' não pode ser exibida.", - "This image cannot be displayed.": "Esta imagem não pode ser exibida.", "Error decrypting video": "Erro ao descriptografar o vídeo", "Add an Integration": "Adicionar uma integração", "Removed or unknown message type": "Mensagem removida ou de tipo desconhecido", @@ -493,7 +482,7 @@ "Drop file here to upload": "Arraste um arquivo aqui para enviar", " (unsupported)": " (não suportado)", "Ongoing conference call%(supportedText)s.": "Conferência%(supportedText)s em andamento.", - "Online": "Online", + "Online": "Conectada/o", "Idle": "Ocioso", "Offline": "Offline", "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "O arquivo exportado irá permitir a qualquer pessoa que o acesse a descriptografar qualquer uma das mensagens criptografadas que você veja, portanto seja bastante cuidadosa(o) em manter este arquivo seguro. Para deixar este arquivo mais protegido, recomendamos que você insira uma senha abaixo, que será usada para criptografar o arquivo. Só será possível importar os dados usando exatamente a mesma senha.", @@ -594,7 +583,6 @@ "Last seen": "Último uso", "Level:": "Nível:", "No display name": "Sem nome público de usuária(o)", - "Otherwise, click here to send a bug report.": "Caso contrário, clique aqui para enviar um relatório de erros.", "Private Chat": "Conversa privada", "Public Chat": "Conversa pública", "Reason: %(reasonText)s": "Justificativa: %(reasonText)s", @@ -616,7 +604,6 @@ "Unnamed Room": "Sala sem nome", "Unverified": "Não verificado", "Upload new:": "Enviar novo:", - "%(user)s is a": "%(user)s é um(a)", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nível de permissão %(powerLevelNumber)s)", "Verified": "Verificado", "Would you like to accept or decline this invitation?": "Você gostaria de aceitar ou recusar este convite?", @@ -656,5 +643,484 @@ "You are not in this room.": "Você não está nesta sala.", "You do not have permission to do that in this room.": "Você não tem permissão para fazer isto nesta sala.", "Ignored user": "Usuário ignorado", - "You are no longer ignoring %(userId)s": "Você parou de ignorar %(userId)s" + "You are no longer ignoring %(userId)s": "Você parou de ignorar %(userId)s", + "Edit": "Editar", + "Unpin Message": "Desafixar Mensagem", + "Add rooms to this community": "Adicionar salas na comunidade", + "The version of Riot.im": "A Versão do Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Se você está ou não conectado (Nos não Gravaremos seu nome de usuário)", + "The platform you're on": "A plataforma que você está usando", + "Your language of choice": "O idioma que você selecionou", + "Which officially provided instance you are using, if any": "Qual instância oficial você está usando, se for o caso", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Se você está usando o editor de texto visual", + "Your homeserver's URL": "A URL do seu Servidor de Base (homeserver)", + "Your identity server's URL": "A URL do seu servidor de identidade", + "The information being sent to us to help make Riot.im better includes:": "As informações que estão sendo usadas para ajudar a melhorar o Riot.im incluem:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Quando esta página tem informação de identificação, como uma sala, ID de usuária/o ou de grupo, estes dados são removidos antes de serem enviados ao servidor.", + "Call Failed": "A chamada falhou", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Há dispositivos desconhecidos nesta sala: se você continuar sem verificá-los, será possível alguém espiar sua chamada.", + "Review Devices": "Revisar dispositivos", + "Call Anyway": "Ligar assim mesmo", + "Answer Anyway": "Responder assim mesmo", + "Call": "Ligar", + "Answer": "Responder", + "PM": "PM", + "AM": "AM", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s de %(monthName)s de%(fullYear)s", + "Who would you like to add to this community?": "Quem você gostaria de adicionar a esta comunidade?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Atenção: qualquer pessoa que você adicionar a esta comunidade estará publicamente visível para todas as pessoas que conheçam o ID da comunidade", + "Invite new community members": "Convidar novos integrantes para a comunidade", + "Which rooms would you like to add to this community?": "Quais salas você quer adicionar a esta comunidade?", + "Show these rooms to non-members on the community page and room list?": "Exibir estas salas para não integrantes na página da comunidade e na lista de salas?", + "Room name or alias": "Nome da sala ou apelido", + "Unable to create widget.": "Não foi possível criar o widget.", + "You are now ignoring %(userId)s": "Você está agora ignorando %(userId)s", + "Unignored user": "Usuária/o não está sendo mais ignorada/o", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s alterou o seu nome público para %(displayName)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s alterou as mensagens fixas da sala.", + "%(widgetName)s widget modified by %(senderName)s": "O widget %(widgetName)s foi modificado por %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "O widget %(widgetName)s foi criado por %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "O widget %(widgetName)s foi removido por %(senderName)s", + "%(names)s and %(count)s others are typing|other": "%(names)s e %(count)s outras pessoas estão escrevendo", + "%(names)s and %(count)s others are typing|one": "%(names)s e uma outra pessoa estão escrevendo", + "Send": "Enviar", + "Message Replies": "Respostas", + "Message Pinning": "Fixar mensagem", + "Tag Panel": "Painel de tags", + "Disable Emoji suggestions while typing": "Desativar sugestões de emojis enquanto estiver escrevendo", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Ocultar mensagens de entrada e de saída (não afeta convites, expulsões e banimentos)", + "Hide avatar changes": "Ocultar alterações da imagem de perfil", + "Hide display name changes": "Ocultar alterações de nome de usuária/o", + "Enable automatic language detection for syntax highlighting": "Ativar detecção automática de idioma para ressaltar erros de ortografia", + "Hide avatars in user and room mentions": "Ocultar avatares em menções a usuárias/os e a salas", + "Disable big emoji in chat": "Desativar emojis grandes na sala", + "Automatically replace plain text Emoji": "Substituir automaticamente os emojis em texto", + "Mirror local video feed": "Espelhar o feed de vídeo local", + "Enable inline URL previews by default": "Ativar, por padrão, a visualização de resumo de links", + "Enable URL previews for this room (only affects you)": "Ativar, para esta sala, a visualização de links (só afeta você)", + "Enable URL previews by default for participants in this room": "Ativar, para todas/os as/os integrantes desta sala, a visualização de links", + "Delete %(count)s devices|other": "Removar %(count)s dispositivos", + "Delete %(count)s devices|one": "Remover dispositivo", + "Select devices": "Selecionar dispositivos", + "Cannot add any more widgets": "Não é possível adicionar novos widgets", + "The maximum permitted number of widgets have already been added to this room.": "O número máximo de widgets permitidos já foi atingido nesta sala.", + "Add a widget": "Adicionar um widget", + "%(senderName)s sent an image": "%(senderName)s enviou uma imagem", + "%(senderName)s sent a video": "%(senderName)s enviou um vídeo", + "%(senderName)s uploaded a file": "%(senderName)s enviou um arquivo", + "Disinvite this user?": "Desconvidar esta/e usuária/o?", + "Kick this user?": "Excluir esta/e usuária/o?", + "Unban this user?": "Desfazer o banimento desta/e usuária/o?", + "Ban this user?": "Banir esta/e usuária/o?", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Você não poderá desfazer esta alteração, já que está baixando suas próprias permissões. Se você for a última pessoa nesta sala, será impossível recuperar as permissões atuais.", + "Unignore": "Não ignorar mais", + "Ignore": "Ignorar", + "Jump to read receipt": "Ir para a confirmação de leitura", + "Mention": "Mencionar", + "Invite": "Convidar", + "User Options": "Opções de usuária/o", + "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…", + "Send a message (unencrypted)…": "Enviar mensagem (não criptografada)…", + "Jump to message": "Pular para mensagem", + "No pinned messages.": "Não há mensagens fixas.", + "Loading...": "Carregando...", + "Pinned Messages": "Mensagens fixas", + "%(duration)ss": "%(duration)ss", + "%(duration)sm": "%(duration)sm", + "%(duration)sh": "%(duration)sh", + "%(duration)sd": "%(duration)sd", + "Online for %(duration)s": "Online há %(duration)s", + "Idle for %(duration)s": "Inativo há %(duration)s", + "Offline for %(duration)s": "Offline há %(duration)s", + "Unknown for %(duration)s": "Status desconhecido há %(duration)s", + "Unknown": "Desconhecido", + "Replying": "Respondendo", + "No rooms to show": "Nenhuma sala para mostrar", + "Unnamed room": "Sala sem nome", + "World readable": "Aberto publicamente à leitura", + "Guests can join": "Convidadas/os podem entrar", + "Remove avatar": "Remover a imagem de perfil", + "Drop here to favourite": "Arraste aqui para favoritar", + "Drop here to tag direct chat": "Arraste aqui para marcar como conversa direta", + "Drop here to restore": "Arraste aqui para restaurar", + "Drop here to demote": "Arraste aqui para reduzir privilégio", + "Community Invites": "Convites a comunidades", + "You have been kicked from this room by %(userName)s.": "Você foi excluída/o desta sala por %(userName)s.", + "You have been banned from this room by %(userName)s.": "Você foi banida/o desta sala por %(userName)s.", + "You are trying to access a room.": "Você está tentando acessar uma sala.", + "To change the room's avatar, you must be a": "Para alterar a imagem da sala, você deve ser um(a)", + "To change the room's name, you must be a": "Para mudar o nome da sala, você deve ser um(a)", + "To change the room's main address, you must be a": "Para mudar o endereço principal da sala, você deve ser um(a)", + "To change the room's history visibility, you must be a": "Para mudar a visibilidade do histórico desta sala, você deve ser um(a)", + "To change the permissions in the room, you must be a": "Para mudar as permissões nesta sala, você deve ser um(a)", + "To change the topic, you must be a": "Para alterar o tópico desta sala, você deve ser um(a)", + "To modify widgets in the room, you must be a": "Para alterar widgets nesta sala, você deve ser um(a)", + "Banned by %(displayName)s": "Banida/o por %(displayName)s", + "Publish this room to the public in %(domain)s's room directory?": "Quer publicar esta sala na lista pública de salas em %(domain)s's?", + "Members only (since the point in time of selecting this option)": "Apenas integrantes (a partir do momento em que esta opção for selecionada)", + "Members only (since they were invited)": "Apenas integrantes (desde que foram convidadas/os)", + "Members only (since they joined)": "Apenas integrantes (desde que entraram na sala)", + "To send messages, you must be a": "Para enviar mensagens, você deve ser um(a)", + "To invite users into the room, you must be a": "Para convidar pessoas à sala, você deve ser um(a)", + "To configure the room, you must be a": "Para alterar configurações desta sala, você deve ser um(a)", + "To kick users, you must be a": "Para excluir pessoas desta sala, você deve ser um(a)", + "To ban users, you must be a": "Para banir pessoas desta sala, você deve ser um(a)", + "To remove other users' messages, you must be a": "Para apagar mensagens de outras pessoas nesta sala, você deve ser um(a)", + "To send events of type , you must be a": "Para enviar eventos do tipo , você deve ser um(a)", + "Addresses": "Endereços", + "Invalid community ID": "ID de comunidade inválido", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' não é um ID de comunidade válido", + "Flair": "Flair", + "Showing flair for these communities:": "Esta sala mostrará flairs para as seguintes comunidades:", + "This room is not showing flair for any communities": "Esta sala não está mostrando fairs para nenhuma comunidade", + "New community ID (e.g. +foo:%(localDomain)s)": "Novo ID de comunidade (p.ex: +foo:%(localDomain)s)", + "URL previews are enabled by default for participants in this room.": "Pré-visualizações de links estão ativadas por padrão para participantes desta sala.", + "URL previews are disabled by default for participants in this room.": "Pré-visualizações de links estão desativadas por padrão para participantes desta sala.", + "Copied!": "Copiado!", + "Failed to copy": "Não foi possível copiar", + "Message removed by %(userId)s": "Mensagem removida por %(userId)s", + "Message removed": "Mensagem removida", + "Robot check is currently unavailable on desktop - please use a web browser": "A verificação através de robô está atualmente indisponível na versão desktop - utilize um navegador web", + "An email has been sent to %(emailAddress)s": "Um email foi enviado para %(emailAddress)s", + "A text message has been sent to %(msisdn)s": "Uma mensagem de texto foi enviada para %(msisdn)s", + "Username on %(hs)s": "Nome de usuária/o em %(hs)s", + "%(serverName)s Matrix ID": "ID Matrix em %(serverName)s", + "Remove from community": "Remover da comunidade", + "Disinvite this user from community?": "Desconvidar esta pessoa da comunidade?", + "Remove this user from community?": "Remover esta pessoa da comunidade?", + "Failed to withdraw invitation": "Não foi possível retirar o convite", + "Failed to remove user from community": "Não foi possível remover esta pessoa da comunidade", + "Filter community members": "Filtrar participantes da comunidade", + "Flair will appear if enabled in room settings": "Os flairs aparecerão se estiverem ativados nas configurações da sala", + "Flair will not appear": "Os flairs não aparecerão", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Tem certeza que quer remover a sala '%(roomName)s' do grupo %(groupId)s?", + "Removing a room from the community will also remove it from the community page.": "Remover uma sala da comunidade também a removerá da página da comunidade.", + "Failed to remove room from community": "Não foi possível remover a sala da comunidade", + "Failed to remove '%(roomName)s' from %(groupId)s": "Não foi possível remover a sala '%(roomName)s' do grupo %(groupId)s", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "A visibilidade da sala '%(roomName)s' do grupo %(groupId)s não pôde ser atualizada.", + "Visibility in Room List": "Visibilidade na lista de salas", + "Visible to everyone": "Visível para todo mundo", + "Only visible to community members": "Apenas visível para integrantes da comunidade", + "Filter community rooms": "Filtrar salas da comunidade", + "Something went wrong when trying to get your communities.": "Algo deu errado quando estava carregando suas comunidades.", + "Display your community flair in rooms configured to show it.": "Mostrar o flair de sua comunidade em salas configuradas para isso.", + "You're not currently a member of any communities.": "Atualmente você não é integrante de nenhuma comunidade.", + "NOTE: Apps are not end-to-end encrypted": "Nota: os apps não são criptografados ponta-a-ponta", + "Do you want to load widget from URL:": "Você quer carregar o widget da URL:", + "Allow": "Permitir", + "Delete Widget": "Apagar widget", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Remover um widget o remove para todas as pessoas desta sala. Tem certeza que quer remover este widget?", + "Delete widget": "Remover widget", + "Revoke widget access": "Retirar acesso ao widget", + "Minimize apps": "Minimizar apps", + "Communities": "Comunidades", + "Integrations Error": "Erro de integração", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s entraram %(count)s vezes", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s entraram", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s entrou %(count)s vezes", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s entrou", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s saíram %(count)s vezes", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s saíram", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s saiu %(count)s vezes", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s saiu", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s entraram e saíram %(count)s vezes", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s entraram e saíram", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s entrou e saiu %(count)s vezes", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s entrou e saiu", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s saíram e entraram %(count)s vezes", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s saíram e entraram", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s saiu e entrou %(count)s vezes", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s saiu e entrou", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s rejeitaram seus convites %(count)s vezes", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s rejeitaram seus convites", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s rejeitou seu convite %(count)s vezes", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s rejeitou seu convite", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s tiveram seus convites retirados %(count)s vezes", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)s tiveram seus convites retirados", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)s teve seus convites removidos %(count)s vezes", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)s teve seu convite removido", + "were invited %(count)s times|other": "foram convidadas/os %(count)s vezes", + "were invited %(count)s times|one": "foram convidadas/os", + "was invited %(count)s times|other": "foi convidada/o %(count)s vezes", + "was invited %(count)s times|one": "foi convidada/o", + "were banned %(count)s times|other": "foram banidas/os %(count)s vezes", + "were banned %(count)s times|one": "foram banidas/os", + "was banned %(count)s times|other": "foi banida/o %(count)s vezes", + "was banned %(count)s times|one": "foi banida/o", + "were unbanned %(count)s times|other": "tiveram seu banimento desfeito %(count)s vezes", + "were unbanned %(count)s times|one": "tiveram seu banimento desfeito", + "was unbanned %(count)s times|other": "teve seu banimento desfeito %(count)s vezes", + "was unbanned %(count)s times|one": "teve seu banimento desfeito", + "were kicked %(count)s times|other": "foram excluídas/os %(count)s vezes", + "were kicked %(count)s times|one": "foram excluídas/os", + "was kicked %(count)s times|other": "foi excluída/o %(count)s vezes", + "was kicked %(count)s times|one": "foi excluída/o", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s alteraram o seu nome %(count)s vezes", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s alteraram o seu nome", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s alterou o seu nome %(count)s vezes", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s alterou o seu nome", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s alteraram a sua imagem de perfil %(count)s vezes", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s alteraram a sua imagem de perfil", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s alterou a sua imagem de perfil %(count)s vezes", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s alterou a sua imagem de perfil", + "%(items)s and %(count)s others|other": "%(items)s e %(count)s outras", + "%(items)s and %(count)s others|one": "%(items)s e uma outra", + "collapse": "colapsar", + "expand": "expandir", + "Custom of %(powerLevel)s": "Personalizado de %(powerLevel)s", + "In reply to ": "Em resposta a ", + "And %(count)s more...|other": "E %(count)s mais...", + "Matrix ID": "ID Matrix", + "Matrix Room ID": "ID da sala Matrix", + "email address": "endereço de e-mail", + "Try using one of the following valid address types: %(validTypesList)s.": "Tente usar um dos seguintes tipos de endereço válidos: %(validTypesList)s.", + "You have entered an invalid address.": "Você entrou com um endereço inválido.", + "Community IDs cannot not be empty.": "IDs de comunidades não podem estar em branco.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "IDs de comunidade podem apenas ter os seguintes caracteres: a-z, 0-9, ou '=_-./'", + "Something went wrong whilst creating your community": "Algo deu errado ao criar sua comunidade", + "Create Community": "Criar comunidade", + "Community Name": "Nome da comunidade", + "Example": "Exemplo", + "Community ID": "ID da comunidade", + "example": "exemplo", + "Create": "Criar", + "Advanced options": "Opções avançadas", + "Block users on other matrix homeservers from joining this room": "Proibir pessoas de outros servidores matrix (homeservers) de ingressarem nesta sala", + "This setting cannot be changed later!": "Esta configuração não poderá ser desfeita posteriormente!", + "Loading device info...": "Carregando informações do dispositivo...", + "To get started, please pick a username!": "Para começar, escolha um nome de usuária/o!", + "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    HTML para a página da sua comunidade

    \n

    \n Use a descrição longa para apresentar a comunidade para novas/os integrantes ou partilhe links importantes.\n

    \n

    \n Você pode até mesmo usar tags 'img' do HTML\n

    \n", + "Add rooms to the community summary": "Adicionar salas para o índice da comunidade", + "Which rooms would you like to add to this summary?": "Quais salas você gostaria de adicionar a este índice?", + "Add to summary": "Adicionar ao índice", + "Failed to add the following rooms to the summary of %(groupId)s:": "Não foi possível adicionar as seguintes salas para o índice da comunidade %(groupId)s:", + "Add a Room": "Adicionar uma sala", + "Failed to remove the room from the summary of %(groupId)s": "Não foi possível remover a sala do índice da comunidade %(groupId)s", + "The room '%(roomName)s' could not be removed from the summary.": "A sala '%(roomName)s' não pôde ser removida do índice.", + "Add users to the community summary": "Adicionar pessoas para o índice da comunidade", + "Who would you like to add to this summary?": "Quem você gostaria de adicionar a este índice?", + "Failed to add the following users to the summary of %(groupId)s:": "Não foi possível adicionar as seguintes pessoas para o índice da comunidade %(groupId)s:", + "Add a User": "Adicionar uma pessoa", + "Failed to remove a user from the summary of %(groupId)s": "Não foi possível remover uma pessoa do índice da comunidade %(groupId)s", + "The user '%(displayName)s' could not be removed from the summary.": "'%(displayName)s' não pôde ser removida/o do índice.", + "Failed to upload image": "O envio da imagem falhou", + "Failed to update community": "A atualização da comunidade falhou", + "Unable to accept invite": "Não foi possível aceitar o convite", + "Unable to reject invite": "Não foi possível rejeitar o convite", + "Leave Community": "Deixar a comunidade", + "Leave %(groupName)s?": "Quer sair da comunidade %(groupName)s?", + "Leave": "Sair", + "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:", + "Featured Users:": "Pessoas em destaque:", + "%(inviter)s has invited you to join this community": "%(inviter)s convidou você para entrar nesta comunidade", + "You are an administrator of this community": "Você é administrador(a) desta comunidade", + "You are a member of this community": "Você é um/a integrante desta comunidade", + "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "Sua comunidade não tem uma descrição longa, ou seja, uma página HTML para ser exibida às pessoas que fazem parte da comunidade.
    Clique aqui para abrir as configurações e criar uma!", + "Long Description (HTML)": "Descrição longa (HTML)", + "Description": "Descrição", + "Community %(groupId)s not found": "A comunidade %(groupId)s não foi encontrada", + "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.", + "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", + "Error whilst fetching joined communities": "Erro baixando comunidades das quais você faz parte", + "Create a new community": "Criar nova comunidade", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crie uma comunidade para agrupar em um mesmo local pessoas e salas! Monte uma página inicial personalizada para dar uma identidade ao seu espaço no universo Matrix.", + "Join an existing community": "Entrar numa comunidade existente", + "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Para entrar em uma comunidade, você terá que conhecer o seu ID; um ID de comunidade normalmente tem este formato: +exemplo:matrix.org.", + "Show devices, send anyway or cancel.": "Exibir dispositivos, enviar assim mesmo ou cancelar.", + "%(count)s of your messages have not been sent.|one": "Sua mensagem não foi enviada.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Reenviar todas ou cancelar todas agora. Você também pode selecionar mensagens individualmente a serem reenviadas ou canceladas.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Reenviar mensagem ou cancelar mensagem agora.", + "Warning": "Atenção", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Não há mais ninguém aqui! Você deseja convidar outras pessoas ou remover este alerta sobre a sala vazia?", + "Clear filter": "Remover filtro", + "Light theme": "Tema claro", + "Dark theme": "Tema escuro", + "Status.im theme": "Tema Status.im", + "Autocomplete Delay (ms):": "Tempo para preenchimento automático (ms):", + "Ignored Users": "Usuárias/os ignoradas/os", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "A privacidade é importante para nós, portanto nós não coletamos nenhum dado pessoa ou identificável para nossas estatísticas.", + "Learn more about how we use analytics.": "Saiba mais sobre como nós usamos os dados estatísticos.", + "Updates": "Atualizações", + "Check for update": "Verificar atualizações", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Um email foi enviado para %(emailAddress)s. Quando você tiver seguido o link que está nesta mensagem, clique abaixo.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Note que você está se conectando ao servidor %(hs)s, e não ao servidor matrix.org.", + "This homeserver doesn't offer any login flows which are supported by this client.": "Este servidor de base (homeserver) não oferece fluxos de login que funcionem neste cliente.", + "Sign in to get started": "Conecte-se para começar", + "Unbans user with given id": "Retira o banimento para a pessoa com este id", + "Define the power level of a user": "Definir o nível de permissões de um(a) usuário(a)", + "Sets the room topic": "Define o tópico da sala", + "Changes colour scheme of current room": "Altera o esquema de cores da sala atual", + "Verifies a user, device, and pubkey tuple": "Verifica um(a) usuário(a), dispositivo ou tuplo da chave pública", + "Ignores a user, hiding their messages from you": "Ignora um(a) usuário(a), ocultando suas mensagens de você", + "Stops ignoring a user, showing their messages going forward": "Deixa de ignorar um(a) usuário(a), exibindo suas mensagens daqui para frente", + "Notify the whole room": "Notifica a sala inteira", + "Room Notification": "Notificação da sala", + "Failed to set direct chat tag": "Falha ao definir esta conversa como direta", + "Failed to remove tag %(tagName)s from room": "Falha ao remover a tag %(tagName)s da sala", + "Failed to add tag %(tagName)s to room": "Falha ao adicionar a tag %(tagName)s para a sala", + "Did you know: you can use communities to filter your Riot.im experience!": "Você sabia? Você pode usar as comunidades para filtrar a sua experiência no Riot!", + "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 criar um filtro, arraste a imagem de uma comunidade sobre o painel de filtros na extrema esquerda da sua tela. Você pode clicar na imagem de uma comunidade no painel de filtros a qualquer momento para ver apenas as salas e pessoas associadas com esta comunidade.", + "Disable Community Filter Panel": "Desativar painel de filtros de Comunidades", + "Your key share request has been sent - please check your other devices for key share requests.": "Seu pedido de confirmação de chaves foi realizado - favor verificar seus outros dispositivos.", + "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.": "Pedidos de confirmação de chaves são enviados aos outros dispositivos automaticamente. Se você rejeitou ou negou uma confirmação de chaves em seus outros dispositivos, clique aqui para enviar novamente.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Se seus outros dispositivos não têm a chave para esta mensagem, você não poderá decriptá-las.", + "Key request sent.": "Requisição de chave enviada.", + "Re-request encryption keys from your other devices.": "Requisitar novamente chaves de encriptação de seus outros dispositivos.", + "%(user)s is a %(userRole)s": "%(user)s é %(userRole)s", + "Fetching third party location failed": "Falha ao acessar localização de terceiros", + "A new version of Riot is available.": "Uma nova versão do Riot está disponível.", + "I understand the risks and wish to continue": "Entendo os riscos e desejo continuar", + "Couldn't load home page": "Não foi possível carregar a página inicial", + "Send Account Data": "Enviar Dados da Conta", + "Advanced notification settings": "Configurações avançadas de notificação", + "Uploading report": "Enviando o relatório", + "Sunday": "Domingo", + "Notification targets": "Alvos de notificação", + "Today": "Hoje", + "Failed to get protocol list from Home Server": "Falha em acessar a lista de protocolos do servidor padrão", + "You are not receiving desktop notifications": "Você não está recebendo notificações desktop", + "Friday": "Sexta", + "Update": "Atualizar", + "What's New": "Novidades", + "Add an email address above to configure email notifications": "Insira um endereço de email no campo acima para configurar suas notificações por email", + "Expand panel": "Expandir o painel", + "On": "Ativado", + "%(count)s Members|other": "%(count)s Membros", + "Filter room names": "Filtrar salas por título", + "Changelog": "Histórico de alterações", + "Waiting for response from server": "Esperando por resposta do servidor", + "Uploaded on %(date)s by %(user)s": "Enviada em %(date)s por %(user)s", + "Send Custom Event": "Enviar Evento Customizado", + "All notifications are currently disabled for all targets.": "Todas as notificações estão atualmente desabilitadas para todos os casos.", + "delete the alias.": "apagar o apelido da sala.", + "To return to your account in future you need to set a password": "Para poder, futuramente, retornar à sua conta, você precisa definir uma senha", + "Forget": "Esquecer", + "#example": "#exemplo", + "Hide panel": "Ocultar o painel", + "You cannot delete this image. (%(code)s)": "Você não pode apagar esta imagem. (%(code)s)", + "Cancel Sending": "Cancelar o envio", + "This Room": "Esta sala", + "The Home Server may be too old to support third party networks": "O servidor pode ser muito antigo para suportar redes de terceiros", + "Resend": "Reenviar", + "Error saving email notification preferences": "Erro ao salvar as preferências de notificação por email", + "Messages containing my display name": "Mensagens contendo meu nome público", + "Messages in one-to-one chats": "Mensagens em conversas pessoais", + "Unavailable": "Indisponível", + "View Decrypted Source": "Ver a fonte descriptografada", + "Failed to update keywords": "Falha ao alterar as palavras-chave", + "remove %(name)s from the directory.": "remover %(name)s da lista pública de salas.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Notificações sobre as seguintes palavras-chave seguem regras que não podem ser exibidas aqui:", + "Safari and Opera work too.": "Safari e Opera Funciona bem.", + "Please set a password!": "Por favor, defina uma senha!", + "You have successfully set a password!": "Você definiu sua senha com sucesso!", + "An error occurred whilst saving your email notification preferences.": "Um erro ocorreu enquanto o sistema estava salvando suas preferências de notificação por email.", + "Explore Room State": "Explorar Estado da Sala", + "Source URL": "URL fonte", + "Messages sent by bot": "Mensagens enviadas por bots", + "Filter results": "Filtrar resultados", + "Members": "Membros", + "No update available.": "Não há atualizações disponíveis.", + "Noisy": "Barulhento", + "Files": "Arquivos", + "Collecting app version information": "Coletando informação sobre a versão do app", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Apagar o apelido %(alias)s da sala e remover %(name)s da lista pública?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Isso permitirá que você possa retornar à sua conta após fazer logout, e também fazer login em outros dispositivos.", + "Keywords": "Palavras-chave", + "Enable notifications for this account": "Ativar notificações para esta conta", + "Directory": "Diretório", + "Invite to this community": "Convidar para essa comunidade", + "Search for a room": "Procurar por uma sala", + "Messages containing keywords": "Mensagens contendo palavras-chave", + "Room not found": "Sala não encontrada", + "Tuesday": "Terça", + "Enter keywords separated by a comma:": "Coloque cada palavras-chave separada por vírgula:", + "Search…": "Buscar…", + "You have successfully set a password and an email address!": "Você definiu uma senha e um endereço de e-mail com sucesso!", + "Remove %(name)s from the directory?": "Remover %(name)s da lista pública de salas?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "O Riot usa muitas funcionalidades avançadas do navegador, algumas das quais não estão disponíveis ou ainda são experimentais no seu navegador atual.", + "Developer Tools": "Ferramentas do desenvolvedor", + "Enable desktop notifications": "Ativar notificações no desktop", + "Explore Account Data": "Explorar Dados da Conta", + "Remove from Directory": "Remover da lista pública de salas", + "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", + "You must specify an event type!": "Você precisa especificar um tipo do evento!", + "(HTTP status %(httpStatus)s)": "(Status HTTP %(httpStatus)s)", + "Invite to this room": "Convidar para esta sala", + "Please install Chrome or Firefox for the best experience.": "Por favor Instale Chrome Ou Firefox para uma melhor Experiencia.", + "Failed to get public room list": "Falha ao acessar a lista pública de salas", + "Send logs": "Enviar relatórios de erro", + "All messages": "Todas as mensagens", + "Call invitation": "Convite para chamada", + "Downloading update...": "Baixando atualização...", + "State Key": "Chave do Estado", + "Failed to send custom event.": "Falha ao enviar evento personalizado.", + "What's new?": "O que há de novidades?", + "Notify me for anything else": "Notificar-me sobre qualquer outro evento", + "When I'm invited to a room": "Quando sou convidada(o) a uma sala", + "Can't update user notification settings": "Não é possível atualizar as preferências de notificação", + "Notify for all other messages/rooms": "Notificar para todas as outras mensagens e salas", + "Unable to look up room ID from server": "Não foi possível buscar identificação da sala no servidor", + "Couldn't find a matching Matrix room": "Não foi possível encontrar uma sala correspondente no servidor Matrix", + "All Rooms": "Todas as salas", + "You cannot delete this message. (%(code)s)": "Você não pode apagar esta mensagem. (%(code)s)", + "Thursday": "Quinta", + "Forward Message": "Encaminhar", + "Back": "Voltar", + "Reply": "Responder", + "Show message in desktop notification": "Mostrar mensagens na notificação", + "Unhide Preview": "Mostrar a pré-visualização", + "Unable to join network": "Não foi possível conectar na rede", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Você pode te-las configurado em outro cliente além do Riot. Você não pode ajustá-las no Riot, mas ainda assim elas se aplicam aqui", + "Sorry, your browser is not able to run Riot.": "Perdão. O seu navegador não é capaz de rodar o Riot.", + "Messages in group chats": "Mensagens em salas", + "Yesterday": "Ontem", + "Error encountered (%(errorDetail)s).": "Erro encontrado (%(errorDetail)s).", + "Login": "Fazer login", + "Low Priority": "Baixa prioridade", + "Unable to fetch notification target list": "Não foi possível obter a lista de alvos de notificação", + "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 199dc5cbd4..0514c133be 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -3,25 +3,24 @@ "Add email address": "Добавить адрес email", "Add phone number": "Добавить номер телефона", "Admin": "Администратор", - "Advanced": "Дополнительно", + "Advanced": "Подробности", "Algorithm": "Алгоритм", "A new password must be entered.": "Введите новый пароль.", - "Anyone who knows the room's link, apart from guests": "Любой, кто знает ссылку на комнату, кроме гостей", - "Anyone who knows the room's link, including guests": "Любой, кто знает ссылку на комнату, включая гостей", + "Anyone who knows the room's link, apart from guests": "Все, у кого есть ссылка на эту комнату, кроме гостей", + "Anyone who knows the room's link, including guests": "Все, у кого есть ссылка на эту комнату, включая гостей", "Are you sure you want to reject the invitation?": "Вы уверены что вы хотите отклонить приглашение?", - "Are you sure you want to upload the following files?": "Вы уверены что вы хотите отправить следующие файлы?", + "Are you sure you want to upload the following files?": "Вы уверены, что вы хотите отправить эти файлы?", "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": "Изменения того, кто может прочитать историю, будут применяться только к будущим сообщениям в этой комнате", + "Changes to who can read history will only apply to future messages in this room": "Изменение правил доступа к истории будет применено только к будущим сообщениям в этой комнате", "Changes your display nickname": "Изменяет ваш псевдоним", "Claimed Ed25519 fingerprint key": "Требуемый ключ цифрового отпечатка Ed25519", "Clear Cache and Reload": "Очистить кэш и перезагрузить", "Clear Cache": "Очистить кэш", - "Click here to fix": "Щелкните здесь, чтобы исправить", + "Click here to fix": "Нажмите здесь, чтобы исправить это", "Commands": "Команды", "Confirm your new password": "Подтвердите новый пароль", "Continue": "Продолжить", @@ -33,19 +32,19 @@ "Deactivate Account": "Деактивировать учетную запись", "Deactivate my account": "Деактивировать мою учетную запись", "Decryption error": "Ошибка расшифровки", - "Default": "По умолчанию", + "Default": "Участник", "Deops user with given id": "Снимает полномочия оператора с пользователя с заданным ID", "Device ID": "ID устройства", - "Devices will not yet be able to decrypt history from before they joined the room": "Устройства пока не могут дешифровать историю до их входа в комнату", + "Devices will not yet be able to decrypt history from before they joined the room": "Устройства не смогут расшифровать историю сообщений до момента их входа в комнату (временно)", "Display name": "Отображаемое имя", "Displays action": "Отображение действий", "Ed25519 fingerprint": "Ed25519 отпечаток", - "Email, name or matrix ID": "Email, имя или matrix ID", + "Email, name or matrix ID": "Email-адрес, имя или идентификатор", "Emoji": "Смайлы", - "Encrypted messages will not be visible on clients that do not yet implement encryption": "Зашифрованные сообщения не будут видны в клиентах, которые еще не подключили шифрование", + "Encrypted messages will not be visible on clients that do not yet implement encryption": "Зашифрованные сообщения не будут видны в клиентах, еще не поддерживающих сквозное шифрование", "Encrypted room": "Зашифрованная комната", "End-to-end encryption information": "Сведения о сквозном шифровании", - "End-to-end encryption is in beta and may not be reliable": "Сквозное шифрование находится в бета-версии и может быть ненадежным", + "End-to-end encryption is in beta and may not be reliable": "Сквозное шифрование сейчас в бета-тестировании и может не работать", "Error": "Ошибка", "Event information": "Информация о событии", "Export E2E room keys": "Экспорт ключей сквозного шифрования", @@ -57,65 +56,64 @@ "Failed to upload file": "Не удалось отправить файл", "Favourite": "Избранное", "Favourites": "Избранные", - "Filter room members": "Фильтр участников комнаты", + "Filter room members": "Поиск по участникам", "Forget room": "Забыть комнату", "Forgot your password?": "Забыли пароль?", "For security, this session has been signed out. Please sign in again.": "Для обеспечения безопасности ваша сессия была завершена. Пожалуйста, войдите снова.", - "Found a bug?": "Нашли ошибку?", - "Hangup": "Закончить", + "Hangup": "Повесить трубку", "Historical": "Архив", "Homeserver is": "Домашний сервер это", "Identity Server is": "Сервер идентификации это", "I have verified my email address": "Я подтвердил свой адрес email", "Import E2E room keys": "Импорт ключей сквозного шифрования", "Invalid Email Address": "Недопустимый адрес email", - "Invite new room members": "Пригласить новых участников в комнату", - "Invites": "Приглашает", + "Invite new room members": "Пригласить в комнату новых участников", + "Invites": "Приглашения", "Invites user with given id to current room": "Приглашает пользователя с заданным ID в текущую комнату", - "Sign in with": "Войти, используя", + "Sign in with": "Войти с помощью", "Joins room with given alias": "Входит в комнату с заданным псевдонимом", "Kicks user with given id": "Выкидывает пользователя с заданным ID", "Labs": "Лаборатория", "Leave room": "Покинуть комнату", "Login as guest": "Войти как гость", "Logout": "Выйти", - "Low priority": "Низкий приоритет", + "Low priority": "Неважные", "Manage Integrations": "Управление интеграциями", "Mobile phone number": "Номер мобильного телефона", "Moderator": "Модератор", - "%(serverName)s Matrix ID": "%(serverName)s Matrix ID", + "%(serverName)s Matrix ID": "Matrix ID на %(serverName)s", "Name": "Имя", - "Never send encrypted messages to unverified devices from this device": "Никогда не отправлять зашифрованные сообщения на непроверенные устройства с этого устройства", - "Never send encrypted messages to unverified devices in this room from this device": "Никогда не отправлять зашифрованные сообщения на непроверенные устройства в этой комнате с этого устройства", + "Never send encrypted messages to unverified devices from this device": "Никогда не отправлять зашифрованные сообщения на непроверенные устройства (с этого устройства)", + "Never send encrypted messages to unverified devices in this room from this device": "Никогда не отправлять зашифрованные сообщения на непроверенные устройства (в этой комнате, с этого устройства)", "New password": "Новый пароль", "New passwords must match each other.": "Новые пароли должны совпадать.", "none": "никто", "Notifications": "Уведомления", "": "<не поддерживается>", "NOT verified": "НЕ проверено", - "No users have specific privileges in this room": "Ни один пользователь не имеет специальных полномочий в этой комнате", - "Once encryption is enabled for a room it cannot be turned off again (for now)": "После включения шифрования в комнате, оно не может быть деактивировано (на данный момент)", + "No users have specific privileges in this room": "Ни один пользователь не имеет особых прав в этой комнате", + "Once encryption is enabled for a room it cannot be turned off again (for now)": "После включения шифрования в комнате вы не сможете его снова выключить (временно)", "Password": "Пароль", "People": "Люди", - "Permissions": "Разрешения", + "Permissions": "Права доступа", "Phone": "Телефон", "Remove": "Удалить", "Return to login screen": "Вернуться к экрану входа", "Send Reset Email": "Отправить письмо со ссылкой для сброса пароля", "Settings": "Настройки", - "Start a chat": "Начать чат", - "Start Chat": "Начать чат", + "Start a chat": "Начать разговор", + "Start Chat": "Начать разговор", "Unable to add email address": "Не удается добавить адрес email", "Unable to remove contact information": "Не удалось удалить контактную информацию", "Unable to verify email address.": "Не удалось проверить адрес email.", "Unban": "Разблокировать", - "Unencrypted room": "Незашифрованная комната", + "Unencrypted room": "Нешифрованная комната", "unencrypted": "без шифрования", "unknown device": "неизвестное устройство", "unknown error code": "неизвестный код ошибки", "Upload avatar": "Загрузить аватар", "Upload Files": "Отправка файлов", - "Upload file": "Отправка файла", + "Upload file": "Отправить файл", "User ID": "ID пользователя", "User Interface": "Пользовательский интерфейс", "User name": "Имя пользователя", @@ -123,62 +121,61 @@ "Verification Pending": "В ожидании подтверждения", "Verification": "Проверка", "verified": "проверенный", - "Video call": "Видеозвонок", + "Video call": "Видеовызов", "Voice call": "Голосовой вызов", - "VoIP conference finished.": "VoIP-конференция закончилась.", - "VoIP conference started.": "VoIP-конференция началась.", + "VoIP conference finished.": "Конференц-звонок окончен.", + "VoIP conference started.": "Конференц-звонок начался.", "(warning: cannot be disabled again!)": "(предупреждение: отключить будет невозможно!)", "Warning!": "Внимание!", - "Who can access this room?": "Кто может получить доступ к этой комнате?", + "Who can access this room?": "Кто может войти в эту комнату?", "Who can read history?": "Кто может читать историю?", - "Who would you like to add to this room?": "Кого бы вы хотели добавить в эту комнату?", + "Who would you like to add to this room?": "Кого бы вы хотели пригласить в эту комнату?", "Who would you like to communicate with?": "С кем бы вы хотели связаться?", "You do not have permission to post to this room": "Вы не можете писать в эту комнату", "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": "Вы вышли из всех устройств и больше не будете получать push-уведомления. Чтобы повторно активировать уведомления, войдите снова на каждом из устройств", "You have no visible notifications": "Нет видимых уведомлений", "Your password has been reset": "Ваш пароль был сброшен", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Пароль успешно изменен. До повторной авторизации вы не будете получать push-уведомления на других устройствах", - "You should not yet trust it to secure data": "На сегодняшний день не следует полностью полагаться на то, что ваши данные будут надежно зашифрованы", + "You should not yet trust it to secure data": "На данный момент не следует полагаться на то, что ваша переписка будет надежно зашифрована", "%(targetName)s accepted an invitation.": "%(targetName)s принял приглашение.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s принял приглашение от %(displayName)s.", "Active call": "Активный вызов", - "%(names)s and %(lastPerson)s are typing": "%(names)s и %(lastPerson)s печатает", - "%(senderName)s answered the call.": "%(senderName)s ответил на звонок.", + "%(names)s and %(lastPerson)s are typing": "%(names)s и %(lastPerson)s печатают", + "%(senderName)s answered the call.": "%(senderName)s ответил(а) на звонок.", "%(senderName)s banned %(targetName)s.": "%(senderName)s заблокировал(а) %(targetName)s.", - "Call Timeout": "Время ожидания вызова", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s изменено с %(oldDisplayName)s на %(displayName)s.", - "%(senderName)s changed their profile picture.": "%(senderName)s изменил изображение профиля.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s изменил(а) уровень доступа для %(powerLevelDiffText)s.", + "Call Timeout": "Нет ответа", + "%(senderName)s changed their profile picture.": "%(senderName)s изменил(а) свой аватар.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s изменил(а) уровни прав %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s изменил(а) название комнаты на %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s изменил тему на %(topic)s.", - "Conference call failed.": "Не удалось выполнить групповой вызов.", - "Conference calling is in development and may not be reliable.": "Групповые вызовы находятся в разработке и могут быть нестабильны.", - "Conference calls are not supported in encrypted rooms": "Групповые вызовы не поддерживаются в зашифрованных комнатах", - "Conference calls are not supported in this client": "Групповые вызовы в этом клиенте не поддерживаются", - "/ddg is not a command": "/ddg не команда", - "Drop here to tag %(section)s": "Перетащите сюда для тега %(section)s", - "%(senderName)s ended the call.": "%(senderName)s завершил звонок.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s изменил(а) тему комнаты на \"%(topic)s\".", + "Conference call failed.": "Сбой конференц-звонка.", + "Conference calling is in development and may not be reliable.": "Конференц-связь находится в разработке и может не работать.", + "Conference calls are not supported in encrypted rooms": "Конференц-связь не поддерживается в зашифрованных комнатах", + "Conference calls are not supported in this client": "Конференц-связь в этом клиенте не поддерживается", + "/ddg is not a command": "/ddg — это не команда", + "Drop here to tag %(section)s": "Перетащите сюда, чтобы пометить как %(section)s", + "%(senderName)s ended the call.": "%(senderName)s завершил(а) звонок.", "Existing Call": "Текущий вызов", - "Failed to lookup current room": "Не удалось выполнить поиск текущий комнаты", + "Failed to lookup current room": "Не удалось найти текущую комнату", "Failed to send request.": "Не удалось отправить запрос.", - "Failed to set up conference call": "Не удалось настроить групповой вызов", - "Failed to verify email address: make sure you clicked the link in the email": "Не удалось проверить адрес email: убедитесь, что вы перешли по ссылке в письме", + "Failed to set up conference call": "Не удалось сделать конференц-звонок", + "Failed to verify email address: make sure you clicked the link in the email": "Не удалось проверить email-адрес: убедитесь, что вы перешли по ссылке в письме", "Failure to create room": "Не удалось создать комнату", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s с %(fromPowerLevel)s на %(toPowerLevel)s", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "для %(userId)s с %(fromPowerLevel)s на %(toPowerLevel)s", "click to reveal": "нажмите для открытия", "%(senderName)s invited %(targetName)s.": "%(senderName)s приглашает %(targetName)s.", "%(displayName)s is typing": "%(displayName)s печатает", - "%(targetName)s joined the room.": "%(targetName)s вошел(ла) в комнату.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s выкинул %(targetName)s.", - "%(targetName)s left the room.": "%(targetName)s покинул комнату.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s сделал(а) историю комнаты видимой для всех участников комнаты с момента их приглашения.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s сделал(а) историю комнаты видимой для всех участников комнаты с момента их входа.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s сделал(а) историю комнаты видимой для всех участников комнаты.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s сделал(а) историю комнаты видимой для всех.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s сделал(а) историю комнаты видимой для неизвестного (%(visibility)s).", + "%(targetName)s joined the room.": "%(targetName)s вошел(-ла) в комнату.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s выгнал(а) %(targetName)s.", + "%(targetName)s left the room.": "%(targetName)s покинул(а) комнату.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s сделал(а) историю разговора видимой для всех собеседников с момента их приглашения.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s сделал(а) историю разговора видимой для всех собеседников с момента их входа в комнату.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s сделал(а) историю разговора видимой для всех собеседников.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s сделал(а) историю разговора видимой для всех.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s сделал(а) историю комнаты видимой в неизвестном режиме (%(visibility)s).", "Missing room_id in request": "Отсутствует room_id в запросе", "Missing user_id in request": "Отсутствует user_id в запросе", - "Must be viewing a room": "Необходимо посмотреть комнату", + "Must be viewing a room": "Вы должны просматривать комнату", "(not supported by this browser)": "(не поддерживается этим браузером)", "Connectivity to the server has been lost.": "Связь с сервером потеряна.", "Sent messages will be stored until your connection has returned.": "Отправленные сообщения будут сохранены, пока соединение не восстановится.", @@ -200,25 +197,25 @@ "Encrypt room": "Шифрование комнаты", "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", "Upload an avatar:": "Загрузите аватар:", - "You need to be logged in.": "Вы должны быть авторизованы.", + "You need to be logged in.": "Вы должны войти в систему.", "You need to be able to invite users to do that.": "Для этого вы должны иметь возможность приглашать пользователей.", - "You cannot place VoIP calls in this browser.": "VoIP звонки не поддерживаются в этом браузере.", - "You are already in a call.": "Вы уже совершаете вызов.", - "You are trying to access %(roomName)s.": "Вы пытаетесь получить доступ к %(roomName)s.", - "You cannot place a call with yourself.": "Вы не можете сделать вызов самому себе.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s отозвал %(targetName)s's приглашение.", - "Sep": "Сен.", - "Jan": "Янв.", - "Feb": "Фев.", - "Mar": "Мар.", - "Apr": "Апр.", + "You cannot place VoIP calls in this browser.": "Звонки не поддерживаются в этом браузере.", + "You are already in a call.": "Идет разговор.", + "You are trying to access %(roomName)s.": "Вы пытаетесь войти в %(roomName)s.", + "You cannot place a call with yourself.": "Вы не можете позвонить самому себе.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s отозвал(а) свое приглашение %(targetName)s.", + "Sep": "Сен", + "Jan": "Янв", + "Feb": "Фев", + "Mar": "Мар", + "Apr": "Апр", "May": "Май", - "Jun": "Июн.", - "Jul": "Июл.", - "Aug": "Авг.", - "Oct": "Окт.", - "Nov": "Ноя.", - "Dec": "Дек.", + "Jun": "Июн", + "Jul": "Июл", + "Aug": "Авг", + "Oct": "Окт", + "Nov": "Ноя", + "Dec": "Дек", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s", "Mon": "Пн", "Sun": "Вс", @@ -227,21 +224,21 @@ "Thu": "Чт", "Fri": "Пт", "Sat": "Сб", - "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш адрес email, кажется, не связан с Matrix ID на этом домашнем сервере.", - "To use it, just wait for autocomplete results to load and tab through them.": "Для того, чтобы использовать эту функцию, просто подождите автозаполнения результатов, а затем используйте клавишу TAB для прокрутки.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включено сквозное шифрование (algorithm %(algorithm)s).", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш email-адрес не связан ни с одним пользователем на этом сервере.", + "To use it, just wait for autocomplete results to load and tab through them.": "Чтобы воспользоваться этой функцией, дождитесь загрузки результатов в окне автодополнения, а затем используйте Tab для прокрутки.", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включил(а) в комнате сквозное шифрование (алгоритм %(algorithm)s).", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s разблокировал(а) %(targetName)s.", "Unable to capture screen": "Не удается сделать снимок экрана", "Unable to enable Notifications": "Не удалось включить уведомления", - "Upload Failed": "Сбой при отправке", + "Upload Failed": "Сбой отправки файла", "Usage": "Использование", "Use with caution": "Использовать с осторожностью", - "VoIP is unsupported": "VoIP не поддерживается", - "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Текстовое сообщение было отправлено на +%(msisdn)s. Введите проверочный код, который оно содержит", + "VoIP is unsupported": "Звонки не поддерживаются", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Текстовое сообщение было отправлено на +%(msisdn)s. Введите проверочный код из сообщения", "and %(count)s others...|other": "и %(count)s других...", "and %(count)s others...|one": "и еще один...", "Are you sure?": "Вы уверены?", - "Autoplay GIFs and videos": "Автовоспроизведение GIF и видео", + "Autoplay GIFs and videos": "Автоматически воспроизводить GIF-анимации и видео", "Click to mute audio": "Щелкните, чтобы выключить звук", "Click to mute video": "Щелкните, чтобы выключить видео", "Click to unmute video": "Щелкните, чтобы включить видео", @@ -249,18 +246,18 @@ "Decrypt %(text)s": "Расшифровать %(text)s", "Delete": "Удалить", "Devices": "Устройства", - "Direct chats": "Прямые чаты", + "Direct chats": "Личные чаты", "Disinvite": "Отозвать приглашение", - "Don't send typing notifications": "Не оповещать, когда я печатаю", - "Download %(text)s": "Загрузить %(text)s", + "Don't send typing notifications": "Не отправлять оповещения о том, когда я печатаю", + "Download %(text)s": "Скачать %(text)s", "Enable encryption": "Включить шифрование", "Enter Code": "Ввести код", "Failed to ban user": "Не удалось заблокировать пользователя", - "Failed to change power level": "Не удалось изменить уровень привилегий", - "Failed to forget room %(errCode)s": "Не удалось удалить комнату %(errCode)s", + "Failed to change power level": "Не удалось изменить уровень прав", + "Failed to forget room %(errCode)s": "Не удалось забыть комнату: %(errCode)s", "Failed to join room": "Не удалось войти в комнату", "Access Token:": "Токен доступа:", - "Always show message timestamps": "Всегда показывать временные метки сообщений", + "Always show message timestamps": "Всегда показывать время отправки сообщений", "Authentication": "Аутентификация", "olm version:": "Версия olm:", "%(items)s and %(lastItem)s": "%(items)s и %(lastItem)s", @@ -269,7 +266,7 @@ "Ban": "Заблокировать", "Change Password": "Сменить пароль", "Command error": "Ошибка команды", - "Confirm password": "Подтвердите пароль", + "Confirm password": "Подтвердите новый пароль", "Current password": "Текущий пароль", "Email": "Электронная почта", "Failed to kick": "Не удалось выгнать", @@ -278,46 +275,45 @@ "Failed to reject invite": "Не удалось отклонить приглашение", "Failed to save settings": "Не удалось сохранить настройки", "Failed to set display name": "Не удалось задать отображаемое имя", - "Failed to toggle moderator status": "Не удалось изменить статус модератора", + "Failed to toggle moderator status": "Не удалось переключить статус модератора", "Fill screen": "Заполнить экран", - "Hide read receipts": "Скрыть отметки о прочтении", - "Hide Text Formatting Toolbar": "Скрыть панель форматирования текста", + "Hide read receipts": "Скрывать отметки о прочтении", + "Hide Text Formatting Toolbar": "Скрыть инструменты форматирования текста", "Incorrect verification code": "Неверный код подтверждения", "Interface Language": "Язык интерфейса", - "Invalid alias format": "Недопустимый формат псевдонима", + "Invalid alias format": "Недопустимый формат имени", "Invalid address format": "Недопустимый формат адреса", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' недопустимый формат адреса", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' недопустимый формат псевдонима", + "'%(alias)s' is not a valid format for an address": "Адрес '%(alias)s' имеет недопустимый формат", + "'%(alias)s' is not a valid format for an alias": "Имя '%(alias)s' имеет недопустимый формат", "Join Room": "Войти в комнату", "Kick": "Выгнать", - "Local addresses for this room:": "Локальные адреса этой комнаты:", + "Local addresses for this room:": "Адреса этой комнаты на вашем сервере:", "Markdown is disabled": "Markdown отключен", "Markdown is enabled": "Markdown включен", "matrix-react-sdk version:": "версия matrix-react-sdk:", - "New address (e.g. #foo:%(localDomain)s)": "Новый адрес (например, #foo:%(localDomain)s)", + "New address (e.g. #foo:%(localDomain)s)": "Новый адрес (например, #чтонибудь:%(localDomain)s)", "New passwords don't match": "Новые пароли не совпадают", - "not set": "не задано", - "not specified": "не определен", + "not set": "не указан", + "not specified": "не задан", "No devices with registered encryption keys": "Нет устройств с зарегистрированными ключами шифрования", "No more results": "Больше никаких результатов", "No results": "Нет результатов", "OK": "OK", - "Only people who have been invited": "Только приглашенные люди", + "Only people who have been invited": "Только приглашенные участники", "Passwords can't be empty": "Пароли не могут быть пустыми", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s выполнил %(callType)s вызов.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s начал(а) %(callType)s-звонок.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Проверьте свою электронную почту и нажмите на содержащуюся ссылку. После этого нажмите кнопку Продолжить.", - "Power level must be positive integer.": "Уровень авторизации должен быть положительным целым числом.", + "Power level must be positive integer.": "Уровень прав должен быть положительным целым числом.", "Profile": "Профиль", "Reason": "Причина", - "%(targetName)s rejected the invitation.": "%(targetName)s отклонил приглашение.", + "%(targetName)s rejected the invitation.": "%(targetName)s отклонил(а) приглашение.", "Reject invitation": "Отклонить приглашение", "Remove Contact Information?": "Удалить контактную информацию?", - "%(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": "Сообщить об этом", + "%(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 хочет начать конференц-звонок.", "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 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 не получил разрешение на отправку уведомлений, пожалуйста, попробуйте снова", "riot-web version:": "версия riot-web:", "Room %(roomId)s not visible": "Комната %(roomId)s невидима", @@ -325,13 +321,13 @@ "Room name (optional)": "Имя комнаты (необязательно)", "Rooms": "Комнаты", "Scroll to bottom of page": "Перейти к нижней части страницы", - "Scroll to unread messages": "Прокрутка к непрочитанным сообщениям", + "Scroll to unread messages": "Прокрутить до непрочитанных сообщений", "Search": "Поиск", "Search failed": "Поиск не удался", "Sender device information": "Информация об устройстве отправителя", "Send Invites": "Отправить приглашения", - "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s отправил изображение.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s отправил(а) приглашение для %(targetDisplayName)s войти в комнату.", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s отправил(а) изображение.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s пригласил(а) %(targetDisplayName)s в комнату.", "Show panel": "Показать панель", "Sign in": "Войти", "Sign out": "Выйти", @@ -339,14 +335,14 @@ "Someone": "Кто-то", "Submit": "Отправить", "Success": "Успех", - "The default role for new room members is": "Роль по умолчанию для новых участников комнаты", - "The main address for this room is": "Основной адрес для этой комнаты", - "This email address is already in use": "Этот адрес email уже используется", + "The default role for new room members is": "Права по умолчанию для новых участников комнаты", + "The main address for this room is": "Основной адрес этой комнаты", + "This email address is already in use": "Этот email-адрес уже используется", "This email address was not found": "Этот адрес электронной почты не найден", "The email address linked to your account must be entered.": "Необходимо ввести адрес электронной почты, связанный с вашей учетной записью.", "The file '%(fileName)s' failed to upload": "Не удалось отправить файл '%(fileName)s'", - "The remote side failed to pick up": "Вызываемый абонент не ответил", - "This room has no local addresses": "В этой комнате нет локальных адресов", + "The remote side failed to pick up": "Собеседник не ответил на ваш звонок", + "This room has no local addresses": "У этой комнаты нет адресов на вашем сервере", "This room is not recognised.": "Эта комната не опознана.", "These are experimental features that may break in unexpected ways": "Это экспериментальные функции, которые могут себя вести неожиданным образом", "This doesn't appear to be a valid email address": "Похоже, это недействительный адрес email", @@ -356,30 +352,30 @@ "Turn Markdown off": "Выключить Markdown", "Turn Markdown on": "Включить Markdown", "Unknown room %(roomId)s": "Неизвестная комната %(roomId)s", - "You have been invited to join this room by %(inviterName)s": "%(inviterName)s приглашает вас в комнату", + "You have been invited to join this room by %(inviterName)s": "%(inviterName)s приглашает вас в эту комнату", "You seem to be uploading files, are you sure you want to quit?": "Похоже, вы отправляете файлы, вы уверены, что хотите выйти?", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s", "Make Moderator": "Сделать модератором", "Room": "Комната", "Cancel": "Отмена", "bold": "жирный", - "italic": "курсивный", + "italic": "курсив", "strike": "перечеркнутый", "underline": "подчеркнутый", "code": "код", "quote": "цитата", - "bullet": "список", - "numbullet": "нумерованный список", + "bullet": "элемент списка", + "numbullet": "элемент нумерованного списка", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Не удается подключиться к домашнему серверу через HTTP, так как в адресной строке браузера указан URL HTTPS. Используйте HTTPS или либо включите небезопасные сценарии.", "Dismiss": "Отклонить", - "Custom Server Options": "Настраиваемые параметры сервера", - "Mute": "Беззвучный", + "Custom Server Options": "Выбор другого сервера", + "Mute": "Приглушить", "Operation failed": "Сбой операции", "powered by Matrix": "Основано на Matrix", - "Add a topic": "Добавить тему", - "Show timestamps in 12 hour format (e.g. 2:30pm)": "Отображать время в 12-часовом формате (напр. 2:30pm)", - "Use compact timeline layout": "Использовать компактный макет временной шкалы", - "Hide removed messages": "Скрыть удаленные сообщения", + "Add a topic": "Задать тему", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "Отображать время в 12-часовом формате (напр. 2:30 ПП)", + "Use compact timeline layout": "Использовать компактный вид списка сообщений", + "Hide removed messages": "Скрывать удаленные сообщения", "No Microphones detected": "Микрофоны не обнаружены", "Unknown devices": "Неизвестное устройство", "Camera": "Камера", @@ -388,29 +384,28 @@ "Start automatically after system login": "Автозапуск при входе в систему", "Analytics": "Аналитика", "Riot collects anonymous analytics to allow us to improve the application.": "Riot собирает анонимные данные, позволяющие нам улучшить приложение.", - "Opt out of analytics": "Не собирать аналитические данные", "Logged in as:": "Вы вошли как:", "Default Device": "Устройство по умолчанию", "No Webcams detected": "Веб-камера не обнаружена", "VoIP": "VoIP", "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.": "Для обеспечения безопасности при выходе будут удалены все ключи сквозного шифрования из этого браузера. Если вы хотите иметь возможность расшифровать историю сообщений в будущем, необходимо экспортировать ключи комнат вручную.", "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.": "Посторонние не смогут войти в эту комнату, даже если они будут приглашены.", "Missing Media Permissions, click here to request.": "Отсутствуют разрешения, нажмите для запроса.", "No media permissions": "Нет разрешенных носителей", "You may need to manually permit Riot to access your microphone/webcam": "Вам необходимо предоставить Riot доступ к микрофону или веб-камере вручную", "Anyone": "Все", "Are you sure you want to leave the room '%(roomName)s'?": "Вы уверены, что хотите покинуть '%(roomName)s'?", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s удалил имя комнаты.", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Смена пароля на данный момент сбрасывает ключи сквозного шифрования на всех устройствах, делая зашифрованную историю чата нечитаемой. Чтобы избежать этого, экспортируйте ключи комнат и импортируйте их после смены пароля. В будущем это будет исправлено.", - "Custom level": "Пользовательский уровень", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s удалил(а) имя комнаты.", + "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Смена пароля на данный момент сбрасывает ключи сквозного шифрования на всех устройствах, делая историю зашифрованных чатов нечитаемой. Чтобы избежать этого, экспортируйте ключи сквозного шифрования и импортируйте их после смены пароля. В будущем это будет исправлено.", + "Custom level": "Специальные права", "Device already verified!": "Устройство уже проверено!", "Device ID:": "ID устройства:", "device id: ": "ID устройства: ", "Device key:": "Ключ устройства:", - "Email address": "Адрес email", - "Email address (optional)": "Адрес email (необязательно)", - "Error decrypting attachment": "Ошибка при расшифровке вложения", + "Email address": "Email-адрес", + "Email address (optional)": "Email-адрес (необязательно)", + "Error decrypting attachment": "Ошибка расшифровки вложения", "Export": "Экспорт", "Failed to set avatar.": "Не удалось установить аватар.", "Import": "Импорт", @@ -419,14 +414,14 @@ "Invited": "Приглашен", "Jump to first unread message.": "Перейти к первому непрочитанному сообщению.", "Message not sent due to unknown devices being present": "Сообщение не отправлено из-за присутствия неизвестных устройств", - "Mobile phone number (optional)": "Номер мобильного телефона (не обязательно)", + "Mobile phone number (optional)": "Номер мобильного телефона (необязательно)", "Password:": "Пароль:", "Privacy warning": "Предупреждение о конфиденциальности", "Privileged Users": "Привилегированные пользователи", "Revoke Moderator": "Отозвать права модератора", "Refer a friend to Riot:": "Расскажите другу о Riot:", - "Register": "Регистрация", - "Remote addresses for this room:": "Удаленные адреса для этой комнаты:", + "Register": "Зарегистрироваться", + "Remote addresses for this room:": "Адреса этой комнаты на других серверах:", "Remove %(threePid)s?": "Удалить %(threePid)s?", "Results from DuckDuckGo": "Результаты от DuckDuckGo", "Save": "Сохранить", @@ -435,35 +430,35 @@ "Server may be unavailable or overloaded": "Сервер может быть недоступен или перегружен", "Server may be unavailable, overloaded, or search timed out :(": "Сервер может быть недоступен, перегружен или поиск прекращен по тайм-ауту :(", "Server may be unavailable, overloaded, or the file too big": "Сервер может быть недоступен, перегружен или размер файла слишком большой", - "Server may be unavailable, overloaded, or you hit a bug.": "Сервер может быть недоступен, перегружен или возникла ошибка.", - "Server unavailable, overloaded, or something else went wrong.": "Сервер может быть недоступен, перегружен или что-то пошло не так.", + "Server may be unavailable, overloaded, or you hit a bug.": "Возможно, сервер недоступен, перегружен или случилась ошибка.", + "Server unavailable, overloaded, or something else went wrong.": "Возможно, сервер недоступен, перегружен или что-то еще пошло не так.", "Session ID": "ID сессии", - "%(senderName)s set a profile picture.": "%(senderName)s установил изображение профиля.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s изменил отображаемое имя на %(displayName)s.", + "%(senderName)s set a profile picture.": "%(senderName)s установил(а) себе аватар.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s изменил(а) отображаемое имя на %(displayName)s.", "Signed Out": "Выполнен выход", - "Tagged as: ": "Теги: ", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Предоставленный ключ подписи соответствует ключу, полученному от %(userId)s с устройства %(deviceId)s. Устройство помечено как проверенное.", - "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Файл '%(fileName)s' превышает предельный размер, допустимый к отправке на этом домашнем сервере", + "Tagged as: ": "Метки: ", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Предоставленный вами ключ совпадает с ключом, полученным от %(userId)s с устройства %(deviceId)s. Это устройство помечено как проверенное.", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Файл '%(fileName)s' слишком большой для отправки на этот сервер", "This Home Server does not support login using email address.": "Этот домашний сервер не поддерживает авторизацию с использованием адреса электронной почты.", - "The visibility of existing history will be unchanged": "Видимость существующей истории не изменится", - "This room is not accessible by remote Matrix servers": "Это комната недоступна с удаленных серверов Matrix", + "The visibility of existing history will be unchanged": "Правила доступа к существующей истории не изменятся", + "This room is not accessible by remote Matrix servers": "Это комната недоступна из других серверов Matrix", "To reset your password, enter the email address linked to your account": "Чтобы сбросить пароль, введите адрес электронной почты, связанный с вашей учетной записью", "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.": "Попытка загрузить выбранный интервал истории чата этой комнаты не удалась, так как запрошенный элемент не найден.", "Unable to load device list": "Не удалось загрузить список устройств", - "Unknown (user, device) pair:": "Неизвестная пара (пользователь, устройство):", - "Unmute": "Включить звук", + "Unknown (user, device) pair:": "Неизвестная пара пользователь-устройство:", + "Unmute": "Вернуть право речи", "Unrecognised command:": "Нераспознанная команда:", - "Unrecognised room alias:": "Нераспознанный псевдоним комнаты:", - "Verified key": "Проверенный ключ", + "Unrecognised room alias:": "Нераспознанное имя комнаты:", + "Verified key": "Ключ проверен", "WARNING: Device already verified, but keys do NOT MATCH!": "ВНИМАНИЕ: устройство уже было проверено, однако ключи НЕ СОВПАДАЮТ!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ВНИМАНИЕ: ОШИБКА ПРОВЕРКИ КЛЮЧЕЙ! Ключ подписи пользователя %(userId)s на устройстве %(deviceId)s — \"%(fprint)s\", и он не соответствует предоставленному ключу \"%(fingerprint)s\". Это может означать, что ваше общение перехватывается!", - "You have disabled URL previews by default.": "Предварительный просмотр ссылок отключен по-умолчанию.", - "You have enabled URL previews by default.": "Предварительный просмотр ссылок включен по-умолчанию.", + "You have disabled URL previews by default.": "Предпросмотр ссылок по умолчанию выключен для вас.", + "You have enabled URL previews by default.": "Предпросмотр ссылок по умолчанию включен для вас.", "You need to enter a user name.": "Необходимо ввести имя пользователя.", "You seem to be in a call, are you sure you want to quit?": "Звонок не завершен, вы уверены, что хотите выйти?", - "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Вы не сможете отменить это изменение, так как этот пользователь получит уровень доступа, аналогичный вашему.", - "Please select the destination room for this message": "Выберите комнату для отправки этого сообщения", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Вы не сможете отменить это действие, так как этот пользователь получит уровень прав, равный вашему.", + "Please select the destination room for this message": "Выберите, куда отправить это сообщение", "Options": "Настройки", "Passphrases must match": "Пароли должны совпадать", "Passphrase must not be empty": "Пароль не должен быть пустым", @@ -481,14 +476,12 @@ "Start new chat": "Начать новый чат", "Failed to invite": "Пригласить не удалось", "Failed to invite user": "Не удалось пригласить пользователя", - "Failed to invite the following users to the %(roomName)s room:": "Не удалось пригласить следующих пользователей в %(roomName)s:", + "Failed to invite the following users to the %(roomName)s room:": "Не удалось пригласить этих пользователей в %(roomName)s:", "Confirm Removal": "Подтвердите удаление", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Вы действительно хотите удалить это событие? Обратите внимание, что если это смена названия комнаты или темы, то удаление отменит это изменение.", "Unknown error": "Неизвестная ошибка", "Incorrect password": "Неверный пароль", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Ваша учетная запись будет заблокирована навсегда. Вы не сможете повторно зарегистрировать тот же идентификатор пользователя.", - "This action is irreversible.": "Это действие необратимо.", - "To continue, please enter your password.": "Для продолжения введите ваш пароль.", + "To continue, please enter your password.": "Чтобы продолжить, введите ваш пароль.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Чтобы удостовериться, что этому устройству можно доверять, пожалуйста, свяжитесь с владельцем другим способом (например, лично или по телефону) и спросите его, совпадает ли ключ, указанный у него в настройках для этого устройства, с ключом ниже:", "Device name": "Имя устройства", "Device key": "Ключ устройства", @@ -496,54 +489,50 @@ "In future this verification process will be more sophisticated.": "В будущем процесс проверки будет усовершенствован.", "Verify device": "Проверить устройство", "I verify that the keys match": "Я подтверждаю, что ключи совпадают", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Произошла ошибка при попытке восстановить предыдущий сеанс. Если продолжить, потребуется снова войти в систему, а зашифрованная история чата будет нечитаема.", "Unable to restore session": "Восстановление сессии не удалось", "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, то ваша сессия может быть несовместима с текущей. Закройте это окно и вернитесь к использованию более новой версии.", - "Continue anyway": "Все равно продолжить", "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.": "Мы рекомендуем вам выполнить процедуру проверки каждого устройства, чтобы удостовериться, что они принадлежат их законному владельцу, но вы можете переотправить сообщение без проверки, если хотите.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" содержит неподтвержденные устройства.", "Unknown Address": "Неизвестный адрес", - "Unblacklist": "Удалить из черного списка", - "Blacklist": "Черный список", - "Unverify": "Отозвать статус проверенного", - "Verify...": "Проверить...", + "Unblacklist": "Разблокировать", + "Blacklist": "Заблокировать", + "Unverify": "Отозвать доверие", + "Verify...": "Сверить ключи...", "ex. @bob:example.com": "например @bob:example.com", "Add User": "Добавить пользователя", - "This Home Server would like to make sure you are not a robot": "Этот домашний сервер хочет убедиться, что вы не робот", - "Sign in with CAS": "Войти, используя CAS", - "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Вы можете использовать настраиваемые параметры сервера для входа на другие серверы Matrix, указав другой URL-адрес домашнего сервера.", - "This allows you to use this app with an existing Matrix account on a different home server.": "Это позволяет использовать это приложение с существующей учетной записью Matrix на другом домашнем сервере.", - "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Вы также можете установить другой сервер идентификации, но это, как правило, будет препятствовать взаимодействию с пользователями на основе адреса email.", - "Please check your email to continue registration.": "Проверьте электронную почту, чтобы продолжить регистрацию.", - "Token incorrect": "Неверный токен", + "This Home Server would like to make sure you are not a robot": "Этот сервер хочет убедиться, что вы не робот", + "Sign in with CAS": "Войти с помощью CAS", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Вы можете войти на другой сервер Matrix, указав его URL-адрес.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Это позволяет использовать приложение с учетной записью Matrix на другом сервере.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Кроме того, можно выбрать другой сервер идентификации, однако в таком случае вы, скорее всего, не сможете взаимодействовать с пользователями посредством их email-адресов.", + "Please check your email to continue registration.": "Чтобы продолжить регистрацию, проверьте электронную почту.", + "Token incorrect": "Неверный код проверки", "Please enter the code it contains:": "Введите полученный код:", - "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Если адрес email не указан, сброс пароля будет невозможным. Уверены?", - "You are registering with %(SelectedTeamName)s": "Вы регистрируетесь на %(SelectedTeamName)s", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Если не указать email-адрес, вы не сможете при необходимости сбросить свой пароль. Уверены?", + "You are registering with %(SelectedTeamName)s": "Вы регистрируетесь в %(SelectedTeamName)s", "Default server": "Сервер по умолчанию", - "Custom server": "Пользовательский сервер", - "Home server URL": "URL-адрес домашнего сервера", + "Custom server": "Другой сервер", + "Home server URL": "URL-адрес сервера", "Identity server URL": "URL-адрес сервера идентификации", "What does this mean?": "Что это значит?", - "Error decrypting audio": "Ошибка расшифровки аудио", + "Error decrypting audio": "Ошибка расшифровки аудиозаписи", "Error decrypting image": "Ошибка расшифровки изображения", - "Image '%(Body)s' cannot be displayed.": "Изображение '%(Body)s' не может быть отображено.", - "This image cannot be displayed.": "Не удается отобразить изображение.", "Error decrypting video": "Ошибка расшифровки видео", "Add an Integration": "Добавить интеграцию", - "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Вы будете пернаправлены на внешний сайт, где сможете аутентифицировать свою учетную запись для использования с %(integrationsUrl)s. Продолжить?", - "Removed or unknown message type": "Удалено или неизвестный тип сообщения", - "URL Previews": "Предварительный просмотр URL-адресов", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Вы будете перенаправлены на внешний сайт, чтобы войти в свою учетную запись для использования с %(integrationsUrl)s. Продолжить?", + "Removed or unknown message type": "Сообщение удалено или имеет неизвестный тип", + "URL Previews": "Предпросмотр содержимого ссылок", "Drop file here to upload": "Перетащите файл сюда для отправки", " (unsupported)": " (не поддерживается)", - "Ongoing conference call%(supportedText)s.": "Установлен групповой вызов %(supportedText)s.", - "Online": "В сети", + "Ongoing conference call%(supportedText)s.": "Идет конференц-звонок%(supportedText)s.", + "Online": "Онлайн", "Idle": "Неактивен", "Offline": "Не в сети", - "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s сменил аватар комнаты на ", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s удалил аватар комнаты.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s сменил аватар для %(roomName)s", - "Create new room": "Создать новую комнату", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s сменил(а) аватар комнаты на ", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s удалил(а) аватар комнаты.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s сменил(а) аватар %(roomName)s", + "Create new room": "Создать комнату", "Room directory": "Каталог комнат", "Start chat": "Начать чат", "Add": "Добавить", @@ -568,12 +557,12 @@ "Something went wrong!": "Что-то пошло не так!", "This will be your account name on the homeserver, or you can pick a different server.": "Это будет имя вашей учетной записи на домашнем сервере, или вы можете выбрать другой сервер.", "If you already have a Matrix account you can log in instead.": "Если у вас уже есть учетная запись Matrix, вы можете войти.", - "Home": "Старт", + "Home": "Начало", "Accept": "Принять", - "Active call (%(roomName)s)": "Активный вызов (%(roomName)s)", + "Active call (%(roomName)s)": "Текущий вызов (%(roomName)s)", "Admin Tools": "Инструменты администратора", "Alias (optional)": "Псевдоним (опционально)", - "Click here to join the discussion!": "Нажмите здесь, чтобы присоединиться к обсуждению!", + "Click here to join the discussion!": "Нажмите здесь, чтобы присоединиться!", "Close": "Закрыть", "Disable Notifications": "Отключить уведомления", "Drop File Here": "Перетащите файл сюда", @@ -582,61 +571,59 @@ "Encrypted by an unverified device": "Зашифровано непроверенным устройством", "Encryption is enabled in this room": "Шифрование в этой комнате включено", "Encryption is not enabled in this room": "Шифрование в этой комнате не включено", - "Failed to upload profile picture!": "Не удалось отправить изображение профиля!", + "Failed to upload profile picture!": "Не удалось загрузить аватар!", "Incoming call from %(name)s": "Входящий вызов от %(name)s", "Incoming video call from %(name)s": "Входящий видеовызов от %(name)s", "Incoming voice call from %(name)s": "Входящий голосовой вызов от %(name)s", - "Join as voice or video.": "Войти как голос или видео.", - "Last seen": "Последний визит", + "Join as voice or video.": "Присоединиться с голосом или с видео.", + "Last seen": "Последний вход", "Level:": "Уровень:", "No display name": "Нет отображаемого имени", - "Otherwise, click here to send a bug report.": "В противном случае, нажмите 2 для отправки отчета об ошибке.", "Private Chat": "Приватный чат", "Public Chat": "Публичный чат", "Reason: %(reasonText)s": "Причина: %(reasonText)s", "Rejoin": "Войти повторно", - "Start authentication": "Начать проверку подлинности", - "This room": "В этой комнате", - "(~%(count)s results)|other": "(~%(count)s результаты)", + "Start authentication": "Начать аутентификацию", + "This room": "Эта комната", + "(~%(count)s results)|other": "(~%(count)s результатов)", "Device Name": "Имя устройства", "Custom": "Пользовательские", "Decline": "Отклонить", "Room contains unknown devices": "Комната содержит непроверенные устройства", "%(roomName)s does not exist.": "%(roomName)s не существует.", "%(roomName)s is not accessible at this time.": "%(roomName)s на данный момент недоступна.", - "Seen by %(userName)s at %(dateTime)s": "Просмотрено %(userName)s в %(dateTime)s", + "Seen by %(userName)s at %(dateTime)s": "Прочитано %(userName)s в %(dateTime)s", "Send anyway": "Отправить в любом случае", - "Show Text Formatting Toolbar": "Показать панель инструментов форматирования текста", - "This invitation was sent to an email address which is not associated with this account:": "Это приглашение было отправлено на адрес email, не связанный с этой учетной записью:", - "To link to a room it must have an address.": "Чтобы связаться с комнатой, она должна иметь адрес.", - "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Не удалось установить соответствует ли адрес, по которому этому приглашение было послано, вашей учетной записи.", + "Show Text Formatting Toolbar": "Показать инструменты форматирования текста", + "This invitation was sent to an email address which is not associated with this account:": "Это приглашение было отправлено на email-адрес, не связанный с вашей учетной записью:", + "To link to a room it must have an address.": "Чтобы иметь возможность ссылаться на комнату, ей нужно присвоить адрес.", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Не удалось установить, что адрес в этом приглашении соответствует вашей учетной записи.", "Undecryptable": "Невозможно расшифровать", - "Unencrypted message": "Незашифрованное сообщение", + "Unencrypted message": "Нешифрованное сообщение", "unknown caller": "неизвестный абонент", - "Unnamed Room": "Комната без имени", + "Unnamed Room": "Комната без названия", "Unverified": "Не проверено", - "Upload new:": "Отправить новый:", - "%(user)s is a": "%(user)s является", - "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (уровень доступа %(powerLevelNumber)s)", + "Upload new:": "Загрузить новый:", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (уровень прав %(powerLevelNumber)s)", "Verified": "Проверено", - "Would you like to accept or decline this invitation?": "Вы хотели бы подтвердить или отклонить это приглашение?", + "Would you like to accept or decline this invitation?": "Вы хотите подтвердить или отклонить это приглашение?", "(~%(count)s results)|one": "(~%(count)s результат)", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Не удается подключиться к домашнему серверу - проверьте подключение, убедитесь, что ваш SSL-сертификат домашнего сервера является доверенным и что расширение браузера не блокирует запросы.", - "You have been banned from %(roomName)s by %(userName)s.": "%(userName)s заблокировал вас в %(roomName)s.", - "You have been kicked from %(roomName)s by %(userName)s.": "%(userName)s выгнал вас из %(roomName)s.", - "You may wish to login with a different account, or add this email to this account.": "При желании вы можете войти в систему с другой учетной записью или добавить этот адрес email в эту учетную запись.", - "Your home server does not support device management.": "Ваш домашний сервер не поддерживает управление устройствами.", - "(could not connect media)": "(подключение к СМИ не может быть установлено)", + "You have been banned from %(roomName)s by %(userName)s.": "%(userName)s заблокировал(а) вас в %(roomName)s.", + "You have been kicked from %(roomName)s by %(userName)s.": "%(userName)s выгнал(а) вас из %(roomName)s.", + "You may wish to login with a different account, or add this email to this account.": "При желании вы можете войти в систему под другим именем или привязать этот email-адрес к вашей учетной записи.", + "Your home server does not support device management.": "Ваш сервер не поддерживает управление устройствами.", + "(could not connect media)": "(сбой подключения)", "(no answer)": "(нет ответа)", - "(unknown failure: %(reason)s)": "(неизвестная ошибка: %(reason)s", + "(unknown failure: %(reason)s)": "(неизвестная ошибка: %(reason)s)", "Disable Peer-to-Peer for 1:1 calls": "Отключить Peer-to-Peer для 1:1 звонков", - "Not a valid Riot keyfile": "Недействительный файл ключа Riot", + "Not a valid Riot keyfile": "Недействительный файл ключей Riot", "Your browser does not support the required cryptography extensions": "Ваш браузер не поддерживает требуемые криптографические расширения", - "Authentication check failed: incorrect password?": "Ошибка аутентификации: неправильный пароль?", - "Do you want to set an email address?": "Хотите указать адрес email?", + "Authentication check failed: incorrect password?": "Ошибка аутентификации: возможно, неправильный пароль?", + "Do you want to set an email address?": "Хотите указать email-адрес?", "This will allow you to reset your password and receive notifications.": "Это позволит при необходимости сбросить пароль и получать уведомления.", - "Press to start a chat with someone": "Нажмите для начала чата с кем-либо", - "You're not in any rooms yet! Press to make a room or to browse the directory": "Вы еще не вошли ни в одну из комнат! Нажмите , чтобы создать комнату или для просмотра каталога", + "Press to start a chat with someone": "Нажмите , чтобы начать разговор с кем-либо", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Вы еще не вошли ни в одну из комнат! Нажмите , чтобы создать комнату, или , чтобы посмотреть каталог комнат", "To return to your account in future you need to set a password": "Чтобы вернуться к учетной записи в будущем, необходимо задать пароль", "Skip": "Пропустить", "Start verification": "Начать проверку", @@ -653,24 +640,22 @@ "Changes colour scheme of current room": "Изменяет цветовую схему текущей комнаты", "Delete widget": "Удалить виджет", "Define the power level of a user": "Определить уровень доступа пользователя", - "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)": "Скрыть сообщения о входе/выходе (не применяется к приглашениям/выкидываниям/банам)", + "Do you want to load widget from URL:": "Вы собираетесь загрузить виджет по URL-адресу:", + "Edit": "Изменить", + "Enable automatic language detection for syntax highlighting": "Автоматически определять язык подсветки синтаксиса", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Скрывать уведомления о входе/выходе из комнаты (не применяется к приглашениям/выкидываниям/банам)", "Integrations Error": "Ошибка интеграции", - "AM": "AM", - "PM": "PM", + "AM": "ДП", + "PM": "ПП", "NOTE: Apps are not end-to-end encrypted": "ПРИМЕЧАНИЕ: приложения не защищены сквозным шифрованием", - "Revoke widget access": "Отозвать доступ к виджетам", + "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.": "Не удалось создать виджет.", "Unbans user with given id": "Разбанить пользователя с заданным ID", - "You are not in this room.": "Вас нет в этой комнате.", - "You do not have permission to do that in this room.": "У вас нет разрешения на это в этой комнате.", + "You are not in this room.": "Вас сейчас нет в этой комнате.", + "You do not have permission to do that in this room.": "У вас нет разрешения на это в данной комнате.", "Verifies a user, device, and pubkey tuple": "Проверка пользователя, устройства и открытого ключа", "Autocomplete Delay (ms):": "Задержка автозаполнения (мс):", "Loading device info...": "Загрузка информации об устройстве...", @@ -678,14 +663,14 @@ "Create": "Создать", "Featured Rooms:": "Рекомендуемые комнаты:", "Featured Users:": "Избранные пользователи:", - "Automatically replace plain text Emoji": "Автоматически заменять обычный текст на Emoji", + "Automatically replace plain text Emoji": "Автоматически заменять текстовые смайлики на Emoji", "Failed to upload image": "Не удалось загрузить изображение", - "Hide avatars in user and room mentions": "Скрыть аватары в упоминаниях пользователей и комнат", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s виджет, добавленный %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s виджет, удаленный %(senderName)s", - "Robot check is currently unavailable on desktop - please use a web browser": "Проверка робота в настоящее время недоступна на компьютере - пожалуйста, используйте браузер", - "Publish this room to the public in %(domain)s's room directory?": "Опубликовать эту комнату для пользователей в %(domain)s каталоге комнат?", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s виджет, измененный %(senderName)s", + "Hide avatars in user and room mentions": "Скрывать аватары в упоминаниях пользователей и комнат", + "%(widgetName)s widget added by %(senderName)s": "Виджет %(widgetName)s был добавлен %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Виджет %(widgetName)s был удален %(senderName)s", + "Robot check is currently unavailable on desktop - please use a web browser": "CAPTCHA-тест в настоящее время недоступен в Desktop-клиенте - пожалуйста, используйте браузер", + "Publish this room to the public in %(domain)s's room directory?": "Опубликовать эту комнату в каталоге комнат %(domain)s?", + "%(widgetName)s widget modified by %(senderName)s": "Виджет %(widgetName)s был изменен %(senderName)s", "Copied!": "Скопировано!", "Failed to copy": "Не удалось скопировать", "Advanced options": "Дополнительные параметры", @@ -694,41 +679,40 @@ "Ignored Users": "Игнорируемые пользователи", "Ignore": "Игнорировать", "Unignore": "Перестать игнорировать", - "User Options": "Параметры пользователя", + "User Options": "Действия", "You are now ignoring %(userId)s": "Теперь вы игнорируете %(userId)s", "You are no longer ignoring %(userId)s": "Вы больше не игнорируете %(userId)s", - "Unignored user": "Неигнорируемый пользователь", - "Ignored user": "Игнорируемый пользователь", + "Unignored user": "Пользователь убран из списка игнорирования", + "Ignored user": "Пользователь добавлен в список игнорирования", "Stops ignoring a user, showing their messages going forward": "Прекращает игнорирование пользователя, показывая их будущие сообщения", "Ignores a user, hiding their messages from you": "Игнорирует пользователя, скрывая сообщения от вас", - "Disable Emoji suggestions while typing": "Отключить предложения Emoji при наборе текста", - "Banned by %(displayName)s": "Запрещено %(displayName)s", + "Disable Emoji suggestions while typing": "Не предлагать Emoji при наборе текста", + "Banned by %(displayName)s": "Заблокирован(а) %(displayName)s", "Message removed by %(userId)s": "Сообщение удалено %(userId)s", "To send messages, you must be a": "Для отправки сообщений необходимо быть", - "To invite users into the room, you must be a": "Чтобы пригласить пользователей в комнату, необходимо быть", - "To configure the room, you must be a": "Чтобы настроить комнату, необходимо быть", - "To kick users, you must be a": "Чтобы выкидывать пользователей, необходимо быть", - "To ban users, you must be a": "Чтобы банить пользователей, необходимо быть", - "To remove other users' messages, you must be a": "Чтобы удалять сообщения других пользователей, необходимо быть", + "To invite users into the room, you must be a": "Чтобы приглашать участников в комнату, необходимо быть", + "To configure the room, you must be a": "Чтобы настраивать комнату, необходимо быть", + "To kick users, you must be a": "Чтобы выгонять участников, необходимо быть", + "To ban users, you must be a": "Чтобы блокировать участников, необходимо быть", + "To remove other users' messages, you must be a": "Чтобы удалять сообщения других участников, необходимо быть", "To send events of type , you must be a": "Для отправки событий типа , необходимо быть", "To change the room's avatar, you must be a": "Чтобы изменить аватар комнаты, необходимо быть", - "To change the room's name, you must be a": "Чтобы изменить имя комнаты, необходимо быть", - "To change the room's main address, you must be a": "Чтобы изменить основной адрес комнаты, необходимо быть", - "To change the room's history visibility, you must be a": "Чтобы изменить видимость истории комнаты, необходимо быть", - "To change the permissions in the room, you must be a": "Чтобы изменить разрешения в комнате, необходимо быть", - "To change the topic, you must be a": "Чтобы изменить тему, необходимо быть", - "To modify widgets in the room, you must be a": "Чтобы изменить виджеты в комнате, необходимо быть", + "To change the room's name, you must be a": "Чтобы переименовывать комнату, необходимо быть", + "To change the room's main address, you must be a": "Чтобы изменять основной адрес комнаты, необходимо быть", + "To change the room's history visibility, you must be a": "Чтобы изменять настройки доступа к истории комнаты, необходимо быть", + "To change the permissions in the room, you must be a": "Чтобы изменять разрешения в комнате, необходимо быть", + "To change the topic, you must be a": "Чтобы изменять тему комнаты, необходимо быть", + "To modify widgets in the room, you must be a": "Чтобы изменять виджеты в комнате, необходимо быть", "Description": "Описание", - "Name or matrix ID": "Имя или matrix ID", + "Name or matrix ID": "Имя или идентификатор Matrix", "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", - "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Вы действительно хотите удалить '%(roomName)s' из %(groupId)s?", - "Jump to read receipt": "Перейти к подтверждению о прочтении", - "Disable big emoji in chat": "Отключить большие emoji в чате", - "Message Pinning": "Закрепление сообщений", + "Failed to invite the following users to %(groupId)s:": "Не удалось пригласить этих пользователей в %(groupId)s:", + "Failed to remove '%(roomName)s' from %(groupId)s": "Не удалось убрать '%(roomName)s' из %(groupId)s", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Вы действительно хотите убрать '%(roomName)s' из %(groupId)s?", + "Jump to read receipt": "Перейти к последнему прочтенному им сообщению", + "Disable big emoji in chat": "Отключить большие Emoji в чате", + "Message Pinning": "Закрепленные сообщения", "Remove avatar": "Удалить аватар", "Failed to invite users to %(groupId)s": "Не удалось пригласить пользователей в %(groupId)s", "Unable to reject invite": "Невозможно отклонить приглашение", @@ -739,9 +723,9 @@ "Add to summary": "Добавить в сводку", "Failed to add the following users to the summary of %(groupId)s:": "Не удалось добавить следующих пользователей в сводку %(groupId)s:", "Which rooms would you like to add to this summary?": "Какие комнаты вы хотите добавить в эту сводку?", - "Room name or alias": "Название комнаты или псевдоним", + "Room name or alias": "Название или идентификатор комнаты", "Pinned Messages": "Закрепленные сообщения", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s изменил закрепленные сообщения для этой комнаты.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s изменил(а) закрепленные в этой комнате сообщения.", "Failed to add the following rooms to the summary of %(groupId)s:": "Не удалось добавить следующие комнаты в сводку %(groupId)s:", "Failed to remove the room from the summary of %(groupId)s": "Не удалось удалить комнату из сводки %(groupId)s", "The room '%(roomName)s' could not be removed from the summary.": "Комнату '%(roomName)s' не удалось удалить из сводки.", @@ -750,7 +734,7 @@ "Light theme": "Светлая тема", "Dark theme": "Темная тема", "Unknown": "Неизвестно", - "Failed to add the following rooms to %(groupId)s:": "Не удалось добавить следующие комнаты в %(groupId)s:", + "Failed to add the following rooms to %(groupId)s:": "Не удалось добавить эти комнаты в %(groupId)s:", "Matrix ID": "Matrix ID", "Matrix Room ID": "Matrix ID комнаты", "email address": "адрес email", @@ -761,30 +745,30 @@ "No pinned messages.": "Нет прикрепленных сообщений.", "Loading...": "Загрузка...", "Unnamed room": "Комната без названия", - "World readable": "Доступно всем", - "Guests can join": "Гости могут присоединиться", - "No rooms to show": "Нет комнат для отображения", + "World readable": "Открыта для чтения", + "Guests can join": "Открыта для участия", + "No rooms to show": "Нет комнат, нечего показывать", "Long Description (HTML)": "Длинное описание (HTML)", "Community Settings": "Настройки сообщества", "Invite to Community": "Пригласить в сообщество", "Add to community": "Добавить в сообщество", - "Add rooms to the community": "Добавление комнат в сообщество", + "Add rooms to the community": "Добавить комнаты в сообщество", "Which rooms would you like to add to this community?": "Какие комнаты вы хотите добавить в это сообщество?", "Who would you like to add to this community?": "Кого бы вы хотели добавить в это сообщество?", - "Invite new community members": "Пригласить новых членов сообщества", - "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Предупреждение: любой, кого вы добавляете в сообщество, будет виден всем, кто знает ID сообщества", + "Invite new community members": "Пригласить в сообщество новых участников", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Предупреждение: любой, кого вы добавляете в сообщество, будет виден всем, кто знает ID этого сообщества", "Add rooms to this community": "Добавить комнаты в это сообщество", "Failed to invite users to community": "Не удалось пригласить пользователей в сообщество", "Communities": "Сообщества", - "Invalid community ID": "Недопустимый ID сообщества", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' - недействительный ID сообщества", - "New community ID (e.g. +foo:%(localDomain)s)": "Новый ID сообщества (напр. +foo:%(localDomain)s)", - "Remove from community": "Удалить из сообщества", - "Failed to remove user from community": "Не удалось удалить пользователя из сообщества", - "Filter community members": "Фильтр участников сообщества", - "Filter community rooms": "Фильтр комнат сообщества", - "Failed to remove room from community": "Не удалось удалить комнату из сообщества", - "Removing a room from the community will also remove it from the community page.": "Удаление комнаты из сообщества также удалит ее со страницы сообщества.", + "Invalid community ID": "Недопустимый идентификатор сообщества", + "'%(groupId)s' is not a valid community ID": "Идентификатор сообщества '%(groupId)s' недопустим", + "New community ID (e.g. +foo:%(localDomain)s)": "Новый идентификатор сообщества (напр. +чтонибудь:%(localDomain)s)", + "Remove from community": "Исключить из сообщества", + "Failed to remove user from community": "Не удалось исключить участника из сообщества", + "Filter community members": "Поиск по участникам сообщества", + "Filter community rooms": "Поиск по комнатам сообщества", + "Failed to remove room from community": "Не удалось убрать комнату из сообщества", + "Removing a room from the community will also remove it from the community page.": "Исключение комнаты из сообщества также уберет ее со страницы сообщества.", "Create Community": "Создать сообщество", "Community Name": "Имя сообщества", "Community ID": "ID сообщества", @@ -800,158 +784,386 @@ "This Home server does not support communities": "Этот домашний сервер не поддерживает сообщества", "Failed to load %(groupId)s": "Ошибка загрузки %(groupId)s", "Your Communities": "Ваши сообщества", - "You're not currently a member of any communities.": "В настоящее время вы не являетесь членом каких-либо сообществ.", + "You're not currently a member of any communities.": "Вы не состоите в каких-либо сообществах.", "Error whilst fetching joined communities": "Ошибка при загрузке сообществ", "Create a new community": "Создать новое сообщество", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Создайте сообщество для объединения пользователей и комнат! Создайте собственную домашнюю страницу, чтобы выделить свое пространство во вселенной Matrix.", "Join an existing community": "Присоединиться к существующему сообществу", "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Чтобы присоединиться к существующему сообществу, вам нужно знать его ID; это будет выглядеть примерно так+primer:matrix.org.", "Something went wrong whilst creating your community": "При создании сообщества что-то пошло не так", - "%(names)s and %(count)s others are typing|other": "%(names)s и %(count)s другие печатают", - "And %(count)s more...|other": "И более %(count)s...", + "%(names)s and %(count)s others are typing|other": "%(names)s и еще %(count)s печатают", + "And %(count)s more...|other": "Еще %(count)s…", "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?": "Удаление виджета действует для всех участников этой комнаты. Вы действительно хотите удалить этот виджет?", "Message removed": "Сообщение удалено", - "Mirror local video feed": "Зеркальное отображение видео", + "Mirror local video feed": "Зеркально отражать видео со своей камеры", "Invite": "Пригласить", - "Mention": "Упоминание", + "Mention": "Упомянуть", "Failed to withdraw invitation": "Не удалось отозвать приглашение", "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "ID сообществ могут содержать только символы a-z, 0-9, или '=_-./'", - "%(names)s and %(count)s others are typing|one": "%(names)s и еще кто-то печатает", + "%(names)s and %(count)s others are typing|one": "%(names)s и еще один собеседник печатают", "%(senderName)s sent an image": "%(senderName)s отправил(а) изображение", "%(senderName)s sent a video": "%(senderName)s отправил(а) видео", - "%(senderName)s uploaded a file": "%(senderName)s загрузил(а) файл", - "Disinvite this user?": "Отменить приглашение этого пользователя?", + "%(senderName)s uploaded a file": "%(senderName)s отправил(а) файл", + "Disinvite this user?": "Отозвать приглашение этого пользователя?", "Kick this user?": "Выгнать этого пользователя?", "Unban this user?": "Разблокировать этого пользователя?", "Ban this user?": "Заблокировать этого пользователя?", "Drop here to favourite": "Перетащите сюда для добавления в избранные", "You have been kicked from this room by %(userName)s.": "%(userName)s выгнал(а) вас из этой комнаты.", "You have been banned from this room by %(userName)s.": "%(userName)s заблокировал(а) вас в этой комнате.", - "You are trying to access a room.": "Вы пытаетесь получить доступ к комнате.", + "You are trying to access a room.": "Вы пытаетесь войти в комнату.", "Members only (since the point in time of selecting this option)": "Только участники (с момента выбора этого параметра)", "Members only (since they were invited)": "Только участники (с момента их приглашения)", - "Members only (since they joined)": "Только участники (с момента их присоединения)", + "Members only (since they joined)": "Только участники (с момента их входа)", "An email has been sent to %(emailAddress)s": "Письмо было отправлено на %(emailAddress)s", "A text message has been sent to %(msisdn)s": "Текстовое сообщение отправлено на %(msisdn)s", - "Disinvite this user from community?": "Отозвать приглашение этого пользователя в сообщество?", - "Remove this user from community?": "Удалить этого пользователя из сообщества?", + "Disinvite this user from community?": "Отозвать приглашение в сообщество этого участника?", + "Remove this user from community?": "Исключить этого участника из сообщества?", "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", - "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s присоединились %(count)s раз", - "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s присоединились", - "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s присоединился(-лась) %(count)s раз", - "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s присоединился(-лась)", - "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s покинули %(count)s раз", - "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s покинули", - "%(oneUser)sleft %(count)s times|other": "%(oneUser)sl покинул(а) %(count)s раз", - "%(oneUser)sleft %(count)s times|one": "%(oneUser)s покинул(а)", - "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s присоединились и покинули %(count)s раз", - "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s присоединились и покинули", - "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s присоединился(-лась) и покинул(а) %(count)s раз", - "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s присоединился(-лась) и покинул(а)", - "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s покинули и снова присоединились %(count)s раз", - "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s покинули и снова присоединились", - "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s покинул(а) и снова присоединился(-лась) %(count)s раз", - "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s покинул(а) и снова присоединился(-лась)", - "were invited %(count)s times|other": "были приглашены %(count)s раз", - "were invited %(count)s times|one": "были приглашены", - "was invited %(count)s times|other": "был(а) приглашен(а) %(count)s раз", - "was invited %(count)s times|one": "был(а) приглашен(а)", - "were banned %(count)s times|other": "были заблокированы %(count)s раз", - "were banned %(count)s times|one": "были заблокированы", - "was banned %(count)s times|other": "был(а) заблокирован(а) %(count)s раз", - "was banned %(count)s times|one": "был(а) заблокирован(а)", - "were unbanned %(count)s times|other": "были разблокированы %(count)s раз", - "were unbanned %(count)s times|one": "были разблокированы", - "was unbanned %(count)s times|other": "был(а) разблокирован(а) %(count)s раз", - "was unbanned %(count)s times|one": "был(а) разблокирован(а)", - "were kicked %(count)s times|other": "были выкинуты %(count)s раз", - "were kicked %(count)s times|one": "были выкинуты", - "was kicked %(count)s times|other": "был(а) выкинут(а) %(count)s раз", - "was kicked %(count)s times|one": "был(а) выкинут(а)", - "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s изменили свое имя %(count)s раз", - "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s изменили свое имя", - "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s изменил(а) свое имя %(count)s раз", - "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s изменил(а) свое имя", - "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s изменили свои аватары %(count)s раз", - "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s изменили свои аватары", - "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s изменил(а) свой аватар %(count)s раз", - "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s изменил(а) свой аватар", - "%(items)s and %(count)s others|other": "%(items)s и %(count)s других", - "%(items)s and %(count)s others|one": "%(items)s и один другой", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)sвошли %(count)s раз", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sвошли", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)sвошел(-ла) %(count)s раз", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)sвошел(-ла)", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)sушли %(count)s раз", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)sушли", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)sушел(-ла) %(count)s раз", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)sушел(-ла)", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)sвошли и ушли %(count)s раз", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)sвошли и ушли", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)sвошел(-ла) и ушел(-ла) %(count)s раз", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sвошел(-ла) и ушел(-ла)", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)sушли и снова вошли %(count)s раз", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)sушли и снова вошли", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)sушел(-ла) и снова вошел(-ла) %(count)s раз", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sушел(-ла) и снова вошел(-ла)", + "were invited %(count)s times|other": "приглашены %(count)s раз", + "were invited %(count)s times|one": "приглашены", + "was invited %(count)s times|other": "приглашен(а) %(count)s раз", + "was invited %(count)s times|one": "приглашен(а)", + "were banned %(count)s times|other": "заблокированы %(count)s раз", + "were banned %(count)s times|one": "заблокированы", + "was banned %(count)s times|other": "заблокирован(а) %(count)s раз", + "was banned %(count)s times|one": "заблокирован(а)", + "were unbanned %(count)s times|other": "разблокированы %(count)s раз", + "were unbanned %(count)s times|one": "разблокированы", + "was unbanned %(count)s times|other": "разблокирован(а) %(count)s раз", + "was unbanned %(count)s times|one": "разблокирован(а)", + "were kicked %(count)s times|other": "выгнаны %(count)s раз", + "were kicked %(count)s times|one": "выгнаны", + "was kicked %(count)s times|other": "выгнан(а) %(count)s раз", + "was kicked %(count)s times|one": "выгнан(а)", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)sпоменяли имя %(count)s раз", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)sпоменяли имя", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sпоменял(а) имя %(count)s раз", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sпоменял(а) имя", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)sпоменяли аватары %(count)s раз", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)sпоменяли аватары", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)sпоменял(а) аватар %(count)s раз", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)sпоменял(а) аватар", + "%(items)s and %(count)s others|other": "%(items)s и еще %(count)s участника(-ов)", + "%(items)s and %(count)s others|one": "%(items)s и еще кто-то", "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Сообщение отправлено на %(emailAddress)s. После перехода по ссылке в отправленном вам письме, щелкните ниже.", "Room Notification": "Уведомления комнаты", - "Drop here to tag direct chat": "Перетащите сюда, чтобы отметить как прямой чат", - "Drop here to restore": "Перетащиет сюда для восстановления", - "Drop here to demote": "Перетащите сюда для понижения", + "Drop here to tag direct chat": "Перетащите сюда, чтобы пометить как личный чат", + "Drop here to restore": "Перетащиет сюда, чтобы вернуть", + "Drop here to demote": "Перетащите сюда, чтобы понизить", "Community Invites": "Приглашения в сообщества", "Notify the whole room": "Уведомить всю комнату", "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Эти комнаты отображаются для участников сообщества на странице сообщества. Участники сообщества могут присоединиться к комнатам, щелкнув на них.", - "Show these rooms to non-members on the community page and room list?": "Следует ли показывать эти комнаты посторонним на странице сообщества и в комнате?", + "Show these rooms to non-members on the community page and room list?": "Следует ли показывать эти комнаты посторонним на странице сообщества и в списке комнат?", "Sign in to get started": "Войдите, чтобы начать", "Visibility in Room List": "Видимость в списке комнат", - "Visible to everyone": "Видимый для всех", + "Visible to everyone": "Всем", "Only visible to community members": "Только участникам сообщества", - "Presence Management": "Управление присутствием", - "Hide avatar changes": "Скрыть изменения аватара", - "Hide display name changes": "Скрыть изменения отображаемого имени", - "Enable inline URL previews by default": "Включить просмотр URL-адресов по умолчанию", - "Enable URL previews for this room (only affects you)": "Включить просмотр URL-адресов для этой комнаты (влияет только на вас)", - "Enable URL previews by default for participants in this room": "Включить просмотр URL-адресов по умолчанию для участников этой комнаты", + "Hide avatar changes": "Скрывать уведомления об изменении аватаров", + "Hide display name changes": "Скрывать уведомления об изменениях имен", + "Enable inline URL previews by default": "Включить предпросмотр ссылок по умолчанию", + "Enable URL previews for this room (only affects you)": "Включить предпросмотр ссылок в этой комнате (влияет только на вас)", + "Enable URL previews by default for participants in this room": "Включить предпросмотр ссылок для участников этой комнаты по умолчанию", "Status.im theme": "Тема status.im", - "Restricted": "Ограничен", + "Restricted": "Ограниченный пользователь", "Username on %(hs)s": "Имя пользователя на %(hs)s", - "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Видимость '%(roomName)s' в %(groupId)s не удалось обновить.", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Не удалось изменить видимость '%(roomName)s' в %(groupId)s.", "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s отклонили приглашения %(count)s раз", - "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s отклонили приглашения", - "URL previews are enabled by default for participants in this room.": "Предварительный просмотр URL-адресов для участников этой комнаты по умолчанию.", - "URL previews are disabled by default for participants in this room.": "Предварительный просмотр URL-адресов для участников этой комнаты по умолчанию.", - "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)sотклонил их приглашение %(count)s раз", - "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)sотклонил приглашение", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)sотклонили приглашения", + "URL previews are enabled by default for participants in this room.": "Предпросмотр ссылок по умолчанию включен для участников этой комнаты.", + "URL previews are disabled by default for participants in this room.": "Предпросмотр ссылок по умолчанию выключен для участников этой комнаты.", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)sотклонил(а) приглашение %(count)s раз", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)sотклонил(а) приглашение", "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)sотозвали приглашения %(count)s раз", "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)sотозвали приглашения", - "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)sотклонил приглашение %(count)s раз", - "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)sотозвал приглашение", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)sотклонил(а) приглашение %(count)s раз", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)sотозвал(а) приглашение", "Please note you are logging into the %(hs)s server, not matrix.org.": "Обратите внимание, что вы заходите на сервер %(hs)s, а не на matrix.org.", - "Custom of %(powerLevel)s": "Пользовательский уровень %(powerLevel)s", + "Custom of %(powerLevel)s": "Специальные права: %(powerLevel)s", "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    HTML для страницы вашего сообщества

    \n

    \n Используйте подробное описание для представления вашего сообщества новым участникам, или\n поделитесь чем-нибудь важным, например ссылками\n

    \n

    \n Также вы можете использовать теги 'img'\n

    \n", - "%(duration)ss": "%(duration)sсек", - "%(duration)sm": "%(duration)sмин", - "%(duration)sh": "%(duration)sчас", - "%(duration)sd": "%(duration)sдн", + "%(duration)ss": "%(duration)s сек", + "%(duration)sm": "%(duration)s мин", + "%(duration)sh": "%(duration)s ч", + "%(duration)sd": "%(duration)s дн", "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "У вашего сообщества нет подробного описания HTML-страницы для показа участникам.
    Щелкните здесь, чтобы открыть параметры и добавить его!", "Online for %(duration)s": "В сети %(duration)s", "Offline for %(duration)s": "Не в сети %(duration)s", "Idle for %(duration)s": "Неактивен %(duration)s", "Unknown for %(duration)s": "Неизвестно %(duration)s", "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Здесь никого нет! Хотите пригласить кого-нибудь или выключить предупреждение о пустой комнате?", - "Something went wrong when trying to get your communities.": "Что-то пошло не так, во время отображения ваших сообществ.", + "Something went wrong when trying to get your communities.": "Что-то пошло не так при попытке получить список ваших сообществ.", "Tag Panel": "Панель тегов", - "Delete %(count)s devices|other": "Удалить %(count)s устройств", - "Delete %(count)s devices|one": "Удалить устройство", - "Select devices": "Выбрать устройства", + "Delete %(count)s devices|other": "Удалить (%(count)s)", + "Delete %(count)s devices|one": "Удалить", + "Select devices": "Выбрать", "This homeserver doesn't offer any login flows which are supported by this client.": "Этот домашний сервер не поддерживает метод входа, поддерживаемый клиентом.", "Call Failed": "Звонок не удался", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "В этой комнате есть неизвестные устройства: если вы продолжите без их проверки, имейте в виду, что кто-то посторонний может вас прослушать.", - "Review Devices": "Обзор устройств", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "В этой комнате есть неизвестные устройства: если вы решите их не проверять, имейте в виду, что кто-то, возможно, вас прослушивает.", + "Review Devices": "Проверка устройств", "Call Anyway": "Позвонить в любом случае", "Answer Anyway": "Ответить в любом случае", - "Call": "Вызов", + "Call": "Позвонить", "Answer": "Ответить", "Send": "Отправить", "Addresses": "Адреса", "collapse": "свернуть", "expand": "развернуть", - "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": "Обнаружены старые криптографические данные", "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. Это приведет к сбою криптографии в более ранней версии. В этой версии не могут быть расшифрованы сообщения, которые использовались недавно при использовании старой версии. Это также может привести к сбою обмена сообщениями с этой версией. Если возникают неполадки, выйдите и снова войдите в систему. Чтобы сохранить журнал сообщений, экспортируйте и повторно импортируйте ключи.", - "Show devices or cancel all.": "Показать устройства или отменить все.", - "Warning": "Предупреждение", - "Showing flair for these communities:": "Показ таланта этим сообществам:", - "This room is not showing flair for any communities": "Эта комната не показывает талант любым сообществам", - "Flair will appear if enabled in room settings": "Талант появится, если включено в настройках комнаты", - "Flair": "Чутье", - "Flair will not appear": "Талант не появится", - "Display your community flair in rooms configured to show it.": "Покажите свое чутье в комнатах, настроенных для показа." + "Warning": "Внимание", + "Showing flair for these communities:": "Комната принадлежит следующим сообществам:", + "This room is not showing flair for any communities": "Эта комната не принадлежит каким-либо сообществам", + "Flair will appear if enabled in room settings": "Значок появится, если он включен в настройках комнаты", + "Flair": "Значки сообществ", + "Flair will not appear": "Значок не будет отображаться", + "Display your community flair in rooms configured to show it.": "Вы можете показывать значки своих сообществ в комнатах, в которых это разрешено.", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "После понижения своих привилегий вы не сможете это отменить. Если вы являетесь последним привилегированным пользователем в этой комнате, выдать права кому-либо заново будет невозможно.", + "%(count)s of your messages have not been sent.|one": "Ваше сообщение не было отправлено.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Отправить все или отменить все сейчас. Можно также выбрать отдельные сообщения для отправки или отмены.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Отправить или отменить сообщение сейчас.", + "Message Replies": "Сообщения-ответы", + "Send an encrypted reply…": "Отправить зашифрованный ответ…", + "Send a reply (unencrypted)…": "Отправить ответ (нешифрованный)…", + "Send an encrypted message…": "Отправить зашифрованное сообщение…", + "Send a message (unencrypted)…": "Отправить сообщение (нешифрованное)…", + "Replying": "Отвечает", + "Minimize apps": "Свернуть приложения", + "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.": "Подробнее о том, как мы используем аналитику.", + "The information being sent to us to help make Riot.im better includes:": "Информация, отправляемая нам, чтобы помочь нам сделать Riot.im лучше, включает в себя:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Если на этой странице встречаются сведения личного характера, например имя комнаты, имя пользователя или группы, они удаляются перед отправкой на сервер.", + "The platform you're on": "Используемая платформа", + "The version of Riot.im": "Версия Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Вошли вы в систему или нет (мы не храним ваше имя пользователя)", + "Your language of choice": "Выбранный язык", + "Your homeserver's URL": "URL-адрес сервера", + "Your identity server's URL": "URL-адрес сервера идентификации", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", + "Which officially provided instance you are using, if any": "Каким официально поддерживаемым клиентом вы пользуетесь (если пользуетесь)", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Используете ли вы режим Richtext в редакторе Rich Text Editor", + "This room is not public. You will not be able to rejoin without an invite.": "Эта комната не является публичной. Вы не сможете войти без приглашения.", + "Show devices, send anyway or cancel.": "Показать устройства, отправить в любом случае или отменить.", + "Community IDs cannot not be empty.": "ID сообществ не могут быть пустыми.", + "In reply to ": "В ответ на ", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s изменил(а) отображаемое имя на %(displayName)s.", + "Failed to set direct chat tag": "Не удалось установить тег прямого чата", + "Failed to remove tag %(tagName)s from room": "Не удалось удалить тег %(tagName)s из комнаты", + "Failed to add tag %(tagName)s to room": "Не удалось добавить тег %(tagName)s в комнату", + "Clear filter": "Очистить фильтр", + "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.": "Чтобы настроить фильтр, перетащите аватар сообщества на панель фильтров в левой части экрана. Вы можете нажать на аватар в панели фильтров в любое время, чтобы увидеть только комнаты и людей, связанных с этим сообществом.", + "Did you know: you can use communities to filter your Riot.im experience!": "Знаете ли вы: вы можете использовать сообщества, чтобы фильтровать в Riot.im!", + "Disable Community Filter Panel": "Отключить панель сообществ", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Если на других устройствах тоже нет ключа для этого сообщения, вы не сможете его расшифровать.", + "Key request sent.": "Запрос ключа отправлен.", + "Re-request encryption keys from your other devices.": "Повторно запросить ключи шифрования с других устройств.", + "%(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.": "Запросы на передачу ключей автоматически отправляются на другие устройства. Если вы отклонили или отменили запрос на другом устройстве, нажмите, чтобы запросить ключи повторно.", + "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 contain messages.": "Если вы отправили ошибку через GitHub, журналы отладки могут помочь нам выявить проблему. Журналы отладки содержат данные об использовании приложения, включая ваше имя пользователя, идентификаторы или псевдонимы комнат или групп, которые вы посетили, а также имена других пользователей. Они не содержат сообщений.", + "Submit debug logs": "Отправка журналов отладки", + "Opens the Developer Tools dialog": "Открывает Инструменты разработчика", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Прочитано %(displayName)s (%(userName)s) в %(dateTime)s", + "Unable to join community": "Не удалось присоединиться к сообществу", + "Unable to leave community": "Не удалось покинуть сообщество", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Изменения имени и аватара, внесенные в ваше сообщество, могут не отображаться другим пользователям в течение 30 минут.", + "Join this community": "Присоединиться к сообществу", + "Leave this community": "Покинуть это сообщество", + "Who can join this community?": "Кто может присоединиться к этому сообществу?", + "Everyone": "Все", + "Stickerpack": "Стикеры", + "Add a stickerpack": "Добавить стикеры", + "Hide Stickers": "Скрыть стикеры", + "Show Stickers": "Показать стикеры", + "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-адрес выше для настройки 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": "Загружено %(user)s в %(date)s", + "Send Custom Event": "Отправить индивидуальное мероприятие", + "Advanced notification settings": "Дополнительные параметры уведомлений", + "Failed to send logs: ": "Не удалось отправить журналы: ", + "delete the alias.": "удалить псевдоним.", + "To return to your account in future you need to set a password": "Чтобы вы могли вернуться в свою учетную запись в будущем, вам необходимо задать пароль", + "Forget": "Забыть", + "#example": "#пример", + "Hide panel": "Скрыть панель", + "You cannot delete this image. (%(code)s)": "Вы не можете удалить это изображение. (%(code)s)", + "Cancel Sending": "Отменить отправку", + "This Room": "В этой комнате", + "The Home Server may be too old to support third party networks": "Домашний сервер может быть слишком старым для поддержки сетей сторонних производителей", + "Noisy": "Вкл. (со звуком)", + "Room not found": "Комната не найдена", + "Messages containing my display name": "Сообщения с моим именем", + "Messages in one-to-one chats": "Сообщения в 1:1 чатах", + "Unavailable": "Недоступен", + "Error saving email notification preferences": "Ошибка сохранения настроек email-уведомлений", + "View Decrypted Source": "Просмотр расшифрованного источника", + "Failed to update keywords": "Не удалось обновить ключевые слова", + "Notes:": "Заметки:", + "remove %(name)s from the directory.": "удалить %(name)s из каталога.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Уведомления по этим ключевым словам соответствуют правилам, которые нельзя отобразить здесь:", + "Safari and Opera work too.": "Safari и Opera работают тоже.", + "Please set a password!": "Пожалуйста, установите пароль!", + "You have successfully set a password!": "Вы успешно установили пароль!", + "An error occurred whilst saving your email notification preferences.": "Возникла ошибка при сохранении настроек email-уведомлений.", + "Explore Room State": "Просмотр статуса комнаты", + "Source URL": "Исходный URL-адрес", + "Messages sent by bot": "Сообщения от ботов", + "Filter results": "Фильтрация результатов", + "Members": "Участники", + "No update available.": "Нет доступных обновлений.", + "Resend": "Переотправить", + "Failed to get protocol list from Home Server": "Не удалось получить список протоколов с домашнего сервера", + "Collecting app version information": "Сбор информации о версии приложения", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Удалить псевдоним комнаты %(alias)s и удалить %(name)s из каталога?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Это позволит вам вернуться к учетной записи после выхода из системы и войти на других устройствах.", + "Keywords": "Ключевые слова", + "Enable notifications for this account": "Включить уведомления для этой учетной записи", + "Directory": "Каталог", + "Invite to this community": "Пригласить в это сообщество", + "Search for a room": "Поиск комнаты", + "Messages containing keywords": "Сообщения, содержащие определенные ключевые слова", + "View Source": "Просмотр источника", + "Tuesday": "Вторник", + "Enter keywords separated by a comma:": "Введите ключевые слова, разделенные запятой:", + "Search…": "Поиск…", + "You have successfully set a password and an email address!": "Вы успешно установили пароль и адрес email!", + "Remove %(name)s from the directory?": "Удалить %(name)s из каталога?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot использует многие передовые возможности браузера, некоторые из которых недоступны или являются экспериментальным в вашем текущем браузере.", + "Developer Tools": "Инструменты разработчика", + "Preparing to send logs": "Подготовка к отправке журналов", + "Enable desktop notifications": "Включить оповещения на рабочем столе", + "Explore Account Data": "Просмотр данных аккаунта", + "All messages (noisy)": "Все сообщения (со звуком)", + "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:", + "You must specify an event type!": "Необходимо указать тип мероприятия!", + "(HTTP status %(httpStatus)s)": "(статус HTTP %(httpStatus)s)", + "Invite to this room": "Пригласить в комнату", + "Please install Chrome or Firefox for the best experience.": "Лучший опыт вы получите, установив Chrome или Firefox.", + "Failed to get public room list": "Не удалось получить список общедоступных комнат", + "Send logs": "Отправка журналов", + "All messages": "Все сообщения", + "Call invitation": "Звонки", + "Downloading update...": "Загрузка обновления…", + "State Key": "Ключ состояния", + "Failed to send custom event.": "Не удалось отправить индивидуальное мероприятие.", + "What's new?": "Что нового?", + "Notify me for anything else": "Уведомлять во всех остальных случаях", + "When I'm invited to a room": "Приглашения в комнаты", + "Can't update user notification settings": "Не удалось обновить пользовательские настройки оповещения", + "Notify for all other messages/rooms": "Уведомлять обо всех остальных сообщениях и комнатах", + "Unable to look up room ID from server": "Не удалось найти ID комнаты на сервере", + "Couldn't find a matching Matrix room": "Не удалось найти подходящую комнату Matrix", + "All Rooms": "Везде", + "You cannot delete this message. (%(code)s)": "Это сообщение нельзя удалить. (%(code)s)", + "Thursday": "Четверг", + "Forward Message": "Переслать сообщение", + "Logs sent": "Журналы отправлены", + "Back": "Назад", + "Reply": "Ответить", + "Show message in desktop notification": "Показывать текст сообщения в уведомлениях на рабочем столе", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Журналы отладки содержат данные об использовании приложения, включая ваше имя пользователя, идентификаторы или псевдонимы комнат или групп, которые вы посетили, а также имена других пользователей. Они не содержат сообщений.", + "Unhide Preview": "Показать предварительный просмотр", + "Unable to join network": "Не удается подключиться к сети", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Возможно, вы настроили их не в Riot, а в другом Matrix-клиенте. Настроить их в Riot не удастся, но они будут продолжать работать и здесь", + "Sorry, your browser is not able to run Riot.": "К сожалению, ваш браузер не способен запустить Riot.", + "Messages in group chats": "Сообщения в конференциях", + "Yesterday": "Вчера", + "Error encountered (%(errorDetail)s).": "Обнаружена ошибка (%(errorDetail)s).", + "Login": "Войти", + "Low Priority": "Низкий приоритет", + "Unable to fetch notification target list": "Не удалось получить список устройств для уведомлений", + "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": "Существуют дополнительные уведомления, которые не показаны здесь", + "Missing roomId.": "Отсутствует идентификатор комнаты.", + "You don't currently have any stickerpacks enabled": "У вас нет стикеров", + "Picture": "Снимок", + "Popout widget": "Всплывающий виджет", + "Every page you use in the app": "Каждая страница, которую вы используете в приложении", + "e.g. ": "напр. ", + "Your User Agent": "Ваш пользовательский агент", + "Your device resolution": "Разрешение вашего устройства", + "Always show encryption icons": "Всегда показывать значки шифрования", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Ошибки Riot отслеживаются на GitHub: создать проблему на GitHub.", + "Log out and remove encryption keys?": "Выйти и удалить ключи шифрования?", + "Send Logs": "Отправить логи", + "Clear Storage and Sign Out": "Очистить хранилище и выйти", + "Refresh": "Обновить", + "We encountered an error trying to restore your previous session.": "Произошла ошибка при попытке восстановить предыдущий сеанс.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Очистка хранилища вашего браузера может устранить проблему, но при этом ваша сессия будет завершена и зашифрованная история чата станет нечитаемой.", + "Unable to reply": "Не удается ответить", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не удается загрузить событие, на которое был дан ответ, либо оно не существует, либо у вас нет разрешения на его просмотр.", + "Enable widget screenshots on supported widgets": "Включить скриншоты виджета в поддерживаемых виджетах", + "Collapse Reply Thread": "Ответить с цитированием" } diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 0126299f9f..c7f38cff35 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -109,7 +109,6 @@ "%(senderName)s requested a VoIP conference.": "%(senderName)s požiadal o VoIP konferenciu.", "%(senderName)s invited %(targetName)s.": "%(senderName)s pozval %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s zakázal vstup %(targetName)s.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s si zmenil zobrazované meno z %(oldDisplayName)s na %(displayName)s.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s si nastavil zobrazované meno %(displayName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s odstránil svoje zobrazované meno (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s si z profilu odstránil obrázok.", @@ -264,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", @@ -290,22 +287,22 @@ "No pinned messages.": "Žiadne pripnuté správy.", "Loading...": "Načítanie...", "Pinned Messages": "Pripnuté správy", - "Online": "Prítomný", + "Online": "Pripojený", "Idle": "Nečinný", "Offline": "Nedostupný", "Unknown": "Neznámy", "Seen by %(userName)s at %(dateTime)s": "%(userName)s videl %(dateTime)s", "Unnamed room": "Nepomenovaná miestnosť", "World readable": "Viditeľné pre každého", - "Guests can join": "Aj hostia môžu vstúpiť", + "Guests can join": "Môžu vstúpiť aj hostia", "No rooms to show": "Žiadne miestnosti na zobrazenie", - "Failed to set avatar.": "Nepodarilo sa nastaviť avatara.", + "Failed to set avatar.": "Nepodarilo sa nastaviť obrázok.", "Save": "Uložiť", "(~%(count)s results)|other": "(~%(count)s výsledkov)", "(~%(count)s results)|one": "(~%(count)s výsledok)", "Join Room": "Vstúpiť do miestnosti", - "Upload avatar": "Nahrať avatara", - "Remove avatar": "Odstrániť avatara", + "Upload avatar": "Nahrať obrázok", + "Remove avatar": "Odstrániť obrázok", "Settings": "Nastavenia", "Forget room": "Zabudnúť miestnosť", "Search": "Hľadať", @@ -342,7 +339,7 @@ "You are trying to access a room.": "Pristupujete k miestnosti.", "Click here to join the discussion!": "Kliknutím sem vstúpite do diskusie!", "This is a preview of this room. Room interactions have been disabled": "Toto je náhľad na miestnosť. Všetky akcie pre túto miestnosť sú zakázané", - "To change the room's avatar, you must be a": "Aby ste mohli meniť avatara miestnosti, musíte byť", + "To change the room's avatar, you must be a": "Aby ste mohli meniť obrázok miestnosti, musíte byť", "To change the room's name, you must be a": "Aby ste mohli meniť názov miestnosti, musíte byť", "To change the room's main address, you must be a": "Aby ste mohli meniť hlavnú adresu miestnosti, musíte byť", "To change the room's history visibility, you must be a": "Aby ste mohli meniť viditeľnosť histórie miestnosti, musíte byť", @@ -367,7 +364,6 @@ "Encryption is enabled in this room": "V tejto miestnosti je povolené šifrovanie", "Encryption is not enabled in this room": "V tejto miestnosti nie je povolené šifrovanie", "Privileged Users": "Poverení používatelia", - "%(user)s is a": "%(user)s je", "No users have specific privileges in this room": "Žiadny používatelia nemajú v tejto miestnosti pridelené konkrétne poverenia", "Banned users": "Používatelia, ktorým bol zakázaný vstup", "This room is not accessible by remote Matrix servers": "Táto miestnosť nie je prístupná cez vzdialené Matrix servery", @@ -427,17 +423,15 @@ "Download %(text)s": "Stiahnuť %(text)s", "Invalid file%(extra)s": "Neplatný súbor%(extra)s", "Error decrypting image": "Chyba pri dešifrovaní obrázka", - "Image '%(Body)s' cannot be displayed.": "Nie je možné zobraziť obrázok '%(Body)s'.", - "This image cannot be displayed.": "Tento obrázok nie je možné zobraziť.", "Error decrypting video": "Chyba pri dešifrovaní videa", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s zmenil avatara pre %(roomName)s", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s z miestnosti odstránil avatara.", - "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s zmenil avatara miestnosti na ", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s zmenil obrázok miestnosti %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odstránil obrázok miestnosti.", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s zmenil obrázok miestnosti ", "Copied!": "Skopírované!", "Failed to copy": "Nepodarilo sa skopírovať", "Add an Integration": "Pridať integráciu", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Budete presmerovaní na stránku tretej strany, aby ste mohli overiť svoj účet na použitie s %(integrationsUrl)s. Chcete pokračovať?", - "Removed or unknown message type": "Odstránený alebo neznámy typ udalosti", + "Removed or unknown message type": "Odstránený alebo neznámy typ správy", "Message removed by %(userId)s": "Správu odstránil %(userId)s", "Message removed": "správa odstránená", "Robot check is currently unavailable on desktop - please use a web browser": "Overenie, že nieste robot nie je možné cez aplikáciu na pracovnej ploche - prosím prejdite do prehliadača webu", @@ -555,10 +549,10 @@ "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)ssi zmenili meno", "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)ssi %(count)s krát zmenil meno", "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)ssi zmenil meno", - "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)ssi %(count)s krát zmenili avatara", - "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)ssi zmenili avatara", - "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)ssi %(count)s krát zmenil avatara", - "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)ssi zmenil avatara", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)ssi %(count)s krát zmenili obrázok v profile", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)ssi zmenili obrázok v profile", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)ssi %(count)s krát zmenil obrázok v profile", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)ssi zmenil obrázok v profile", "%(items)s and %(count)s others|other": "%(items)s a %(count)s ďalší", "%(items)s and %(count)s others|one": "%(items)s a jeden ďalší", "%(items)s and %(lastItem)s": "%(items)s a tiež %(lastItem)s", @@ -597,8 +591,6 @@ "Unknown error": "Neznáma chyba", "Incorrect password": "Nesprávne heslo", "Deactivate Account": "Deaktivovať účet", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Toto spôsobí, že váš účet nebude viac použiteľný. Tak tiež si nebudete môcť znovu zaregistrovať rovnaké používateľské ID.", - "This action is irreversible.": "Túto akciu nie je možné vrátiť späť.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Ak chcete overiť, či toto zariadenie je skutočne dôverihodné, kontaktujte jeho vlastníka iným spôsobom (napr. osobne alebo cez telefón) a opýtajte sa ho, či kľúč, ktorý má pre toto zariadenie zobrazený v nastaveniach sa zhoduje s kľúčom zobrazeným nižšie:", "Device name": "Názov zariadenia", "Device key": "Kľúč zariadenia", @@ -615,11 +607,8 @@ "Ignore request": "Ignorovať žiadosť", "Loading device info...": "Načítanie informácií o zariadení...", "Encryption key request": "Žiadosť o šifrovacie kľúče", - "Otherwise, click here to send a bug report.": "inak kliknutím sem nahláste chybu.", "Unable to restore session": "Nie je možné obnoviť reláciu", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Pri pokuse o obnovenie vašej predchádzajúcej relácie sa vyskytla chyba. Ak budete pokračovať, musíte sa znovu prihlásiť, a história šifrovaných konverzácii nebude viac čitateľná.", "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.": "Ak ste sa v minulosti prihlásili s novšou verziou programu Riot, vaša relácia nemusí byť kompatibilná s touto verziou. Zatvorte prosím toto okno a vráťte sa cez najnovšiu verziu Riot.", - "Continue anyway": "Napriek tomu pokračovať", "Invalid Email Address": "Nesprávna emailová adresa", "This doesn't appear to be a valid email address": "Zdá sa, že toto nie je platná emailová adresa", "Verification Pending": "Nedokončené overenie", @@ -675,7 +664,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", @@ -750,7 +738,6 @@ "Hide avatars in user and room mentions": "Skryť avatarov pri zmienkach miestností a používateľov", "Disable big emoji in chat": "Zakázať veľké Emoji v konverzácii", "Mirror local video feed": "Zrkadliť lokálne video", - "Opt out of analytics": "Odhlásiť sa zo zberu analytických údajov", "Disable Peer-to-Peer for 1:1 calls": "Zakázať P2P počas priamych volaní", "Never send encrypted messages to unverified devices from this device": "Z tohoto zariadenia nikdy neposielať šifrované správy neovereným zariadeniam", "Light theme": "Svetlá téma", @@ -775,9 +762,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", @@ -839,9 +823,9 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "K domovskému serveru nie je možné pripojiť sa použitím protokolu HTTP keďže v adresnom riadku prehliadača máte HTTPS adresu. Použite protokol HTTPS alebo povolte nezabezpečené skripty.", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nie je možné pripojiť sa k domovskému serveru - skontrolujte prosím funkčnosť vašeho pripojenia na internet, uistite sa že certifikát domovského servera je dôverihodný, a že žiaden doplnok nainštalovaný v prehliadači nemôže blokovať požiadavky.", "Login as guest": "Prihlásiť sa ako hosť", - "Failed to fetch avatar URL": "Nepodarilo sa získať URL adresu avatara", + "Failed to fetch avatar URL": "Nepodarilo sa získať URL adresu obrázka", "Set a display name:": "Nastaviť zobrazované meno:", - "Upload an avatar:": "Nahrať avatara:", + "Upload an avatar:": "Nahrať obrázok:", "This server does not support authentication with a phone number.": "Tento server nepodporuje overenie telefónnym číslom.", "Missing password.": "Chýba heslo.", "Passwords don't match.": "Heslá sa nezhodujú.", @@ -907,8 +891,7 @@ "Please note you are logging into the %(hs)s server, not matrix.org.": "Všimnite si: Práve sa prihlasujete na server %(hs)s, nie na server matrix.org.", "Username on %(hs)s": "Meno používateľa na servery %(hs)s", "Restricted": "Obmedzené", - "Presence Management": "Spravovanie prítomnosti", - "Hide avatar changes": "Skryť zmeny avatara", + "Hide avatar changes": "Skryť zmeny obrázka v profile", "Hide display name changes": "Skryť zmeny zobrazovaného mena", "Enable inline URL previews by default": "Predvolene povoliť náhľady URL adries", "Enable URL previews for this room (only affects you)": "Povoliť náhľady URL adries pre túto miestnosť (ovplyvňuje len vás)", @@ -941,11 +924,8 @@ "Something went wrong when trying to get your communities.": "Niečo sa pokazilo pri získavaní vašich komunít.", "collapse": "zbaliť", "expand": "rozbaliť", - "Cryptography data migrated": "Kryptografické údaje zmigrované", - "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.": "Práve bola vykonaná jednorázová migrácia kryptografických údajov. E2E šifrovanie vám nebude fungovať, ak sa vrátite k staršej verzii programu Riot. Ak plánujete použiť šifrovanie v staršej verzii Riot, mali by ste sa pred tým odhlásiť. Aby ste si zachovali históriu šifrovaných konverzácií, exportujte a znovu importujte kľúče miestností.", "Old cryptography data detected": "Nájdené zastaralé kryptografické údaje", "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.": "Boli nájdené údaje zo staršej verzie Riot. Toto spôsobí, že E2E šifrovanie nebude v staršej verzii Riot fungovať. Zašifrované správy prijaté a odoslané v poslednom čase cez staršiu verziu Riot nemusia byť čitateľné v tejto verzii Riot. Môže to tiež spôsobiť, že šifrované konverzácie nebudú s touto verziou Riot čitateľné. Ak spozorujete niektoré s týchto problémov, odhláste sa a opätovne sa prihláste prosím. Históriu šifrovaných konverzácií zachováte tak, že si exportujete a znovu importujete kľúče miestností.", - "Show devices or cancel all.": "Zobraziť zariadenia alebo Zrušiť všetko.", "Warning": "Upozornenie", "This homeserver doesn't offer any login flows which are supported by this client.": "Tento domovský server neponúka žiadny prihlasovací mechanizmus podporovaný vašim klientom.", "Flair": "Príslušnosť ku komunitám", @@ -953,5 +933,238 @@ "This room is not showing flair for any communities": "V tejto miestnosti nie je zobrazená príslušnosť k žiadnym komunitám", "Flair will appear if enabled in room settings": "Príslušnosť ku komunite sa zobrazí ak je to povolené v nastaveniach miestnosti", "Flair will not appear": "Príslušnosť ku komunite nebude zobrazená", - "Display your community flair in rooms configured to show it.": "Zobrazovať vašu príslušnosť ku komunite v miestnostiach, ktoré sú nastavené na zobrazovanie tejto príslušnosti." + "Display your community flair in rooms configured to show it.": "Zobrazovať vašu príslušnosť ku komunite v miestnostiach, ktoré sú nastavené na zobrazovanie tejto príslušnosti.", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", + "Message Replies": "Odpovede na správy", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Túto zmenu nebudete môcť vrátiť späť pretože znižujete vašu vlastnú úroveň moci. Ak ste jediný poverený používateľ v miestnosti, nebudete môcť znovu získať úroveň, akú máte teraz.", + "Send an encrypted reply…": "Odoslať šifrovanú odpoveď…", + "Send a reply (unencrypted)…": "Odoslať odpoveď (nešifrovanú)…", + "Send an encrypted message…": "Odoslať šifrovanú správu…", + "Send a message (unencrypted)…": "Odoslať správu (nešifrovanú)…", + "Replying": "Odpoveď", + "Minimize apps": "Minimalizovať aplikácie", + "%(count)s of your messages have not been sent.|one": "Vaša správa nebola odoslaná.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Znovu poslať všetky alebo zrušiť všetky teraz. Vybratím môžete tiež znovu odoslať alebo zrušiť jednotlivé správy.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Znovu odoslať správu alebo zrušiť správu teraz.", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Vaše súkromie je pre nás dôležité, preto nezhromažďujeme žiadne osobné údaje alebo údaje, na základe ktorých je možné vás identifikovať.", + "Learn more about how we use analytics.": "Zistite viac o tom, ako spracúvame analytické údaje.", + "The information being sent to us to help make Riot.im better includes:": "S cieľom vylepšovať aplikáciu Riot.im zbierame nasledujúce údaje:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Ak sa na stránke vyskytujú identifikujúce údaje, akými sú napríklad názov miestnosti, ID používateľa, miestnosti alebo skupiny, tieto sú pred odoslaním na server odstránené.", + "The platform you're on": "Vami používaná platforma", + "The version of Riot.im": "Verzia Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Stav vašeho prihlásenia - prihlásený / neprihlásený (nezaznamenávame vaše používateľské meno)", + "Your language of choice": "Váš uprednostňovaný jazyk", + "Which officially provided instance you are using, if any": "Cez ktorú oficiálne podporovanú inštanciu Riot.im ste pripojení (ak nehostujete Riot sami)", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Či pri písaní správ používate rozbalenú lištu formátovania textu", + "Your homeserver's URL": "URL adresa vami používaného domovského servera", + "Your identity server's URL": "URL adresa vami používaného servera totožností", + "This room is not public. You will not be able to rejoin without an invite.": "Toto nie je verejne dostupná miestnosť. Bez pozvánky nebudete do nej môcť vstúpiť znovu.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s si zmenil zobrazované meno na %(displayName)s.", + "Failed to set direct chat tag": "Nepodarilo sa nastaviť značku priama konverzácia", + "Failed to remove tag %(tagName)s from room": "Z miestnosti sa nepodarilo odstrániť značku %(tagName)s", + "Failed to add tag %(tagName)s to room": "Miestnosti sa nepodarilo pridať značku %(tagName)s", + "In reply to ": "Odpoveď na ", + "Community IDs cannot not be empty.": "ID komunity nemôže ostať prázdne.", + "Show devices, send anyway or cancel.": "Zobraziť zariadenia, napriek tomu odoslať alebo zrušiť.", + "Disable Community Filter Panel": "Zakázať panel Filter komunity", + "Your key share request has been sent - please check your other devices for key share requests.": "Žiadosť o zdieľanie kľúčov bola odoslaná - Overte si zobrazenie žiadosti o zdieľanie kľúčov na vašich ostatných zariadeniach.", + "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.": "Žiadosť o zdieľanie kľúčov je automaticky odoslaná na vaše ďalšie zariadenia. Ak ste žiadosť odmietli alebo zrušili dialógové okno so žiadosťou na ostatných zariadeniach, kliknutím sem môžete opätovne vyžiadať kľúče pre túto reláciu.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Ak kľúče pre tieto správy nemáte uložené na ostatných vašich zariadeniach, nebudete ich môcť dešifrovať.", + "Key request sent.": "Žiadosť o kľúče odoslaná.", + "Re-request encryption keys from your other devices.": "Znovu vyžiadať šifrovacie kľúče z vašich ostatných zariadení.", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) videl %(dateTime)s", + "%(user)s is a %(userRole)s": "%(user)s je %(userRole)s", + "Code": "Kód", + "Unable to join community": "Nie je možné vstúpiť do komunity", + "Unable to leave community": "Nie je možné opustiť komunitu", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Zmeny vykonané vo vašej komunite názov a obrázok nemusia byť nasledujúcich 30 minút viditeľné všetkými používateľmi.", + "Join this community": "Vstúpiť do tejto komunity", + "Leave this community": "Opustiť túto komunitu", + "Did you know: you can use communities to filter your Riot.im experience!": "Vedeli ste: Že prácu s Riot.im si môžete spríjemníť použitím komunít!", + "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.": "Ak si chcete nastaviť filter, pretiahnite obrázok komunity na panel filtrovania úplne na ľavej strane obrazovky. Potom môžete kedykoľvek kliknúť na obrázok komunity na tomto panely a Riot.im vám bude zobrazovať len miestnosti a ľudí z komunity, na ktorej obrázok ste klikli.", + "Clear filter": "Zrušiť filter", + "Debug Logs Submission": "Odoslanie ladiacich záznamov", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Ak ste nám poslali hlásenie o chybe cez Github, ladiace záznamy nám môžu pomôcť lepšie identifikovať chybu. Ladiace záznamy obsahujú údaje o používaní aplikácii, vrátane vašeho používateľského mena, názvy a aliasy miestností a komunít, ku ktorým ste sa pripojili a mená ostatných používateľov. Tieto záznamy neobsahujú samotný obsah vašich správ.", + "Submit debug logs": "Odoslať ladiace záznamy", + "Opens the Developer Tools dialog": "Otvorí dialóg nástroje pre vývojárov", + "Stickerpack": "Balíček nálepiek", + "You don't currently have any stickerpacks enabled": "Momentálne nemáte aktívne žiadne balíčky s nálepkami", + "Add a stickerpack": "Pridať balíček s nálepkami", + "Hide Stickers": "Skryť nálepky", + "Show Stickers": "Zobraziť nálepky", + "Who can join this community?": "Kto môže vstúpiť do tejto komunity?", + "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 set a password": "Aby ste sa v budúcnosti mohli vrátiť k vašemu účtu mali by ste si teraz nastaviť heslo", + "Forget": "Zabudnuť", + "Hide panel": "Skryť panel", + "You cannot delete this image. (%(code)s)": "Nemôžete vymazať tento obrázok. (%(code)s)", + "Cancel Sending": "Zrušiť odosielanie", + "This Room": "V tejto miestnosti", + "The Home Server may be too old to support third party networks": "Domovský server môže byť natoľko zastaralý, že nepodporuje siete tretíh strán", + "Resend": "Poslať znovu", + "Room not found": "Miestnosť nenájdená", + "Downloading update...": "Sťahovanie aktualizácie...", + "Messages in one-to-one chats": "Správy v priamych konverzáciách", + "Unavailable": "Nedostupné", + "View Decrypted Source": "Zobraziť dešifrovaný zdroj", + "Failed to update keywords": "Nepodarilo sa aktualizovať kľúčové slová", + "Notes:": "Poznámky:", + "remove %(name)s from the directory.": "odstrániť %(name)s z adresára.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Oznámenia nasledujúcich kľúčových slov sa riadia pravidlami, ktoré nie je možné zobraziť na tomto mieste:", + "Safari and Opera work too.": "Správne fungujú aj Safari a Opera.", + "Please set a password!": "Prosím, nastavte si heslo!", + "You have successfully set a password!": "Ǔspešne ste si nastavili heslo!", + "Explore Room State": "Preskúmať Stav Miestnosti", + "Source URL": "Pôvodná URL", + "Messages sent by bot": "Správy odosielané robotmi", + "Filter results": "Filtrovať výsledky", + "Members": "Členovia", + "No update available.": "K dispozícii nie je žiadna aktualizácia.", + "Noisy": "Hlučné", + "Failed to get protocol list from Home Server": "Nepodarilo sa získať zoznam protokolov z domovského servera", + "Collecting app version information": "Získavajú sa informácie o verzii aplikácii", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Vymazať alias %(alias)s a odstrániť miestnosť %(name)s z adresára?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Toto vám v budúcnosti umožní vrátiť sa k vašemu účtu aj po odhlásení, alebo tiež prihlásiť sa na iných zariadeniach.", + "Keywords": "Kľúčové slová", + "Enable notifications for this account": "Povoliť oznámenia pre tento účet", + "Directory": "Adresár", + "Invite to this community": "Pozvať do tejto komunity", + "Failed to get public room list": "Nepodarilo sa získať zoznam verejných miestností", + "Search…": "Hľadať…", + "Messages containing keywords": "Správy obsahujúce kľúčové slová", + "Error saving email notification preferences": "Chyba pri ukladaní nastavení oznamovania emailom", + "Tuesday": "Utorok", + "Enter keywords separated by a comma:": "Zadajte kľúčové slová oddelené čiarkou:", + "Forward Message": "Preposlať správu", + "Remove %(name)s from the directory?": "Odstrániť miestnosť %(name)s z adresára?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot sa spolieha na mnohé pokročilé vlastnosti prehliadača internetu, a niektoré z nich sú vo vašom prehliadači experimentálne alebo nie sú k dispozícii vôbec.", + "Event sent!": "Udalosť odoslaná!", + "Preparing to send logs": "príprava odoslania záznamov", + "Enable desktop notifications": "Povoliť oznámenia na pracovnej ploche", + "Explore Account Data": "Preskúmať Údaje účtu", + "All messages (noisy)": "Všetky správy (hlučné)", + "Saturday": "Sobota", + "Remember, you can always set an email address in user settings if you change your mind.": "Všimnite si, Emailovú adresu môžete pridať aj neskôr v časti nastavenia, ak zmeníte svoj názor.", + "Direct Chat": "Priama konverzácia", + "The server may be unavailable or overloaded": "Server môže byť nedostupný alebo preťažený", + "Reject": "Odmietnuť", + "Failed to set Direct Message status of room": "Nepodarilo sa nastaviť stav miestnosti priama konverzácia", + "Monday": "Pondelok", + "Remove from Directory": "Odstrániť z adresára", + "Enable them now": "Povolte si ich teraz", + "Messages containing my user name": "Správy obsahujúce moje používateľské meno", + "Toolbox": "Nástroje", + "Collecting logs": "Získavajú sa záznamy", + "more": "viac", + "GitHub issue link:": "Odkaz hlásenia na Github:", + "Search for a room": "Vyhľadať miestnosť", + "You must specify an event type!": "Musíte nastaviť typ udalosti!", + "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)", + "All Rooms": "Vo všetkych miestnostiach", + "State Key": "State Key", + "Please install Chrome or Firefox for the best experience.": "Aby ste s používania mali čo možno najlepší dojem, nainštalujte si Chrome alebo Firefox.", + "Wednesday": "Streda", + "Quote": "Citácia", + "Send logs": "Zahrnúť záznamy", + "All messages": "Všetky správy", + "Call invitation": "Audio / Video hovory", + "Messages containing my display name": "Správy obsahujúce moje zobrazované meno", + "You have successfully set a password and an email address!": "Úspešne ste 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", + "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ť", + "Invite to this room": "Pozvať do tejto miestnosti", + "You cannot delete this message. (%(code)s)": "Nemôžete vymazať túto správu. (%(code)s)", + "Thursday": "Štvrtok", + "I understand the risks and wish to continue": "Rozumiem rizikám a želám si pokračovať", + "Logs sent": "Záznamy boli odoslané", + "Back": "Naspäť", + "Reply": "Odpovedať", + "Show message in desktop notification": "Zobraziť text správy v oznámení na pracovnej ploche", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Ladiace záznamy obsahujú údaje o používaní aplikácii, vrátane vašeho používateľského mena, názvy a aliasy miestností a komunít, ku ktorým ste sa pripojili a mená ostatných používateľov. Tieto záznamy neobsahujú samotný obsah vašich správ.", + "Unhide Preview": "Zobraziť náhľad", + "Unable to join network": "Nie je možné sa pripojiť k sieti", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Tieto nastavenia oznámení sa použijú aj napriek tomu, že ich nemôžete meniť cez Riot. Pravdepodobne ste si ich nastavili v inej aplikácii", + "Sorry, your browser is not able to run Riot.": "Prepáčte, vo vašom prehliadači nie je možné spustiť Riot.", + "Messages in group chats": "Správy v skupinových konverzáciách", + "Yesterday": "Včera", + "Error encountered (%(errorDetail)s).": "Vyskytla sa chyba (%(errorDetail)s).", + "Event Type": "Typ Udalosti", + "Low Priority": "Nízka priorita", + "What's New": "Čo Je Nové", + "Set Password": "Nastaviť Heslo", + "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é", + "Every page you use in the app": "Každú stránku v aplikácii, ktorú navštívite", + "e.g. ": "príklad ", + "Your User Agent": "Reťazec User Agent vašeho zariadenia", + "Your device resolution": "Rozlíšenie obrazovky vašeho zariadenia", + "Popout widget": "Otvoriť widget v novom okne", + "Missing roomId.": "Chýba ID miestnosti.", + "Picture": "Vytvoriť snímku", + "Always show encryption icons": "Vždy zobrazovať ikony stavu šifrovania", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Zatiaľ nie je možné k odpovedi pridať súbor. Súbor teda nebude odoslaný ako odpoveď.", + "Unable to reply": "Nie je možné odpovedať", + "At this time it is not possible to reply with an emote.": "V odpovedi zatiaľ nie je možné vijadriť pocit.", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Nie je možné načítať udalosť odkazovanú v odpovedi. Takáto udalosť buď neexistuje alebo nemáte oprávnenie na jej zobrazenie.", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Požiadavky projektu Riot sledujeme na Github: vytvoriť github požiadavku.", + "Log out and remove encryption keys?": "Odhlásiť sa a odstrániť šifrovacie kľúče?", + "Send Logs": "Odoslať záznamy", + "Clear Storage and Sign Out": "Vymazať úložisko a Odhlásiť sa", + "Refresh": "Obnoviť", + "We encountered an error trying to restore your previous session.": "Počas obnovovania vašej predchádzajúcej relácie sa vyskytla chyba.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Vymazaním úložiska prehliadača možno opravíte váš problém, no zároveň sa týmto odhlásite a história vašich šifrovaných konverzácií sa pre vás môže stať nečitateľná.", + "Collapse Reply Thread": "Zbaliť vlákno odpovedí" } diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json new file mode 100644 index 0000000000..2936695a6d --- /dev/null +++ b/src/i18n/strings/sq.json @@ -0,0 +1,301 @@ +{ + "This email address is already in use": "Kjo adresë e-mail-i tashmë është në përdorim", + "This phone number is already in use": "Ky numër telefoni tashmë është në përdorim", + "Failed to verify email address: make sure you clicked the link in the email": "Vërtetimi i adresës e-mail i pasukseshëm: Sigurohu që ke klikuar lidhjen në e-mail", + "The platform you're on": "Platforma që jë duke përdorur", + "The version of Riot.im": "Versioni i Riot.im-it", + "Whether or not you're logged in (we don't record your user name)": "A je i lajmëruar apo jo (ne nuk do të inçizojmë emrin përdorues tëndë)", + "Your language of choice": "Gjuha jote e zgjedhur", + "Which officially provided instance you are using, if any": "Cilën instancë zyrtarisht të ofruar je duke përdorur, në rast që je", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "A je duke e përdorur mënyrën e tekstit të pasuruar të redaktionuesit të tekstit të pasuruar apo jo", + "Your homeserver's URL": "URL-ja e server-it shtëpiak tëndë", + "Your identity server's URL": "URL-ja e server-it identiteti tëndë", + "Analytics": "Analiza", + "The information being sent to us to help make Riot.im better includes:": "Informacionet që dërgohen për t'i ndihmuar Riot.im-it të përmirësohet përmbajnë:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Kur kjo faqe pëmban informacione që mund të të identifikojnë, sikur një dhomë, përdorues apo identifikatues grupi, këto të dhëna do të mënjanohen para se t‘i dërgohën një server-it.", + "Call Failed": "Thirrja nuk mundej të realizohet", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Pajisje të panjohura ndodhen në këtë dhomë: nësë vazhdon pa i vërtetuar, është e mundshme që dikush të jua përgjon thirrjen.", + "Review Devices": "Rishiko pajisjet", + "Call Anyway": "Thirr prapëseprapë", + "Answer Anyway": "Prano prapëseprapë", + "Call": "Thirr", + "Answer": "Prano", + "Call Timeout": "Skadim kohe thirrjeje", + "The remote side failed to pick up": "Ana e kundërt nuk arriti të pranojë", + "Unable to capture screen": "Ekrani nuk mundi të inçizohej", + "Existing Call": "Thirrje aktuale", + "You are already in a call.": "Tashmë je në thirrje.", + "VoIP is unsupported": "VoIP nuk mbulohet", + "You cannot place VoIP calls in this browser.": "Thirrjet me VoIP nuk mbulohen nga ky kërkues uebi.", + "You cannot place a call with yourself.": "Nuk mund të realizosh thirrje me vetveten.", + "Conference calls are not supported in this client": "Thirrjet konference nuk mbulohen nga ky klienti", + "Conference calls are not supported in encrypted rooms": "Thirrjet konference nuk mbulohen në dhoma të shifruara", + "Warning!": "Paralajmërim!", + "Conference calling is in development and may not be reliable.": "Thirrja konference ende është në zhvillim dhe mund të jetë e paqëndrueshme.", + "Failed to set up conference call": "Thirrja konference nuk mundi të realizohej", + "Conference call failed.": "Thirrja konference dështoi.", + "The file '%(fileName)s' failed to upload": "Fajli '%(fileName)s' nuk mundi të mbartet", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Fajli '%(fileName)s' tejkalon kufirin madhësie për mbartje e këtij server-i shtëpiak", + "Upload Failed": "Mbartja dështoi", + "Failure to create room": "Dhoma nuk mundi të krijohet", + "Server may be unavailable, overloaded, or you hit a bug.": "Server-i është i padisponueshëm, i ngarkuar tej mase, apo ka një gabim.", + "Send anyway": "Dërgo prapëseprapë", + "Send": "Dërgoje", + "Sun": "Die", + "Mon": "Hën", + "Tue": "Mar", + "Wed": "Mër", + "Thu": "Enj", + "Fri": "Pre", + "Sat": "Sht", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s", + "Who would you like to add to this community?": "Kë kishe dashur të shtosh në këtë komunitet?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Paralajmërim: se cili që e shton në një komunitet do t‘i doket se cilit që e di identifikatuesin e komunitetit", + "Invite new community members": "Fto anëtar të ri komuniteti", + "Name or matrix ID": "Emri apo identifikatuesi matrix-i", + "Invite to Community": "Fto në komunitet", + "Which rooms would you like to add to this community?": "Cilët dhoma kishe dashur t‘i shtosh në këtë komunitet?", + "Show these rooms to non-members on the community page and room list?": "A t‘i duken dhomat joanëtarëvë ne faqën komuniteti si dhe listën dhome?", + "Add rooms to the community": "Shto dhoma komunitetit", + "Add to community": "Shto në komunitet", + "Jan": "Jan", + "Feb": "Shk", + "Mar": "Mar", + "Apr": "Pri", + "May": "Maj", + "Jun": "Qer", + "Jul": "Kor", + "Aug": "Gus", + "Sep": "Sht", + "Oct": "Tet", + "Nov": "Nën", + "Dec": "Dhj", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "Failed to invite the following users to %(groupId)s:": "Ky përdorues vijues nuk mundi të ftohet në %(groupId)s:", + "Failed to invite users to community": "Përdoruesit nuk mundën të ftohën", + "Failed to invite users to %(groupId)s": "Nuk mundën të ftohën përdoruesit në %(groupId)s", + "Failed to add the following rooms to %(groupId)s:": "Nuk mundën të shtohen dhomat vijuese në %(groupId)s:", + "Unnamed Room": "Dhomë paemër", + "Riot does not have permission to send you notifications - please check your browser settings": "Riot nuk ka lejim të të dergojë lajmërime - të lutem kontrollo rregullimet e kërkuesit ueb tëndë", + "Riot was not given permission to send notifications - please try again": "Riot-it nuk i është dhënë leje të dërgojë lajmërime - të lutëm përpjeku serish", + "Unable to enable Notifications": "Lajmërimet nuk mundën të lëshohen", + "This email address was not found": "Kjo adresë e-mail-i nuk është gjetur", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Adresa e-mail-i yt nuk duket së është lidhur më një indentifikatues matrix në këtë server shtëpiak.", + "Default": "Standardi", + "Restricted": "Kufizuar", + "Moderator": "Moderator", + "Admin": "Administrator", + "Start a chat": "Fillo bisedë", + "Who would you like to communicate with?": "Me kë kishe dashur të bisedosh?", + "Email, name or matrix ID": "E-mail-i, emri apo identifikatuesi matrix", + "Start Chat": "Fillo bisedë", + "Invite new room members": "Fto anëtar dhome të rinjë", + "Who would you like to add to this room?": "Kë kishe dashur të shtosh në këtë dhomë?", + "Send Invites": "Dërgo ftesa", + "Failed to invite user": "Përdoruesi nuk mundi të ftohej", + "Operation failed": "Veprimi dështoi", + "Failed to invite": "Nuk mundi të ftohet", + "Failed to invite the following users to the %(roomName)s room:": "Përdoruesit vijuesë nuk mundën të ftohen në dhomën %(roomName)s:", + "You need to be logged in.": "Duhesh të jesh i lajmëruar.", + "You need to be able to invite users to do that.": "Duhesh të kesh aftësinë të ftosh përdorues për të bërë këtë.", + "Unable to create widget.": "Widget-i nuk mundi të krijohet.", + "Failed to send request.": "Lutja nuk mundi të dërgohej.", + "This room is not recognised.": "Kjo dhomë nuk është e njohur.", + "Power level must be positive integer.": "Niveli fuqie duhet të jetë numër i plotë pozitiv.", + "You are not in this room.": "Ti nuk je në këtë dhomë.", + "You do not have permission to do that in this room.": "Nuk ke leje të bësh këtë në këtë dhomë.", + "Must be viewing a room": "Duhet të shikohet një dhomë", + "Room %(roomId)s not visible": "Dhoma %(roomId)s e padukshme", + "Failed to lookup current room": "Dhoma aktuale nuk mundi të kërkohej", + "Usage": "Përdorimi", + "/ddg is not a command": "/ddg s'është komandë", + "To use it, just wait for autocomplete results to load and tab through them.": "Për të përdorur, thjesht prit derisa të mbushën rezultatat vetëplotësuese dhe pastaj shfletoji.", + "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", + "Fetching third party location failed": "Dështoi prurja e vendndodhjes së palës së tretë", + "A new version of Riot is available.": "Ka gati një version të ri Riot-it.", + "Couldn't load home page": "S’u ngarkua dot faqja hyrëse", + "Send Account Data": "Dërgo të Dhëna Llogarie", + "All notifications are currently disabled for all targets.": "Krejt njoftimet hëpërhë janë çaktivizuar për krejt objektivat.", + "Uploading report": "Po ngarkohet raporti", + "Sunday": "E diel", + "Guests can join": "Vizitorët mund të marrin pjesë", + "Notification targets": "Objektiva njoftimesh", + "Today": "Sot", + "Files": "Kartela", + "You are not receiving desktop notifications": "Nuk po merrni njoftime për desktop", + "Friday": "E premte", + "Update": "Përditësoje", + "Notifications": "Njoftime", + "Unable to fetch notification target list": "S’arrihet të sillet listë objektivash njoftimi", + "Add an email address above to configure email notifications": "Shtoni më sipër një adresë email që të formësoni njoftime me email", + "Expand panel": "Zgjerojeni panelin", + "On": "On", + "%(count)s Members|other": "%(count)s Anëtarë", + "Filter room names": "Filtroni emra dhomash", + "Changelog": "Regjistër ndryshimesh", + "Reject": "Hidheni tej", + "Waiting for response from server": "Po pritet për përgjigje shërbyesi", + "Failed to change password. Is your password correct?": "S’u arrit të ndryshohet fjalëkalimi. A është i saktë fjalëkalimi juaj?", + "Uploaded on %(date)s by %(user)s": "Ngarkuar më %(date)s nga %(user)s", + "OK": "OK", + "Send Custom Event": "Dërgoni Akt Vetjak", + "Advanced notification settings": "Rregullime të mëtejshme për njoftimet", + "Failed to send logs: ": "S’u arrit të dërgohen regjistra: ", + "delete the alias.": "fshije aliasin.", + "To return to your account in future you need to set a password": "Që të riktheheni te llogaria juaj në të ardhmen, lypset të caktoni një fjalëkalim", + "Forget": "Harroje", + "World readable": "E lexueshme nga bota", + "Mute": "Pa Zë", + "Hide panel": "Fshihe panelin", + "You cannot delete this image. (%(code)s)": "S’mund ta fshini këtë figurë. (%(code)s)", + "Cancel Sending": "Anuloje Dërgimin", + "Warning": "Sinjalizim", + "This Room": "Këtë Dhomë", + "The Home Server may be too old to support third party networks": "Shërbyesi Home mund të jetë shumë i vjetër për të mbuluar rrjete nga palë të treta", + "Resend": "Ridërgoje", + "Room not found": "Dhoma s’u gjet", + "Downloading update...": "Po shkarkohet përditësim…", + "Messages in one-to-one chats": "Mesazhe në fjalosje tek për tek", + "Unavailable": "S’kapet", + "View Decrypted Source": "Shihni Burim të Shfshehtëzuar", + "Failed to update keywords": "S’u arrit të përditësohen fjalëkyçe", + "Notes:": "Shënime:", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Njoftimet e shkaktuara nga fjalëkyçet vijuese ndjekin rregulla që s’mund të shfaqen këtu:", + "Safari and Opera work too.": "Safari dhe Opera bëjnë, po ashtu.", + "Please set a password!": "Ju lutemi, caktoni një fjalëkalim!", + "powered by Matrix": "bazuar në Matrix", + "You have successfully set a password!": "Caktuat me sukses një fjalëkalim!", + "Favourite": "E parapëlqyer", + "All Rooms": "Krejt Dhomat", + "Explore Room State": "Eksploroni Gjendje Dhome", + "Source URL": "URL-ja e Burimit", + "Messages sent by bot": "Mesazhe të dërguar nga bot", + "Cancel": "Anuloje", + "Filter results": "Filtroni përfundimet", + "Members": "Anëtarë", + "No update available.": "S’ka përditësim gati.", + "Noisy": "I zhurmshëm", + "Failed to get protocol list from Home Server": "S’u arrit të merrej listë protokollesh nga Shërbyesi Home", + "Collecting app version information": "Po grumbullohen të dhëna versioni aplikacioni", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Të fshihet aliasi i dhomës %(alias)s dhe të hiqet %(name)s nga drejtoria?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Kjo do t’ju lejojë të riktheheni te llogaria juaj pasi të keni bërë daljen, dhe të hyni që nga pajisje të tjera.", + "Keywords": "Fjalëkyçe", + "Unpin Message": "Shfiksojeni Mesazhin", + "Enable notifications for this account": "Aktivizo njoftime për këtë llogari", + "Remove": "Hiqe", + "Directory": "Drejtori", + "Invite to this community": "Ftojeni te kjo bashkësi", + "Search for a room": "Kërkoni për një dhomë", + "Search…": "Kërkoni…", + "Messages containing keywords": "Mesazhe që përmbajnë fjalëkyçe", + "Error saving email notification preferences": "Gabim në ruajtje parapëlqimesh për njoftime me email", + "Tuesday": "E martë", + "Enter keywords separated by a comma:": "Jepni fjalëkyçe ndarë me presje:", + "Forward Message": "Përcille Mesazhin", + "You have successfully set a password and an email address!": "Keni caktuar me sukses një fjalëkalim dhe një adresë email!", + "Remove %(name)s from the directory?": "Të hiqet %(name)s prej drejtorisë?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot-i përdor mjaft veçori të përparuara të shfletuesve, disa prej të cilave s’janë gati ose janë eksperimentale në shfletuesin tuaj të tanishëm.", + "Event sent!": "Akti u dërgua!", + "Preparing to send logs": "Po përgatitet për dërgim regjistrash", + "Unnamed room": "Dhomë e paemërtuar", + "Dismiss": "Mos e merr parasysh", + "Explore Account Data": "Eksploroni të Dhëna Llogarie", + "All messages (noisy)": "Tërë Mesazhet (e zhurmshme)", + "Saturday": "E shtunë", + "Remember, you can always set an email address in user settings if you change your mind.": "Mos harroni, mundeni përherë të caktoni një adresë email te rregullimet e përdoruesit, nëse ndërroni mendje.", + "Direct Chat": "Fjalosje e Drejtpërdrejtë", + "The server may be unavailable or overloaded": "Shërbyesi mund të jetë i pakapshëm ose i mbingarkuar", + "Online": "Në linjë", + "Failed to set Direct Message status of room": "S’u arrit të caktohej gjendje Mesazhesh të Drejtpërdrejtë në dhomë", + "Monday": "E hënë", + "Download this file": "Shkarkoje këtë kartelë", + "Remove from Directory": "Hiqe prej Drejtorie", + "Enable them now": "Aktivizoji tani", + "Messages containing my user name": "Mesazhe që përmbajnë emrin tim", + "Toolbox": "Grup mjetesh", + "Collecting logs": "Po grumbullohen regjistra", + "more": "më tepër", + "GitHub issue link:": "Lidhje çështjeje GitHub:", + "Failed to get public room list": "S’u të merrej listë dhomash publike", + "Search": "Kërkim", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Regjistrat e diagnostikimeve përmbajnë të dhëna përdorimi të aplikacioneve, përfshi emrin tuaj të përdoruesit, ID ose aliase të dhomave apo grupeve që keni vizituar dhe emrat e përdoruesve të përdoruesve të tjerë. Nuk përmbajnë mesazhe.", + "(HTTP status %(httpStatus)s)": "(Gjendje HTTP %(httpStatus)s)", + "Failed to forget room %(errCode)s": "S’u arrit të harrohej dhoma %(errCode)s", + "Submit debug logs": "Parashtro regjistra diagnostikimi", + "Please install Chrome or Firefox for the best experience.": "Ju lutemi, për funksionimin më të mirë, instaloni Chrome ose Firefox.", + "Wednesday": "E mërkurë", + "Quote": "Citim", + "Error": "Gabim", + "Send logs": "Dërgo regjistra", + "All messages": "Krejt mesazhet", + "unknown error code": "kod gabimi të panjohur", + "Call invitation": "Ftesë për thirrje", + "Thank you!": "Faleminderit!", + "Messages containing my display name": "Mesazhe që përmbajnë emrin tim të ekranit", + "State Key": "Kyç Gjendjeje", + "Failed to send custom event.": "S’u arrit të dërgohet akt vetjak.", + "What's new?": "Ç’ka të re?", + "Notify me for anything else": "Njoftomë për gjithçka tjetër", + "When I'm invited to a room": "Kur ftohem në një dhomë", + "Close": "Mbylle", + "Can't update user notification settings": "S’përditësohen dot rregullime njoftimi të përdoruesit", + "Notify for all other messages/rooms": "Njoftim për krejt mesazhet/dhomat e tjera", + "Unable to look up room ID from server": "S’arrihet të kërkohet ID dhome nga shërbyesi", + "Couldn't find a matching Matrix room": "S’u gjet dot një dhomë Matrix me përputhje", + "Invite to this room": "Ftoje te kjo dhomë", + "You cannot delete this message. (%(code)s)": "S’mund ta fshini këtë mesazh. (%(code)s)", + "Thursday": "E enjte", + "I understand the risks and wish to continue": "I kuptoj rreziqet dhe dua të vazhdoj", + "Logs sent": "Regjistrat u dërguan", + "Back": "Mbrapsht", + "Reply": "Përgjigjuni", + "Show message in desktop notification": "Shfaq mesazh në njoftim për desktop", + "You must specify an event type!": "Duhet të përcaktoni një lloj akti!", + "Unhide Preview": "Shfshihe Paraparjen", + "Unable to join network": "S’arrihet të hyhet në rrjet", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Mund t’i keni formësuar në një tjetër klient nga Riot-i. S’mund t’i sintonizoni në Riot, por ata janë ende të vlefshëm", + "Sorry, your browser is not able to run Riot.": "Na ndjeni, shfletuesi juaj nuk është në gjendje të xhirojë Riot-in.", + "Messages in group chats": "Mesazhe në fjalosje në grup", + "Yesterday": "Dje", + "Error encountered (%(errorDetail)s).": "U has gabim (%(errorDetail)s).", + "Event Type": "Lloj Akti", + "Low Priority": "Përparësi e Ulët", + "What's New": "Ç’ka të Re", + "Set Password": "Caktoni Fjalëkalim", + "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 b43afe6116..ebacd28a5c 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -1,7 +1,7 @@ { "This email address is already in use": "Ова мејл адреса се већ користи", "This phone number is already in use": "Овај број телефона се већ користи", - "Failed to verify email address: make sure you clicked the link in the email": "Нисам успео да потврдим мејл адресу, постарајте се да сте кликнули на везу у мејлу", + "Failed to verify email address: make sure you clicked the link in the email": "Нисам успео да проверим мејл адресу, постарајте се да сте кликнули на везу у мејлу", "The remote side failed to pick up": "Друга страна није подигла слушалицу", "Unable to capture screen": "Не могу да ухватим садржај екрана", "Existing Call": "Постојећи позив", @@ -87,5 +87,1079 @@ "Missing room_id in request": "Недостаје room_id у захтеву", "Must be viewing a room": "Морате гледати собу", "Room %(roomId)s not visible": "Соба %(roomId)s није видљива", - "Missing user_id in request": "Недостаје user_id у захтеву" + "Missing user_id in request": "Недостаје user_id у захтеву", + "Call Failed": "Позивање неуспешно", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Постоје непознати уређаји у овој соби: уколико наставите без проверавања, можда ће неко прислушкивати ваш позив.", + "Review Devices": "Испрегледај уређаје", + "Call Anyway": "Ипак позови", + "Answer Anyway": "Ипак одговори", + "Call": "Позови", + "Answer": "Одговори", + "Call Timeout": "Прекорачено време позивања", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", + "Failed to lookup current room": "Неуспех при потраживању тренутне собе", + "Usage": "Коришћење", + "/ddg is not a command": "/ddg није наредба", + "To use it, just wait for autocomplete results to load and tab through them.": "Да бисте је користили, само сачекајте да се исходи самодовршавања учитају и табом прођите кроз њих.", + "Unrecognised room alias:": "Непознати алијас собе:", + "Ignored user": "Занемарени корисник", + "You are now ignoring %(userId)s": "Сада занемарујете корисника %(userId)s", + "Unignored user": "Незанемарени корисник", + "You are no longer ignoring %(userId)s": "Више не занемарујете корисника %(userId)s", + "Unknown (user, device) pair:": "Непознати пар (корисника, уређаја):", + "Device already verified!": "Уређај је већ проверен!", + "WARNING: Device already verified, but keys do NOT MATCH!": "УПОЗОРЕЊЕ: Уређај је већ проверен али се кључеви НЕ ПОДУДАРАЈУ!", + "Verified key": "Проверени кључ", + "Unrecognised command:": "Непрепозната наредба:", + "Reason": "Разлог", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s је прихватио позивницу за %(displayName)s.", + "%(targetName)s accepted an invitation.": "%(targetName)s је прихватио позивницу.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s је затражио VoIP конференцију.", + "%(senderName)s invited %(targetName)s.": "%(senderName)s је позвао %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s је бановао %(targetName)s.", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "УПОЗОРЕЊЕ: ПРОВЕРА КЉУЧА НИЈЕ УСПЕЛА! Кључ потписивања за корисника %(userId)s и уређај %(deviceId)s је „%(fprint)s“ а то се не подудара са достављеним кључем „%(fingerprint)s“. Ово можда значи да се ваши разговори прате!", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Кључ за потписивање који сте доставили се подудара са кључем за потписивање од корисника %(userId)s и уређаја %(deviceId)s. Уређај је означен као проверен.", + "%(senderName)s set their display name to %(displayName)s.": "Корисник %(senderName)s је себи поставио приказно име %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "Корисник %(senderName)s је себи уклонио приказно име %(oldDisplayName)s.", + "%(senderName)s removed their profile picture.": "Корисник %(senderName)s је себи уклонио профилну слику.", + "%(senderName)s changed their profile picture.": "Корисник %(senderName)s је себи променио профилну слику.", + "%(senderName)s set a profile picture.": "Корисник %(senderName)s је себи поставио профилну слику.", + "VoIP conference started.": "VoIP конференција је започета.", + "%(targetName)s joined the room.": "Корисник %(targetName)s је ушао у собу.", + "VoIP conference finished.": "VoIP конференција је завршена.", + "%(targetName)s rejected the invitation.": "Корисник %(targetName)s је одбацио позивницу.", + "%(targetName)s left the room.": "Корисник %(targetName)s је напустио собу.", + "%(senderName)s unbanned %(targetName)s.": "Корисник %(senderName)s је скинуо забрану приступа са %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "Корисник %(senderName)s је избацио %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "Пошиљалац %(senderName)s је повукао позивницу за %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "Корисник %(senderDisplayName)s је променио тему у „%(topic)s“.", + "%(senderDisplayName)s removed the room name.": "Корисник %(senderDisplayName)s је уклонио назив собе.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "Корисник %(senderDisplayName)s је променио назив собе у %(roomName)s.", + "%(senderDisplayName)s sent an image.": "Корисник %(senderDisplayName)s је послао слику.", + "Someone": "Неко", + "(not supported by this browser)": "(није подржано од стране овог прегледача)", + "%(senderName)s answered the call.": "Корисник %(senderName)s се јавио.", + "(could not connect media)": "(не могу да повежем медије)", + "(no answer)": "(нема одговора)", + "(unknown failure: %(reason)s)": "(непозната грешка: %(reason)s)", + "%(senderName)s ended the call.": "Корисник %(senderName)s је окончао позив.", + "%(senderName)s placed a %(callType)s call.": "Корисник %(senderName)s је направио %(callType)s позив.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "Корисник %(senderName)s је послао позивницу за приступ соби ка %(targetDisplayName)s.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свим члановима собе, од тренутка позивања у собу.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свим члановима собе, од тренутка приступања соби.", + "%(senderName)s made future room history visible to all room members.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свим члановима собе.", + "%(senderName)s made future room history visible to anyone.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свима.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "Корисник %(senderName)s је учинио будући историјат собе непознатим (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "Корисник %(senderName)s је укључио шифровање с краја на крај (алгоритам %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s са %(fromPowerLevel)s на %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "Корисник %(senderName)s је променио ниво моћи од %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "Корисник %(senderName)s је променио закачене поруке у соби.", + "%(widgetName)s widget modified by %(senderName)s": "Корисник %(senderName)s је променио виџет %(widgetName)s", + "%(widgetName)s widget added by %(senderName)s": "Корисник %(senderName)s је додао виџет %(widgetName)s", + "%(widgetName)s widget removed by %(senderName)s": "Корисник %(senderName)s је уклонио виџет %(widgetName)s", + "%(displayName)s is typing": "%(displayName)s куца", + "%(names)s and %(count)s others are typing|other": "%(names)s и %(count)s корисник(а) куцају", + "%(names)s and %(count)s others are typing|one": "%(names)s и још један куцају", + "%(names)s and %(lastPerson)s are typing": "%(names)s и %(lastPerson)s куцају", + "Failure to create room": "Неуспех при прављењу собе", + "Server may be unavailable, overloaded, or you hit a bug.": "Сервер је можда недоступан, преоптерећен или сте нашли грешку.", + "Send anyway": "Ипак пошаљи", + "Send": "Пошаљи", + "Unnamed Room": "Неименована соба", + "Your browser does not support the required cryptography extensions": "Ваш прегледач не подржава потребна криптографска проширења", + "Not a valid Riot keyfile": "Није исправана Riot кључ-датотека", + "Authentication check failed: incorrect password?": "Провера идентитета није успела: нетачна лозинка?", + "Failed to join room": "Нисам успео да уђем у собу", + "Message Replies": "Одговори", + "Message Pinning": "Закачене поруке", + "Tag Panel": "Означи површ", + "Disable Emoji suggestions while typing": "Онемогући предлагање емоџија приликом куцања", + "Use compact timeline layout": "Користи збијени распоред временске линије", + "Hide removed messages": "Сакриј уклоњене поруке", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Сакриј поруке приступања и напуштања (позивнице, избацивања и забране нису захваћене)", + "Hide avatar changes": "Сакриј промене аватара", + "Hide display name changes": "Сакриј промене приказног имена", + "Hide read receipts": "Сакриј потврде прочитаности", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "Прикажи временске жигове у 12-сатном облику (нпр.: 2:30 ПоП)", + "Always show message timestamps": "Увек прикажи временске жигове", + "Autoplay GIFs and videos": "Самостално пуштај GIF-ове и видео записе", + "Enable automatic language detection for syntax highlighting": "Омогући самостално препознавање језика за истицање синтаксе", + "Hide avatars in user and room mentions": "Сакриј аватаре у спомињањима корисника и соба", + "Disable big emoji in chat": "Онемогући велике емоџије у ћаскању", + "Don't send typing notifications": "Не шаљи обавештења о куцању", + "Automatically replace plain text Emoji": "Самостално замени емоџије писане обичним текстом", + "Mirror local video feed": "Копирај довод локалног видеа", + "Disable Peer-to-Peer for 1:1 calls": "Онемогући парњаке за 1 на 1 позиве", + "Never send encrypted messages to unverified devices from this device": "Никада не шаљи шифроване поруке са овог уређаја ка непровереним уређајима", + "Never send encrypted messages to unverified devices in this room from this device": "Никада не шаљи шифроване поруке са овог уређаја ка непровереним уређајима у овој соби", + "Enable inline URL previews by default": "Подразумевано омогући претпрегледе адреса унутар линије", + "Enable URL previews for this room (only affects you)": "Омогући претпрегледе адреса у овој соби (утиче само на вас)", + "Enable URL previews by default for participants in this room": "Подразумевано омогући прегледе адреса за чланове ове собе", + "Room Colour": "Боја собе", + "Active call (%(roomName)s)": "Активни позив (%(roomName)s)", + "unknown caller": "непознати позивалац", + "Incoming voice call from %(name)s": "Долазни гласовни позив од корисника %(name)s", + "Incoming video call from %(name)s": "Долазни видео позив од корисника %(name)s", + "Incoming call from %(name)s": "Долазни позив од корисника %(name)s", + "Decline": "Одбиј", + "Accept": "Прихвати", + "Error": "Грешка", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Текстуална порука је послата на %(msisdn)s. Унесите потврдни код из те поруке", + "Incorrect verification code": "Нетачни потврдни код", + "Enter Code": "Унесите код", + "Submit": "Пошаљи", + "Phone": "Телефон", + "Add phone number": "Додај телефонски број", + "Add": "Додај", + "Failed to upload profile picture!": "Нисам успео да отпремим профилну слику!", + "Upload new:": "Отпреми нову:", + "No display name": "Нема приказног имена", + "New passwords don't match": "Нове лозинке се не подударају", + "Passwords can't be empty": "Лозинке не могу бити празне", + "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Промена лозинке ће тренутно ресетовати све кључеве за шифровање с краја на крај, на свим уређајима и тиме учинити шифровани историјат ћаскања нечитљивим осим ако прво не извезете кључеве ваше собе па их поново увезете после. Ово ће бити побољшано у будућности.", + "Continue": "Настави", + "Export E2E room keys": "Извези E2E кључеве собе", + "Do you want to set an email address?": "Да ли желите да поставите мејл адресу?", + "Current password": "Тренутна лозинка", + "Password": "Лозинка", + "New Password": "Нова лозинка", + "Confirm password": "Потврди лозинку", + "Change Password": "Промени лозинку", + "Your home server does not support device management.": "Ваш кућни сервер не подржава управљање уређајима.", + "Unable to load device list": "Нисам могао да учитам списак уређаја", + "Authentication": "Идентификација", + "Delete %(count)s devices|other": "Обриши %(count)s уређај(а)", + "Delete %(count)s devices|one": "Обриши уређај", + "Device ID": "ИБ уређаја", + "Device Name": "Назив уређаја", + "Last seen": "Последњи пут виђен", + "Select devices": "Изабери уређаје", + "Failed to set display name": "Нисам успео да поставим приказно име", + "Disable Notifications": "Онемогући обавештења", + "Enable Notifications": "Омогући обавештења", + "Cannot add any more widgets": "Не могу да додам још виџета", + "The maximum permitted number of widgets have already been added to this room.": "Највећи број дозвољених додатих виџета је прекорачен у овој соби.", + "Add a widget": "Додај виџет", + "Drop File Here": "Превуци датотеку овде", + "Drop file here to upload": "Превуци датотеку овде да би је отпремио", + " (unsupported)": " (неподржано)", + "Join as voice or video.": "Приступи преко гласа или видеа.", + "Ongoing conference call%(supportedText)s.": "Текући конференцијски позив %(supportedText)s.", + "%(senderName)s sent an image": "Корисник %(senderName)s је послао слику", + "%(senderName)s sent a video": "Корисник %(senderName)s је послао видео", + "%(senderName)s uploaded a file": "Корисник %(senderName)s је отпремио датотеку", + "Options": "Опције", + "Undecryptable": "Немогуће дешифровати", + "Encrypted by a verified device": "Шифровано на провереном уређају", + "Encrypted by an unverified device": "Шифровано на непровереном уређају", + "Unencrypted message": "Нешифрована порука", + "Please select the destination room for this message": "Изаберите одредишну собу за ову поруку", + "Blacklisted": "На црном списку", + "Verified": "Проверени", + "Unverified": "Непроверени", + "device id: ": "иб уређаја: ", + "Disinvite": "Откажи позивницу", + "Kick": "Избаци", + "Disinvite this user?": "Отказати позивницу за овог корисника?", + "Kick this user?": "Избацити овог корисника?", + "Failed to kick": "Неуспех при избацивању", + "Unban": "Скини забрану", + "Ban": "Забрани приступ", + "Unban this user?": "Скинути забрану за овог корисника?", + "Ban this user?": "Забранити приступ овом кориснику?", + "Failed to ban user": "Неуспех при забрањивању приступа кориснику", + "Failed to mute user": "Неуспех при пригушивању корисника", + "Failed to toggle moderator status": "Неуспех при промени стања модератора", + "Failed to change power level": "Неуспех при промени нивоа моћи", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Нећете моћи да опозовете ове промене зато што снижавате себе, ако сте последњи овлашћени корисник у соби, немогуће је да поново добијете овлашћења.", + "Are you sure?": "Да ли сте сигурни?", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Нећете моћи да опозовете ову измену јер унапређујете корисника тако да има исти ниво моћи као и ви.", + "No devices with registered encryption keys": "Нема уређаја са регистрованим кључевима за шифровање", + "Devices": "Уређаји", + "Unignore": "Не занемаруј више", + "Ignore": "Занемари", + "Jump to read receipt": "Скочи на потврду о прочитаности", + "Mention": "Спомени", + "Invite": "Позови", + "User Options": "Корисничке опције", + "Direct chats": "Директна ћаскања", + "Unmute": "Појачај", + "Mute": "Утишај", + "Revoke Moderator": "Опозови модератора", + "Make Moderator": "Учини модератором", + "Admin Tools": "Админ алатке", + "Level:": "Ниво:", + "and %(count)s others...|other": "и %(count)s других...", + "and %(count)s others...|one": "и још један други...", + "Invited": "Позван", + "Filter room members": "Филтрирај чланове собе", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (моћ %(powerLevelNumber)s)", + "Attachment": "Прилог", + "Upload Files": "Отпреми датотеке", + "Are you sure you want to upload the following files?": "Да ли сте сигурни да желите да отпремите следеће датотеке?", + "Encrypted room": "Шифрована соба", + "Unencrypted room": "Нешифрована соба", + "Hangup": "Спусти слушалицу", + "Voice call": "Гласовни позив", + "Video call": "Видео позив", + "Upload file": "Отпреми датотеку", + "Show Text Formatting Toolbar": "Прикажи алатницу за форматирање текста", + "Send an encrypted reply…": "Пошаљи шифровани одговор…", + "Send a reply (unencrypted)…": "Пошаљи одговор (нешифровани)…", + "Send an encrypted message…": "Пошаљи шифровану поруку…", + "Send a message (unencrypted)…": "Пошаљи поруку (нешифровану)…", + "You do not have permission to post to this room": "Немате овлашћење за писање у овој соби", + "Turn Markdown on": "Укључи Маркдаун", + "Turn Markdown off": "Искључи Маркдаун", + "Hide Text Formatting Toolbar": "Сакриј алатницу за форматирање текста", + "Server error": "Грешка на серверу", + "Server unavailable, overloaded, or something else went wrong.": "Сервер није доступан или је преоптерећен или је нешто пошло наопако.", + "Command error": "Грешка у наредби", + "bold": "подебљано", + "italic": "искошено", + "strike": "прецртано", + "underline": "подвучено", + "code": "код", + "quote": "цитат", + "bullet": "списак", + "numbullet": "бројевни_списак", + "Markdown is disabled": "Маркдаун је искључен", + "Markdown is enabled": "Маркдаун је укључен", + "Unpin Message": "Откачи поруку", + "Jump to message": "Скочи на поруку", + "No pinned messages.": "Нема закачених порука.", + "Loading...": "Учитавам...", + "Pinned Messages": "Закачене поруке", + "%(duration)ss": "%(duration)sс", + "%(duration)sm": "%(duration)sм", + "%(duration)sh": "%(duration)sч", + "%(duration)sd": "%(duration)sд", + "Online for %(duration)s": "На мрежи %(duration)s", + "Idle for %(duration)s": "У мировању %(duration)s", + "Offline for %(duration)s": "Ван мреже %(duration)s", + "Unknown for %(duration)s": "Непознато већ %(duration)s", + "Online": "На мрежи", + "Idle": "У мировању", + "Offline": "Ван мреже", + "Unknown": "Непознато", + "Replying": "Одговара", + "Seen by %(userName)s at %(dateTime)s": "Видео корисник %(userName)s у %(dateTime)s", + "No rooms to show": "Нема соба за приказ", + "Unnamed room": "Неименована соба", + "World readable": "Читљиво за све", + "Guests can join": "Гости могу приступити", + "Failed to set avatar.": "Нисам успео да поставим аватар.", + "Save": "Сачувај", + "(~%(count)s results)|other": "(~%(count)s резултата)", + "(~%(count)s results)|one": "(~%(count)s резултат)", + "Join Room": "Приступи соби", + "Upload avatar": "Отпреми аватара", + "Remove avatar": "Уклони аватара", + "Settings": "Подешавања", + "Forget room": "Заборави собу", + "Search": "Претрага", + "Show panel": "Прикажи површ", + "Drop here to favourite": "Пусти овде да учиниш омиљеним", + "Drop here to tag direct chat": "Пусти овде да означиш директно ћаскање", + "Drop here to restore": "Пусти овде да опоравиш", + "Drop here to demote": "Пусти овде да унизиш", + "Drop here to tag %(section)s": "Пусти овде да означиш %(section)s", + "Press to start a chat with someone": "Притисни за почетак ћаскања са неким", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Још нисте у било којој соби! Притисните да бисте направили собу или да бисте погледали фасциклу", + "Community Invites": "Позивнице заједнице", + "Invites": "Позивнице", + "Favourites": "Омиљено", + "People": "Особе", + "Rooms": "Собе", + "Low priority": "Ниска важност", + "Historical": "Историјско", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Не могу да утврдим да ли се адреса на овој позивници поклапа са оном која је повезана са вашим налогом.", + "This invitation was sent to an email address which is not associated with this account:": "Ова позивница је послата на мејл адресу која није повезана са вашим налогом:", + "You may wish to login with a different account, or add this email to this account.": "Можда бисте желели да се пријавите са другим налогом или да додате овај мејл у ваш налог.", + "You have been invited to join this room by %(inviterName)s": "Позвани сте да приступите овој соби од стране корисника %(inviterName)s", + "Would you like to accept or decline this invitation?": "Да ли желите да прихватите или одбијете ову позивницу?", + "Reason: %(reasonText)s": "Разлог: %(reasonText)s", + "Rejoin": "Поново приступи", + "You have been kicked from %(roomName)s by %(userName)s.": "Корисник %(userName)s вас је избацио из собе %(roomName)s.", + "You have been kicked from this room by %(userName)s.": "Корисник %(userName)s вас је избацио из ове собе.", + "You have been banned from %(roomName)s by %(userName)s.": "Корисник %(userName)s је вама забранио приступ соби %(roomName)s.", + "You have been banned from this room by %(userName)s.": "Корисник %(userName)s је вама забранио приступ овој соби.", + "This room": "Ова соба", + "%(roomName)s does not exist.": "Соба %(roomName)s не постоји.", + "%(roomName)s is not accessible at this time.": "Соба %(roomName)s није доступна у овом тренутку.", + "You are trying to access %(roomName)s.": "Покушавате да приступите соби %(roomName)s.", + "You are trying to access a room.": "Покушавате да приступите соби.", + "Click here to join the discussion!": "Кликните овде да бисте се придружили разговору!", + "This is a preview of this room. Room interactions have been disabled": "Ово је претпреглед ове собе. Интеракције у соби су онемогућене", + "To change the room's avatar, you must be a": "Да бисте променили аватар собе, морате бити", + "To change the room's name, you must be a": "Да бисте променили назив собе, морате бити", + "To change the room's main address, you must be a": "Да бисте променили главну адресу собе, морате бити", + "To change the room's history visibility, you must be a": "Да бисте променили видљивост историјата собе, морате бити", + "To change the permissions in the room, you must be a": "Да бисте променили овлашћења у соби, морате бити", + "To change the topic, you must be a": "Да бисте променили тему, морате бити", + "To modify widgets in the room, you must be a": "Да бисте изменили виџете у соби, морате бити", + "Failed to unban": "Нисам успео да скинем забрану", + "Banned by %(displayName)s": "Приступ забранио %(displayName)s", + "Privacy warning": "Упозорење о приватности", + "Changes to who can read history will only apply to future messages in this room": "Измене права читања историјата биће примењене на будуће поруке у овој соби", + "The visibility of existing history will be unchanged": "Видљивост постојећег историјата неће бити промењена", + "unknown error code": "непознати код грешке", + "Failed to forget room %(errCode)s": "Нисам успео да заборавим собу %(errCode)s", + "End-to-end encryption is in beta and may not be reliable": "Шифровање с краја на крај је у бета фази и може бити непоуздано", + "You should not yet trust it to secure data": "Не бисте требали да му још верујете за обезбеђивање података", + "Devices will not yet be able to decrypt history from before they joined the room": "Уређаји још не могу да дешифрују историјат настао пре приступања соби", + "Once encryption is enabled for a room it cannot be turned off again (for now)": "Када се шифровање омогући за собу, не може се поново искључити (за сада)", + "Encrypted messages will not be visible on clients that do not yet implement encryption": "Шифроване поруке неће бити видљиве на клијентима који још не подржавају шифровање", + "Enable encryption": "Омогући шифровање", + "(warning: cannot be disabled again!)": "(упозорење: не може се поново искључити!)", + "Encryption is enabled in this room": "Шифровање је омогућено у овој соби", + "Encryption is not enabled in this room": "Шифровање није омогућено у овој соби", + "Privileged Users": "Овлашћени корисници", + "No users have specific privileges in this room": "Нема корисника са посебним овлашћењима у овој соби", + "Banned users": "Корисници са забраном приступа", + "This room is not accessible by remote Matrix servers": "Овој соби не могу приступити удаљени Матрикс сервери", + "Leave room": "Напусти собу", + "Favourite": "Омиљено", + "Tagged as: ": "Означено као: ", + "To link to a room it must have an address.": "Да бисте слали везу собе, она мора имати адресу.", + "Guests cannot join this room even if explicitly invited.": "Гости не могу приступити овој соби чак и ако су експлицитно позвани.", + "Click here to fix": "Кликните овде да бисте поправили", + "Who can access this room?": "Ко може приступити овој соби?", + "Only people who have been invited": "Само особе које су позване", + "Anyone who knows the room's link, apart from guests": "Било ко ко зна везу ка соби, осим гостију", + "Anyone who knows the room's link, including guests": "Било ко ко зна везу ка соби, укључујући и госте", + "Publish this room to the public in %(domain)s's room directory?": "Објавити ову собу у јавној фасцикли соба на домену %(domain)s?", + "Who can read history?": "Ко може читати историјат?", + "Anyone": "Било ко", + "Members only (since the point in time of selecting this option)": "Само чланови (од тренутка бирања ове опције)", + "Members only (since they were invited)": "Само чланови (од тренутка позивања)", + "Members only (since they joined)": "Само чланови (од приступања)", + "Permissions": "Овлашћења", + "The default role for new room members is": "Подразумевана улога за нове чланове у соби је", + "To send messages, you must be a": "Да бисте слали поруке, морате бити", + "To invite users into the room, you must be a": "Да бисте позивали кориснике у собу, морате бити", + "To configure the room, you must be a": "Да бисте подешавали собу, морате бити", + "To kick users, you must be a": "Да бисте избацивали кориснике, морате бити", + "To ban users, you must be a": "Да бисте забрањивали приступ корисницима, морате бити", + "To remove other users' messages, you must be a": "Да бисте уклањали поруке других корисника, морате бити", + "To send events of type , you must be a": "Да бисте слали догађаје врсте , морате бити", + "Advanced": "Напредно", + "This room's internal ID is": "Унутрашњи ИБ ове собе је", + "Add a topic": "Додај тему", + "Cancel": "Откажи", + "Scroll to unread messages": "Превуци на непрочитане поруке", + "Jump to first unread message.": "Скочи на прву непрочитану поруку.", + "Close": "Затвори", + "Invalid alias format": "Неисправан облик алијаса", + "'%(alias)s' is not a valid format for an alias": "„%(alias)s 1“ није исправан облик алијаса", + "Invalid address format": "Неисправан облик адресе", + "'%(alias)s' is not a valid format for an address": "„%(alias)s“ није исправан облик адресе", + "not specified": "није наведено", + "not set": "није постављено", + "Remote addresses for this room:": "Удаљене адресе за ову собу:", + "Addresses": "Адресе", + "The main address for this room is": "Главна адреса ове собе је", + "Local addresses for this room:": "Локална адреса ове собе:", + "This room has no local addresses": "Ова соба нема локалних адреса", + "New address (e.g. #foo:%(localDomain)s)": "Нова адреса (нпр.: #soba:%(localDomain)s)", + "Invalid community ID": "Неисправан ИБ заједнице", + "'%(groupId)s' is not a valid community ID": "„%(groupId)s“ није исправан ИБ заједнице", + "Flair": "Беџ", + "Showing flair for these communities:": "Приказујем беџ за ове заједнице:", + "This room is not showing flair for any communities": "Ова соба не приказује беџеве било које заједнице", + "New community ID (e.g. +foo:%(localDomain)s)": "Нови ИБ заједнице (нпр.: +zajednica:%(localDomain)s)", + "You have enabled URL previews by default.": "Омогућили сте подразумеване претпрегледе адреса.", + "You have disabled URL previews by default.": "Онемогућили сте подразумеване претпрегледе адреса.", + "URL previews are enabled by default for participants in this room.": "Претпрегледи адреса су подразумевано омогућени за све чланове ове собе.", + "URL previews are disabled by default for participants in this room.": "Претпрегледи адреса су подразумевано онемогућени за све чланове ове собе.", + "URL Previews": "Претпрегледи адреса", + "Error decrypting audio": "Грешка при дешифровању звука", + "Error decrypting attachment": "Грешка при дешифровању прилога", + "Decrypt %(text)s": "Дешифруј %(text)s", + "Download %(text)s": "Преузми %(text)s", + "Invalid file%(extra)s": "Неисправна датотека %(extra)s", + "Error decrypting image": "Грешка при дешифровању слике", + "Error decrypting video": "Грешка при дешифровању видеа", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "Корисник %(senderDisplayName)s је променио аватара собе %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "Корисник %(senderDisplayName)s је уклонио аватара собе.", + "%(senderDisplayName)s changed the room avatar to ": "Корисник %(senderDisplayName)s је променио аватара собе у ", + "Copied!": "Копирано!", + "Failed to copy": "Нисам успео да ископирам", + "Add an Integration": "Додај уградњу", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Бићете пребачени на сајт треће стране да бисте се идентификовали са својим налогом зарад коришћења уградње %(integrationsUrl)s. Да ли желите да наставите?", + "Removed or unknown message type": "Уклоњена порука или порука непознатог типа", + "Message removed by %(userId)s": "Поруку је уклонио корисник %(userId)s", + "Message removed": "Порука је уклоњена", + "Robot check is currently unavailable on desktop - please use a web browser": "Роботска провера тренутно није доступна у стоним програмима, користите веб прегледач", + "This Home Server would like to make sure you are not a robot": "Овај кућни сервер жели да се увери да нисте робот", + "Sign in with CAS": "Пријавите се уз CAS", + "Custom Server Options": "Прилагођене опције сервера", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Можете користити прилагођене опције сервера да бисте се пријавили на друге Матрикс сервере тако што ћете навести другачију адресу кућног сервера.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Ово омогућава коришћење ове апликације са постојећим Матрикс налогом на другом кућном серверу.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Можете такође поставити прилагођени сервер идентитета али ово уобичајено спречава радње са другим корисницима које користе мејл адресе.", + "Dismiss": "Одбаци", + "To continue, please enter your password.": "Да бисте наставили, унесите вашу лозинку.", + "Password:": "Лозинка:", + "An email has been sent to %(emailAddress)s": "Мејл је послат на адресу %(emailAddress)s", + "Please check your email to continue registration.": "Проверите ваше сандуче да бисте наставили регистровање.", + "Token incorrect": "Жетон је нетачан", + "A text message has been sent to %(msisdn)s": "Текстуална порука је послата на %(msisdn)s", + "Please enter the code it contains:": "Унесите код који се налази у њој:", + "Start authentication": "Започните идентификацију", + "powered by Matrix": "покреће Матрикс", + "Username on %(hs)s": "Корисничко на %(hs)s", + "User name": "Корисничко име", + "Mobile phone number": "Мобилни број телефона", + "Forgot your password?": "Заборавили сте лозинку?", + "%(serverName)s Matrix ID": "%(serverName)s Матрикс ИБ", + "Sign in with": "Пријавите се преко", + "Email address": "Мејл адреса", + "Sign in": "Пријави се", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ако не наведете мејл адресу, нећете моћи да опоравите вашу лозинку. Да ли сте сигурни?", + "Email address (optional)": "Мејл адреса (изборно)", + "You are registering with %(SelectedTeamName)s": "Региструјете се уз %(SelectedTeamName)s", + "Mobile phone number (optional)": "Број мобилног телефона (изборно)", + "Register": "Регистровање", + "Default server": "Подразумевани сервер", + "Custom server": "Прилагођени сервер", + "Home server URL": "Адреса кућног сервера", + "Identity server URL": "Адреса сервера идентитета", + "What does this mean?": "Шта ово значи?", + "Remove from community": "Уклони из заједнице", + "Disinvite this user from community?": "Отказати позивницу у заједницу овом кориснику?", + "Remove this user from community?": "Уклонити овог корисника из заједнице?", + "Failed to withdraw invitation": "Нисам успео да повучем позивницу", + "Failed to remove user from community": "Нисам успео да уклоним кориснике из заједнице", + "Filter community members": "Филтрирај чланове заједнице", + "Flair will appear if enabled in room settings": "Беџ ће се приказати ако се омогући у подешавањима собе", + "Flair will not appear": "Беџ се неће приказати", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Да ли сте сигурни да желите да уклоните собу „%(roomName)s“ из %(groupId)s?", + "Removing a room from the community will also remove it from the community page.": "Уклањање собе из заједнице је такође уклања и са странице заједнице.", + "Remove": "Уклони", + "Failed to remove room from community": "Нисам успео да уклоним собу из заједнице", + "Failed to remove '%(roomName)s' from %(groupId)s": "Нисам успео да уклоним собу „%(roomName)s“ из %(groupId)s", + "Something went wrong!": "Нешто је пошло наопако!", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Видљивост собе „%(roomName)s“ у %(groupId)s није могла бити измењена.", + "Visibility in Room List": "Видљивост у списку соба", + "Visible to everyone": "Видљиво свима", + "Only visible to community members": "Видљиво само члановима заједнице", + "Filter community rooms": "Филтрирај собе заједнице", + "Something went wrong when trying to get your communities.": "Нешто је пошло наопако приликом добављања ваших заједница.", + "Display your community flair in rooms configured to show it.": "Приказује ваш беџ заједнице у собама које су подешене за то.", + "You're not currently a member of any communities.": "Тренутно нисте члан било које заједнице.", + "Unknown Address": "Непозната адреса", + "NOTE: Apps are not end-to-end encrypted": "НАПОМЕНА: Апликације не користе шифровање с краја на крај", + "Do you want to load widget from URL:": "Да ли желите да учитате виџет са адресе:", + "Allow": "Дозволи", + "Delete Widget": "Обриши виџет", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Брисање виџета уклања виџет за све чланове ове собе. Да ли сте сигурни да желите обрисати овај виџет?", + "Delete widget": "Обриши виџет", + "Revoke widget access": "Опозови приступ виџету", + "Minimize apps": "Умањи апликације", + "Edit": "Уреди", + "Create new room": "Направи нову собу", + "Unblacklist": "Скини са црног списка", + "Blacklist": "Стави на црни списак", + "Unverify": "Означи непровереним", + "Verify...": "Провери...", + "No results": "Нема резултата", + "Delete": "Обриши", + "Communities": "Заједнице", + "Home": "Почетна", + "Integrations Error": "Грешка са уградњама", + "Could not connect to the integration server": "Не могу да се повежем на сервер за уградње", + "Manage Integrations": "Управљај уградњама", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s су ушли %(count)s пута", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s је ушло", + "%(oneUser)sjoined %(count)s times|other": "Корисник %(oneUser)s је ушао %(count)s пута", + "%(oneUser)sjoined %(count)s times|one": "Корисник %(oneUser)s је ушао", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s је изашло %(count)s пута", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s је изашло", + "%(oneUser)sleft %(count)s times|other": "Корисник %(oneUser)s је изашло %(count)s пута", + "%(oneUser)sleft %(count)s times|one": "Корисник %(oneUser)s је изашао", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s је ушло и изашло %(count)s пута", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s је ушло и изашло", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s је ушао и изашао %(count)s пута", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s је ушао и изашао", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s је изашло и поново ушло %(count)s пута", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s је изашло и поново ушло", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s је изашао и поново ушао %(count)s пута", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s је изашао и поново ушао", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s је одбило њихове позивнице %(count)s пута", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s је одбило њихове позивнице", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s је одбио позивницу %(count)s пута", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s је одбио позивницу", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "Корисницима %(severalUsers)s су позивнице повучене %(count)s пута", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "Корисницима %(severalUsers)s су позивнице повучене", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "Кориснику %(oneUser)s је позивница повучена %(count)s пута", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "Кориснику %(oneUser)s је позивница повучена", + "were invited %(count)s times|other": "су позвани %(count)s пута", + "were invited %(count)s times|one": "су позвани", + "was invited %(count)s times|other": "је позван %(count)s пута", + "was invited %(count)s times|one": "је позван", + "were banned %(count)s times|other": "забрањен приступ %(count)s пута", + "were banned %(count)s times|one": "забрањен приступ", + "was banned %(count)s times|other": "забрањен приступ %(count)s пута", + "was banned %(count)s times|one": "забрањен приступ", + "were unbanned %(count)s times|other": "дозвољен приступ %(count)s пута", + "were unbanned %(count)s times|one": "дозвољен приступ", + "was unbanned %(count)s times|other": "дозвољен приступ %(count)s пута", + "was unbanned %(count)s times|one": "дозвољен приступ", + "were kicked %(count)s times|other": "избачен %(count)s пута", + "were kicked %(count)s times|one": "избачен", + "was kicked %(count)s times|other": "избачен %(count)s пута", + "was kicked %(count)s times|one": "избачен", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s је променило своје име %(count)s пута", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s је променило своје име", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s је променило своје име %(count)s пута", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s је променило своје име", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s је променило свој аватар %(count)s пута", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s је променило свој аватар", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s је променило свој аватар %(count)s пута", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s је променило свој аватар", + "%(items)s and %(count)s others|other": "%(items)s и %(count)s других", + "%(items)s and %(count)s others|one": "%(items)s и још један", + "%(items)s and %(lastItem)s": "%(items)s и %(lastItem)s", + "collapse": "скупи", + "expand": "рашири", + "Custom of %(powerLevel)s": "Прилагођени ниво %(powerLevel)s", + "Custom level": "Прилагођени ниво", + "Quote": "Цитат", + "Room directory": "Фасцикла са собама", + "Start chat": "Започни ћаскање", + "And %(count)s more...|other": "И %(count)s других...", + "ex. @bob:example.com": "нпр.: @pera:domen.rs", + "Add User": "Додај корисника", + "Matrix ID": "Матрикс ИБ", + "Matrix Room ID": "ИБ Матрикс собе", + "email address": "мејл адреса", + "Try using one of the following valid address types: %(validTypesList)s.": "Пробајте са једним од следећих исправних типова адреса: %(validTypesList)s.", + "You have entered an invalid address.": "Унели сте неисправну адресу.", + "Create a new chat or reuse an existing one": "Започните ново ћаскање или искористите постојеће", + "Start new chat": "Започни ново ћаскање", + "You already have existing direct chats with this user:": "Већ имате постојећа директна ћаскања са овим корисником:", + "Start chatting": "Започни ћаскање", + "Click on the button below to start chatting!": "Кликните на дугме испод да бисте започели ћаскање!", + "Start Chatting": "Започни ћаскање", + "Confirm Removal": "Потврди уклањање", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Да ли сте сигурни да желите уклонити (обрисати) овај догађај? Знајте да брисање назива собе или мењање теме може опозвати измену.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "ИБ-јеви заједнице могу садржати само знакове a-z, 0-9, или '=_-./'", + "Community IDs cannot not be empty.": "ИБ-јеви заједнице не могу бити празни.", + "Something went wrong whilst creating your community": "Нешто је пошло наопако приликом стварања ваше заједнице", + "Create Community": "Направи заједницу", + "Community Name": "Назив заједнице", + "Example": "Пример", + "Community ID": "ИБ заједнице", + "example": "пример", + "Create": "Направи", + "Create Room": "Направи собу", + "Room name (optional)": "Назив собе (изборно)", + "Advanced options": "Напредне опције", + "Block users on other matrix homeservers from joining this room": "Блокирај приступ соби корисницима са других матрикс кућних сервера", + "This setting cannot be changed later!": "Ово подешавање се не може променити касније!", + "Unknown error": "Непозната грешка", + "Incorrect password": "Нетачна лозинка", + "Deactivate Account": "Угаси налог", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Да бисте проверили да се овом уређају може веровати, контактирајте власника користећи друге начине (нпр.: лично или преко телефонског позива) и питајте га да ли се кључ који види у корисничким подешавањима подудара са кључем испод:", + "Device name": "Назив уређаја", + "Device key": "Кључ уређаја", + "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.": "Ако се подудара, притисните дугме за потврду провере испод. Ако се не подудара, неко други прислушкује овај уређај и вероватно желите да притиснете дугме за стављање на црни списак.", + "In future this verification process will be more sophisticated.": "У будућности ће овај поступак провере бити напреднији.", + "Verify device": "Провери уређај", + "I verify that the keys match": "Потврђујем да се кључеви подударају", + "An error has occurred.": "Догодила се грешка.", + "OK": "У реду", + "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“ захтева кључеве за шифровање.", + "Start verification": "Започни проверу", + "Share without verifying": "Подели без провере", + "Ignore request": "Занемари захтев", + "Loading device info...": "Учитавам податке о уређају...", + "Encryption key request": "Захтев за кључ шифровања", + "Unable to restore session": "Не могу да повратим сесију", + "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-а, ваша сесија може бити некомпатибилна са овим издањем. Затворите овај прозор и вратите се на новије издање.", + "Invalid Email Address": "Неисправна мејл адреса", + "This doesn't appear to be a valid email address": "Изгледа да ово није исправна мејл адреса", + "Verification Pending": "Чека се на проверу", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Проверите ваш мејл и кликните на везу унутар њега. Када ово урадите, кликните на дугме „настави“.", + "Unable to add email address": "Не могу да додам мејл адресу", + "Unable to verify email address.": "Не могу да проверим мејл адресу.", + "This will allow you to reset your password and receive notifications.": "Ово омогућава поновно постављање лозинке и примање обавештења.", + "Skip": "Прескочи", + "User names may only contain letters, numbers, dots, hyphens and underscores.": "Корисничка имена могу садржати само слова, бројеве, тачке, повлаке и доње црте.", + "Username not available": "Корисничко име није доступно", + "Username invalid: %(errMessage)s": "Корисничко име није исправно: %(errMessage)s", + "An error occurred: %(error_string)s": "Догодила се грешка: %(error_string)s", + "Username available": "Корисничко име је доступно", + "To get started, please pick a username!": "Да бисте кренули, изаберите корисничко име!", + "This will be your account name on the homeserver, or you can pick a different server.": "Ово ће бити назив вашег налога на кућном серверу, или можете изабрати други сервер.", + "If you already have a Matrix account you can log in instead.": "Ако већ имате Матрикс налог, можете се већ пријавити.", + "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.": "Предлажемо да прођете кроз поступак провере сваког уређаја да бисте потврдили да они припадају њиховим стварним власницима али можете поново послати поруку без провере, ако то желите.", + "Room contains unknown devices": "Соба садржи непознате уређаје", + "\"%(RoomName)s\" contains devices that you haven't seen before.": "Соба „%(RoomName)s“ садржи уређаје које нисте видели пре.", + "Unknown devices": "Непознати уређаји", + "Private Chat": "Приватно ћаскање", + "Public Chat": "Јавно ћаскање", + "Custom": "Прилагођено", + "Alias (optional)": "Алијас (изборно)", + "Name": "Име", + "Topic": "Тема", + "Make this room private": "Учини ову собу приватном", + "Share message history with new users": "Подели историјат порука са новим корисницима", + "Encrypt room": "Шифруј собу", + "You must register to use this functionality": "Морате се регистровати да бисте користили ову могућност", + "You must join the room to see its files": "Морате приступити соби да бисте видели њене датотеке", + "There are no visible files in this room": "Нема видљивих датотека у овој соби", + "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    HTML за страницу ваше заједнице

    \n

    \n Користите дужи опис да бисте упознали нове чланове са заједницом, или поделили\n неке важне везе\n

    \n

    \n Можете чак користити \"img\" ознаке\n

    \n", + "Add rooms to the community summary": "Додај собе у кратак опис заједнице", + "Which rooms would you like to add to this summary?": "Које собе желите додати у овај кратак опис?", + "Add to summary": "Додај у кратак опис", + "Failed to add the following rooms to the summary of %(groupId)s:": "Нисам успео да додам следеће собе у кратак опис групе %(groupId)s:", + "Add a Room": "Додај собу", + "Failed to remove the room from the summary of %(groupId)s": "Нисам успео да уклоним собу из кратког описа групе %(groupId)s", + "The room '%(roomName)s' could not be removed from the summary.": "Соба „%(roomName)s“ се не може уклонити из кратког описа.", + "Add users to the community summary": "Додај кориснике у кратак опис заједнице", + "Who would you like to add to this summary?": "Да ли желите да додате у овај кратак опис?", + "Failed to add the following users to the summary of %(groupId)s:": "Нисам успео да додам следеће кориснике у кратак опис групе %(groupId)s:", + "Add a User": "Додај корисника", + "Failed to remove a user from the summary of %(groupId)s": "Нисам успео да уклоним корисника из кратког описа групе %(groupId)s", + "The user '%(displayName)s' could not be removed from the summary.": "Корисник „%(displayName)s“ се не може уклонити из кратког описа.", + "Failed to upload image": "Нисам успео да отпремим слику", + "Failed to update community": "Нисам успео да ажурирам заједницу", + "Unable to accept invite": "Не могу да прихватим позивницу", + "Unable to reject invite": "Не могу да одбијем позивницу", + "Leave Community": "Напусти заједницу", + "Leave %(groupName)s?": "Напустити %(groupName)s?", + "Leave": "Напусти", + "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": "Додај собе у ову заједницу", + "Featured Rooms:": "Издвојене собе:", + "Featured Users:": "Издвојени корисници:", + "%(inviter)s has invited you to join this community": "Корисник %(inviter)s вас је позвао у ову заједницу", + "You are an administrator of this community": "Ви сте администратор ове заједнице", + "You are a member of this community": "Ви сте члан ове заједнице", + "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "Ваша заједница нема дуги опис, HTML страницу на којој су приказани чланови заједнице.
    Кликните овде да бисте отворили подешавања и направили страницу!", + "Long Description (HTML)": "Дуги опис (HTML)", + "Description": "Опис", + "Community %(groupId)s not found": "Заједница %(groupId)s није нађена", + "This Home server does not support communities": "Овај кућни сервер не подржава заједнице", + "Failed to load %(groupId)s": "Нисам успео да учитам %(groupId)s", + "Reject invitation": "Одбиј позивницу", + "Are you sure you want to reject the invitation?": "Да ли сте сигурни да желите одбити позивницу?", + "Failed to reject invitation": "Нисам успео да одбијем позивницу", + "Are you sure you want to leave the room '%(roomName)s'?": "Да ли сте сигурни да желите напустити собу „%(roomName)s“?", + "Failed to leave room": "Нисам успео да напустим собу", + "Signed Out": "Одјављен", + "For security, this session has been signed out. Please sign in again.": "Зарад безбедности, одјављени сте из ове сесије. Пријавите се поново.", + "Old cryptography data detected": "Нађени су стари криптографски подаци", + "The platform you're on": "Платформа коју користите", + "The version of Riot.im": "Riot.im издање", + "Whether or not you're logged in (we don't record your user name)": "Стање ваше пријављености (не памтимо ваше корисничко име)", + "Your language of choice": "Ваш жељени језик", + "Which officially provided instance you are using, if any": "Коју званичну инстанцу користите, ако користите", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Да ли користите режим богатог текста у уређивачу богатог текста", + "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-а спадају:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Ако страница садржи поверљиве податке (као што је назив собе, корисника или ИБ-ја групе), ти подаци се уклањају пре слања на сервер.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "Корисник %(oldDisplayName)s је променио приказно име у %(displayName)s.", + "Failed to set direct chat tag": "Нисам успео да поставим ознаку директног ћаскања", + "Failed to remove tag %(tagName)s from room": "Нисам успео да скинем ознаку %(tagName)s са собе", + "Failed to add tag %(tagName)s to room": "Нисам успео да додам ознаку %(tagName)s на собу", + "In reply to ": "Као одговор за ", + "This room is not public. You will not be able to rejoin without an invite.": "Ова соба није јавна. Нећете моћи да поново приступите без позивнице.", + "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-а су нађени. Ово ће узроковати лош рад шифровања с краја на крај у старијем издању. Размењене поруке које су шифроване с краја на крај у старијем издању је можда немогуће дешифровати у овом издању. Такође, ово може узроковати неуспешно размењивање порука са овим издањем. Ако доживите проблеме, одјавите се и пријавите се поново. Да бисте задржали историјат поруке, извезите па поново увезите ваше кључеве.", + "Logout": "Одјава", + "Your Communities": "Ваше заједнице", + "Error whilst fetching joined communities": "Грешка приликом добављања списка са приступљеним заједницама", + "Create a new community": "Направи нову заједницу", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Направите заједницу да бисте спојили кориснике и собе! Направите прилагођену почетну страницу да бисте означили ваш кутак у Матрикс универзуму.", + "Join an existing community": "Приступи већ постојећој заједници", + "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Да бисте приступили већ постојећој заједници, морате знати њен идентификатор заједнице. Ово изгледа нешто као +primer:matrix.org.", + "You have no visible notifications": "Немате видљивих обавештења", + "Scroll to bottom of page": "Превуци на дно странице", + "Message not sent due to unknown devices being present": "Порука се неће послати због присутности непознатих уређаја", + "Show devices, send anyway or cancel.": "Прикажи уређаје, ипак пошаљи или откажи.", + "%(count)s of your messages have not been sent.|other": "Неке ваше поруке нису послате.", + "%(count)s of your messages have not been sent.|one": "Ваша порука није послата.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Пошаљи поново или откажи све сада. Такође можете изабрати појединачне поруке за поновно слање или отказивање.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Поново пошаљи поруку или откажи поруку сада.", + "Warning": "Упозорење", + "Connectivity to the server has been lost.": "Веза ка серверу је прекинута.", + "Sent messages will be stored until your connection has returned.": "Послате поруке биће сачуване док се веза не успостави поново.", + "%(count)s new messages|other": "%(count)s нових порука", + "%(count)s new messages|one": "%(count)s нова порука", + "Active call": "Текући позив", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Нема других чланова! Да ли желите да позовете друге или да склоните упозорење о празној соби?", + "You seem to be uploading files, are you sure you want to quit?": "Изгледа да отпремате датотеке. Да ли сте сигурни да желите изаћи?", + "You seem to be in a call, are you sure you want to quit?": "Изгледа да сте у позиву. Да ли сте сигурни да желите изаћи?", + "Failed to upload file": "Нисам успео да отпремим датотеку", + "Server may be unavailable, overloaded, or the file too big": "Сервер је можда недоступан, преоптерећен или је датотека сувише велика", + "Search failed": "Претрага је неуспешна", + "Server may be unavailable, overloaded, or search timed out :(": "Сервер је можда недоступан, преоптерећен или је истекло време претраживања :(", + "No more results": "Нема више резултата", + "Unknown room %(roomId)s": "Непозната соба %(roomId)s", + "Room": "Соба", + "Failed to save settings": "Нисам успео да сачувам подешавања", + "Failed to reject invite": "Нисам успео да одбацим позивницу", + "Fill screen": "Испуни екран", + "Click to unmute video": "Кликни да појачаш видео", + "Click to mute video": "Кликни да утишаш видео", + "Click to unmute audio": "Кликни да појачаш звук", + "Click to mute audio": "Кликни да утишаш звук", + "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.": "Покушао сам да учитам одређену тачку у временској линији ове собе али нисам могао да је нађем.", + "Failed to load timeline position": "Нисам могао да учитам позицију у временској линији", + "Uploading %(filename)s and %(count)s others|other": "Отпремам датотеку %(filename)s и још %(count)s других", + "Uploading %(filename)s and %(count)s others|zero": "Отпремам датотеку %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Отпремам датотеку %(filename)s и %(count)s других датотека", + "Light theme": "Светла тема", + "Dark theme": "Тамна тема", + "Status.im theme": "Status.im тема", + "Can't load user settings": "Не могу да учитам корисничка подешавања", + "Server may be unavailable or overloaded": "Сервер је недоступан или је преоптерећен", + "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.": "Зарад безбедности, одјава ће обрисати све кључеве за шифровање с краја на крај, на овом прегледачу. Ако желите да дешифрујете историјат вашег ћаскања из будућих Riot сесија, извезите ваше кључеве и чувајте их.", + "Failed to change password. Is your password correct?": "Нисам успео да променим лозинку. Да ли је ваша лозинка тачна?", + "Success": "Успех", + "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 %(threePid)s?": "Уклонити %(threePid)s?", + "Unable to remove contact information": "Не могу да уклоним контакт податке", + "Refer a friend to Riot:": "Кажите пријатељу за Riot:", + "Interface Language": "Језик интерфејса", + "User Interface": "Кориснички интерфејс", + "Autocomplete Delay (ms):": "Застој самодопуњавања (мс):", + "": "<није подржано>", + "Import E2E room keys": "Увези E2E кључеве собе", + "Cryptography": "Криптографија", + "Device ID:": "ИБ уређаја:", + "Device key:": "Кључ уређаја:", + "Ignored Users": "Занемарени корисници", + "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.": "Сазнајте више о нашем начину употребе аналитике.", + "Labs": "Лабораторије", + "These are experimental features that may break in unexpected ways": "Ово су пробне могућности које се могу поломити на непредвидљиве начине", + "Use with caution": "Опрезно користите", + "Deactivate my account": "Деактивирај мој налог", + "Clear Cache": "Очисти кеш", + "Clear Cache and Reload": "Очисти кеш и поново учитај", + "Updates": "Ажурирања", + "Check for update": "Провери да ли има ажурирања", + "Reject all %(invitedRooms)s invites": "Одбиј све позивнице за собе %(invitedRooms)s", + "Bulk Options": "Вишеструке опције", + "Desktop specific": "Само за стоне уређаје", + "Start automatically after system login": "Самостално покрећи након пријаве на систем", + "No media permissions": "Нема овлашћења за медије", + "You may need to manually permit Riot to access your microphone/webcam": "Можда ћете морати да ручно доделите овлашћења Riot-у за приступ микрофону/веб камери", + "Missing Media Permissions, click here to request.": "Недостају овлашћења за медије, кликните овде да затражите.", + "No Microphones detected": "Нема уочених микрофона", + "No Webcams detected": "Нема уочених веб камера", + "Default Device": "Подразумевани уређај", + "Microphone": "Микрофон", + "Camera": "Камера", + "VoIP": "VoIP", + "Email": "Мејл", + "Add email address": "Додај мејл адресу", + "Notifications": "Обавештења", + "Profile": "Профил", + "Display name": "Приказно име", + "Account": "Налог", + "To return to your account in future you need to set a password": "Да бисте се вратили у ваш налог у будућности, морате поставити лозинку", + "Logged in as:": "Пријављени као:", + "Access Token:": "Приступни жетон:", + "click to reveal": "кликни за приказ", + "Homeserver is": "Кућни сервер је", + "Identity Server is": "Идентитетски сервер је", + "matrix-react-sdk version:": "matrix-react-sdk издање:", + "riot-web version:": "riot-web издање:", + "olm version:": "olm издање:", + "Failed to send email": "Нисам успео да пошаљем мејл", + "The email address linked to your account must be entered.": "Морате унети мејл адресу која је везана за ваш налог.", + "A new password must be entered.": "Морате унети нову лозинку.", + "New passwords must match each other.": "Нове лозинке се морају подударати.", + "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.": "Опоравак ваше лозинке ће тренутно поново поставити кључеве за шифровање с краја на крај, на свим вашим уређајима. Ово ће учинити шифровани историјат ћаскања нечитљивим осим ако прво не извезете ваше кључеве собе па их онда увезете касније. Ово ће бити побољшано у будућности.", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Мејл је послат на адресу %(emailAddress)s. Када будете испратили везу у њему, кликните испод.", + "I have verified my email address": "Потврдио сам своју мејл адресу", + "Your password has been reset": "Ваша лозинка је опорављена", + "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": "Одјављени сте са свих ваших уређаја и више нећете примати пуш обавештења. Да бисте поново омогућили обавештења, одјавите се и пријавите поново на сваком вашем уређају", + "Return to login screen": "Врати ме на екран за пријаву", + "To reset your password, enter the email address linked to your account": "Да бисте опоравили вашу лозинку, унесите мејл адресу повезану са вашим налогом", + "New password": "Нова лозинка", + "Confirm your new password": "Потврдите вашу нову лозинку", + "Send Reset Email": "Пошаљи мејл за опоравак", + "Create an account": "Направи налог", + "This Home Server does not support login using email address.": "Овај кућни сервер не подржава пријављивање преко мејл адресе.", + "Incorrect username and/or password.": "Нетачно корисничко име и/или лозинка.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Знајте да се пријављујете на сервер %(hs)s, не на matrix.org.", + "Guest access is disabled on this Home Server.": "Гостински приступ је онемогућен на овом кућном серверу.", + "The phone number entered looks invalid": "Унети број телефона не изгледа исправно", + "This homeserver doesn't offer any login flows which are supported by this client.": "Овај кућни сервер не пружа било који начин пријаве унутар овог клијента.", + "Error: Problem communicating with the given homeserver.": "Грешка: проблем у комуницирању са датим кућним сервером.", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Не могу да се повежем на кућни сервер преко HTTP-а када се користи HTTPS адреса у траци вашег прегледача. Или користите HTTPS или омогућите небезбедне скрипте.", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Не могу да се повежем на кућни сервер. Проверите вашу интернет везу, постарајте се да верујете SSL сертификату кућног сервера и да проширење прегледача не блокира захтеве.", + "Login as guest": "Пријави се као гост", + "Sign in to get started": "Пријави се да почнеш", + "Failed to fetch avatar URL": "Нисам успео да добавим адресу аватара", + "Set a display name:": "Постави приказно име:", + "Upload an avatar:": "Отпреми аватар:", + "This server does not support authentication with a phone number.": "Овај сервер не подржава идентификацију преко броја мобилног.", + "Missing password.": "Недостаје лозинка.", + "Passwords don't match.": "Лозинке се не подударају.", + "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Лозинка је сувише кратка (најмање %(MIN_PASSWORD_LENGTH)s).", + "This doesn't look like a valid email address.": "Мејл адреса не изгледа исправно.", + "This doesn't look like a valid phone number.": "Број телефона не изгледа исправно.", + "You need to enter a user name.": "Морате унети корисничко име.", + "An unknown error occurred.": "Непозната грешка се догодила.", + "I already have an account": "Већ имам налог", + "Displays action": "Приказује радњу", + "Bans user with given id": "Забрањује приступ кориснику са датим иб-јем", + "Unbans user with given id": "Скида забрану приступа кориснику са датим иб-јем", + "Define the power level of a user": "Дефинише ниво моћи корисника", + "Deops user with given id": "Укида админа за корисника са датим иб-јем", + "Invites user with given id to current room": "Позива корисника са датим иб-јем у тренутну собу", + "Joins room with given alias": "Приступа соби са датим алијасем", + "Sets the room topic": "Поставља тему собе", + "Kicks user with given id": "Избацује корисника са датим иб-јем", + "Changes your display nickname": "Мења ваш приказни надимак", + "Searches DuckDuckGo for results": "Претражује DuckDuckGo за резултате", + "Changes colour scheme of current room": "Мења шему боје у тренутној соби", + "Verifies a user, device, and pubkey tuple": "Проверава корисника, уређај и торку јавног кључа", + "Ignores a user, hiding their messages from you": "Занемарује корисника и тиме скрива њихове поруке од вас", + "Stops ignoring a user, showing their messages going forward": "Престаје са занемаривањем корисника и тиме приказује њихове поруке одсад", + "Commands": "Наредбе", + "Results from DuckDuckGo": "Резултати са DuckDuckGo-а", + "Emoji": "Емоџи", + "Notify the whole room": "Обавести све у соби", + "Room Notification": "Собно обавештење", + "Users": "Корисници", + "unknown device": "непознати уређај", + "NOT verified": "НИЈЕ проверен", + "verified": "проверен", + "Verification": "Провера", + "Ed25519 fingerprint": "Ed25519 отисак прста", + "User ID": "Кориснички ИБ", + "Curve25519 identity key": "Curve25519 идентитески кључ", + "none": "ништа", + "Claimed Ed25519 fingerprint key": "Наводни Ed25519 кључ отиска прста", + "Algorithm": "Алгоритам", + "unencrypted": "нешифрован", + "Decryption error": "Грешка дешифровања", + "Session ID": "ИБ сесије", + "End-to-end encryption information": "Подаци о шифровању с краја на крај", + "Event information": "Подаци о догађају", + "Sender device information": "Подаци о уређају пошиљаоца", + "Passphrases must match": "Фразе се морају подударати", + "Passphrase must not be empty": "Фразе не смеју бити празне", + "Export room keys": "Извези кључеве собе", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Ова радња вам омогућава да извезете кључеве за примљене поруке у шифрованим собама у локалну датотеку. Онда ћете моћи да увезете датотеку у други Матрикс клијент, у будућности, тако да ће тај клијент моћи да дешифрује ове поруке.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Извезена датотека ће дозволити свима који је могу прочитати да дешифрују било које шифроване поруке које можете видети те бисте требали да будете пажљиви и да је осигурате. Да бисмо вам помогли са тиме, требало би да унесете фразу испод са којом ће извезени подаци бити шифровани. Поновни увоз података ће бити могућ само уз коришћење исте фразе.", + "Enter passphrase": "Унеси фразу", + "Confirm passphrase": "Потврди фразу", + "Export": "Извези", + "Import room keys": "Увези кључеве собе", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Ова радња вам омогућава да увезете кључеве за шифровање које сте претходно извезли из другог Матрикс клијента. Након тога ћете моћи да дешифрујете било коју поруку коју је други клијент могао да дешифрује.", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Извезена датотека ће бити заштићена са фразом. Требало би да унесете фразу овде, да бисте дешифровали датотеку.", + "File to import": "Датотека за увоз", + "Import": "Увези", + "Disable Community Filter Panel": "Онемогући површ за филтрирање заједнице", + "Did you know: you can use communities to filter your Riot.im experience!": "Да ли сте знали: можете користити заједнице за филтрирање вашег Riot.im искуства!", + "Clear filter": "Очисти филтер", + "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.": "Захтеви за дељење кључа се самостално шаљу на остале ваше уређаје. Ако сте одбили или одбацили захтев за дељење кључа на неком другом вашем уређају, кликните овде да бисте затражили поново кључеве за ову сесију.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Ако остали ваши уређаји немају кључ за ову поруку, нећете моћи да је дешифрујете.", + "Key request sent.": "Захтев за дељење кључа послат.", + "Re-request encryption keys from your other devices.": "Поново затражи кључеве за шифровање са осталих ваших уређаја.", + "%(user)s is a %(userRole)s": "Корисник %(user)s је у улози %(userRole)s", + "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Да бисте поставили филтер, повуците аватар заједнице на површ филтрирања скроз на леву страну екрана. Можете кликнути на аватар у површи филтрирања било када да бисте видели само собе и особе везане за ту заједницу.", + "Fetching third party location failed": "Добављање локације треће стране није успело", + "A new version of Riot is available.": "Ново издање RIot-а је доступно.", + "Couldn't load home page": "Нисам могао да учитам почетну страну", + "Send Account Data": "Пошаљи податке налога", + "All notifications are currently disabled for all targets.": "Сва обавештења су тренутно онемогућена за све циљеве.", + "Uploading report": "Отпремам извештај", + "Sunday": "Недеља", + "Notification targets": "Циљеви обавештења", + "Today": "Данас", + "Files": "Датотеке", + "You are not receiving desktop notifications": "Не примате стона обавештења", + "Friday": "Петак", + "Update": "Ажурирај", + "Unable to fetch notification target list": "Не могу да досегнем списак циљева за обавештења", + "Add an email address above to configure email notifications": "Додајте мејл адресу изнад да бисте подесили мејл обавештења", + "Expand panel": "Прошири површ", + "On": "Укључено", + "%(count)s Members|other": "%(count)s чланова", + "Filter room names": "Филтрирај називе соба", + "Changelog": "Записник о изменама", + "Waiting for response from server": "Чекам на одговор са сервера", + "Uploaded on %(date)s by %(user)s": "Отпремљено датума %(date)s од корисника %(user)s", + "Send Custom Event": "Пошаљи прилагођени догађај", + "Off": "Искључено", + "Advanced notification settings": "Напредна подешавања обавештења", + "delete the alias.": "обриши алијас.", + "To return to your account in future you need to set a password": "Да бисте се вратили на ваш налог у будућности, морате поставити лозинку", + "Forget": "Заборави", + "Hide panel": "Сакриј површ", + "You cannot delete this image. (%(code)s)": "Не можете обрисати ову слику. (%(code)s)", + "Cancel Sending": "Откажи слање", + "This Room": "Ова соба", + "The Home Server may be too old to support third party networks": "Кућни сервер је можда сувише застарео да би подржао мреже трећих страна", + "Room not found": "Соба није пронађена", + "Downloading update...": "Преузимам ажурирање...", + "Messages in one-to-one chats": "Поруке у један-на-један ћаскањима", + "Unavailable": "Недоступан", + "View Decrypted Source": "Погледај дешифровани извор", + "Failed to update keywords": "Нисам успео да ажурирам кључне речи", + "remove %(name)s from the directory.": "уклони %(name)s из фасцикле.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Обавештења за следеће кључне речи прате правила која не могу бити приказана овде:", + "Safari and Opera work too.": "Сафари и Опера такође раде.", + "Please set a password!": "Поставите лозинку!", + "You have successfully set a password!": "Успешно сте поставили лозинку!", + "Explore Room State": "Истражи стање собе", + "Source URL": "Адреса извора", + "Messages sent by bot": "Поруке послате од бота", + "Filter results": "Филтрирај резултате", + "Members": "Чланови", + "No update available.": "Нема нових ажурирања.", + "Noisy": "Бучно", + "Failed to get protocol list from Home Server": "Нисам успео да добијем списак протокола од кућног сервера", + "Collecting app version information": "Прикупљам податке о издању апликације", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Обрисати алијас собе %(alias)s и уклонити %(name)s из фасцикле?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Ово ће вам омогућити да се вратите у ваш налог након што се одјавите и пријавите, на другим уређајима.", + "Keywords": "Кључне речи", + "Enable notifications for this account": "Омогући обавештења за овај налог", + "Directory": "Фасцикла", + "Invite to this community": "Позови у ову заједницу", + "Failed to get public room list": "Нисам успео да добавим списак јавних соба", + "Search…": "Претрага…", + "Messages containing keywords": "Поруке које садрже кључне речи", + "Error saving email notification preferences": "Грешка при чувању поставки мејл обавештења", + "Tuesday": "Уторак", + "Enter keywords separated by a comma:": "Унесите кључне речи одвојене зарезима:", + "Forward Message": "Проследи поруку", + "Remove %(name)s from the directory?": "Уклонити %(name)s из фасцикле?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot користи напредне могућности прегледача од којих неке нису доступне или су у пробној фази, у вашем прегледачу.", + "Event sent!": "Догађај је послат!", + "Explore Account Data": "Истражи податке налога", + "All messages (noisy)": "Све поруке (гласно)", + "Saturday": "Субота", + "Remember, you can always set an email address in user settings if you change your mind.": "Запамтите, увек можете поставити мејл адресу у корисничким подешавањима, уколико се предомислите.", + "Direct Chat": "Директно ћаскање", + "The server may be unavailable or overloaded": "Сервер је можда недоступан или преоптерећен", + "Reject": "Одбаци", + "Failed to set Direct Message status of room": "Нисам успео да подесим стање директне поруке собе", + "Monday": "Понедељак", + "Remove from Directory": "Уклони из фасцикле", + "Enable them now": "Омогућите их сада", + "Messages containing my user name": "Поруке које садрже моје корисничко име", + "Toolbox": "Алатница", + "Collecting logs": "Прикупљам записнике", + "more": "више", + "Search for a room": "Потражи собу", + "You must specify an event type!": "Морате навести врсту догађаја!", + "(HTTP status %(httpStatus)s)": "(HTTP стање %(httpStatus)s)", + "All Rooms": "Све собе", + "State Key": "Кључ стања", + "Please install Chrome or Firefox for the best experience.": "Инсталирајте Хром (Chrome) или Фајерфокс (Firefox) за најбољи угођај.", + "Wednesday": "Среда", + "Send logs": "Пошаљи записнике", + "All messages": "Све поруке", + "Call invitation": "Позивница за позив", + "Messages containing my display name": "Поруке које садрже моје приказно име", + "You have successfully set a password and an email address!": "Успешно сте поставили лозинку и мејл адресу!", + "Failed to send custom event.": "Нисам успео да пошаљем прилагођени догађај.", + "What's new?": "Шта је ново?", + "Notify me for anything else": "Обавести ме за било шта друго", + "When I'm invited to a room": "Када сам позван у собу", + "Can't update user notification settings": "Не могу да ажурирам корисничка подешавања обавештења", + "Notify for all other messages/rooms": "Обавести за све друге поруке и собе", + "Unable to look up room ID from server": "Не могу да погледам ИБ собе на серверу", + "Couldn't find a matching Matrix room": "Не могу да нађем одговарајућу Матрикс собу", + "Invite to this room": "Позови у ову собу", + "You cannot delete this message. (%(code)s)": "Не можете обрисати ову поруку. (%(code)s)", + "Thursday": "Четвртак", + "I understand the risks and wish to continue": "Разумем опасност и желим да наставим", + "Back": "Назад", + "Reply": "Одговори", + "Show message in desktop notification": "Прикажи поруку у стоном обавештењу", + "Unhide Preview": "Откриј преглед", + "Unable to join network": "Не могу да приступим мрежи", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Можда сте их подесили у неком другом клијенту а не Riot-у. Не можете их преправљати у Riot-у али се и даље примењују", + "Sorry, your browser is not able to run Riot.": "Нажалост, ваш прегледач не може да покреће Riot.", + "Messages in group chats": "Поруке у групним ћаскањима", + "Yesterday": "Јуче", + "Error encountered (%(errorDetail)s).": "Догодила се грешка (%(errorDetail)s).", + "Event Type": "Врста догађаја", + "Low Priority": "Најмања важност", + "What's New": "Шта је ново", + "Set Password": "Постави лозинку", + "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": "Постоје напредна обавештења која нису приказана овде", + "Your User Agent": "Ваш кориснички агент", + "Every page you use in the app": "Свака страница коју будете користили у апликацији", + "e.g. ": "Нпр.: ", + "Your device resolution": "Резолуција вашег уређаја", + "Popout widget": "Виџет за искакање", + "Missing roomId.": "Недостаје roomId.", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Видео корисник %(displayName)s (%(userName)s) у %(dateTime)s", + "You don't currently have any stickerpacks enabled": "Тренутно немате омогућено било које паковање са налепницама", + "Add a stickerpack": "Додај паковање са налепницама", + "Stickerpack": "Паковање са налепницама", + "Hide Stickers": "Сакриј налепнице", + "Show Stickers": "Прикажи налепнице", + "Code": "Код", + "Picture": "Слика", + "Preparing to send logs": "Припремам се за слање записника", + "Logs sent": "Записници су послати", + "Failed to send 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.": "Записници за поправљање грешака садрже податке о коришћењу апликације међу којима се налази ваше корисничко име, ИБ-јеви или алијаси посећених соба или група и корисничка имена других корисника. Не садрже саме поруке.", + "GitHub issue link:": "Веза до проблема на Гитхабу:", + "Notes:": "Напомене:", + "Unable to join community": "Не могу да приступим заједници", + "Unable to leave community": "Не могу да напустим заједницу", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Измене које сте начинили у имену ваше заједнице и на аватару можда неће бити видљиве другим корисницима највише 30 минута.", + "Join this community": "Приступи овој заједници", + "Leave this community": "Напусти ову заједницу", + "Who can join this community?": "Ко може приступити овој заједници?", + "Everyone": "Свако", + "Debug Logs Submission": "Слање извештаја за поправљање грешака", + "Opens the Developer Tools dialog": "Отвори прозор програмерских алатки", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Ако сте пријавили грешку преко Гитхаба, извештаји за поправљање грешака нам могу помоћи да лакше нађемо узрок. Извештаји садрже податке о коришћењу апликације и међу њих спада ваше корисничко име, ИБ-јеви или алијаси посећених соба или група и корисничка имена других корисника. Не садрже саме поруке.", + "Always show encryption icons": "Увек прикажи иконице шифровања", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Грешке у Riot-у се прате на Гитхабу: направите Гитхаб проблем.", + "Log out and remove encryption keys?": "Желите да се одјавите и уклоните кључеве за шифровање?", + "Send Logs": "Пошаљи записнике", + "Clear Storage and Sign Out": "Очисти складиште и одјави ме", + "Refresh": "Освежи", + "We encountered an error trying to restore your previous session.": "Наишли смо на грешку приликом повраћаја ваше претходне сесије.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Чишћење складишта вашег прегледача може решити проблем али ће вас то одјавити и учинити шифровани историјат ћаскања нечитљивим." } diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 59e9d2a899..5a4c247c47 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -10,16 +10,16 @@ "VoIP": "VoIP", "Missing Media Permissions, click here to request.": "Saknar mediebehörigheter, klicka för att begära.", "No Microphones detected": "Ingen mikrofon hittades", - "No Webcams detected": "Ingen kamera hittades", + "No Webcams detected": "Ingen webbkamera hittades", "No media permissions": "Inga mediebehörigheter", "You may need to manually permit Riot to access your microphone/webcam": "Du måste manuellt tillåta Riot att komma åt din mikrofon/kamera", "Default Device": "Standardenhet", "Microphone": "Mikrofon", "Camera": "Kamera", - "Advanced": "Avancerad", + "Advanced": "Avancerat", "Algorithm": "Algoritm", "Always show message timestamps": "Visa alltid tidsstämpel för meddelanden", - "Hide removed messages": "Göm raderade meddelanden", + "Hide removed messages": "Dölj borttagna meddelanden", "Authentication": "Autentisering", "%(items)s and %(lastItem)s": "%(items)s och %(lastItem)s", "and %(count)s others...|other": "och %(count)s andra...", @@ -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", @@ -48,7 +47,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Det går inte att ansluta till en hemserver via HTTP då adressen i webbläsaren är HTTPS. Använd HTTPS, eller sätt på osäkra skript.", "Can't load user settings": "Det gick inte att ladda användarinställningar", "Change Password": "Byt lösenord", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s bytte namn från %(oldDisplayName)s till %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s bytte sin profilbild.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s bytte rummets namn till %(roomName)s.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s tog bort rummets namn.", @@ -149,7 +147,7 @@ "Access Token:": "Åtkomsttoken:", "Active call (%(roomName)s)": "Aktiv samtal (%(roomName)s)", "Add": "Lägg till", - "Admin Tools": "Admin verktyg", + "Admin Tools": "Admin-verktyg", "Alias (optional)": "Alias (valfri)", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Det gick inte att ansluta till servern - kontrollera anslutningen, försäkra att din hemservers TLS-certifikat är betrott, och att inget webbläsartillägg blockerar förfrågningar.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ändrade maktnivån av %(powerLevelDiffText)s.", @@ -179,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.", @@ -271,7 +268,6 @@ "Once encryption is enabled for a room it cannot be turned off again (for now)": "När kryptering aktiveras i ett rum kan det inte deaktiveras (tills vidare)", "Only people who have been invited": "Endast inbjudna", "Operation failed": "Handlingen misslyckades", - "Otherwise, click here to send a bug report.": "Annars kan du klicka här för att skicka en buggrapport.", "Password": "Lösenord", "Password:": "Lösenord:", "Passwords can't be empty": "Lösenorden kan inte vara tomma", @@ -302,10 +298,9 @@ "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", + "Return to login screen": "Tillbaka till login-skärmen", "Riot does not have permission to send you notifications - please check your browser settings": "Riot har inte tillstånd att skicka aviseringar - kontrollera webbläsarens inställningar", "Riot was not given permission to send notifications - please try again": "Riot fick inte tillstånd att skicka aviseringar - försök igen", "riot-web version:": "riot-web -version:", @@ -365,16 +360,14 @@ "Delete widget": "Ta bort widget", "Define the power level of a user": "Definiera anseende för en användare", "Do you want to load widget from URL:": "Vill du ladda widgeten från URL:", - "Edit": "Redigera", + "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", @@ -383,8 +376,380 @@ "The phone number entered looks invalid": "Telefonnumret ser felaktigt ut", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Signeringsnyckeln du angav matchar signeringsnyckeln som mottogs från enheten %(deviceId)s som tillhör %(userId)s. Enheten är markerad som verifierad.", "This email address is already in use": "Den här epostadressen är redan i bruk", - "This email address was not found": "Den här epostadressen fanns inte", + "This email address was not found": "Den här epostadressen finns inte", "The email address linked to your account must be entered.": "Epostadressen som är kopplad till ditt konto måste anges.", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Filen '%(fileName)s' överskrider serverns största tillåtna filstorlek", - "The file '%(fileName)s' failed to upload": "Filen '%(fileName)s' kunde inte laddas upp" + "The file '%(fileName)s' failed to upload": "Filen '%(fileName)s' kunde inte laddas upp", + "Online": "Aktiv", + "Unnamed room": "Namnlöst rum", + "World readable": "Alla kan läsa", + "Guests can join": "Gäster kan bli medlem i rummet", + "No rooms to show": "Inga fler rum att visa", + "This phone number is already in use": "Detta telefonnummer är redan i bruk", + "The version of Riot.im": "Versionen av Riot.im", + "Call Failed": "Samtal misslyckades", + "Call Anyway": "Ring ändå", + "Call": "Ring", + "Answer": "Svara", + "You are already in a call.": "Du är redan i ett samtal.", + "You cannot place a call with yourself.": "Du kan inte ringa till dig själv.", + "Warning!": "Varning!", + "Upload Failed": "Uppladdning misslyckades", + "Sun": "Sön", + "Mon": "Mån", + "Tue": "Tis", + "Wed": "Ons", + "Thu": "Tors", + "Fri": "Fre", + "Sat": "Lör", + "Jan": "Jan", + "Feb": "Feb", + "Mar": "Mar", + "Apr": "Apr", + "May": "Maj", + "Jun": "Jun", + "Jul": "Juli", + "Aug": "Aug", + "Sep": "Sep", + "Oct": "Okt", + "Nov": "Nov", + "Dec": "Dec", + "Name or matrix ID": "Namn eller matrix ID", + "Invite to Community": "", + "Unable to enable Notifications": "Det går inte att aktivera Notifieringar", + "Failed to invite user": "Misslyckades med att bjuda in användaren", + "The information being sent to us to help make Riot.im better includes:": "Informationen som skickas till oss för att hjälpa Riot.im att bli bättre inkluderar:", + "Review Devices": "Granska enheter", + "Answer Anyway": "Svara ändå", + "VoIP is unsupported": "VoIP stöds ej", + "Who would you like to add to this room?": "Vem vill du lägga till i det här rummet?", + "Failed to invite": "Misslyckades med att bjuda in", + "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.", + "Fetching third party location failed": "Det gick inte att hämta platsdata från tredje part", + "A new version of Riot is available.": "En ny version av Riot är tillgänglig.", + "Couldn't load home page": "Kunde inte ladda startsidan", + "All notifications are currently disabled for all targets.": "Alla aviseringar är för tillfället avstängda för alla mål.", + "Uploading report": "Laddar upp rapport", + "Sunday": "söndag", + "Messages sent by bot": "Meddelanden från bottar", + "Notification targets": "Aviseringsmål", + "Failed to set direct chat tag": "Det gick inte att markera rummet som direkt chatt", + "Today": "idag", + "Failed to get protocol list from Home Server": "Det gick inte att hämta protokollistan från hemservern", + "You are not receiving desktop notifications": "Du får inte skrivbordsaviseringar", + "Friday": "fredag", + "Update": "Uppdatera", + "What's New": "Vad är nytt", + "Add an email address above to configure email notifications": "Lägg till en epostadress här för att konfigurera epostaviseringar", + "Expand panel": "Öppna panel", + "On": "På", + "%(count)s Members|other": "%(count)s 1 Medlemmar", + "Filter room names": "Filtrera rumsnamn", + "Changelog": "Ändringslogg", + "Waiting for response from server": "Väntar på svar från servern", + "Leave": "Lämna", + "Uploaded on %(date)s by %(user)s": "%(user)s laddade upp %(date)s", + "Advanced notification settings": "Avancerade aviseringsinställingar", + "delete the alias.": "radera adressen.", + "To return to your account in future you need to set a password": "För att återgå till ditt konto i framtiden måste du välja ett lösenord", + "Forget": "Glöm bort", + "#example": "#exempel", + "Hide panel": "Göm panel", + "You cannot delete this image. (%(code)s)": "Du kan inte radera den här bilden. (%(code)s)", + "Cancel Sending": "Avbryt sändning", + "Warning": "Varning", + "This Room": "Det här rummet", + "The Home Server may be too old to support third party networks": "Hemservern kan vara för gammal för stöda tredje parters nätverk", + "Noisy": "Högljudd", + "Room not found": "Rummet hittades inte", + "Messages containing my display name": "Meddelanden som innehåller mitt namn", + "Messages in one-to-one chats": "Meddelanden i privata chattar", + "Unavailable": "Inte tillgänglig", + "View Decrypted Source": "Visa dekrypterad källa", + "Failed to update keywords": "Det gick inte att uppdatera nyckelorden", + "remove %(name)s from the directory.": "ta bort %(name)s från katalogen.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Aviseringar för följande nyckelord följer regler som inte kan visas här:", + "Please set a password!": "Vänligen välj ett lösenord!", + "You have successfully set a password!": "Du har valt ett nytt lösenord!", + "An error occurred whilst saving your email notification preferences.": "Ett fel uppstod då epostaviseringsinställningarna sparades.", + "Explore Room State": "Utforska rumläget", + "Source URL": "Käll-URL", + "Failed to add tag %(tagName)s to room": "Det gick inte att lägga till \"%(tagName)s\" till rummet", + "Filter results": "Filtrera resultaten", + "Members": "Medlemmar", + "No update available.": "Ingen uppdatering tillgänglig.", + "Resend": "Sänd igen", + "Files": "Filer", + "Collecting app version information": "Samlar in appversionsinformation", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Radera rumsadressen %(alias)s och ta bort %(name)s från katalogen?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Detta kommer tillåta dig att återgå till ditt konto efter att ha loggat ut, och logga in på andra enheter.", + "Keywords": "Nyckelord", + "Enable notifications for this account": "Sätt på aviseringar för det här kontot", + "Directory": "Katalog", + "Failed to get public room list": "Det gick inte att hämta listan över offentliga rum", + "Messages containing keywords": "Meddelanden som innehåller nyckelord", + "Error saving email notification preferences": "Ett fel uppstod då epostaviseringsinställningarna sparades", + "Tuesday": "tisdag", + "Enter keywords separated by a comma:": "Skriv in nyckelord, separerade med kommatecken:", + "Search…": "Sök…", + "Remove %(name)s from the directory?": "Ta bort %(name)s från katalogen?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot använder flera avancerade webbläsaregenskaper, av vilka alla inte stöds eller är experimentella i din nuvarande webbläsare.", + "Enable desktop notifications": "Sätt på skrivbordsaviseringar", + "Remember, you can always set an email address in user settings if you change your mind.": "Kom ihåg att du alltid kan välja en e-postadress i dina användarinställningar om du ändrar dig.", + "All messages (noisy)": "Alla meddelanden (högljudd)", + "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", + "(HTTP status %(httpStatus)s)": "(HTTP-status %(httpStatus)s)", + "All Rooms": "Alla rum", + "Wednesday": "onsdag", + "You cannot delete this message. (%(code)s)": "Du kan inte radera det här meddelandet. (%(code)s)", + "Send": "Sänd", + "Send logs": "Sänd loggar", + "All messages": "Alla meddelanden", + "Call invitation": "Inbjudan till samtal", + "Downloading update...": "Laddar ned uppdatering...", + "You have successfully set a password and an email address!": "Du har framgångsrikt valt ett lösenord och en e-postadress!", + "What's new?": "Vad är nytt?", + "Notify me for anything else": "Avisera för allt annat", + "When I'm invited to a room": "När jag bjuds in till ett rum", + "Can't update user notification settings": "Kan inte uppdatera aviseringsinställningarna", + "Notify for all other messages/rooms": "Avisera för alla andra meddelanden/rum", + "Unable to look up room ID from server": "Det gick inte att hämta rums-ID:t från servern", + "Couldn't find a matching Matrix room": "Kunde inte hitta ett matchande Matrix-rum", + "Invite to this room": "Bjud in i rummet", + "Search for a room": "Sök efter rum", + "Thursday": "torsdag", + "Forward Message": "Vidarebefordra meddelande", + "Back": "Tillbaka", + "Reply": "Svara", + "Show message in desktop notification": "Visa meddelande i skrivbordsavisering", + "Unhide Preview": "Visa förhandsvisning", + "Unable to join network": "Det gick inte att ansluta till nätverket", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du kan ha konfigurerat dem i en annan klient än Riot. Du kan inte ändra dem i Riot men de tillämpas ändå", + "Sorry, your browser is not able to run Riot.": "Beklagar, din webbläsare kan inte köra Riot.", + "Messages in group chats": "Meddelanden i gruppchattar", + "Yesterday": "igår", + "Error encountered (%(errorDetail)s).": "Fel påträffat (%(errorDetail)s).", + "Low Priority": "Låg prioritet", + "Unable to fetch notification target list": "Det gick inte att hämta aviseringsmållistan", + "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", + "Who can access this room?": "Vilka kan komma åt detta rum?", + "Who can read history?": "Vilka kan läsa historik?", + "Members only (since the point in time of selecting this option)": "Endast medlemmar (från tidpunkten för när denna inställning valdes)", + "Members only (since they were invited)": "Endast medlemmar (från när de blev inbjudna)", + "Members only (since they joined)": "Endast medlemmar (från när de gick med)", + "This room's internal ID is": "Rummets interna ID är", + "Addresses": "Adresser", + "This room has no local addresses": "Det här rummet har inga lokala adresser", + "Updates": "Uppdateringar", + "Check for update": "Leta efter uppdatering", + "Your language of choice": "Ditt valda språk", + "The platform you're on": "Plattformen du använder", + "Whether or not you're logged in (we don't record your user name)": "Om du är inloggad eller inte (vi sparar inte ditt användarnamn)", + "Your homeserver's URL": "Din hemservers URL", + "Your identity server's URL": "Din identitetsservers URL", + "Every page you use in the app": "Varje sida du använder i appen", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Om du använder Richtext-läget i Rich-Text-editorn eller inte", + "e.g. ": "t.ex. ", + "Your User Agent": "Din användaragent", + "Your device resolution": "Din enhetsupplösning", + "You cannot place VoIP calls in this browser.": "Du kan inte ringa VoIP-samtal i den här webbläsaren.", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Din epostadress verkar inte vara kopplad till något Matrix-ID på den här hemservern.", + "Restricted": "Begränsad", + "Who would you like to communicate with?": "Vem vill du kommunicera med?", + "Failed to invite the following users to the %(roomName)s room:": "Misslyckades med att bjuda in följande användare till %(roomName)s-rummet:", + "Unable to create widget.": "Det går inte att skapa widget.", + "Ignored user": "Ignorerad användare", + "You are now ignoring %(userId)s": "Du ignorerar nu %(userId)s", + "Unignored user": "Oignorerad användare", + "You are no longer ignoring %(userId)s": "Du ignorerar inte längre %(userId)s", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s bytte sitt visningsnamn till %(displayName)s.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s avbannade %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s drog tillbaka inbjudan för %(targetName)s.", + "(no answer)": "(inget svar)", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s-widget har modifierats av %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-widget har lagts till av %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s-widget har tagits bort av %(senderName)s", + "%(names)s and %(count)s others are typing|other": "%(names)s och %(count)s andra skriver", + "%(names)s and %(count)s others are typing|one": "%(names)s och en till skriver", + "Unnamed Room": "Namnlöst rum", + "Your browser does not support the required cryptography extensions": "Din webbläsare stödjer inte nödvändiga kryptografitillägg", + "Invite": "Bjud in", + "Unignore": "Ignorera inte", + "Ignore": "Ignorera", + "Jump to message": "Hoppa till meddelande", + "Mention": "Nämn", + "Make Moderator": "Gör till moderator", + "Upload Files": "Ladda upp filer", + "Unencrypted room": "Okrypterat rum", + "Voice call": "Röstsamtal", + "Video call": "Videosamtal", + "Upload file": "Ladda upp fil", + "Send an encrypted reply…": "Skicka ett krypterat svar…", + "Send a reply (unencrypted)…": "Skicka ett svar (okrypterat)…", + "Send an encrypted message…": "Skicka ett krypterat meddelande…", + "Send a message (unencrypted)…": "Skicka ett meddelande (okrypterat)…", + "You do not have permission to post to this room": "Du har inte behörighet att posta till detta rum", + "Turn Markdown on": "Sätt på Markdown", + "Turn Markdown off": "Stäng av Markdown", + "Unable to reply": "Det gick inte att svara", + "bold": "fet", + "italic": "kursiv", + "strike": "genomstruken", + "underline": "understruken", + "code": "kod", + "quote": "citat", + "bullet": "punkter", + "numbullet": "numrering", + "Loading...": "Laddar...", + "%(duration)ss": "%(duration)s", + "%(duration)sm": "%(duration)sm", + "%(duration)sh": "%(duration)sh", + "%(duration)sd": "%(duration)sd", + "Online for %(duration)s": "Aktiv i %(duration)s", + "Idle for %(duration)s": "Inaktiv i %(duration)s", + "Offline for %(duration)s": "Offline i %(duration)s", + "Idle": "Inaktiv", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Sedd av %(displayName)s (%(userName)s) %(dateTime)s", + "Offline": "Offline", + "(~%(count)s results)|other": "(~%(count)s resultat)", + "(~%(count)s results)|one": "(~%(count)s resultat)", + "Upload avatar": "Ladda upp profilbild", + "Remove avatar": "Ta bort profilbild", + "This invitation was sent to an email address which is not associated with this account:": "Den här inbjudan skickades till en epostadress som inte är kopplad till detta konto:", + "To link to a room it must have an address.": "För att länka till ett rum behöver det en adress.", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nivå %(powerLevelNumber)s)", + "Unknown Address": "Okänd adress", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s har gått med %(count)s gånger", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sgick med", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s har gått med %(count)s gånger", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)sgick med", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)shar lämnat %(count)s gånger", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)slämnade", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)shar lämnat %(count)s gånger", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)slämnade", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)shar gått med och lämnat %(count)s gånger", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)shar gått med och lämnat", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)shar gått med och lämnat %(count)s gånger", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)shar gått med och lämnat", + "And %(count)s more...|other": "Och %(count)s till...", + "ex. @bob:example.com": "t.ex. @kalle:exempel.com", + "Add User": "Lägg till användare", + "Matrix ID": "Matrix-ID", + "Matrix Room ID": "Matrix-rums-ID", + "email address": "epostadress", + "Try using one of the following valid address types: %(validTypesList)s.": "Prova att använda någon av följande giltiga adresstyper: %(validTypesList)s.", + "You have entered an invalid address.": "Du har angett en ogiltig adress.", + "Preparing to send logs": "Förbereder att skicka loggar", + "Logs sent": "Loggar skickade", + "Failed to send logs: ": "Det gick inte att skicka loggar: ", + "Submit debug logs": "Skicka felsökningsloggar", + "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.": "Felsökningsloggar innehåller användningsdata för applikationen inklusive ditt användarnamn, ID:n eller alias för de rum och grupper du har besökt och användarnamn för andra användare. De innehåller inte meddelanden.", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Riot-buggar hanteras på GitHub: skapa en GitHub-issue.", + "GitHub issue link:": "Länk till GitHub-issue:", + "Notes:": "Noteringar:", + "Start new chat": "Starta ny chatt", + "Default server": "Standardserver", + "Custom server": "Anpassad server", + "Home server URL": "Hemserver-URL", + "Identity server URL": "Identitetsserver-URL", + "What does this mean?": "Vad betyder det här?", + "User name": "Användarnamn", + "Username on %(hs)s": "Användarnamn på %(hs)s", + "An email has been sent to %(emailAddress)s": "Ett epostmeddelande har skickats till %(emailAddress)s", + "To continue, please enter your password.": "För att fortsätta, vänligen ange ditt lösenord.", + "Please check your email to continue registration.": "Vänligen kolla din epost för att fortsätta registreringen.", + "Token incorrect": "Ogiltig token", + "A text message has been sent to %(msisdn)s": "Ett textmeddelande har skickats till %(msisdn)s", + "Please enter the code it contains:": "Vänligen ange koden det innehåller:", + "Code": "Kod", + "I already have an account": "Jag har redan ett konto", + "Sign in to get started": "Logga in för att komma igång", + "Set a display name:": "Ange ett visningsnamn:", + "Upload an avatar:": "Ladda upp en avatar:", + "This server does not support authentication with a phone number.": "Denna server har inte support för autentisering via telefonnummer.", + "Missing password.": "Lösenord saknas.", + "Passwords don't match.": "Lösenorden matchar inte.", + "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Lösenordet är för kort (min %(MIN_PASSWORD_LENGTH)s).", + "This doesn't look like a valid email address.": "Det här ser inte ut vara en giltig epostadress.", + "This doesn't look like a valid phone number.": "Det här ser inte ut att vara ett giltigt telefonnummer.", + "You need to enter a user name.": "Du måste ange ett användarnamn.", + "An unknown error occurred.": "Ett okänt fel uppstod.", + "Hide avatar changes": "Dölj avatarändringar", + "Hide display name changes": "Dölj visningsnamnsändringar", + "Uploading %(filename)s and %(count)s others|other": "Laddar upp %(filename)s och %(count)s andra", + "Uploading %(filename)s and %(count)s others|zero": "Laddar upp %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Laddar upp %(filename)s och %(count)s annan", + "Light theme": "Ljust tema", + "Dark theme": "Mörkt tema", + "Status.im theme": "Status.im-tema", + "You already have existing direct chats with this user:": "Du har redan existerande direkt-chattar med den här användaren:", + "Start chatting": "Börja chatta", + "Click on the button below to start chatting!": "Klicka på knappen nedanför för att börja chatta!", + "Start Chatting": "Börja chatta", + "This doesn't appear to be a valid email address": "Det här verkar inte vara en giltig epostadress", + "Verification Pending": "Avvaktar verifiering", + "Unable to add email address": "Det gick inte att lägga till epostadress", + "Unable to verify email address.": "Det gick inte att verifiera epostadressen.", + "Skip": "Hoppa över", + "User names may only contain letters, numbers, dots, hyphens and underscores.": "Användarnamn får endast innehålla bokstäver, siffror, punkter, bindestreck och understreck.", + "Username not available": "Användarnamn inte tillgängligt", + "Username invalid: %(errMessage)s": "Ogiltigt användarnamn: %(errMessage)s", + "An error occurred: %(error_string)s": "Ett fel uppstod: %(error_string)s", + "Username available": "Användarnamn tillgängligt", + "To get started, please pick a username!": "För att komma igång, vänligen välj ett användarnamn!", + "This will be your account name on the homeserver, or you can pick a different server.": "Det här kommer bli ditt kontonamn på hemservern , eller så kan du välja en annan server.", + "If you already have a Matrix account you can log in instead.": "Om du redan har ett Matrix-konto kan du logga in istället.", + "Please install Chrome or Firefox for the best experience.": "Vänligen installera Chrome eller Firefox för den bästa upplevelsen.", + "Safari and Opera work too.": "Safari och Opera funkar också.", + "Topic": "Ämne", + "Make this room private": "Gör det här rummet privat", + "Share message history with new users": "Dela meddelandehistoriken med nya användare", + "Encrypt room": "Kryptera rum", + "You must register to use this functionality": "Du måste registrera dig för att använda den här funktionaliteten", + "You must join the room to see its files": "Du måste gå med i rummet för att se tillhörande filer", + "There are no visible files in this room": "Det finns inga synliga filer i det här rummet", + "Your password has been reset": "Ditt lösenord har återställts", + "To reset your password, enter the email address linked to your account": "För att återställa ditt lösenord, ange epostadressen som är kopplad till ditt konto", + "This Home Server does not support login using email address.": "Den här hemservern har inte support för inloggning med epostadress.", + "Desktop specific": "Skrivbordsspecifikt", + "Start automatically after system login": "Starta automatiskt vid systeminloggning", + "User Interface": "Användargränssnitt", + "This will allow you to reset your password and receive notifications.": "Det här låter dig återställa lösenordet och ta emot aviseringar.", + "You have no visible notifications": "Du har inga synliga aviseringar", + "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ditt lösenord har ändrats. Du kommer inte att få push-aviseringar på andra enheter förrän du har loggat in på dem igen", + "Failed to upload image": "Det gick inte att ladda upp bild" } diff --git a/src/i18n/strings/ta.json b/src/i18n/strings/ta.json new file mode 100644 index 0000000000..6aecb54bfd --- /dev/null +++ b/src/i18n/strings/ta.json @@ -0,0 +1,149 @@ +{ + "A new version of Riot is available.": "Riot-ன் புதிய பதிப்பு உள்ளது.", + "Add an email address above to configure email notifications": "மின்னஞ்சல் மூலம் அறிவிப்புகளை பெற உங்கள் மின்னஞ்சல் முகவரியை மேலே இணைக்கவும்", + "Advanced notification settings": "மேம்பட்ட அறிவிப்பிற்கான அமைப்புகள்", + "All messages": "அனைத்து செய்திகள்", + "All messages (noisy)": "அனைத்து செய்திகள் (உரக்க)", + "All Rooms": "அனைத்து அறைகள்", + "All notifications are currently disabled for all targets.": "அனைத்து இலக்குகளுக்கான அனைத்து அறிவுப்புகளும் தற்போது முடக்கி வைக்கப்பட்டுள்ளது.", + "An error occurred whilst saving your email notification preferences.": "உங்கள் மின்னஞ்சல் அறிவிப்பு விருப்பங்களை சேமிப்பதில் ஏதோ பிழை ஏற்பட்டுள்ளது.", + "Cancel": "ரத்து", + "Cancel Sending": "அனுப்புதலை ரத்து செய்", + "Changelog": "மாற்றப்பதிவு", + "Close": "மூடு", + "Collapse panel": "பலகத்தை மாற்று", + "Collecting app version information": "செயலியின் பதிப்பு தகவல்கள் சேகரிக்கப்படுகிறது", + "Collecting logs": "பதிவுகள் சேகரிக்கப்படுகிறது", + "Call invitation": "அழைப்பிற்கான விண்ணப்பம்", + "Can't update user notification settings": "பயனர் அறிவிப்பு அமைப்புகளை மாற்ற முடியவில்லை", + "Couldn't find a matching Matrix room": "பொருத்தமான Matrix அறை கிடைக்கவில்லை", + "Custom Server Options": "விருப்பிற்கேற்ற வழங்கி இடப்புகள்", + "delete the alias.": "மாற்றை அழி.", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "அறை மாற்று %(alias)s -ஐ அழித்து, %(name)s -ஐ அடைவிலிருந்து நீக்க வேண்டுமா?", + "Direct Chat": "நேரடி அரட்டை", + "Directory": "அடைவு", + "Dismiss": "நீக்கு", + "Download this file": "இந்த கோப்பைத் தரவிறக்கு", + "Enable audible notifications in web client": "இணைய வாங்கியில் ஒலி அறிவிப்புகளை ஏதுவாக்கு", + "Enable desktop notifications": "திரை அறிவிப்புகளை ஏதுவாக்கு", + "Enable email notifications": "மின்னஞ்சல் அறிவிப்புகளை ஏதுவாக்கு", + "Enable notifications for this account": "இந்த கணக்கிற்கான அறிவிப்புகளை ஏதுவாக்கு", + "Enable them now": "இப்போது அவற்றை ஏதுவாக்கு", + "Error": "கோளாறு", + "Expand panel": "பலகத்தை விரிவாக்கு", + "Failed to add tag %(tagName)s to room": "%(tagName)s எனும் குறிச்சொல்லை அறையில் சேர்ப்பதில் தோல்வி", + "Failed to change settings": "அமைப்புகள் மாற்றத்தில் தோல்வி", + "Failed to forget room %(errCode)s": "அறையை மறப்பதில் தோல்வி %(errCode)s", + "Failed to update keywords": "முக்கிய வார்த்தைகளை புதுப்பித்தலில் தோல்வி", + "Failed to get public room list": "பொது அறைப் பட்டியலை பெறுவதில் தோல்வி", + "Favourite": "விருப்பமான", + "Files": "கோப்புகள்", + "Filter room names": "அறை பெயர்களை வடிகட்டு", + "Forget": "மற", + "Guests can join": "விருந்தினர்கள் சேரலாம்", + "Hide panel": "பலகத்தை மறை", + "Invite to this room": "இந்த அறைக்கு அழை", + "Keywords": "முக்கிய வார்த்தைகள்", + "Leave": "வெளியேறு", + "Login": "உள்நுழை", + "Low Priority": "குறைந்த முன்னுரிமை", + "Members": "உறுப்பினர்கள்", + "Mentions only": "குறிப்பிடுகள் மட்டும்", + "#example": "#உதாரணமாக", + "Enter keywords separated by a comma:": "ஒரு comma மூலம் முக்கிய வார்த்தைகளை உள்ளிடவும்:", + "Error saving email notification preferences": "மின்னஞ்சல் அறிவிப்பு விருப்பங்களை சேமிப்பதில் கோளாறு", + "Failed to get protocol list from Home Server": "முகப்பு சேவையகத்திலிருந்து நெறிமுறை பட்டியலைப் பெறுவதில் தோல்வி", + "Failed to remove tag %(tagName)s from room": "அறையில் இருந்து குறிச்சொல் %(tagName)s களை அகற்றுவது தோல்வியடைந்தது", + "Failed to set direct chat tag": "நேரடி அரட்டை குறியை அமைப்பதில் தோல்வி", + "Failed to set Direct Message status of room": "அறையின் நேரடி செய்தி நிலையை அமைக்க தவறிவிட்டது", + "Fetching third party location failed": "மூன்றாம் இடத்தில் உள்ள இடம் தோல்வி", + "Forward Message": "முன்னோடி செய்தி", + "(HTTP status %(httpStatus)s)": "(HTTP நிலைகள் %(httpStatus)s)", + "I understand the risks and wish to continue": "நான் அபாயங்களைப் புரிந்துகொண்டு தொடர விரும்புகிறேன்", + "Messages containing my display name": "என் காட்சி பெயர் கொண்ட செய்திகள்", + "more": "அதிகம்", + "Mute": "முடக்கு", + "No rooms to show": "காண்பிக்க எந்த அறையும் இல்லை", + "Messages containing keywords": "முக்கிய கொண்ட செய்திகள்", + "Messages containing my user name": "என் பயனர் பெயர் கொண்ட செய்திகள்", + "Messages in group chats": "குழு அரட்டைகளில் உள்ள செய்திகள்", + "Messages in one-to-one chats": "ஒரு-க்கு-ஒரு அரட்டைகளில் உள்ள செய்திகள்", + "Messages sent by bot": "bot மூலம் அனுப்பிய செய்திகள்", + "Noisy": "சத்தம்", + "Notification targets": "அறிவிப்பு இலக்குகள்", + "Notifications": "அறிவிப்புகள்", + "Notifications on the following keywords follow rules which can’t be displayed here:": "பின்வரும் முக்கிய வார்த்தைகளில் அறிவிப்புகள் இங்கே காட்டப்பட முடியாத விதிகள் பின்பற்றப்படுகின்றன:", + "Notify for all other messages/rooms": "மற்ற எல்லா செய்திகளுக்கும் அறைகளுக்கும் தெரிவிக்கவும்", + "Notify me for anything else": "வேறு எதையும் எனக்கு தெரிவி", + "Off": "அமை", + "On": "மீது", + "Operation failed": "செயல்பாடு தோல்வியுற்றது", + "Permalink": "நிரந்தரத் தொடுப்பு", + "powered by Matrix": "Matrix-ஆல் ஆனது", + "Quote": "மேற்கோள்", + "Reject": "நிராகரி", + "Remove %(name)s from the directory?": "அடைவிலிருந்து %(name)s-ஐ நீக்கலாமா?", + "Remove": "நீக்கு", + "remove %(name)s from the directory.": "அடைவிலிருந்து %(name)s-ஐ நீக்கு.", + "Remove from Directory": "அடைவிலிருந்து நீக்கு", + "Resend": "மீண்டும் அனுப்பு", + "Room not found": "அறை காணவில்லை", + "Search": "தேடு", + "Search…": "தேடு…", + "Search for a room": "அறையைத் தேடு", + "Send": "அனுப்பு", + "Send logs": "பதிவுகளை அனுப்பு", + "Source URL": "மூல முகவரி", + "This Room": "இந்த அறை", + "Unable to join network": "முனையங்களில் சேர இயலவில்லை", + "Unavailable": "இல்லை", + "unknown error code": "தெரியாத பிழை குறி", + "Unnamed room": "பெயரிடப்படாத அறை", + "Update": "புதுப்பி", + "Uploaded on %(date)s by %(user)s": "%(date)s அன்று %(user)s ஆல் பதிவேற்றப்பட்டது", + "Uploading report": "அறிக்கை பதிவேற்றப்படுகிறது", + "Riot does not know how to join a room on this network": "இந்த வலையமைப்பில் உள்ள அறையில் எப்படி சேர்வதென்று Riotற்க்கு தெரியவில்லை", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot பல மேம்பட்ட உலாவி வசதிகளைப் பயன்படுத்துகிறது, அதில் சிலவற்றைக் காணவில்லை அல்லது உங்கள் உலாவியில் பரிசோதனைக்காக உள்ளது.", + "There are advanced notifications which are not shown here": "இங்கு காண்பிக்கப்படாத மேம்பட்ட அறிவிப்புகள் உள்ளது", + "The server may be unavailable or overloaded": "வழங்கி அளவுமீறிய சுமையில் உள்ளது அல்லது செயல்பாட்டில் இல்லை", + "Unable to fetch notification target list": "அறிவிப்பு பட்டியலை பெற முடியவில்லை", + "Unable to look up room ID from server": "வழங்கியிலிருந்து அறை ID யை காண முடியவில்லை", + "Unhide Preview": "முன்னோட்டத்தைக் காண்பி", + "View Decrypted Source": "மறையீடு நீக்கப்பட்ட மூலத்தைக் காண்பி", + "View Source": "மூலத்தைக் காட்டு", + "What's New": "புதிதாக வந்தவை", + "What's new?": "புதிதாக என்ன?", + "Waiting for response from server": "வழங்கியின் பதிலுக்காக காத்திருக்கிறது", + "When I'm invited to a room": "நான் அறைக்கு அழைக்கப்பட்ட போது", + "World readable": "உலகமே படிக்கும்படி", + "You cannot delete this image. (%(code)s)": "இந்த படத்தை நீங்கள் அழிக்க முடியாது. (%(code)s)", + "You cannot delete this message. (%(code)s)": "இந்த செய்தியை நீங்கள் அழிக்க முடியாது. (%(code)s)", + "You are not receiving desktop notifications": "திரை அறிவிப்புகளை நீங்கள் பெறவில்லை", + "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 homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "గృహనిర్వాహకులకు కనెక్ట్ చేయలేరు - దయచేసి మీ కనెక్టివిటీని తనిఖీ చేయండి, మీ 1 హోమరుసు యొక్క ఎస్ఎస్ఎల్ సర్టిఫికేట్ 2 ని విశ్వసనీయపరుచుకొని, బ్రౌజర్ పొడిగింపు అభ్యర్థనలను నిరోధించబడదని నిర్ధారించుకోండి.", @@ -170,7 +169,6 @@ "riot-web version:": "రయట్-వెబ్ సంస్కరణ:", "Riot was not given permission to send notifications - please try again": "రయట్ కు ప్రకటనలను పంపడానికి అనుమతి లేదు - దయచేసి మళ్ళీ ప్రయత్నించండి", "Unable to restore session": "సెషన్ను పునరుద్ధరించడానికి సాధ్యపడలేదు", - "Report it": "దానిని నివేదించండి", "Remove": "తొలగించు", "Room directory": "గది వివరము", "Create new room": "క్రొత్త గది సృష్టించండి", @@ -182,5 +180,100 @@ "Notifications": "ప్రకటనలు", "Operation failed": "కార్యం విఫలమైంది", "Search": "శోధన", - "Settings": "అమరికలు" + "Settings": "అమరికలు", + "Fetching third party location failed": "మూడవ పార్టీ స్థానాన్ని పొందడం విఫలమైంది", + "A new version of Riot is available.": "కొత్త రిమోట్ వివరణము అందుబాటులో ఉంది.", + "Couldn't load home page": "హోమ్ పేజీని లోడ్ చేయలేకపోయాము", + "Advanced notification settings": "ఆధునిక తాఖీదు అమరిక", + "Sunday": "ఆదివారం", + "Guests can join": "అతిథులు చేరవచ్చు", + "Messages sent by bot": "బాట్ పంపిన సందేశాలు", + "Notification targets": "తాఖీదు లక్ష్యాలు", + "Failed to set direct chat tag": "ప్రత్యక్ష మాటామంతి బొందు సెట్ చేయడంలో విఫలమైంది", + "Today": "ఈ రోజు", + "Failed to get protocol list from Home Server": "హోమ్ సర్వర్ నుండి ప్రోటోకాల్ జాబితాను పొందడం విఫలమైంది", + "Friday": "శుక్రువారం", + "Add an email address above to configure email notifications": "ఇమెయిల్ ప్రకటనలను రూపశిల్పం చేయడానికి ఎగువ ఇమెయిల్ చిరునామాను జోడించండి", + "Expand panel": "ప్యానెల్ను విస్తరింపజేయండి", + "On": "వేయుము", + "Filter room names": "గది పేర్లను ఫిల్టర్ చేయండి", + "Changelog": "మార్పు వివరణ", + "Leave": "వదిలి", + "All notifications are currently disabled for all targets.": "ప్రస్తుతానికి అన్ని చోట్లనుంచి అన్ని ప్రకటనలు ఆగి వున్నాయి.", + "delete the alias.": "అలియాస్ తొలగించండి.", + "Forget": "మర్చిపో", + "Hide panel": "ప్యానెల్ను దాచు", + "Source URL": "మూల URL", + "Warning": "హెచ్చరిక", + "Noisy": "శబ్దం", + "Room not found": "గది కనుగొనబడలేదు", + "Messages containing my display name": "నా ప్రదర్శన పేరును కలిగి ఉన్న సందేశాలు", + "Messages in one-to-one chats": "సందేశాలు నుండి ఒకరికి ఒకటి మాటామంతి", + "Failed to update keywords": "కీలక పదాలను నవీకరించడంలో విఫలమైంది", + "remove %(name)s from the directory.": "వివరము నుండి %(name)s ను తొలిగించు.", + "Please set a password!": "దయచేసి మీ రహస్యపదాన్నీ అమర్చండి!", + "Cancel Sending": "పంపడాన్ని ఆపేయండి", + "Failed to add tag %(tagName)s to room": "%(tagName)s ను బొందు జోడించడంలో విఫలమైంది", + "Members": "సభ్యులు", + "No update available.": "ఏ నవీకరణ అందుబాటులో లేదు.", + "Resend": "మళ్ళి పంపుము", + "Files": "దస్ర్తాలు", + "Collecting app version information": "అనువర్తన సంస్కరణ సమాచారాన్ని సేకరించడం", + "Forward Message": "సందేశాన్ని మునుముందుకు చేయండి", + "Enable notifications for this account": "ఈ ఖాతా కోసం తాఖీదు ప్రారంభించండి", + "Directory": "వివరం", + "Search for a room": "గది కోసం శోధించండి", + "Messages containing keywords": "కీలక పదాలనుకలిగి ఉన్న సందేశం", + "Error saving email notification preferences": "ఇమెయిల్ ప్రకటనలను ప్రాధాన్యతలను దాచు చేయడంలో లోపం", + "Tuesday": "మంగళవారం", + "Enter keywords separated by a comma:": "కామాతో వేరు చేయబడిన కీలక పదాలను నమోదు చేయండి:", + "I understand the risks and wish to continue": "నేను నష్టాలను అర్థం చేసుకుంటాను మరియు కొనసాగించాలని కోరుకుంటున్నాను", + "Remove %(name)s from the directory?": "వివరము నుండి %(name)s తొలిగించు?", + "Remove from Directory": "`వివరము నుండి తొలిగించు", + "Direct Chat": "ప్రత్యక్ష మాటామంతి", + "Reject": "తిరస్కరించు", + "Failed to set Direct Message status of room": "గది యొక్క ప్రత్యక్ష సందేశ స్థితి సెట్ చేయడంలో విఫలమైంది", + "Monday": "సోమవారం", + "All messages (noisy)": "అన్ని సందేశాలు (గట్టిగ)", + "Enable them now": "ఇప్పుడే వాటిని ప్రారంభించండి", + "Messages containing my user name": "నా వినియోగదారు పేరు కలిగి ఉన్న సందేశాలు", + "Collecting logs": "నమోదు సేకరించడం", + "more": "మరింత", + "Failed to get public room list": "ప్రజా గది జాబితాను పొందడం విఫలమైంది", + "(HTTP status %(httpStatus)s)": "(HTTP స్థితి %(httpStatus)s)", + "All Rooms": "అన్ని గదులు", + "Wednesday": "బుధవారం", + "Send": "పంపండి", + "Send logs": "నమోదును పంపు", + "All messages": "అన్ని సందేశాలు", + "Call invitation": "మాట్లాడడానికి ఆహ్వానం", + "Downloading update...": "నవీకరణను దిగుమతి చేస్తోంది...", + "Keywords": "ముఖ్యపదాలు", + "Can't update user notification settings": "వినియోగదారు ప్రకటన ప్రాదాన్యాలు నవీకరించదడానేకి రాదు", + "Notify for all other messages/rooms": "అన్ని ఇతర సందేశాలు / గదులు కోసం తెలియజేయండి", + "Couldn't find a matching Matrix room": "సరిపోలిక మ్యాట్రిక్స్ గదిని కనుగొనలేకపోయాము", + "Invite to this room": "ఈ గదికి ఆహ్వానించండి", + "Thursday": "గురువారం", + "Search…": "శోధన…", + "Sorry, your browser is not able to run Riot.": "క్షమించండి, మీ బ్రౌజర్ రియట్ని అమలు చేయలేరు.", + "Messages in group chats": "సమూహ మాటామంతిలో సందేశాలు", + "Yesterday": "నిన్న", + "Error encountered (%(errorDetail)s).": "లోపం సంభవించింది (%(errorDetail)s).", + "Low Priority": "తక్కువ ప్రాధాన్యత", + "Set Password": "రహస్యపదాన్నీ అమర్చండి", + "An error occurred whilst saving your email notification preferences.": "మీ ఇమెయిల్ ప్రకటన ప్రాధాన్యాలు బద్రపరిచేతప్పుడు ఎదో తప్పు జరిగింది.", + "Enable audible notifications in web client": "వెబ్ బంట్రౌతు వినిపించే నోటిఫికేషన్లను ప్రారంభించండి", + "Off": "ఆపు", + "Mentions only": "మాత్రమే ప్రస్తావిస్తుంది", + "Failed to remove tag %(tagName)s from room": "గది నుండి బొందు %(tagName)s తొలగించడంలో విఫలమైంది", + "Enable desktop notifications": "రంగస్థల తాఖీదు ప్రారంభించండి", + "Enable email notifications": "ఇమెయిల్ ప్రకటనలను ప్రారంభించండి", + "Login": "ప్రవేశ ద్వారం", + "No rooms to show": "చూపించడానికి గదులు లేవు", + "Download this file": "ఈ దస్త్రం దిగుమతి చేయండి", + "Failed to change settings": "అమరిక మార్చడం విఫలమైంది", + "#example": "#ఉదాహరణ", + "Collapse panel": "ప్యానెల్ కుదించు", + "Checking for an update...": "నవీకరణ కోసం చూస్తోంది...", + "Saturday": "శనివారం" } diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 9e9e606826..6fa7febabd 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": "รายการโปรด", @@ -84,7 +81,6 @@ "Bans user with given id": "ผู้ใช้และ id ที่ถูกแบน", "Blacklisted": "ขึ้นบัญชีดำ", "Can't load user settings": "ไม่สามารถโหลดการตั้งค่าผู้ใช้ได้", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s เปลี่ยนชื่อที่แสดงของเขาจาก %(oldDisplayName)s ไปเป็น %(displayName)s", "%(senderName)s changed their profile picture.": "%(senderName)s เปลี่ยนรูปโปรไฟล์ของเขา", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s เปลี่ยนชื่อห้องไปเป็น %(roomName)s", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ลบชื่อห้อง", @@ -393,7 +389,6 @@ "Rejoin": "กลับเข้าร่วม", "This room": "ห้องนี้", "Unnamed Room": "ห้องที่ยังไม่ได้ตั้งชื่อ", - "%(user)s is a": "%(user)s เป็น", "(~%(count)s results)|one": "(~%(count)s ผลลัพท์)", "(~%(count)s results)|other": "(~%(count)s ผลลัพท์)", "Missing Media Permissions, click here to request.": "ไม่มีสิทธิ์เข้าถึงสื่อ, คลิกที่นี่เพื่อขอสิทธิ์", @@ -412,7 +407,6 @@ "Custom level": "กำหนดระดับเอง", "No display name": "ไม่มีชื่อที่แสดง", "Only people who have been invited": "เฉพาะบุคคลที่ได้รับเชิญ", - "Otherwise, click here to send a bug report.": "หรือคลิกที่นี่เพื่อรายงานจุดบกพร่อง", "Power level must be positive integer.": "ระดับอำนาจต้องเป็นจำนวนเต็มบวก", "%(roomName)s does not exist.": "ไม่มีห้อง %(roomName)s อยู่จริง", "To link to a room it must have an address.": "ห้องต้องมีที่อยู่ก่อน ถึงจะลิงก์ได้", @@ -435,7 +429,137 @@ "What does this mean?": "นี่แปลว่าอะไร?", "Error decrypting audio": "เกิดข้อผิดพลาดในการถอดรหัสเสียง", "Error decrypting image": "เกิดข้อผิดพลาดในการถอดรหัสรูป", - "Image '%(Body)s' cannot be displayed.": "ไม่สามารถแสดงรูป '%(Body)s' ได้", - "This image cannot be displayed.": "ไม่สามารถแสดงรูปนี้ได้", - "Error decrypting video": "เกิดข้อผิดพลาดในการถอดรหัสวิดิโอ" + "Error decrypting video": "เกิดข้อผิดพลาดในการถอดรหัสวิดิโอ", + "Fetching third party location failed": "การเรียกข้อมูลตำแหน่งจากบุคคลที่สามล้มเหลว", + "A new version of Riot is available.": "มี Riot เวอร์ชั่นใหม่", + "I understand the risks and wish to continue": "ฉันเข้าใจความเสี่ยงและต้องการดำเนินการต่อ", + "Advanced notification settings": "ตั้งค่าการแจ้งเตือนขั้นสูง", + "Uploading report": "กำลังอัปโหลดรายงาน", + "Sunday": "วันอาทิตย์", + "Guests can join": "แขกเข้าร่วมได้", + "Failed to add tag %(tagName)s to room": "การเพิ่มแท็ก %(tagName)s ของห้องนี้ล้มเหลว", + "Notification targets": "เป้าหมายการแจ้งเตือน", + "Failed to set direct chat tag": "การติดแท็กแชทตรงล้มเหลว", + "Today": "วันนี้", + "Files": "ไฟล์", + "You are not receiving desktop notifications": "การแจ้งเตือนบนเดสก์ทอปถูกปิดอยู่", + "Friday": "วันศุกร์", + "Update": "อัปเดต", + "What's New": "มีอะไรใหม่", + "Add an email address above to configure email notifications": "เพิ่มที่อยู่อีเมลข้างบนเพื่อตั้งค่าการแจ้งเตือนทางอีเมล", + "Expand panel": "ขยายหน้าต่าง", + "On": "เปิด", + "Filter room names": "กรองชื่อห้อง", + "Changelog": "บันทึกการเปลี่ยนแปลง", + "Waiting for response from server": "กำลังรอการตอบสนองจากเซิร์ฟเวอร์", + "Leave": "ออกจากห้อง", + "Uploaded on %(date)s by %(user)s": "อัปโหลดเมื่อ %(date)s โดย %(user)s", + "All notifications are currently disabled for all targets.": "การแจ้งเตือนทั้งหมดถูกปิดใช้งานสำหรับทุกอุปกรณ์", + "delete the alias.": "ลบนามแฝง", + "To return to your account in future you need to set a password": "คุณต้องตั้งรหัสผ่านเพื่อจะกลับมาที่บัญชีนี้ในอนาคต", + "Forget": "ลืม", + "World readable": "ทุกคนอ่านได้", + "Hide panel": "ซ่อนหน้าต่าง", + "You cannot delete this image. (%(code)s)": "คุณไม่สามารถลบรูปนี้ได้ (%(code)s)", + "Cancel Sending": "ยกเลิกการส่ง", + "Warning": "คำเตือน", + "This Room": "ห้องนี้", + "The Home Server may be too old to support third party networks": "เซิร์ฟเวอร์บ้านอาจเก่าเกินกว่าจะรองรับเครือข่ายของบุคคลที่สาม", + "Resend": "ส่งใหม่", + "Room not found": "ไม่พบห้อง", + "Messages containing my display name": "ข้อความที่มีชื่อของฉัน", + "Messages in one-to-one chats": "ข้อความในแชทตัวต่อตัว", + "Unavailable": "ไม่มี", + "Error saving email notification preferences": "การบันทึกการตั้งค่าการแจ้งเตือนทางอีเมลผิดพลาด", + "View Decrypted Source": "ดูซอร์สที่ถอดรหัสแล้ว", + "Send": "ส่ง", + "remove %(name)s from the directory.": "ถอด %(name)s ออกจากไดเรกทอรี", + "Notifications on the following keywords follow rules which can’t be displayed here:": "การแจ้งเตือนจากคีย์เวิร์ดเหล่านี้ เป็นไปตามกฏที่ไม่สามารถแสดงที่นี่ได้:", + "Please set a password!": "กรุณาตั้งรหัสผ่าน!", + "You have successfully set a password!": "การตั้งรหัสผ่านเสร็จสมบูรณ์!", + "An error occurred whilst saving your email notification preferences.": "เกิดข้อผิดพลาดระหว่างบันทึกการตั้งค่าการแจ้งเตือนทางอีเมล", + "Source URL": "URL ต้นฉบับ", + "Messages sent by bot": "ข้อความจากบอท", + "Members": "สมาชิก", + "No update available.": "ไม่มีอัปเดตที่ใหม่กว่า", + "Noisy": "เสียงดัง", + "Failed to get protocol list from Home Server": "การขอรายชื่อโปรโตคอลจากเซิร์ฟเวอร์บ้านล้มเหลว", + "Collecting app version information": "กำลังรวบรวมข้อมูลเวอร์ชันแอป", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "ลบนามแฝง %(alias)s ของห้องและถอด %(name)s ออกจากไดเรกทอรี?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "เพื่อคุณจะได้กลับมายังบัญชีเดิมของคุณได้ หลังจากออกจากระบบ แล้วกลับเข้าสู่ระบบในอุปกรณ์อื่น ๆ", + "Enable notifications for this account": "เปิดใช้งานการแจ้งเตือนสำหรับบัญชีนี้", + "Directory": "ไดเรกทอรี", + "Search for a room": "ค้นหาห้อง", + "Messages containing keywords": "ข้อความที่มีคีย์เวิร์ด", + "View Source": "ดูซอร์ส", + "Tuesday": "วันอังคาร", + "Enter keywords separated by a comma:": "กรอกคีย์เวิร์ดทั้งหมด คั่นด้วยเครื่องหมายจุลภาค:", + "Search…": "ค้นหา…", + "Remove %(name)s from the directory?": "ถอด %(name)s ออกจากไดเรกทอรี?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot ใช้คุณสมบัติขั้นสูงในเบราว์เซอร์หลายประการ คุณสมบัติบางอย่างอาจยังไม่พร้อมใช้งานหรืออยู่ในขั้นทดลองในเบราว์เซอร์ปัจจุบันของคุณ", + "Unnamed room": "ห้องที่ไม่มีชื่อ", + "All messages (noisy)": "ทุกข้อความ (เสียงดัง)", + "Saturday": "วันเสาร์", + "Remember, you can always set an email address in user settings if you change your mind.": "อย่าลืม คุณสามารถตั้งที่อยู่อีเมลในการตั้งค่าผู้ใช้ได้ทุกเมื่อหากคุณเปลี่ยนใจ", + "Direct Chat": "แชทโดยตรง", + "The server may be unavailable or overloaded": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งานหรือทำงานหนักเกินไป", + "Reject": "ปฏิเสธ", + "Failed to set Direct Message status of room": "การตั้งสถานะข้อความตรงของห้องล้มเหลว", + "Monday": "วันจันทร์", + "Remove from Directory": "ถอดออกจากไดเรกทอรี", + "Enable them now": "เปิดใช้งานเดี๋ยวนี้", + "Messages containing my user name": "ข้อความที่มีชื่อผู้ใช้ของฉัน", + "Collecting logs": "กำลังรวบรวมล็อก", + "more": "เพิ่มเติม", + "Failed to get public room list": "การขอรายชื่อห้องสาธารณะล้มเหลว", + "(HTTP status %(httpStatus)s)": "(สถานะ HTTP %(httpStatus)s)", + "All Rooms": "ทุกห้อง", + "Wednesday": "วันพุธ", + "Failed to update keywords": "การอัปเดตคีย์เวิร์ดล้มเหลว", + "Send logs": "ส่งล็อก", + "All messages": "ทุกข้อความ", + "Call invitation": "คำเชิญเข้าร่วมการโทร", + "Downloading update...": "กำลังดาวน์โหลดอัปเดต...", + "You have successfully set a password and an email address!": "ตั้งรหัสผ่านและที่อยู่อีเมลสำเร็จแล้ว!", + "What's new?": "มีอะไรใหม่?", + "Notify me for anything else": "แจ้งเตือนสำหรับอย่างอื่นทั้งหมด", + "When I'm invited to a room": "เมื่อฉันได้รับคำเชิญเข้าห้อง", + "Keywords": "คีย์เวิร์ด", + "Can't update user notification settings": "ไม่สามารถอัปเดตการตั้งค่าการแจ้งเตือนของผู้ใช้", + "Notify for all other messages/rooms": "แจ้งเตือนจากห้อง/ข้อความอื่น ๆ ทั้งหมด", + "Unable to look up room ID from server": "ไม่สามารถหา ID ห้องจากเซิร์ฟเวอร์ได้", + "Couldn't find a matching Matrix room": "ไม่พบห้อง Matrix ที่ตรงกับคำค้นหา", + "Invite to this room": "เชิญเข้าห้องนี้", + "You cannot delete this message. (%(code)s)": "คุณไม่สามารถลบข้อความนี้ได้ (%(code)s)", + "Thursday": "วันพฤหัสบดี", + "Forward Message": "ส่งต่อข้อความ", + "Unhide Preview": "แสดงตัวอย่าง", + "Unable to join network": "ไม่สามารถเข้าร่วมเครือข่ายได้", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "คุณอาจมีการตั้งค่าจากไคลเอนต์อื่นนอกจาก Riot การตั้งต่าเหล่านั้นยังถูกใช้งานอยู่แต่คุณจะปรับแต่งจากใน Riot ไม่ได้", + "Sorry, your browser is not able to run Riot.": "ขออภัย เบราว์เซอร์ของคุณไม่สามารถ run Riot ได้", + "Messages in group chats": "ข้อความในแชทกลุ่ม", + "Yesterday": "เมื่อวานนี้", + "Error encountered (%(errorDetail)s).": "เกิดข้อผิดพลาด (%(errorDetail)s)", + "Low Priority": "ความสำคัญต่ำ", + "Riot does not know how to join a room on this network": "Riot ไม่รู้วิธีเข้าร่วมห้องในเครือข่ายนี้", + "Set Password": "ตั้งรหัสผ่าน", + "Enable audible notifications in web client": "เปิดใช้งานเสียงแจ้งเตือนบนเว็บไคลเอนต์", + "Permalink": "ลิงก์ถาวร", + "Off": "ปิด", + "#example": "#example", + "Mentions only": "เมื่อถูกกล่าวถึงเท่านั้น", + "Failed to remove tag %(tagName)s from room": "การลบแท็ก %(tagName)s จากห้องล้มเหลว", + "You can now return to your account after signing out, and sign in on other devices.": "คุณสามารถกลับไปยังบัญชีของคุณหลังจากออกจากระบบ แล้วกลับเขาสู่ระบบบนอุปกรณ์อื่น ๆ", + "Enable desktop notifications": "เปิดใช้งานการแจ้งเตือนบนเดสก์ทอป", + "Enable email notifications": "เปิดใช้งานการแจ้งเตือนทางอีเมล", + "Login": "เข้าสู่ระบบ", + "No rooms to show": "ไม่มีห้องที่จะแสดง", + "Download this file": "ดาวน์โหลดไฟล์นี้", + "Failed to change settings": "การแก้ไขการตั้งค่าล้มเหลว", + "Unable to fetch notification target list": "ไม่สามารถรับรายชื่ออุปกรณ์แจ้งเตือน", + "Quote": "อ้างอิง", + "Collapse panel": "ซ่อนหน้าต่าง", + "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "การแสดงผลของโปรแกรมอาจผิดพลาด ฟังก์ชันบางอย่างหรือทั้งหมดอาจไม่ทำงานในเบราว์เซอร์ปัจจุบันของคุณ หากคุณต้องการลองดำเนินการต่อ คุณต้องรับมือกับปัญหาที่อาจจะเกิดขึ้นด้วยตัวคุณเอง!", + "Checking for an update...": "กำลังตรวจหาอัปเดต...", + "There are advanced notifications which are not shown here": "มีการแจ้งเตือนขั้นสูงที่ไม่ได้แสดงที่นี่" } diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 4067de767e..797fed79ce 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -48,14 +48,12 @@ "Banned users": "Yasaklanan(Banlanan) Kullanıcılar", "Bans user with given id": "Yasaklanan(Banlanan) Kullanıcılar , ID'leri ile birlikte", "Blacklisted": "Kara listeye alınanlar", - "Bug Report": "Hata Raporu", "Bulk Options": "Toplu Seçenekler", "Call Timeout": "Arama Zaman Aşımı", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Ana Sunucu'ya bağlanılamıyor - lütfen bağlantınızı kontrol edin , Ana Sunucu SSL sertifikanızın güvenilir olduğundan ve bir tarayıcı uzantısının istekleri engellemiyor olduğundan emin olun.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Tarayıcı çubuğunuzda bir HTTPS URL'si olduğunda Ana Sunusuna HTTP üzerinden bağlanılamıyor . Ya HTTPS kullanın veya güvensiz komut dosyalarını etkinleştirin.", "Can't load user settings": "Kullanıcı ayarları yüklenemiyor", "Change Password": "Şifre Değiştir", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s görüntülenen ismini %(oldDisplayName)s dan %(displayName)s 'a değiştirdi.", "%(senderName)s changed their profile picture.": "%(senderName)s profil resmini değiştirdi.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s %(powerLevelDiffText)s'nin güç düzeyini değiştirdi.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s odanın ismini %(roomName)s olarak değiştirdi.", @@ -179,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.", @@ -271,7 +268,6 @@ "Once encryption is enabled for a room it cannot be turned off again (for now)": "Bu oda için şifreleme etkinleştirildikten sonra tekrar kapatılamaz (şimdilik)", "Only people who have been invited": "Sadece davet edilmiş insanlar", "Operation failed": "Operasyon başarısız oldu", - "Otherwise, click here to send a bug report.": "Aksi taktirde , bir hata raporu göndermek için buraya tıklayın .", "Password": "Şifre", "Password:": "Şifre:", "Passwords can't be empty": "Şifreler boş olamaz", @@ -302,7 +298,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", @@ -419,7 +414,6 @@ "Use with caution": "Dikkatli kullan", "User ID": "Kullanıcı ID", "User Interface": "Kullanıcı Arayüzü", - "%(user)s is a": "%(user)s bir", "User name": "Kullanıcı ismi", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (güç %(powerLevelNumber)s)", "Username invalid: %(errMessage)s": "Kullanıcı ismi geçersiz : %(errMessage)s", @@ -537,7 +531,6 @@ "Start automatically after system login": "Sisteme giriş yaptıktan sonra otomatik başlat", "Desktop specific": "Masaüstüne özgü", "Analytics": "Analitik", - "Opt out of analytics": "Analytics'ten çıkmak", "Options": "Seçenekler", "Riot collects anonymous analytics to allow us to improve the application.": "Riot , uygulamayı iyileştirmemize izin vermek için anonim analitik toplar.", "Passphrases must match": "Şifrenin eşleşmesi gerekir", @@ -560,8 +553,6 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Bu etkinliği kaldırmak(silmek) istediğinizden emin misiniz ? Bir odayı ismini silmeniz veya konu değiştirmeniz , geri alınabilir bir durumdur.", "Unknown error": "Bilinmeyen Hata", "Incorrect password": "Yanlış Şifre", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Bu hesabınızı kalıcı olarak kullanılamaz yapılacak . Aynı kullanıcı ID ile yeniden Kayıt olamazsınız .", - "This action is irreversible.": "Bu eylem geri döndürülemez.", "To continue, please enter your password.": "Devam etmek için , lütfen şifrenizi girin.", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Bu cihazın güvenilir olabileceğini doğrulamak için , lütfen sahibiyle başka yollarla iletişim kurun (örn. şahsen veya telefon görüşmesi) ve bu cihazın Kullanıcı Ayarları'nda gördükleri anahtarın aşağıdaki anahtarla eşleşip eşleşmediğini sorun :", "Device name": "Cihaz ismi", @@ -571,10 +562,8 @@ "In future this verification process will be more sophisticated.": "Gelecekte bu doğrulama işlemi daha gelişmiş olacak.", "Verify device": "Cihazı Doğrula", "I verify that the keys match": "Anahtarların uyuştuğunu doğruluyorum", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Önceki oturumunuzu geri getirmeye çalışırken bir hata ile karşılaşdık . Devam ederseniz , tekrar oturum açmanız gerekecek , ve şifreli sohbet geçmişi okunamıyor hale gelecek.", "Unable to restore session": "Oturum geri yüklenemiyor", "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.": "Eğer daha önce Riot'un daha yeni bir versiyonunu kullandıysanız , oturumunuz bu sürümle uyumsuz olabilir . Bu pencereyi kapatın ve daha yeni sürüme geri dönün.", - "Continue anyway": "Her halükarda devam et", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Şu anda doğrulanmamış cihazları kara listeye alıyorsunuz , bu cihazlara mesaj göndermek için onları doğrulamanız gerekir.", "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.": "Her cihazın yasal sahiplerine ait olduklarını doğrulamak için doğrulama işlemini gerçekleştirmenizi öneririz, ancak tercih edip onaylamadan iletiyi tekrar gönderebilirsiniz.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" daha önce görmediğiniz cihazları içeriyor.", @@ -606,8 +595,6 @@ "What does this mean?": "Bu ne anlama geliyor ?", "Error decrypting audio": "Ses şifre çözme hatası", "Error decrypting image": "Resim şifre çözme hatası", - "Image '%(Body)s' cannot be displayed.": "'%(Body)s' Resmi görüntülenemiyor.", - "This image cannot be displayed.": "Bu görüntü görüntülenemiyor.", "Error decrypting video": "Video şifre çözme hatası", "Add an Integration": "Entegrasyon ekleyin", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Hesabınızı %(integrationsUrl)s ile kullanmak üzere doğrulayabilmeniz için üçüncü taraf bir siteye götürülmek üzeresiniz. Devam etmek istiyor musunuz ?", @@ -643,5 +630,130 @@ "Ignore request": "İsteği yoksay", "You added a new device '%(displayName)s', which is requesting encryption keys.": "Şifreleme anahtarları isteyen , '%(displayName)s' isminde yeni bir cihaz eklediniz .", "Your unverified device '%(displayName)s' is requesting encryption keys.": "Tanımlanmamış cihazınız '%(displayName)s' , şifreleme anahtarlarını istiyor.", - "Encryption key request": "Şifreleme anahtarı isteği" + "Encryption key request": "Şifreleme anahtarı isteği", + "Fetching third party location failed": "Üçüncü parti konumunu çekemedi", + "A new version of Riot is available.": "Riot'un yeni bir versiyonu mevcuttur.", + "All notifications are currently disabled for all targets.": "Tüm bildirimler şu anda tüm hedefler için devre dışı bırakılmıştır.", + "Uploading report": "Rapor yükleniyor", + "Sunday": "Pazar", + "Guests can join": "Misafirler katılabilirler", + "Messages sent by bot": "Bot tarafından gönderilen mesajlar", + "Notification targets": "Bildirim hedefleri", + "Failed to set direct chat tag": "Direkt sohbet etiketi ayarlanamadı", + "Today": "Bugün", + "Failed to get protocol list from Home Server": "Ana Sunucu'dan protokol listesi alınamadı", + "You are not receiving desktop notifications": "Masaüstü bildirimleri almıyorsunuz", + "Friday": "Cuma", + "Update": "Güncelleştirme", + "What's New": "Yenilikler", + "Add an email address above to configure email notifications": "E-posta bildirimlerini yapılandırmak için yukarıya bir e-posta adresi ekleyin", + "Expand panel": "Genişletme paneli", + "On": "Açık", + "Filter room names": "Oda isimlerini filtrele", + "Changelog": "Değişiklikler", + "Waiting for response from server": "Sunucudan yanıt bekleniyor", + "Leave": "Ayrıl", + "Advanced notification settings": "Gelişmiş bildirim ayarları", + "delete the alias.": "Tüm rumuzları sil.", + "Forget": "Unut", + "World readable": "Okunabilir dünya", + "#example": "örnek", + "Hide panel": "Paneli gizle", + "You cannot delete this image. (%(code)s)": "Bu resmi silemezsiniz. (%(code)s)", + "Cancel Sending": "Göndermeyi İptal Et", + "This Room": "Bu Oda", + "The Home Server may be too old to support third party networks": "Ana Sunucu 3. parti ağları desteklemek için çok eski olabilir", + "Noisy": "Gürültülü", + "Room not found": "Oda bulunamadı", + "Messages in one-to-one chats": "Bire bir sohbetlerdeki mesajlar", + "Unavailable": "Kullanım dışı", + "View Decrypted Source": "Şifresi Çözülmüş(Decrypted) Kaynağı Görüntüle", + "Failed to update keywords": "Anahtar kelimeler güncellenemedi", + "remove %(name)s from the directory.": "%(name)s'i dizinden kaldır.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Aşağıdaki anahtar kelimeleri ile ilgili bildirimler burada gösterilemeyen kuralları takip eder:", + "Please set a password!": "Lütfen bir şifre ayarlayın !", + "You have successfully set a password!": "Başarıyla bir şifre ayarladınız!", + "Source URL": "Kaynak URL", + "Failed to add tag %(tagName)s to room": "%(tagName)s etiketi odaya eklenemedi", + "Members": "Üyeler", + "Resend": "Yeniden Gönder", + "Files": "Dosyalar", + "Collecting app version information": "Uygulama sürümü bilgileri toplanıyor", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "%(alias)s oda rumuzu silinsin ve %(name)s dizinden kaldırılsın mı ?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Bu oturumunuzu kapattıktan sonra hesabınıza dönmenizi ve diğer cihazlarda oturum açmanızı sağlar.", + "Keywords": "Anahtar kelimeler", + "Enable notifications for this account": "Bu hesap için bildirimleri etkinleştir", + "Directory": "Dizin", + "Failed to get public room list": "Genel odalar listesi alınamadı", + "Messages containing keywords": " anahtar kelimeleri içeren mesajlar", + "Error saving email notification preferences": "E-posta bildirim tercihlerini kaydetme hatası", + "Tuesday": "Salı", + "Enter keywords separated by a comma:": "Anahtar kelimeleri virgül ile ayırarak girin:", + "I understand the risks and wish to continue": "Riskleri anlıyorum ve devam etmek istiyorum", + "Remove %(name)s from the directory?": "%(name)s'i dizinden kaldırılsın mı ?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot geçerli tarayıcınızda mevcut olmayan veya denemelik olan birçok gelişmiş tarayıcı özelliği kullanıyor.", + "Enable desktop notifications": "Masaüstü bildirimlerini etkinleştir", + "Unnamed room": "İsimsiz oda", + "All messages (noisy)": "Tüm mesajlar (uzun)", + "Saturday": "Cumartesi", + "Remember, you can always set an email address in user settings if you change your mind.": "Unutmayın , fikrinizi değiştirirseniz her zaman bir şifre ve e-posta adresi ayarlayabilirsiniz.", + "Direct Chat": "Doğrudan Sohbet", + "The server may be unavailable or overloaded": "Sunucu kullanılamıyor veya aşırı yüklenmiş olabilir", + "Reject": "Reddet", + "Failed to set Direct Message status of room": "Odanın Direkt Mesaj durumu ayarlanamadı", + "Monday": "Pazartesi", + "Remove from Directory": "Dizinden Kaldır", + "Enable them now": "Onları şimdi etkinleştir", + "Forward Message": "Mesajı İlet", + "Messages containing my user name": "Kullanıcı ismimi içeren mesajlar", + "Collecting logs": "Kayıtlar toplanıyor", + "more": "Daha", + "Search for a room": "Oda ara", + "(HTTP status %(httpStatus)s)": "(HTTP durumu %(httpStatus)s)", + "All Rooms": "Tüm Odalar", + "Wednesday": "Çarşamba", + "Quote": "Alıntı", + "Send": "Gönder", + "Send logs": "Kayıtları gönder", + "All messages": "Tüm mesajlar", + "Call invitation": "Arama davetiyesi", + "Messages containing my display name": "İsmimi içeren mesajlar", + "You have successfully set a password and an email address!": "Başarıyla bir şifre ve e-posta adresi ayarladın !", + "What's new?": "Yeni olan ne ?", + "Notify me for anything else": "Başka herhangi bir şey için bana bildirim yap", + "When I'm invited to a room": "Bir odaya davet edildiğimde", + "Can't update user notification settings": "Kullanıcı bildirim ayarları güncellenemiyor", + "Notify for all other messages/rooms": "Diğer tüm mesajlar / odalar için bildirim yapın", + "Unable to look up room ID from server": "Sunucudan oda ID'si aranamadı", + "Couldn't find a matching Matrix room": "Eşleşen bir Matrix odası bulunamadı", + "Invite to this room": "Bu odaya davet et", + "You cannot delete this message. (%(code)s)": "Bu mesajı silemezsiniz (%(code)s)", + "Thursday": "Perşembe", + "Search…": "Arama…", + "Unhide Preview": "Önizlemeyi Göster", + "Unable to join network": "Ağa bağlanılamıyor", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Onları Riot dışında bir istemciden yapılandırmış olabilirsiniz . Onları Riot içersinide ayarlayamazsınız ama hala geçerlidirler", + "Sorry, your browser is not able to run Riot.": "Üzgünüz , tarayıcınız Riot'u çalıştıramıyor .", + "Uploaded on %(date)s by %(user)s": "%(user)s tarafında %(date)s e yüklendi", + "Messages in group chats": "Grup sohbetlerindeki mesajlar", + "Yesterday": "Dün", + "Low Priority": "Düşük Öncelikli", + "Unable to fetch notification target list": "Bildirim hedef listesi çekilemedi", + "An error occurred whilst saving your email notification preferences.": "E-posta bildirim tercihlerinizi kaydetme işlemi sırasında bir hata oluştu.", + "Enable audible notifications in web client": "Web istemcisinde sesli bildirimleri etkinleştir", + "Permalink": "Kalıcı Bağlantı(permalink)", + "Off": "Kapalı", + "Riot does not know how to join a room on this network": "Riot bu ağdaki bir odaya nasıl gireceğini bilmiyor", + "Mentions only": "Sadece Mention'lar", + "Failed to remove tag %(tagName)s from room": "Odadan %(tagName)s etiketi kaldırılamadı", + "You can now return to your account after signing out, and sign in on other devices.": "Şimdi oturumunuzu iptal ettikten sonra başka cihazda oturum açarak hesabınıza dönebilirsiniz.", + "Enable email notifications": "E-posta bildirimlerini etkinleştir", + "Login": "Oturum aç", + "No rooms to show": "Gösterilecek oda yok", + "Download this file": "Bu dosyayı indir", + "Failed to change settings": "Ayarlar değiştirilemedi", + "View Source": "Kaynağı Görüntüle", + "Collapse panel": "Katlanır panel", + "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Geçerli tarayıcınız ile birlikte , uygulamanın görünüş ve kullanım hissi tamamen hatalı olabilir ve bazı ya da tüm özellikler çalışmayabilir. Yine de denemek isterseniz devam edebilirsiniz ancak karşılaşabileceğiniz sorunlar karşısında kendi başınasınız !", + "There are advanced notifications which are not shown here": "Burada gösterilmeyen gelişmiş bildirimler var" } diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 7d292a4bbe..bed499adc3 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -73,20 +73,18 @@ "Banned users": "Заблоковані користувачі", "Bans user with given id": "Блокує користувача з заданим ID", "Blacklisted": "В чорному списку", - "Bug Report": "Звіт про помилку", "Bulk Options": "Групові параметри", "Call Timeout": "Час очікування виклика", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Не вдається підключитись до домашнього серверу - перевірте підключення, переконайтесь, що ваш SSL-сертифікат домашнього сервера є довіреним і що розширення браузера не блокує запити.", "Can't load user settings": "Неможливо завантажити настройки користувача", "Cannot add any more widgets": "Неможливо додати більше віджетів", "Change Password": "Поміняти пароль", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s змінено з %(oldDisplayName)s на %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s змінив зображення профіля.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s змінив(ла) рівень доступу для %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s змінив(ла) назву кімнати на %(roomName)s.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s видалив ім'я кімнати.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s змінив тему на %(topic)s.", - "Email": "е-почта", + "Email": "е-пошта", "Email address": "Адреса е-почти", "Email address (optional)": "Адреса е-почти (не обов'язково)", "Email, name or matrix ID": "Е-почта, ім'я або matrix ID", @@ -97,5 +95,174 @@ "Rooms": "Кімнати", "Add rooms to this community": "Добавити кімнати в це суспільство", "This email address is already in use": "Ця адреса елект. почти вже використовується", - "This phone number is already in use": "Цей телефонний номер вже використовується" + "This phone number is already in use": "Цей телефонний номер вже використовується", + "Fetching third party location failed": "Не вдалось отримати стороннє місцеперебування", + "Messages in one-to-one chats": "Повідомлення у чатах \"сам на сам\"", + "A new version of Riot is available.": "Доступне оновлення для Riot.", + "Couldn't load home page": "Не вдалось завантажити домівку", + "Send Account Data": "Відправити данні аккаунта", + "Advanced notification settings": "Додаткові налаштування сповіщень", + "Uploading report": "Завантаження звіту", + "Sunday": "Неділя", + "Guests can join": "Гості можуть приєднуватися", + "Failed to add tag %(tagName)s to room": "Не вдалось додати до кімнати мітку %(tagName)s", + "Notification targets": "Цілі сповіщень", + "Failed to set direct chat tag": "Не вдалося встановити мітку прямого чату", + "Today": "Сьогодні", + "Failed to get protocol list from Home Server": "Не вдалось отримати перелік протоколів з Домашнього серверу", + "You are not receiving desktop notifications": "Ви не отримуєте сповіщення на стільниці", + "Friday": "П'ятниця", + "Update": "Оновити", + "What's New": "Що нового", + "Add an email address above to configure email notifications": "Додайте вище адресу е-пошти щоб налаштувати сповіщення е-поштою", + "Expand panel": "Розгорнути панель", + "On": "Увімкнено", + "Filter room names": "Відфільтрувати назви кімнат", + "Changelog": "Журнал змін", + "Waiting for response from server": "Очікується відповідь від сервера", + "Leave": "Вийти", + "Send Custom Event": "Відправити приватний захід", + "All notifications are currently disabled for all targets.": "Сповіщення для усіх цілей на даний момент вимкнені.", + "Failed to send logs: ": "Не вдалося відправити журнали: ", + "delete the alias.": "видалити псевдонім.", + "To return to your account in future you need to set a password": "Щоб мати змогу використовувати вашу обліковку у майбутньому, зазначте пароль", + "Forget": "Забути", + "World readable": "Відкрито для світу", + "#example": "#зразок", + "Hide panel": "Сховати панель", + "You cannot delete this image. (%(code)s)": "Ви не можете видалити це зображення. (%(code)s)", + "Cancel Sending": "Скасувати надсилання", + "Warning": "Попередження", + "This Room": "Ця кімната", + "The Home Server may be too old to support third party networks": "Домашній сервер може бути застарим для підтримки сторонніх мереж", + "Noisy": "Шумний", + "Error saving email notification preferences": "Помилка при збереженні параметрів сповіщень е-поштою", + "Messages containing my display name": "Повідомлення, вміщає моє ім'я", + "Remember, you can always set an email address in user settings if you change your mind.": "Пам'ятайте, що ви завжди можете встановити адресу е-пошти у налаштуваннях, якщо передумаєте.", + "Unavailable": "Нема в наявності", + "View Decrypted Source": "Переглянути розшифроване джерело", + "Failed to update keywords": "Не вдалось оновити ключові слова", + "remove %(name)s from the directory.": "прибрати %(name)s з каталогу.", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Сповіщення з наступних ключових слів дотримуються правил, що не можуть бути показані тут:", + "Safari and Opera work too.": "Safari та Opera працюють теж.", + "Please set a password!": "Встановіть пароль, будь ласка!", + "You have successfully set a password!": "Пароль успішно встановлено!", + "An error occurred whilst saving your email notification preferences.": "Під час збереження налаштувань сповіщень е-поштою трапилася помилка.", + "Explore Room State": "Перегляд статуса кімнати", + "Source URL": "Джерельне посилання", + "Messages sent by bot": "Повідомлення, надіслані ботом", + "Filter results": "Фільтр результатів", + "Members": "Члени", + "No update available.": "Оновлення відсутні.", + "Resend": "Перенадіслати", + "Files": "Файли", + "Collecting app version information": "Збір інформації про версію застосунка", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Видалити псевдонім %(alias)s та прибрати з каталогу %(name)s?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Це дозволить вам повернутися до своєї обліковки після виходу з неї, та заходити з інших пристроїв.", + "Keywords": "Ключові слова", + "Enable notifications for this account": "Увімкнути сповіщення для цієї обліковки", + "Directory": "Каталог", + "Invite to this community": "Запросити в це суспільство", + "Failed to get public room list": "Не вдалось отримати перелік прилюдних кімнат", + "Messages containing keywords": "Повідомлення, що містять ключові слова", + "When I'm invited to a room": "Коли мене запрошено до кімнати", + "Tuesday": "Вівторок", + "Enter keywords separated by a comma:": "Введіть ключові слова через кому:", + "Forward Message": "Переслати повідомлення", + "You have successfully set a password and an email address!": "Пароль та адресу е-пошти успішно встановлено!", + "Remove %(name)s from the directory?": "Прибрати %(name)s з каталогу?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot використовує багато новітніх функцій, деякі з яких не доступні або є експериментальними у вашому оглядачі.", + "Developer Tools": "Інструменти розробника", + "Preparing to send logs": "Підготовка до відправки журланлу", + "Unnamed room": "Неназвана кімната", + "Explore Account Data": "Продивитись данні аккаунта", + "All messages (noisy)": "Усі повідомлення (гучно)", + "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": "докладніше", + "You must specify an event type!": "Необхідно вказати тип захода!", + "(HTTP status %(httpStatus)s)": "(статус HTTP %(httpStatus)s)", + "All Rooms": "Усі кімнати", + "Please install Chrome or Firefox for the best experience.": "Краще встановіть Chrome або Firefox.", + "Wednesday": "Середа", + "You cannot delete this message. (%(code)s)": "Ви не можете видалити це повідомлення. (%(code)s)", + "Quote": "Цитувати", + "Send": "Надіслати", + "Send logs": "Надіслати журнали", + "All messages": "Усі повідомлення", + "Call invitation": "Запрошення до виклику", + "Downloading update...": "Звантаженя оновлення…", + "State Key": "Ключ стану", + "Failed to send custom event.": "Не вдалося відправити приватний захід.", + "What's new?": "Що нового?", + "Notify me for anything else": "Сповіщати мене про будь-що інше", + "View Source": "Переглянути джерело", + "Can't update user notification settings": "Неможливо оновити налаштування користувацьких сповіщень", + "Notify for all other messages/rooms": "Сповіщати щодо всіх повідомлень/кімнат", + "Unable to look up room ID from server": "Неможливо знайти ID кімнати на сервері", + "Couldn't find a matching Matrix room": "Неможливо знайти відповідну кімнату", + "Invite to this room": "Запросити до цієї кімнати", + "Search for a room": "Пошук кімнати", + "Thursday": "Четвер", + "Search…": "Пошук…", + "Logs sent": "Журнали відправленні", + "Back": "Назад", + "Reply": "Відповісти", + "Show message in desktop notification": "Показати повідомлення в сповіщення на робочому столі", + "Unable to join network": "Неможливо приєднатись до мережі", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Можливо, ви налаштували їх не у Riot, а у іншому застосунку. Ви не можете регулювати їх у Riot, але вони все ще мають силу", + "Sorry, your browser is not able to run Riot.": "Вибачте, ваш оглядач не спроможний запустити Riot.", + "Uploaded on %(date)s by %(user)s": "Завантажено %(date)s користувачем %(user)s", + "Messages in group chats": "Повідомлення у групових чатах", + "Yesterday": "Вчора", + "Error encountered (%(errorDetail)s).": "Трапилась помилка (%(errorDetail)s).", + "Login": "Зайти", + "Low Priority": "Неважливі", + "Unable to fetch notification target list": "Неможливо отримати перелік цілей сповіщення", + "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": "Є додаткові сповіщення, що не показуються тут", + "Clear Cache": "Очистити кеш", + "Clear Cache and Reload": "Очистити кеш та перезавантажити", + "Updates": "Оновлення", + "Check for update": "Перевірити на наявність оновлень", + "Reject all %(invitedRooms)s invites": "Відхилити запрошення до усіх %(invitedRooms)s", + "Desktop specific": "Властиві для стільниці", + "Profile": "Профіль", + "Display name": "Відображуване ім'я", + "To return to your account in future you need to set a password": "Щоб мати змогу користуватись обліковкою у майбутньому, треба зазначити пароль", + "Logged in as:": "Ви зайшли як:", + "click to reveal": "натисніть щоб побачити", + "Homeserver is": "Домашній сервер —" } diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index d27ef2a48a..8e2dc6e0f8 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -10,18 +10,18 @@ "Decryption error": "解密出错", "Delete": "删除", "Default": "默认", - "Device ID": "设备识别码", + "Device ID": "设备 ID", "Devices": "设备列表", "Devices will not yet be able to decrypt history from before they joined the room": "新加入聊天室的设备不能解密加入之前的聊天记录", "Direct chats": "私聊", "Disinvite": "取消邀请", - "Display name": "显示名称", + "Display name": "昵称", "Displays action": "显示操作", "Don't send typing notifications": "不要发送我的打字状态", "Download %(text)s": "下载 %(text)s", "Email": "电子邮箱", - "Email address": "电子邮箱地址", - "Email, name or matrix ID": "电子邮箱,姓名或者matrix ID", + "Email address": "邮箱地址", + "Email, name or matrix ID": "邮箱地址,名称或者Matrix ID", "Emoji": "表情", "Enable encryption": "启用加密", "Encrypted messages will not be visible on clients that do not yet implement encryption": "不支持加密的客户端将看不到加密的消息", @@ -29,18 +29,18 @@ "%(senderName)s ended the call.": "%(senderName)s 结束了通话。.", "End-to-end encryption information": "端到端加密信息", "End-to-end encryption is in beta and may not be reliable": "端到端加密现为 beta 版,不一定可靠", - "Enter Code": "输入代码", + "Enter Code": "输入验证码", "Error": "错误", "Error decrypting attachment": "解密附件时出错", "Event information": "事件信息", - "Existing Call": "现有通话", + "Existing Call": "当前通话", "Export E2E room keys": "导出聊天室的端到端加密密钥", "Failed to ban user": "封禁用户失败", "Failed to change password. Is your password correct?": "修改密码失败。确认原密码输入正确吗?", - "Failed to forget room %(errCode)s": "无法忘记聊天室 %(errCode)s", + "Failed to forget room %(errCode)s": "忘记聊天室失败,错误代码: %(errCode)s", "Failed to join room": "无法加入聊天室", - "Failed to kick": "踢人失败", - "Failed to leave room": "无法离开聊天室", + "Failed to kick": "移除失败", + "Failed to leave room": "无法退出聊天室", "Failed to load timeline position": "无法加载时间轴位置", "Failed to lookup current room": "找不到当前聊天室", "Failed to mute user": "禁言用户失败", @@ -48,7 +48,7 @@ "Failed to reject invitation": "拒绝邀请失败", "Failed to save settings": "保存设置失败", "Failed to send email": "发送邮件失败", - "Failed to send request.": "发送请求失败。", + "Failed to send request.": "请求发送失败。", "Failed to set avatar.": "设置头像失败。.", "Failed to set display name": "设置昵称失败", "Failed to set up conference call": "无法启动群组通话", @@ -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,11 +81,10 @@ "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 未被允许向你推送消息 - 请检查浏览器设置", - "Riot was not given permission to send notifications - please try again": "Riot 未被允许推送消息通知 - 请重试", + "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 没有通知发送权限 - 请重试", "riot-web version:": "riot-网页版:", "Room %(roomId)s not visible": "聊天室 %(roomId)s 已隐藏", "Room Colour": "聊天室颜色", @@ -106,7 +104,7 @@ "Server may be unavailable or overloaded": "服务器可能不可用或者超载", "Server may be unavailable, overloaded, or search timed out :(": "服务器可能不可用、超载,或者搜索超时 :(", "Server may be unavailable, overloaded, or the file too big": "服务器可能不可用、超载,或者文件过大", - "Server may be unavailable, overloaded, or you hit a bug.": "服务器可能不可用、超载,或者你遇到了一个漏洞.", + "Server may be unavailable, overloaded, or you hit a bug.": "服务器可能不可用、超载,或者你遇到了一个 bug。", "Server unavailable, overloaded, or something else went wrong.": "服务器可能不可用、超载,或者其他东西出错了.", "Session ID": "会话 ID", "%(senderName)s set a profile picture.": "%(senderName)s 设置了头像。.", @@ -125,17 +123,17 @@ "Success": "成功", "The default role for new room members is": "此聊天室新成员的默认角色是", "The main address for this room is": "此聊天室的主要地址是", - "This email address is already in use": "此邮箱地址已经被使用", + "This email address is already in use": "此邮箱地址已被使用", "This email address was not found": "未找到此邮箱地址", "The email address linked to your account must be entered.": "必须输入和你账号关联的邮箱地址。", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "文件 '%(fileName)s' 超过了此主服务器的上传大小限制", "The file '%(fileName)s' failed to upload": "文件 '%(fileName)s' 上传失败", "Add email address": "添加邮件地址", - "Add phone number": "添加电话号码", + "Add phone number": "添加手机号码", "Advanced": "高级", "Algorithm": "算法", "Always show message timestamps": "总是显示消息时间戳", - "%(names)s and %(lastPerson)s are typing": "%(names)s 和 %(lastPerson)s 正在打字", + "%(names)s and %(lastPerson)s are typing": "%(names)s 和 %(lastPerson)s 正在输入", "A new password must be entered.": "一个新的密码必须被输入。.", "%(senderName)s answered the call.": "%(senderName)s 接了通话。.", "An error has occurred.": "一个错误出现了。", @@ -154,7 +152,7 @@ "%(targetName)s joined the room.": "%(targetName)s 已加入聊天室。", "Jump to first unread message.": "跳到第一条未读消息。", "%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.", - "Leave room": "离开聊天室", + "Leave room": "退出聊天室", "Login as guest": "以游客的身份登录", "New password": "新密码", "Add a topic": "添加一个主题", @@ -179,23 +177,21 @@ "Anyone who knows the room's link, apart from guests": "任何知道聊天室链接的人,游客除外", "Anyone who knows the room's link, including guests": "任何知道聊天室链接的人,包括游客", "Are you sure?": "你确定吗?", - "Are you sure you want to leave the room '%(roomName)s'?": "你确定要离开聊天室 “%(roomName)s” 吗?", + "Are you sure you want to leave the room '%(roomName)s'?": "你确定要退出聊天室 “%(roomName)s” 吗?", "Are you sure you want to reject the invitation?": "你确定要拒绝邀请吗?", "Are you sure you want to upload the following files?": "你确定要上传这些文件吗?", - "Bans user with given id": "封禁指定 ID 的用户", + "Bans user with given id": "按照 ID 封禁指定的用户", "Blacklisted": "已列入黑名单", - "Bug Report": "反馈漏洞", "Bulk Options": "批量操作", "Call Timeout": "通话超时", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "无法连接主服务器 - 请检查网络连接,确保你的主服务器 SSL 证书被信任,且没有浏览器插件拦截请求。", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "当浏览器地址栏里有 HTTPS 的 URL 时,不能使用 HTTP 连接主服务器。请使用 HTTPS 或者允许不安全的脚本。", "Can't load user settings": "无法加载用户设置", "Change Password": "修改密码", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s 将昵称从 %(oldDisplayName)s 改为了 %(displayName)s。", "%(senderName)s changed their profile picture.": "%(senderName)s 修改了头像。", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s 将聊天室名称改为 %(roomName)s。", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s 移除了聊天室名称。", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s 把话题修改为 “%(topic)s”。", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s 将话题修改为 “%(topic)s”。", "Changes to who can read history will only apply to future messages in this room": "修改阅读历史的权限仅对此聊天室以后的消息有效", "Changes your display nickname": "修改昵称", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "目前,修改密码会导致所有设备上的端到端密钥被重置,使得加密的聊天记录不再可读。除非你事先导出聊天室密钥,修改密码后再导入。这个问题未来会改善。", @@ -214,8 +210,8 @@ "Conference calling is in development and may not be reliable.": "视频会议功能还在开发状态,可能不稳定。", "Conference calls are not supported in encrypted rooms": "加密聊天室不支持视频会议", "Conference calls are not supported in this client": "此客户端不支持视频会议", - "%(count)s new messages|one": "%(count)s 条新消息", - "%(count)s new messages|other": "%(count)s 新消息", + "%(count)s new messages|one": "%(count)s 条未读消息", + "%(count)s new messages|other": "%(count)s 未读消息", "Create a new chat or reuse an existing one": "创建新聊天或使用已有的聊天", "Custom": "自定义", "Custom level": "自定义级别", @@ -226,7 +222,7 @@ "Device key:": "设备密钥 :", "Disable Notifications": "关闭消息通知", "Drop File Here": "把文件拖拽到这里", - "Email address (optional)": "电子邮件地址 (可选)", + "Email address (optional)": "邮箱地址 (可选)", "Enable Notifications": "启用消息通知", "Encrypted by a verified device": "由一个已验证的设备加密", "Encrypted by an unverified device": "由一个未经验证的设备加密", @@ -236,31 +232,31 @@ "Error: Problem communicating with the given homeserver.": "错误: 与指定的主服务器通信时出错。", "Export": "导出", "Failed to fetch avatar URL": "获取 Avatar URL 失败", - "Failed to upload profile picture!": "无法上传头像!", + "Failed to upload profile picture!": "头像上传失败!", "Guest access is disabled on this Home Server.": "此服务器禁用了游客访问。", "Home": "主页面", "Import": "导入", "Incoming call from %(name)s": "来自 %(name)s 的通话", "Incoming video call from %(name)s": "来自 %(name)s 的视频通话", - "Incoming voice call from %(name)s": "来自 %(name)s 的视频通话", + "Incoming voice call from %(name)s": "来自 %(name)s 的语音通话", "Incorrect username and/or password.": "用户名或密码错误。", "%(senderName)s invited %(targetName)s.": "%(senderName)s 邀请了 %(targetName)s。", "Invited": "已邀请", "Invites": "邀请", - "Invites user with given id to current room": "邀请指定 ID 的用户加入当前聊天室", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' 不是一个合法的电子邮件地址格式", + "Invites user with given id to current room": "按照 ID 邀请指定用户加入当前聊天室", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' 不是一个合法的邮箱地址格式", "'%(alias)s' is not a valid format for an alias": "'%(alias)s' 不是一个合法的昵称格式", - "%(displayName)s is typing": "%(displayName)s 正在打字", + "%(displayName)s is typing": "%(displayName)s 正在输入", "Sign in with": "第三方登录", "Message not sent due to unknown devices being present": "消息未发送,因为有未知的设备存在", - "Missing room_id in request": "请求中没有 room_id", + "Missing room_id in request": "请求中没有 聊天室 ID", "Missing user_id in request": "请求中没有 user_id", "Mobile phone number": "手机号码", "Mobile phone number (optional)": "手机号码 (可选)", - "Moderator": "管理员", + "Moderator": "协管员", "Mute": "静音", "Name": "姓名", - "Never send encrypted messages to unverified devices from this device": "不要从此设备向未验证的设备发送消息", + "Never send encrypted messages to unverified devices from this device": "在此设备上不向未经验证的设备发送消息", "New passwords don't match": "两次输入的新密码不符", "none": "无", "not set": "未设置", @@ -278,12 +274,12 @@ "Password:": "密码:", "Passwords can't be empty": "密码不能为空", "Permissions": "权限", - "Phone": "电话", + "Phone": "手机号码", "Cancel": "取消", "Create new room": "创建新聊天室", "Custom Server Options": "自定义服务器选项", - "Dismiss": "设为已读", - "powered by Matrix": "由 Matrix 提供", + "Dismiss": "标记为已读", + "powered by Matrix": "由 Matrix 驱动", "Remove": "移除", "Room directory": "聊天室目录", "Start chat": "开始聊天", @@ -295,10 +291,9 @@ "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 离开了聊天室。", + "%(targetName)s left the room.": "%(targetName)s 退出了聊天室。", "Logged in as:": "登录为:", "Logout": "登出", "Low priority": "低优先级", @@ -308,11 +303,10 @@ "No more results": "没有更多结果", "olm version:": "olm 版本:", "Only people who have been invited": "只有被邀请的人", - "Otherwise, click here to send a bug report.": "否则,点击这里发送一个错误报告。", "Privacy warning": "隐私警告", "Private Chat": "私聊", "Privileged Users": "特权用户", - "Reason": "原因", + "Reason": "理由", "Register": "注册", "%(targetName)s rejected the invitation.": "%(targetName)s 拒绝了邀请。", "Reject invitation": "拒绝邀请", @@ -357,24 +351,22 @@ "Failed to invite user": "邀请用户失败", "Unknown error": "未知错误", "Incorrect password": "密码错误", - "This action is irreversible.": "此操作不可逆。", "To continue, please enter your password.": "请输入你的密码继续。", - "Device name": "设备名", - "Device Name": "设备名", + "Device name": "设备名称", + "Device Name": "设备名称", "Device key": "设备密钥", "Verify device": "验证设备", - "I verify that the keys match": "我验证密钥匹配", + "I verify that the keys match": "我验证此密钥匹配", "Unable to restore session": "无法恢复会话", - "Continue anyway": "无论如何都继续", "Blacklist": "列入黑名单", "Unverify": "取消验证", "ex. @bob:example.com": "例如 @bob:example.com", "Add User": "添加用户", - "This Home Server would like to make sure you are not a robot": "这个Home Server想要确认你不是一个机器人", + "This Home Server would like to make sure you are not a robot": "此主服务器想确保您不是机器人", "Token incorrect": "令牌错误", "Default server": "默认服务器", "Custom server": "自定义服务器", - "URL Previews": "URL 预览", + "URL Previews": "链接预览", "Drop file here to upload": "把文件拖到这里以上传", "Online": "在线", "Idle": "空闲", @@ -400,35 +392,35 @@ "Drop here to tag %(section)s": "拖拽到这里标记 %(section)s", "Enable automatic language detection for syntax highlighting": "启用自动语言检测用于语法高亮", "Failed to change power level": "修改特权级别失败", - "Kick": "踢出", - "Kicks user with given id": "踢出指定 ID 的用户", - "Last seen": "上次看见", + "Kick": "移除", + "Kicks user with given id": "按照 ID 移除特定的用户", + "Last seen": "最近一次上线", "Level:": "级别:", "Local addresses for this room:": "这个聊天室的本地地址:", "New passwords must match each other.": "新密码必须互相匹配。", - "Power level must be positive integer.": "特权级别必须是正整数。", - "Reason: %(reasonText)s": "原因: %(reasonText)s", + "Power level must be positive integer.": "权限级别必须是正整数。", + "Reason: %(reasonText)s": "理由: %(reasonText)s", "Revoke Moderator": "撤销主持人", "Revoke widget access": "撤销小部件的访问", "Remote addresses for this room:": "这个聊天室的远程地址:", "Remove Contact Information?": "移除联系人信息?", "Remove %(threePid)s?": "移除 %(threePid)s?", "Results from DuckDuckGo": "来自 DuckDuckGo 的结果", - "Room contains unknown devices": "聊天室有未知设备", + "Room contains unknown devices": "聊天室包含未知设备", "%(roomName)s does not exist.": "%(roomName)s 不存在。", "Save": "保存", "Send anyway": "无论任何都发送", "Sets the room topic": "设置聊天室主题", "Show Text Formatting Toolbar": "显示文字格式工具栏", "This room has no local addresses": "这个聊天室没有本地地址", - "This doesn't appear to be a valid email address": "这看起来不是一个合法的电子邮件地址", + "This doesn't appear to be a valid email address": "这看起来不是一个合法的邮箱地址", "This is a preview of this room. Room interactions have been disabled": "这是这个聊天室的一个预览。聊天室交互已禁用", - "This phone number is already in use": "此电话号码已经被使用", + "This phone number is already in use": "此手机号码已被使用", "This room": "这个聊天室", "This room is not accessible by remote Matrix servers": "这个聊天室无法被远程 Matrix 服务器访问", "This room's internal ID is": "这个聊天室的内部 ID 是", - "Turn Markdown off": "关闭 Markdown", - "Turn Markdown on": "打开 Markdown", + "Turn Markdown off": "禁用 Markdown", + "Turn Markdown on": "启用 Markdown", "Unable to create widget.": "无法创建小部件。", "Unban": "解除封禁", "Unable to capture screen": "无法录制屏幕", @@ -438,7 +430,7 @@ "Unencrypted room": "未加密的聊天室", "unencrypted": "未加密的", "Unencrypted message": "未加密的消息", - "unknown caller": "未知的呼叫者", + "unknown caller": "未知呼叫者", "unknown device": "未知设备", "Unnamed Room": "未命名的聊天室", "Unverified": "未验证", @@ -454,10 +446,10 @@ "Passwords don't match.": "密码不匹配。", "I already have an account": "我已经有一个帐号", "Unblacklist": "移出黑名单", - "Not a valid Riot keyfile": "不是一个合法的 Riot 密钥文件", - "%(targetName)s accepted an invitation.": "%(targetName)s 接受了一个邀请。", + "Not a valid Riot keyfile": "不是一个有效的 Riot 密钥文件", + "%(targetName)s accepted an invitation.": "%(targetName)s 已接受邀请。", "Do you want to load widget from URL:": "你想从此 URL 加载小组件吗:", - "Hide join/leave messages (invites/kicks/bans unaffected)": "隐藏加入/离开消息(邀请/踢出/封禁不受影响)", + "Hide join/leave messages (invites/kicks/bans unaffected)": "隐藏加入/退出消息(邀请/踢出/封禁不受影响)", "Integrations Error": "集成错误", "Publish this room to the public in %(domain)s's room directory?": "把这个聊天室发布到 %(domain)s 的聊天室目录吗?", "Manage Integrations": "管理集成", @@ -466,16 +458,15 @@ "Please check your email and click on the link it contains. Once this is done, click continue.": "请检查你的电子邮箱并点击里面包含的链接。完成时请点击继续。", "Press to start a chat with someone": "按下 来开始和某个人聊天", "%(senderName)s removed their profile picture.": "%(senderName)s 移除了他们的头像。", - "%(senderName)s requested a VoIP conference.": "%(senderName)s 请求一个 VoIP 会议。", + "%(senderName)s requested a VoIP conference.": "%(senderName)s 已请求发起 VoIP 会议。", "Seen by %(userName)s at %(dateTime)s": "在 %(dateTime)s 被 %(userName)s 看到", - "Show Apps": "显示应用", - "Tagged as: ": "标记为:", - "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "验证码将发送到+%(msisdn)s,请输入接收到的验证码", + "Tagged as: ": "标记为: ", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "验证码将发送至 +%(msisdn)s,请输入收到的验证码", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s 接受了 %(displayName)s 的邀请。", - "Active call (%(roomName)s)": "%(roomName)s 的呼叫", + "Active call (%(roomName)s)": "当前通话 (来自聊天室 %(roomName)s)", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s 将级别调整到%(powerLevelDiffText)s 。", "Changes colour scheme of current room": "修改了样式", - "Deops user with given id": "Deops user", + "Deops user with given id": "按照 ID 取消特定用户的管理员权限", "Join as voice or video.": "通过 语言 或者 视频加入.", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s 设定历史浏览功能为 所有聊天室成员,从他们被邀请开始.", "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s 设定历史浏览功能为 所有聊天室成员,从他们加入开始.", @@ -491,24 +482,23 @@ "Refer a friend to Riot:": "介绍朋友加入Riot:", "%(roomName)s is not accessible at this time.": "%(roomName)s 此时无法访问。", "Start authentication": "开始认证", - "The maximum permitted number of widgets have already been added to this room.": "小部件的最大允许数量已经添加到这个房间了。", - "The phone number entered looks invalid": "输入的电话号码看起来无效", - "The remote side failed to pick up": "远端未能接收到", - "This Home Server does not support login using email address.": "HS不支持使用电子邮件地址登陆。", - "This invitation was sent to an email address which is not associated with this account:": "此邀请被发送到与此帐户不相关的电子邮件地址:", - "This room is not recognised.": "这个房间未匹配。", + "The maximum permitted number of widgets have already been added to this room.": "小部件的最大允许数量已经添加到这个聊天室了。", + "The phone number entered looks invalid": "输入的手机号码看起来无效", + "The remote side failed to pick up": "对方未能接听", + "This Home Server does not support login using email address.": "HS不支持使用邮箱地址登陆。", + "This invitation was sent to an email address which is not associated with this account:": "此邀请被发送到与此帐户不相关的邮箱地址:", + "This room is not recognised.": "无法识别此聊天室。", "To get started, please pick a username!": "请点击用户名!", - "Unable to add email address": "无法添加电子邮件地址", + "Unable to add email address": "无法添加邮箱地址", "Automatically replace plain text Emoji": "文字、表情自动转换", - "To reset your password, enter the email address linked to your account": "要重置你的密码,请输入关联你的帐号的电子邮箱地址", - "Unable to verify email address.": "无法验证电子邮箱地址。", + "To reset your password, enter the email address linked to your account": "要重置你的密码,请输入关联你的帐号的邮箱地址", + "Unable to verify email address.": "无法验证邮箱地址。", "Unknown room %(roomId)s": "未知聊天室 %(roomId)s", "Unknown (user, device) pair:": "未知(用户,设备)对:", "Unrecognised command:": "无法识别的命令:", "Unrecognised room alias:": "无法识别的聊天室别名:", "Use with caution": "谨慎使用", "User Interface": "用户界面", - "%(user)s is a": "%(user)s 是一个", "User name": "用户名", "(no answer)": "(没有回答)", "(warning: cannot be disabled again!)": "(警告:无法再被禁用!)", @@ -516,35 +506,35 @@ "Who can access this room?": "谁可以访问这个聊天室?", "Who would you like to add to this room?": "你想把谁加入这个聊天室?", "Who would you like to communicate with?": "你想和谁交流?", - "You are already in a call.": "你已经在一个通话之中。", + "You are already in a call.": "您正在通话。", "You do not have permission to do that in this room.": "你没有权限在这个聊天室里面做那件事。", "You are trying to access %(roomName)s.": "你正在尝试访问 %(roomName)s.", "You cannot place VoIP calls in this browser.": "你不能在这个浏览器中发起 VoIP 通话。", "You do not have permission to post to this room": "你没有发送到这个聊天室的权限", - "You have been invited to join this room by %(inviterName)s": "你已经被 %(inviterName)s 邀请加入这个聊天室", - "You seem to be in a call, are you sure you want to quit?": "你好像在一个通话中,你确定要退出吗?", - "You seem to be uploading files, are you sure you want to quit?": "你好像正在上传文件,你确定要退出吗?", + "You have been invited to join this room by %(inviterName)s": "您已被 %(inviterName)s 邀请加入这个聊天室", + "You seem to be in a call, are you sure you want to quit?": "您似乎正在进行通话,确定要退出吗?", + "You seem to be uploading files, are you sure you want to quit?": "您似乎正在上传文件,确定要退出吗?", "You should not yet trust it to secure data": "你不应该相信它来保护你的数据", "Upload an avatar:": "上传一个头像:", - "This doesn't look like a valid email address.": "这看起来不是一个合法的电子邮件地址。", - "This doesn't look like a valid phone number.": "这看起来不是一个合法的电话号码。", + "This doesn't look like a valid email address.": "这看起来不是一个合法的邮箱地址。", + "This doesn't look like a valid phone number.": "这看起来不是一个合法的手机号码。", "User names may only contain letters, numbers, dots, hyphens and underscores.": "用户名只可以包含字母、数字、点、连字号和下划线。", "An unknown error occurred.": "一个未知错误出现了。", "An error occurred: %(error_string)s": "一个错误出现了: %(error_string)s", "Encrypt room": "加密聊天室", "There are no visible files in this room": "这个聊天室里面没有可见的文件", - "Active call": "活跃的通话", + "Active call": "当前通话", "Verify...": "验证...", "Error decrypting audio": "解密音频时出错", "Error decrypting image": "解密图像时出错", "Error decrypting video": "解密视频时出错", - " (unsupported)": "(不支持)", + " (unsupported)": " (不支持)", "Updates": "更新", "Check for update": "检查更新", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s 移除了聊天室头像。", "Something went wrong!": "出了点问题!", "If you already have a Matrix account you can log in instead.": "如果你已经有一个 Matrix 帐号,你可以登录。", - "Do you want to set an email address?": "你要设置一个电子邮箱地址吗?", + "Do you want to set an email address?": "你要设置一个邮箱地址吗?", "New address (e.g. #foo:%(localDomain)s)": "新的地址(例如 #foo:%(localDomain)s)", "Upload new:": "上传新的:", "User ID": "用户 ID", @@ -554,16 +544,16 @@ "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告:密钥验证失败!%(userId)s 和 device %(deviceId)s 的签名密钥是 \"%(fprint)s\",和提供的咪呀 \"%(fingerprint)s\" 不匹配。这可能意味着你的通信正在被窃听!", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s 收回了 %(targetName)s 的邀请。", "Would you like to accept or decline this invitation?": "你想要 接受 还是 拒绝 这个邀请?", - "You already have existing direct chats with this user:": "你已经有和这个用户的直接聊天:", + "You already have existing direct chats with this user:": "你已经有和此用户的直接聊天:", "You're not in any rooms yet! Press to make a room or to browse the directory": "你现在还不再任何聊天室!按下 来创建一个聊天室或者 来浏览目录", "You cannot place a call with yourself.": "你不能和你自己发起一个通话。", - "You have been kicked from %(roomName)s by %(userName)s.": "你已经被 %(userName)s 踢出了 %(roomName)s.", + "You have been kicked from %(roomName)s by %(userName)s.": "您已被 %(userName)s 从聊天室 %(roomName)s 中移除。", "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": "你已经登出了所有的设备并不再接收推送通知。要重新启用通知,请再在每个设备上登录", - "You have disabled URL previews by default.": "你已经默认 禁用 URL 预览。", - "You have enabled URL previews by default.": "你已经默认 启用 URL 预览。", + "You have disabled URL previews by default.": "你已经默认 禁用 链接预览。", + "You have enabled URL previews by default.": "你已经默认 启用 链接预览。", "Your home server does not support device management.": "你的 home server 不支持设备管理。", "Set a display name:": "设置一个昵称:", - "This server does not support authentication with a phone number.": "这个服务器不支持用电话号码认证。", + "This server does not support authentication with a phone number.": "这个服务器不支持用手机号码认证。", "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "密码过短(最短为 %(MIN_PASSWORD_LENGTH)s)。", "Make this room private": "使这个聊天室私密", "Share message history with new users": "和新用户共享消息历史", @@ -574,7 +564,7 @@ "(~%(count)s results)|other": "(~%(count)s 个结果)", "Please select the destination room for this message": "请选择这条消息的目标聊天室", "Start automatically after system login": "在系统登录后自动启动", - "Analytics": "分析", + "Analytics": "统计分析服务", "Reject all %(invitedRooms)s invites": "拒绝所有 %(invitedRooms)s 邀请", "You may wish to login with a different account, or add this email to this account.": "你可能希望用另外一个账户登录,或者添加这个电子邮件到这个账户上。", "Sun": "星期日", @@ -600,15 +590,13 @@ "You must join the room to see its files": "你必须加入聊天室以看到它的文件", "Failed to invite the following users to the %(roomName)s room:": "邀请以下用户到 %(roomName)s 聊天室失败:", "Confirm Removal": "确认移除", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "这会让你的账户永远不可用。你无法重新注册同一个用户 ID.", "Verifies a user, device, and pubkey tuple": "验证一个用户、设备和密钥元组", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "我们在尝试恢复你之前的会话时遇到了一个错误。如果你继续,你将需要重新登录,加密的聊天历史将会不可读。", "Unknown devices": "未知设备", "Unknown Address": "未知地址", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s 删除了他们的昵称 (%(oldDisplayName)s).", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "你提供的签名密钥和你从 %(userId)s 的设备 (deviceId)s 收到的签名密钥匹配。设备被标记为已验证。", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "您提供的签名密钥和你从 %(userId)s 的设备 %(deviceId)s 收到的签名密钥匹配。设备被标记为已验证。", "These are experimental features that may break in unexpected ways": "这些是可能以意外的方式坏掉的实验性的特性", - "The visibility of existing history will be unchanged": "现有历史记录的可见性不会被改变", + "The visibility of existing history will be unchanged": "现有历史记录的可见性不会改变", "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s 打开了端到端加密 (算法 %(algorithm)s).", "Unable to remove contact information": "无法移除联系人信息", "Riot collects anonymous analytics to allow us to improve the application.": "Riot 收集匿名的分析数据来允许我们改善这个应用。", @@ -616,28 +604,544 @@ "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "你可以使用自定义的服务器选项来通过指定一个不同的主服务器 URL 来登录其他 Matrix 服务器。", "This allows you to use this app with an existing Matrix account on a different home server.": "这允许你用一个已有在不同主服务器的 Matrix 账户使用这个应用。", "Please check your email to continue registration.": "请查看你的电子邮件以继续注册。", - "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "如果你不指定一个电子邮箱地址,你将不能重置你的密码。你确定吗?", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "如果你不指定一个邮箱地址,你将不能重置你的密码。你确定吗?", "Home server URL": "主服务器 URL", - "Identity server URL": "身份服务器 URL", + "Identity server URL": "身份认证服务器 URL", "What does this mean?": "这是什么意思?", - "Image '%(Body)s' cannot be displayed.": "图像 '%(Body)s' 无法显示。", - "This image cannot be displayed.": "图像无法显示。", "Add an Integration": "添加一个集成", "Removed or unknown message type": "被移除或未知的消息类型", "Ongoing conference call%(supportedText)s.": "正在进行的会议通话 %(supportedText)s.", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s 修改了 %(roomName)s 的头像", "This will be your account name on the homeserver, or you can pick a different server.": "这将会成为你在 主服务器上的账户名,或者你可以选择一个 不同的服务器。", - "Your browser does not support the required cryptography extensions": "你的浏览器不支持所需的密码学扩展", + "Your browser does not support the required cryptography extensions": "你的浏览器不支持 Riot 所需的密码学特性", "Authentication check failed: incorrect password?": "身份验证失败:密码错误?", "This will allow you to reset your password and receive notifications.": "这将允许你重置你的密码和接收通知。", "Share without verifying": "不验证就分享", "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' 正在请求加密密钥。", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "你的未经验证的设备 '%(displayName)s' 正在请求加密密钥。", "Encryption key request": "加密密钥请求", - "Autocomplete Delay (ms):": "自动完成延迟(毫秒):", + "Autocomplete Delay (ms):": "自动补全延迟(毫秒):", "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 添加", "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 移除", "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 修改", "Unpin Message": "取消置顶消息", - "Add rooms to this community": "添加聊天室到此社区" + "Add rooms to this community": "添加聊天室到此社区", + "Call Failed": "呼叫失败", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "聊天室中有未知设备:如果您在不验证它们的情况下继续,您的通话可能会被人窃听。", + "Review Devices": "复查设备", + "Call Anyway": "仍然呼叫", + "Answer Anyway": "仍然接听", + "Call": "呼叫", + "Answer": "接听", + "Invite new community members": "邀请新社区成员", + "Invite to Community": "邀请到社区", + "Room name or alias": "聊天室名称或别名", + "Ignored user": "忽视用户", + "You are now ignoring %(userId)s": "你正在忽视 %(userId)s", + "Unignored user": "接触忽视用户", + "You are no longer ignoring %(userId)s": "你不再忽视 %(userId)s", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s 解除了 %(targetName)s 的封禁。", + "(could not connect media)": "(无法连接媒体)", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s 更改了聊天室的置顶消息。", + "%(names)s and %(count)s others are typing|other": "%(names)s 和另外 %(count)s 个人正在输入", + "%(names)s and %(count)s others are typing|one": "%(names)s 和另一个人正在输入", + "Send": "发送", + "Message Pinning": "消息置顶", + "Disable Emoji suggestions while typing": "输入时禁用 Emoji 建议", + "Use compact timeline layout": "使用紧凑的时间线布局", + "Hide avatar changes": "隐藏头像修改", + "Hide display name changes": "隐藏昵称修改", + "Disable big emoji in chat": "禁用聊天中的大Emoji", + "Never send encrypted messages to unverified devices in this room from this device": "在此设备上,在此聊天室中不向未经验证的设备发送加密的消息", + "Enable URL previews for this room (only affects you)": "在此聊天室启用链接预览(只影响你)", + "Enable URL previews by default for participants in this room": "对这个聊天室的参与者默认启用 链接预览", + "Delete %(count)s devices|other": "删除了 %(count)s 个设备", + "Delete %(count)s devices|one": "删除设备", + "Select devices": "选择设备", + "%(senderName)s sent an image": "%(senderName)s 发送了一张图片", + "%(senderName)s sent a video": "%(senderName)s 发送了一个视频", + "%(senderName)s uploaded a file": "%(senderName)s 上传了一个文件", + "Unignore": "取消忽视", + "Ignore": "忽视", + "Jump to read receipt": "跳到阅读回执", + "Mention": "提及", + "Invite": "邀请", + "User Options": "用户选项", + "Jump to message": "跳到消息", + "No pinned messages.": "没有置顶消息。", + "Loading...": "正在加载...", + "Pinned Messages": "置顶的消息", + "Unknown": "未知的", + "Unnamed room": "未命名的聊天室", + "World readable": "公开可读", + "Guests can join": "访客可以加入", + "No rooms to show": "无聊天室", + "Addresses": "地址", + "Message removed": "消息已移除", + "An email has been sent to %(emailAddress)s": "一封邮件已发送到 %(emailAddress)s", + "A text message has been sent to %(msisdn)s": "一封短信已发送到 %(msisdn)s", + "Username on %(hs)s": "在 %(hs)s 上的用户名", + "Visible to everyone": "对所有人可见", + "Delete Widget": "删除小组件", + "were invited %(count)s times|other": "被邀请 %(count)s 次", + "were invited %(count)s times|one": "被邀请", + "was invited %(count)s times|other": "被邀请 %(count)s 次", + "was invited %(count)s times|one": "被邀请", + "were banned %(count)s times|other": "被封禁 %(count)s 次", + "were banned %(count)s times|one": "被封禁", + "was banned %(count)s times|other": "被封禁 %(count)s 次", + "was banned %(count)s times|one": "被封禁", + "were unbanned %(count)s times|other": "被解封 %(count)s 次", + "were unbanned %(count)s times|one": "被解封", + "was unbanned %(count)s times|other": "被解封 %(count)s 次", + "was unbanned %(count)s times|one": "被解封", + "were kicked %(count)s times|other": "被踢出 %(count)s 次", + "were kicked %(count)s times|one": "被踢出", + "was kicked %(count)s times|other": "被踢出 %(count)s 次", + "was kicked %(count)s times|one": "被踢出", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s 改了他们的名称 %(count)s 次", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s 改了他们的名称", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s 改了他们的名称 %(count)s 次", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s 改了他们的名称", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s 更换了他们的的头像 %(count)s 次", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s 更换了他们的头像", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s 更换了他们的头像 %(count)s 次", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s 更换了他们的头像", + "%(items)s and %(count)s others|other": "%(items)s 和其他 %(count)s 人", + "%(items)s and %(count)s others|one": "%(items)s 和另一个人", + "collapse": "折叠", + "expand": "展开", + "email address": "邮箱地址", + "You have entered an invalid address.": "你输入了一个无效地址。", + "Advanced options": "高级选项", + "Leave": "退出", + "Description": "描述", + "Warning": "警告", + "Light theme": "浅色主题", + "Dark theme": "深色主题", + "Status.im theme": "Status.im 主题", + "Ignored Users": "忽视用户", + "Room Notification": "聊天室通知", + "The platform you're on": "您使用的平台是", + "The version of Riot.im": "Riot.im 的版本是", + "Whether or not you're logged in (we don't record your user name)": "您是否登录了(我们不会记录你的用户名)", + "Your language of choice": "您选择的语言是", + "Which officially provided instance you are using, if any": "您正在使用的任何官方 Riot 实现(如果有的话)", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "您是否正在使用富文本编辑器的富文本模式", + "Your homeserver's URL": "您的主服务器的链接", + "Your identity server's URL": "您的身份认证服务器的链接", + "The information being sent to us to help make Riot.im better includes:": "将要为帮助 Riot.im 发展而发送的信息包含:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "这个页面中含有可能能用于识别您身份的信息,比如聊天室、用户或群组 ID,在它们发送到服务器上之前,这些数据会被移除。", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s,%(monthName)s %(day)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s,%(monthName)s %(day)s %(fullYear)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s,%(monthName)s %(day)s %(fullYear)s %(time)s", + "Who would you like to add to this community?": "您想把谁添加到这个社区内?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "警告:您添加的一切用户都将会对一切知道此社区的 ID 的人公开", + "Name or matrix ID": "名称或 Matrix ID", + "Which rooms would you like to add to this community?": "您想把哪个聊天室添加到这个社区中?", + "Add rooms to the community": "添加聊天室到社区", + "Add to community": "添加到社区", + "Failed to invite users to community": "邀请用户到社区失败", + "Message Replies": "消息回复", + "Disable Peer-to-Peer for 1:1 calls": "在一对一通话中禁用 P2P 对等网络", + "Enable inline URL previews by default": "默认启用网址预览", + "Disinvite this user?": "取消邀请此用户?", + "Kick this user?": "移除此用户?", + "Unban this user?": "解除此用户的封禁?", + "Ban this user?": "封紧此用户?", + "Send an encrypted reply…": "发送加密的回复…", + "Send a reply (unencrypted)…": "发送回复(未加密)…", + "Send an encrypted message…": "发送加密消息…", + "Send a message (unencrypted)…": "发送消息 (未加密)…", + "Replying": "正在回复", + "Community Invites": "社区邀请", + "You are trying to access a room.": "你正在尝试访问一个聊天室。", + "To change the topic, you must be a": "要修改主题,你必须是", + "To modify widgets in the room, you must be a": "要修改聊天室中的小组件,你必须是", + "Banned by %(displayName)s": "被 %(displayName)s 封禁", + "To send messages, you must be a": "要发送消息,你必须是", + "To invite users into the room, you must be a": "要邀请用户到聊天室,你必须是", + "To configure the room, you must be a": "要配置聊天室,你必须是", + "To kick users, you must be a": "要踢出用户,你必须是", + "To ban users, you must be a": "要封禁用户,你必须是", + "To remove other users' messages, you must be a": "要删除其他用户的消息,你必须是", + "%(user)s is a %(userRole)s": "%(user)s 是一个 %(userRole)s", + "To link to a room it must have an address.": "要链接一个聊天室,它必须有一个地址。", + "To send events of type , you must be a": "要发送类型为 的事件,你必须是", + "Members only (since the point in time of selecting this option)": "只有成员(从选择这个选项的时间开始)", + "Members only (since they were invited)": "只有成员(从他们被邀请开始)", + "Members only (since they joined)": "只有成员(从他们加入开始)", + "Invalid community ID": "无效的社区 ID", + "Create Community": "创建社区", + "Community Name": "社区名", + "Community ID": "社区 ID", + "example": "例子", + "This setting cannot be changed later!": "此设置在未来将无法修改!", + "Add a Room": "添加一个聊天室", + "Add a User": "添加一个用户", + "Unable to accept invite": "无法接受邀请", + "Unable to reject invite": "无法拒绝邀请", + "Leave Community": "退出社区", + "Community Settings": "社区设置", + "Community %(groupId)s not found": "找不到社区 %(groupId)s", + "Your Communities": "你的社区", + "Failed to set direct chat tag": "无法设定私聊标签", + "Failed to remove tag %(tagName)s from room": "移除聊天室标签 %(tagName)s 失败", + "Failed to add tag %(tagName)s to room": "无法为聊天室新增标签 %(tagName)s", + "Submit debug logs": "提交调试日志", + "Show these rooms to non-members on the community page and room list?": "在社区页面与聊天室列表上对非社区成员显示这些聊天室?", + "Failed to invite users to %(groupId)s": "邀请用户到 %(groupId)s 失败", + "Failed to invite the following users to %(groupId)s:": "邀请下列用户到 %(groupId)s 失败:", + "Failed to add the following rooms to %(groupId)s:": "添加以下聊天室到 %(groupId)s 失败:", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "你似乎没有将此邮箱地址同在此主服务器上的任何一个 Matrix 账号绑定。", + "Restricted": "受限用户", + "To use it, just wait for autocomplete results to load and tab through them.": "若要使用自动补全,只要等待自动补全结果加载完成,按 Tab 键切换即可。", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 将他们的昵称修改成了 %(displayName)s 。", + "Hide avatars in user and room mentions": "隐藏头像", + "Disable Community Filter Panel": "停用社区面板", + "Stickerpack": "贴图集", + "You don't currently have any stickerpacks enabled": "您目前没有启用任何贴纸包", + "Add a stickerpack": "添加贴图集", + "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.": "密钥共享请求将会自动发送到您的其他设备上。如果您在其他设备上拒绝了请求,请点击此处以再次请求此会话的密钥。", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "如果您的其他设备上没有此消息的密钥,您将依然无法解密。", + "Key request sent.": "已请求共享密钥。", + "Re-request encryption keys from your other devices.": "在您的其他设备上 重新请求加密密钥。", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "如果您是房间中最后一位有权限的用户,在您降低自己的权限等级后将无法撤回此修改,因为你将无法重新获得权限。", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "你将无法撤回此修改,因为您正在将此用户的权限提升至和你相同的级别。", + "No devices with registered encryption keys": "没有设备有已注册的加密密钥", + "Unmute": "取消静音", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s(权限级别 %(powerLevelNumber)s)", + "Hide Stickers": "隐藏贴图", + "Show Stickers": "显示贴图", + "%(duration)ss": "%(duration)s 秒", + "%(duration)sm": "%(duration)s 分钟", + "%(duration)sh": "%(duration)s 小时", + "%(duration)sd": "%(duration)s 天", + "Online for %(duration)s": "已上线 %(duration)s", + "Idle for %(duration)s": "已 idle %(duration)s", + "Offline for %(duration)s": "已离线 %(duration)s", + "Unknown for %(duration)s": "在线状态未知 %(duration)s", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) 在 %(dateTime)s 看到这里", + "Remove avatar": "移除头像", + "Drop here to favourite": "拖动到这里以加入收藏", + "Drop here to tag direct chat": "拖动到这里以加入私聊", + "Drop here to restore": "拖动到这里以还原", + "Drop here to demote": "拖动到这里以加入低优先级", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "无法确定此邀请发送给的邮件地址是否和与您的帐户相关的邮件地址相匹配。", + "You have been kicked from this room by %(userName)s.": "您已被 %(userName)s 从此聊天室中移除。", + "'%(groupId)s' is not a valid community ID": "“%(groupId)s” 不是有效的社区 ID", + "Flair": "Flair", + "Message removed by %(userId)s": "此消息已被 %(userId)s 移除", + "Sign in with CAS": "使用 CAS 登录", + "Code": "代码", + "%(serverName)s Matrix ID": "%(serverName)s Matrix ID", + "You are registering with %(SelectedTeamName)s": "你将注册为 %(SelectedTeamName)s", + "Remove from community": "从社区中移除", + "Disinvite this user from community?": "是否不再邀请此用户加入本社区?", + "Remove this user from community?": "是否要从社区中移除此用户?", + "Failed to withdraw invitation": "撤回邀请失败", + "Failed to remove user from community": "移除用户失败", + "Filter community members": "过滤社区成员", + "Flair will not appear": "将不会显示 Flair", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "你确定要从 %(groupId)s 中移除 %(roomName)s 吗?", + "Removing a room from the community will also remove it from the community page.": "从社区中移除房间时,同时也会将其从社区页面中移除。", + "Failed to remove room from community": "从社区中移除聊天室失败", + "Failed to remove '%(roomName)s' from %(groupId)s": "从 %(groupId)s 中移除 “%(roomName)s” 失败", + "Only visible to community members": "仅对社区成员可见", + "Filter community rooms": "过滤社区聊天室", + "You're not currently a member of any communities.": "您目前不是任何一个社区的成员。", + "Communities": "社区", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s 已加入 %(count)s 次", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s 已加入", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s 已加入 %(count)s 次", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s 已加入", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s 已退出 %(count)s 次", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s 已退出", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s 已退出 %(count)s 次", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s 已退出", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s 已加入&已退出 %(count)s 次", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s 已加入&已退出", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s 已加入&已退出 %(count)s 次", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s 已加入&已退出", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s 退出并重新加入了 %(count)s 次", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s 退出并重新加入了", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s 退出并重新加入了 %(count)s 次", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s 退出并重新加入了", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s 拒绝了他们的邀请", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s 拒绝了他们的邀请共 %(count)s 次", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s 拒绝了他们的邀请共 %(count)s 次", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s 拒绝了他们的邀请", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s 撤回了他们的邀请共 %(count)s 次", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)s 撤回了他们的邀请", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)s 撤回了他们的邀请共 %(count)s 次", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)s 撤回了他们的邀请", + "Custom of %(powerLevel)s": "", + "In reply to ": "回复给 ", + "Community IDs cannot not be empty.": "社区 ID 不能为空。", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "社区 ID 只能包含 a-z、0-9 或 “=_-./” 等字符", + "Something went wrong whilst creating your community": "创建社区时出现问题", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "您目前默认将未经验证的设备列入黑名单;在发送消息到这些设备上之前,您必须先验证它们。", + "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,则您的会话可能与当前版本不兼容。请关闭此窗口并使用最新版本。", + "To change the room's avatar, you must be a": "无法修改此聊天室的头像,因为您不是此聊天室的", + "To change the room's name, you must be a": "无法修改此聊天室的名称,因为您不是此聊天室的", + "To change the room's main address, you must be a": "无法修改此聊天室的主地址,因为您不是此聊天室的", + "To change the room's history visibility, you must be a": "无法修改此聊天室的历史聊天记录可见性,因为您不是此聊天室的", + "To change the permissions in the room, you must be a": "无法修改此聊天室中的权限情况,因为您不是此聊天室的", + "Showing flair for these communities:": "为这些社区显示 flair:", + "This room is not showing flair for any communities": "此聊天室没有对任何社区显示 flair", + "New community ID (e.g. +foo:%(localDomain)s)": "新社区 ID(例子:+foo:%(localDomain)s)", + "URL previews are enabled by default for participants in this room.": "此聊天室默认启用链接预览。", + "URL previews are disabled by default for participants in this room.": "此聊天室默认禁用链接预览。", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s 将聊天室的头像更改为 ", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "您也可以自定义身份认证服务器,但这通常会阻止基于邮箱地址的与用户的交互。", + "Please enter the code it contains:": "请输入它包含的代码:", + "Flair will appear if enabled in room settings": "如果在聊天室设置中启用, flair 将会显示", + "Matrix ID": "Matrix ID", + "Matrix Room ID": "Matrix 聊天室 ID", + "Block users on other matrix homeservers from joining this room": "禁止其他 Matrix 主服务器上的用户加入此聊天室", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "为验证此设备是否可信,请通过其他方式(例如面对面交换或拨打电话)与其拥有者联系,并询问他们该设备的用户设置中的密钥是否与以下密钥匹配:", + "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.": "如果匹配,请点击下面的验证按钮。 如果不匹配,那么这可能说明其他人正在盗用此设备,而您应当点击黑名单按钮。", + "In future this verification process will be more sophisticated.": "未来,这个验证过程将会变得更加精致、巧妙一些。", + "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.": "我们建议您对每台设备进行验证以保证它们属于其合法所有者,但是您可以在不验证它们的情况下重新发送消息。", + "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    社区页面的 HTML 代码

    \n

    \n 你可以给社区的新成员们写些长长的社区简介来引导他们,或者放置\n 一些重要的链接\n

    \n

    \n 你甚至可以使用 标签\n

    \n", + "Add rooms to the community summary": "将聊天室添加到社区简介", + "Which rooms would you like to add to this summary?": "您想要将哪个聊天室添加到社区简介?", + "Add to summary": "添加到简介", + "Failed to add the following rooms to the summary of %(groupId)s:": "添加以下聊天室到 %(groupId)s 的简介时失败:", + "Failed to remove the room from the summary of %(groupId)s": "从 %(groupId)s 的简介中移除此聊天室时失败", + "The room '%(roomName)s' could not be removed from the summary.": "聊天室 “%(roomName)s” 无法从社区简介中移除。", + "Failed to update community": "更新社区简介失败", + "Unable to leave community": "无法退出社区", + "Leave %(groupName)s?": "退出 %(groupName)s?", + "Featured Rooms:": "核心聊天室:", + "Featured Users:": "核心用户:", + "Join this community": "加入此社区", + "%(inviter)s has invited you to join this community": "%(inviter)s 邀请您加入此社区", + "Failed to add the following users to the summary of %(groupId)s:": "", + "Failed to remove a user from the summary of %(groupId)s": "", + "You are an administrator of this community": "你是此社区的管理员", + "You are a member of this community": "你是此社区的成员", + "Who can join this community?": "谁可以加入此社区?", + "Everyone": "所有人", + "Leave this community": "退出此社区", + "Long Description (HTML)": "长描述(HTML)", + "This Home server does not support communities": "该主服务器不支持社区", + "Old cryptography data detected": "检测到旧的加密数据", + "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的数据,这将导致端到端加密在旧版本中发生故障。在此版本中,使用旧版本交换的端对端加密消息可能无法解密。这也可能导致与此版本交换的消息失败。如果您遇到问题,请退出并重新登录。要保留历史消息,请先导出并在重新登录后导入您的密钥。", + "Did you know: you can use communities to filter your Riot.im experience!": "你知道吗:你可以将社区用作过滤器以增强你的 Riot.im 使用体验!", + "Create a new community": "创建新社区", + "Error whilst fetching joined communities": "获取已加入社区列表时出现错误", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "创建社区,将用户与聊天室整合在一起!搭建自定义社区主页以在 Matrix 宇宙之中标记出您的私人空间。", + "Join an existing community": "加入已有的社区", + "Show devices, send anyway or cancel.": "显示未信任的设备不经信任直接发送取消发送。", + "%(count)s of your messages have not been sent.|one": "您的消息尚未发送。", + "Uploading %(filename)s and %(count)s others|other": "正在上传 %(filename)s 与其他 %(count)s 个文件", + "Uploading %(filename)s and %(count)s others|zero": "正在上传 %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "正在上传 %(filename)s 与其他 %(count)s 个文件", + "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.": "进一步了解我们如何使用分析统计服务。", + "Please note you are logging into the %(hs)s server, not matrix.org.": "请注意,您正在登录的服务器是 %(hs)s,不是 matrix.org。", + "This homeserver doesn't offer any login flows which are supported by this client.": "此主服务器不兼容本客户端支持的任何登录方式。", + "Sign in to get started": "登录以开始使用", + "Unbans user with given id": "按照 ID 解封特定的用户", + "Opens the Developer Tools dialog": "打开开发者工具窗口", + "Notify the whole room": "通知聊天室全体成员", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "此操作允许您将加密聊天室中收到的消息的密钥导出为本地文件。您可以将文件导入其他 Matrix 客户端,以便让别的客户端在未收到密钥的情况下解密这些消息。", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "导出的文件将允许任何可以读取它的人解密任何他们可以看到的加密消息,因此您应该小心以确保其安全。为了解决这个问题,您应该在下面输入一个密码,用于加密导出的数据。只有输入相同的密码才能导入数据。", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "导出文件有密码保护。你需要在此输入密码以解密此文件。", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "此操作允许您导入之前从另一个 Matrix 客户端中导出的加密密钥文件。导入完成后,您将能够解密那个客户端可以解密的加密消息。", + "Ignores a user, hiding their messages from you": "忽略用户,隐藏他们的消息", + "Stops ignoring a user, showing their messages going forward": "解除忽略用户,显示他们的消息", + "To return to your account in future you need to set a password": "如果你想再次使用账号,您得为它设置一个密码", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "如果你在 GitHub 提交了一个 bug,调试日志可以帮助我们追踪这个问题。 调试日志包含应用程序使用数据,这包括您的用户名、您访问的房间或社区的 ID 或名称以及其他用户的用户名,不包扩聊天记录。", + "Debug Logs Submission": "发送调试日志", + "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "密码修改成功。在您在其他设备上重新登录之前,其他设备不会收到推送通知", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "尝试加载此房间的时间线的特定时间点,但是无法找到。", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "现在 重新发送消息取消发送 。", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "現在 重新发送消息取消发送 。你也可以单独选择消息以重新发送或取消。", + "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "要加入已有的社区,你需要知道它的社区链接,比如 +example:matrix.org。", + "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?": "删除小部件后,此聊天室中的所有用户的这个小部件都会被删除。你确定要删除这个小部件吗?", + "Fetching third party location failed": "获取第三方位置失败", + "A new version of Riot is available.": "Riot 有更新可用。", + "Couldn't load home page": "不能加载首页", + "Send Account Data": "发送账户数据", + "All notifications are currently disabled for all targets.": "目前所有通知都已禁用。", + "Uploading report": "上传报告", + "Sunday": "星期日", + "Notification targets": "通知目标", + "Today": "今天", + "Failed to get protocol list from Home Server": "无法从主服务器取得协议列表", + "You are not receiving desktop notifications": "您将不会收到桌面通知", + "Friday": "星期五", + "Update": "更新", + "What's New": "新鲜事", + "Add an email address above to configure email notifications": "请在上方输入邮箱地址以接收邮件通知", + "Expand panel": "展开面板", + "On": "打开", + "%(count)s Members|other": "%(count)s 位成员", + "Filter room names": "过滤聊天室名称", + "Changelog": "变更日志", + "Waiting for response from server": "正在等待服务器响应", + "Send Custom Event": "发送自定义事件", + "Advanced notification settings": "通知高级设置", + "Failed to send logs: ": "无法发送日志: ", + "delete the alias.": "删除别名。", + "To return to your account in future you need to set a password": "要在未来回到您的账号,您需要 设置密码", + "Forget": "忘记", + "#example": "#例子", + "Hide panel": "隐藏面板", + "You cannot delete this image. (%(code)s)": "您不能删除这个图片。(%(code)s)", + "Cancel Sending": "取消发送", + "This Room": "此聊天室", + "The Home Server may be too old to support third party networks": "主服务器可能太老旧无法支持第三方网络", + "Noisy": "吵闹", + "Error saving email notification preferences": "保存电子邮件通知选项时出错", + "Messages containing my display name": "消息中含有我的显示名称", + "Messages in one-to-one chats": "一对一聊天种的消息", + "Unavailable": "无法获得", + "View Decrypted Source": "查看解密的来源", + "Failed to update keywords": "无法更新关键词", + "Notes:": "记录:", + "remove %(name)s from the directory.": "从目录中移除 %(name)s。", + "Notifications on the following keywords follow rules which can’t be displayed here:": "以下关键词依照规则将不会在此显示:", + "Safari and Opera work too.": "SafariOpera 也能工作。", + "Please set a password!": "请设置密码!", + "You have successfully set a password!": "您已成功设置密码!", + "An error occurred whilst saving your email notification preferences.": "保存电子邮件通知选项时出现错误。", + "Explore Room State": "探索聊天室状态", + "Source URL": "源网址", + "Messages sent by bot": "由机器人发出的消息", + "Filter results": "过滤结果", + "Members": "成员", + "No update available.": "没有可用更新。", + "Resend": "重新发送", + "Files": "文件", + "Collecting app version information": "正在收集应用版本信息", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "确定要删除聊天室别名 %(alias)s 并将 %(name)s 从列表中删除吗?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "这将允许你可以在注销后回到您的账号,并在其他设备上登录。", + "Keywords": "关键词", + "Enable notifications for this account": "对此账号启用通知", + "Directory": "聊天室目录", + "Invite to this community": "邀请加入此社区", + "Failed to get public room list": "无法取得公开的聊天室列表", + "Messages containing keywords": "包含 关键词 的消息", + "Room not found": "找不到聊天室", + "Tuesday": "星期二", + "Enter keywords separated by a comma:": "输入以逗号间隔的关键词:", + "Forward Message": "转发消息", + "You have successfully set a password and an email address!": "您已经成功设置了密码和邮箱地址!", + "Remove %(name)s from the directory?": "从目录中移除 %(name)s 吗?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot 使用了许多先进的浏览器功能,有些在你目前所用的浏览器上无法使用或仅为实验性的功能。", + "Developer Tools": "开发者工具", + "Preparing to send logs": "准备发送日志", + "Enable desktop notifications": "启用桌面通知", + "Remember, you can always set an email address in user settings if you change your mind.": "请记住,如果您改变想法,您永远可以在用户设置中设置电子邮件。", + "Explore Account Data": "探索账户数据", + "All messages (noisy)": "全部消息(高亮)", + "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 链接:", + "You must specify an event type!": "必须指定事件类型!", + "(HTTP status %(httpStatus)s)": "(HTTP 状态 %(httpStatus)s)", + "All Rooms": "全部聊天室", + "Please install Chrome or Firefox for the best experience.": "请安装 ChromeFirefox 以获得最佳体验。", + "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": "当我被邀请进入聊天室", + "Can't update user notification settings": "不能更新用户通知设置", + "Notify for all other messages/rooms": "为所有其他消息/聊天室显示通知", + "Unable to look up room ID from server": "无法在服务器上找到聊天室 ID", + "Couldn't find a matching Matrix room": "未找到符合的 Matrix 聊天室", + "Invite to this room": "邀请别人加入此聊天室", + "Search for a room": "搜索聊天室", + "Thursday": "星期四", + "Search…": "搜索…", + "Logs sent": "记录已发送", + "Back": "返回", + "Reply": "回复", + "Show message in desktop notification": "在桌面通知中显示信息", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "调试日志包含使用数据(包括您的用户名,您访问过的聊天室 / 小组的 ID 或别名以及其他用户的用户名)。它们不包含聊天信息。", + "Unhide Preview": "取消隐藏预览", + "Unable to join network": "无法加入网络", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "您也许不曾在其他 Riot 之外的客户端设置它们。在 Riot 下你无法调整他们但仍然可用", + "Sorry, your browser is not able to run Riot.": "抱歉,您的浏览器 无法 运行 Riot.", + "Uploaded on %(date)s by %(user)s": "由 %(user)s 在 %(date)s 上传", + "Messages in group chats": "群组聊天中的消息", + "Yesterday": "昨天", + "Error encountered (%(errorDetail)s).": "遇到错误 (%(errorDetail)s)。", + "Login": "登录", + "Low Priority": "低优先级", + "Unable to fetch notification target list": "无法获取通知目标列表", + "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": "更多的通知并没有在此显示出来", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "这里没有其他人了!你是想 邀请用户 还是 不再提示?", + "You need to be able to invite users to do that.": "你需要有邀请用户的权限才能进行此操作。", + "Missing roomId.": "找不到此聊天室 ID 所对应的聊天室。", + "Tag Panel": "标签面板", + "You have been banned from %(roomName)s by %(userName)s.": "您已被 %(userName)s 从聊天室 %(roomName)s 中封禁。", + "You have been banned from this room by %(userName)s.": "您已被 %(userName)s 从此聊天室中封禁。", + "Every page you use in the app": "您在 Riot 中使用的每一个页面", + "e.g. ": "例如:", + "Your User Agent": "您的 User Agent", + "Your device resolution": "您设备的分辨率", + "Must be viewing a room": "必须是在查看一个聊天室时", + "Always show encryption icons": "总是显示加密标志", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "目前无法以文件作为回复的内容,所以此文件将不作为回复,独立发送。", + "Unable to reply": "无法回复", + "At this time it is not possible to reply with an emote.": "目前无法使用表情符号作为回复内容。", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "您将被带到一个第三方网站以便验证您的账号以使用 %(integrationsUrl)s 提供的集成。您希望继续吗?", + "Robot check is currently unavailable on desktop - please use a web browser": "目前机器人检查(CAPTCHA)在桌面端不可用——请使用 浏览器", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "无法更新聊天室 %(roomName)s 在社区 “%(groupId)s” 中的可见性。", + "Minimize apps": "最小化小部件", + "Popout widget": "在弹出式窗口中打开小部件", + "Picture": "图片", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "无法加载被回复的事件,它可能不存在,也可能是您没有权限查看它。", + "And %(count)s more...|other": "和 %(count)s 个其他…", + "Try using one of the following valid address types: %(validTypesList)s.": "请尝试使用以下的有效邮箱地址格式中的一种:%(validTypesList)s", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Riot 使用 GitHub 追踪 bug:在 GitHub 上创建新 Issue" } diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 611f6db7ff..2f571d3883 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1,5 +1,5 @@ { - "A new password must be entered.": "一個新的密碼必須被輸入。.", + "A new password must be entered.": "一個新的密碼必須被輸入。", "An error has occurred.": "一個錯誤出現了。", "Anyone who knows the room's link, apart from guests": "任何知道房間連結的人,但訪客除外", "Anyone who knows the room's link, including guests": "任何知道房間連結的人,包括訪客", @@ -8,11 +8,10 @@ "Are you sure you want to upload the following files?": "您確認要上傳以下文件嗎?", "Attachment": "附件", "Autoplay GIFs and videos": "自動播放 GIF 和影片", - "%(senderName)s banned %(targetName)s.": "%(senderName)s 封禁了 %(targetName)s.", - "Ban": "封禁", - "Banned users": "被封禁的用戶", + "%(senderName)s banned %(targetName)s.": "%(senderName)s 封鎖了 %(targetName)s.", + "Ban": "封鎖", + "Banned users": "被封鎖的用戶", "Blacklisted": "已列入黑名單", - "Bug Report": "臭蟲回報", "Call Timeout": "通話超時", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "當瀏覽器網址列裡有 HTTPS URL 時,不能使用 HTTP 連線到家伺服器。請採用 HTTPS 或者允許不安全的指令稿。", "Can't load user settings": "無法載入使用者設定", @@ -64,15 +63,15 @@ "Encrypted messages will not be visible on clients that do not yet implement encryption": "不支援加密的客戶端將看不到加密的訊息", "Encrypted room": "加密聊天室", "%(senderName)s ended the call.": "%(senderName)s 結束了通話。.", - "End-to-end encryption information": "端到端加密信息", + "End-to-end encryption information": "端到端加密資訊", "End-to-end encryption is in beta and may not be reliable": "端到端加密現為測試版,不一定可靠", "Enter Code": "輸入代碼", "Error": "錯誤", "Error decrypting attachment": "解密附件時出錯", - "Event information": "事件信息", + "Event information": "事件資訊", "Existing Call": "現有通話", "Export E2E room keys": "導出聊天室的端到端加密密鑰", - "Failed to ban user": "封禁用戶失敗", + "Failed to ban user": "封鎖用戶失敗", "Failed to change password. Is your password correct?": "變更密碼失敗。您的密碼正確嗎?", "Failed to forget room %(errCode)s": "無法忘記聊天室 %(errCode)s", "Failed to join room": "無法加入聊天室", @@ -90,7 +89,7 @@ "Failed to set display name": "設置暱稱失敗", "Failed to set up conference call": "無法啟動群組通話", "Failed to toggle moderator status": "無法切換管理員權限", - "Failed to unban": "解除封禁失敗", + "Failed to unban": "解除封鎖失敗", "Failed to upload file": "上傳文件失敗", "Failed to verify email address: make sure you clicked the link in the email": "電子郵件地址驗證失敗: 請確保你已點擊郵件中的連結", "Failure to create room": "創建聊天室失敗", @@ -102,13 +101,12 @@ "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": "掛斷", "Hide read receipts": "隱藏已讀回執", "Hide Text Formatting Toolbar": "隱藏格式工具欄", - "Historical": "曆史", + "Historical": "歷史", "Homeserver is": "主服務器是", "Identity Server is": "身份認證服務器是", "I have verified my email address": "我已經驗證了我的電子郵件地址", @@ -127,9 +125,8 @@ "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": "返回登錄頁面", + "Return to login screen": "返回到登入畫面", "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 未被允許向你推送通知 ── 請重試", "riot-web version:": "riot-網頁版:", @@ -142,7 +139,7 @@ "Search": "搜尋", "Search failed": "搜索失敗", "Searches DuckDuckGo for results": "搜索 DuckDuckGo", - "Sender device information": "發送者的裝置信息", + "Sender device information": "發送者的裝置資訊", "Send Invites": "發送邀請", "Send Reset Email": "發送密碼重設郵件", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s 發了一張圖片。.", @@ -173,7 +170,7 @@ "This email address is already in use": "此電子郵件地址已經被使用", "This email address was not found": "未找到此電子郵件地址", "The email address linked to your account must be entered.": "必須輸入和你帳號關聯的電子郵件地址。", - "The file '%(fileName)s' exceeds this home server's size limit for uploads": "文件 '%(fileName)s' 超過了此主伺服器的上傳大小限制", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "文件 '%(fileName)s' 超過了這個家伺服器的上傳大小限制", "The file '%(fileName)s' failed to upload": "文件 '%(fileName)s' 上傳失敗", "Turn Markdown off": "關閉Markdown 語法", "Turn Markdown on": "啟用Markdown 語法", @@ -188,7 +185,7 @@ "Sun": "星期日", "Mon": "星期一", "Tue": "星期二", - "Online": "在線", + "Online": "線上", "Idle": "閒置", "Offline": "下線", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s 更改了聊天室的圖像為 ", @@ -219,13 +216,11 @@ "Register": "註冊", "Default server": "預設伺服器", "Custom server": "自定的伺服器", - "Home server URL": "自家伺服器網址", + "Home server URL": "家伺服器網址", "Identity server URL": "識別伺服器網址", "What does this mean?": "它代表什麼意思?", "Error decrypting audio": "解密音檔出錯", "Error decrypting image": "解密圖片出錯", - "Image '%(Body)s' cannot be displayed.": "圖片 '%(Body)s' 無法顯示。", - "This image cannot be displayed.": "這張圖片無法顯示。", "Error decrypting video": "解密影片出錯", "Add an Integration": "新增整合器", "Ongoing conference call%(supportedText)s.": "%(supportedText)s 正在進行會議通話。", @@ -255,7 +250,6 @@ "Are you sure you want to leave the room '%(roomName)s'?": "您確定您要想要離開房間 '%(roomName)s' 嗎?", "Bans user with given id": "禁止有指定 ID 的使用者", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "無法連線到家伺服器 - 請檢查您的連線,確保您的家伺服器的 SSL 憑證可被信任,而瀏覽器擴充套件也沒有阻擋請求。", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s 已經變更他們的名稱,從 %(oldDisplayName)s 到 %(displayName)s。", "%(senderName)s changed their profile picture.": "%(senderName)s 已經變更了他們的基本資料圖片。", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s 變更了 %(powerLevelDiffText)s 權限等級。", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s 將房間名稱變更為 %(roomName)s。", @@ -274,7 +268,7 @@ "Click to unmute audio": "點選以解除靜音", "Conference call failed.": "會議通話失敗。", "Conference calling is in development and may not be reliable.": "會議通話尚在開發中,可能不太可靠。", - "Conference calls are not supported in encrypted rooms": "不支援在加密房間的會議通話", + "Conference calls are not supported in encrypted rooms": "不支援在加密聊天室的會議通話", "Conference calls are not supported in this client": "這個客戶端不支援會議通話", "Could not connect to the integration server": "無法連線到整合的伺服器", "%(count)s new messages|one": "%(count)s 個訊息", @@ -302,7 +296,7 @@ "Failed to change power level": "變更權限等級失敗", "Failed to fetch avatar URL": "擷取大頭貼 URL 失敗", "Failed to upload profile picture!": "上傳基本資料圖片失敗!", - "Guest access is disabled on this Home Server.": "此家伺服器的訪客存取已停用。", + "Guest access is disabled on this Home Server.": "這個家伺服器的訪客存取已停用。", "Home": "家", "Import": "匯入", "Incoming call from %(name)s": "從 %(name)s 而來的來電", @@ -364,7 +358,6 @@ "olm version:": "olm 版本:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "這個房間只要啟用加密就不能再關掉了(從現在開始)", "Only people who have been invited": "僅有被邀請的夥伴", - "Otherwise, click here to send a bug report.": "否則,請點選此處來傳送錯誤報告。", "Password": "密碼", "Password:": "密碼:", "Passwords can't be empty": "密碼不能為空", @@ -454,7 +447,6 @@ "Use with caution": "謹慎使用", "User ID": "使用者 ID", "User Interface": "使用者介面", - "%(user)s is a": "%(user)s 是一個", "User name": "使用者名稱", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s(權限等級 %(powerLevelNumber)s)", "Username invalid: %(errMessage)s": "使用者名稱無效:%(errMessage)s", @@ -561,7 +553,6 @@ "Start automatically after system login": "在系統登入後自動開始", "Desktop specific": "桌面版特有", "Analytics": "分析", - "Opt out of analytics": "選擇退出分析", "Options": "選項", "Riot collects anonymous analytics to allow us to improve the application.": "Riot 會收集匿名分析以讓我們可以改進此應用程式。", "Passphrases must match": "通關密語必須符合", @@ -584,8 +575,6 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "您確定您想要移除(刪除)此活動嗎?注意若您刪除房間名稱或主題變更,還是可以復原變更。", "Unknown error": "未知的錯誤", "Incorrect password": "不正確的密碼", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "這將會讓您的帳號永遠無法使用。您將無法重新註冊相同的使用者 ID。", - "This action is irreversible.": "此動作是不可逆的。", "To continue, please enter your password.": "要繼續,請輸入您的密碼。", "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "要驗證此裝置是否可信,請使用其他方式(例如:面對面或是打電話)聯絡它的擁有者並詢問他們在使用者設定中看到此裝置的金鑰是否與下列的金鑰相符:", "Device name": "裝置名稱", @@ -595,10 +584,8 @@ "In future this verification process will be more sophisticated.": "在未來,這個過程會更加複雜。", "Verify device": "驗證裝置", "I verify that the keys match": "我驗證金鑰相符", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "我們在嘗試復原您的前一個工作階段中遇到了錯誤。若您繼續,您將會需要再次登入,而加密的聊天歷史也將會無法讀取。", "Unable to restore session": "無法復原工作階段", "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,您的工作階段可能與此版本不相容。關閉此視窗並回到較新的版本。", - "Continue anyway": "無論如何都繼續", "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.": "我們建議您對每一個裝置執行驗證過程以確認它們屬於其合法擁有者,但若您想要的話,您也可以重新傳送訊息而不必驗證它們。", "\"%(RoomName)s\" contains devices that you haven't seen before.": "「%(RoomName)s」包含了您先前沒看過的裝置。", @@ -610,7 +597,7 @@ "Verify...": "驗證...", "ex. @bob:example.com": "例如:@bob:example.com", "Add User": "新增使用者", - "This Home Server would like to make sure you are not a robot": "此家伺服器想要確定您不是機器人", + "This Home Server would like to make sure you are not a robot": "這個家伺服器想要確定您不是機器人", "Sign in with CAS": "使用 CAS 登入", "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "您可以使用自訂伺服器選項來指定不同的家伺服器 URL 以登入到其他的 Matrix 伺服器。", "This allows you to use this app with an existing Matrix account on a different home server.": "這讓您可以利用在不同的家伺服器上既有的 Matrix 帳號使用此應用程式。", @@ -655,8 +642,7 @@ "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)": "隱藏加入/離開訊息(邀請/踢出/封禁不受影響)", + "Hide join/leave messages (invites/kicks/bans unaffected)": "隱藏加入/離開訊息(邀請/踢出/封鎖不受影響)", "Integrations Error": "整合錯誤", "Publish this room to the public in %(domain)s's room directory?": "將這個聊天室公開到 %(domain)s 的聊天室目錄中?", "AM": "上午", @@ -664,11 +650,10 @@ "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.": "無法建立小工具。", - "Unbans user with given id": "取消封禁指定 ID 的使用者", + "Unbans user with given id": "取消封鎖指定 ID 的使用者", "You are not in this room.": "您不在這個聊天室內。", "You do not have permission to do that in this room.": "您沒有在這個聊天室做這件事的權限。", "Verifies a user, device, and pubkey tuple": "驗證使用者、裝置與公開金鑰變數組", @@ -687,5 +672,500 @@ "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s 小工具已被 %(senderName)s 修改", "Copied!": "已複製!", "Failed to copy": "複製失敗", - "Add rooms to this community": "新增聊天室到此社群" + "Add rooms to this community": "新增聊天室到此社群", + "Call Failed": "通話失敗", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "此聊天室有未知的裝置:若您想要不驗證它們而繼續,可能會有其他人竊聽您的通話。", + "Review Devices": "審閱裝置", + "Call Anyway": "無論如何都通話", + "Answer Anyway": "無論如何都回覆", + "Call": "通話", + "Answer": "回覆", + "Who would you like to add to this community?": "您想要把誰新增到此社群內?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "警告:任何您新增到社群內的人都可以被任何知道社群 ID 的人公開看見", + "Invite new community members": "邀請新社群成員", + "Name or matrix ID": "名稱或 matrix ID", + "Invite to Community": "邀請到社群", + "Which rooms would you like to add to this community?": "您想要新增哪個聊天室到此社群?", + "Show these rooms to non-members on the community page and room list?": "在社群頁面與聊天室清單上顯示這些聊天室給非社群成員?", + "Add rooms to the community": "新增聊天室到社群", + "Room name or alias": "聊天室名稱或別名", + "Add to community": "新增到社群", + "Failed to invite the following users to %(groupId)s:": "邀請下列使用者到 %(groupId)s 失敗:", + "Failed to invite users to community": "邀請使用者到社群失敗", + "Failed to invite users to %(groupId)s": "邀請使用者到 %(groupId)s 失敗", + "Failed to add the following rooms to %(groupId)s:": "新增下列聊天室到 %(groupId)s 失敗:", + "Restricted": "限制", + "Ignored user": "已忽略的使用者", + "You are now ignoring %(userId)s": "您忽略了 %(userId)s", + "Unignored user": "未忽略的使用者", + "You are no longer ignoring %(userId)s": "您不再忽略 %(userId)s", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s 變更了聊天室的釘選訊息。", + "%(names)s and %(count)s others are typing|other": "%(names)s 與其他 %(count)s 個人正在輸入", + "%(names)s and %(count)s others are typing|one": "%(names)s 與另一個人正在輸入", + "Send": "傳送", + "Message Replies": "訊息回覆", + "Message Pinning": "訊息釘選", + "Tag Panel": "標籤面板", + "Disable Emoji suggestions while typing": "在輸入時停用繪文字建議", + "Hide avatar changes": "隱藏大頭貼變更", + "Hide display name changes": "隱藏顯示名稱變更", + "Disable big emoji in chat": "在聊天中停用大型繪文字", + "Mirror local video feed": "鏡射本機視訊 feed", + "Enable inline URL previews by default": "預設啟用內嵌 URL 預覽", + "Enable URL previews for this room (only affects you)": "對此聊天室啟用 URL 預覽(僅影響您)", + "Enable URL previews by default for participants in this room": "對此聊天室中的參與者預設啟用 URL 預覽", + "Delete %(count)s devices|other": "刪除 %(count)s 個裝置", + "Delete %(count)s devices|one": "刪除裝置", + "Select devices": "選取裝置", + "%(senderName)s sent an image": "%(senderName)s 傳送了一張圖片", + "%(senderName)s sent a video": "%(senderName)s 傳送了一則視訊", + "%(senderName)s uploaded a file": "%(senderName)s 上傳了一個檔案", + "Disinvite this user?": "取消邀請此使用者?", + "Kick this user?": "踢除此使用者?", + "Unban this user?": "取消阻擋此使用者?", + "Ban this user?": "阻擋此使用者?", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "如果您是聊天室中最後一位有特殊權限的使用者,您將無法復原此變更,因為無法再獲得特定權限。", + "Unignore": "取消忽略", + "Ignore": "忽略", + "Jump to read receipt": "跳到讀取回條", + "Mention": "提及", + "Invite": "邀請", + "User Options": "使用者選項", + "Send an encrypted reply…": "傳送加密的回覆……", + "Send a reply (unencrypted)…": "傳送回覆(未加密)……", + "Send an encrypted message…": "傳送加密的訊息……", + "Send a message (unencrypted)…": "傳送訊息(未加密)……", + "Unpin Message": "取消釘選訊息", + "Jump to message": "跳到訊息", + "No pinned messages.": "沒有已釘選的訊息。", + "Loading...": "正在載入……", + "Pinned Messages": "已釘選的訊息", + "%(duration)ss": "%(duration)s 秒", + "%(duration)sm": "%(duration)s 分鐘", + "%(duration)sh": "%(duration)s 小時", + "%(duration)sd": "%(duration)s 天", + "Online for %(duration)s": "已上線 %(duration)s", + "Idle for %(duration)s": "已閒置 %(duration)s", + "Offline for %(duration)s": "已離線 %(duration)s", + "Unknown for %(duration)s": "未知 %(duration)s", + "Unknown": "未知", + "Replying": "正在回覆", + "No rooms to show": "未顯示聊天室", + "Unnamed room": "未命名的聊天室", + "World readable": "所有人可讀", + "Guests can join": "訪客可加入", + "Remove avatar": "移除大頭貼", + "Drop here to favourite": "拖曳到這裡以加入到最愛", + "Drop here to tag direct chat": "拖曳到這裡以為聊天加上標籤", + "Drop here to restore": "拖曳到這裡以復原", + "Drop here to demote": "拖曳到這裡以降級", + "Community Invites": "社群邀請", + "You have been kicked from this room by %(userName)s.": "您已經被 %(userName)s 從此聊天室中踢除。", + "You have been banned from this room by %(userName)s.": "您已經被 %(userName)s 從此聊天室中阻擋。", + "You are trying to access a room.": "您正在嘗試存取聊天室。", + "To change the room's avatar, you must be a": "要變更聊天室的大頭貼,您必須是", + "To change the room's name, you must be a": "要變更聊天室的名稱,您必須是", + "To change the room's main address, you must be a": "要變更聊天室的主地址,您必須是", + "To change the room's history visibility, you must be a": "要變更聊天室的歷史紀錄可見度,您必須是", + "To change the permissions in the room, you must be a": "要變更聊天室中的權限,您必須是", + "To change the topic, you must be a": "要變更主題,您必須是", + "To modify widgets in the room, you must be a": "要修改聊天室中的小工具,您必須是", + "Banned by %(displayName)s": "被 %(displayName)s 阻擋", + "Members only (since the point in time of selecting this option)": "僅成員(自選取此選項開始)", + "Members only (since they were invited)": "僅成員(自他們被邀請開始)", + "Members only (since they joined)": "僅成員(自他們加入開始)", + "To send messages, you must be a": "要傳送訊息,您必須是", + "To invite users into the room, you must be a": "要邀請使用者到聊天室,您必須是", + "To configure the room, you must be a": "要設定聊天室,您必須是", + "To kick users, you must be a": "要踢除使用者,您必須是", + "To ban users, you must be a": "要阻擋使用者,您必須是", + "To remove other users' messages, you must be a": "要移除其他使用者的訊息,您必須是", + "To send events of type , you must be a": "要傳送 類型的活動,您必須是", + "Addresses": "地址", + "Invalid community ID": "無效的社群 ID", + "'%(groupId)s' is not a valid community ID": "「%(groupId)s」不是有效的社群 ID", + "Flair": "特色", + "Showing flair for these communities:": "為這些社群顯示特色:", + "This room is not showing flair for any communities": "此聊天室並未對任何社群顯示特色", + "New community ID (e.g. +foo:%(localDomain)s)": "新社群 ID(例子:+foo:%(localDomain)s)", + "URL previews are enabled by default for participants in this room.": "此聊天室已預設對參與者啟用 URL 預覽。", + "URL previews are disabled by default for participants in this room.": "此聊天室已預設對參與者停用 URL 預覽。", + "Message removed by %(userId)s": "訊息已被 %(userId)s 移除", + "Message removed": "訊息已移除", + "An email has been sent to %(emailAddress)s": "電子郵件已傳送給 %(emailAddress)s", + "A text message has been sent to %(msisdn)s": "文字訊息已傳送給 %(msisdn)s", + "Username on %(hs)s": "在 %(hs)s 上的使用者名稱", + "%(serverName)s Matrix ID": "%(serverName)s Matrix ID", + "Remove from community": "從社群中移除", + "Disinvite this user from community?": "從社群取消邀請此使用者?", + "Remove this user from community?": "從社群移除此使用者?", + "Failed to withdraw invitation": "撤回邀請失敗", + "Failed to remove user from community": "從社群移除使用者失敗", + "Filter community members": "過濾社群成員", + "Flair will appear if enabled in room settings": "若在聊天室設定內啟用將會顯示特色", + "Flair will not appear": "不會顯示特色", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "您確定您想要從 %(groupId)s 移除「%(roomName)s」嗎?", + "Removing a room from the community will also remove it from the community page.": "從社群移除聊天室同時也會將其從社群頁面中移除。", + "Failed to remove room from community": "從社群中移除聊天室失敗", + "Failed to remove '%(roomName)s' from %(groupId)s": "從 %(groupId)s 移除「%(roomName)s」失敗", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "在 %(groupId)s 中的「%(roomName)s」能見度無法更新。", + "Visibility in Room List": "在聊天室清單中的能見度", + "Visible to everyone": "對所有人可見", + "Only visible to community members": "僅對社群成員可見", + "Filter community rooms": "過濾社群聊天室", + "Something went wrong when trying to get your communities.": "當嘗試取得您的社群時發生錯誤。", + "Display your community flair in rooms configured to show it.": "在設定了顯示特色的聊天室中顯示您的社群特色。", + "You're not currently a member of any communities.": "您目前不是任何社群的成員。", + "Delete Widget": "刪除小工具", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "刪除小工具會將它從此聊天室中所有使用者的收藏中移除。您確定您要刪除這個小工具嗎?", + "Minimize apps": "最小化應用程式", + "Communities": "社群", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s 加入了 %(count)s 次", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s 加入了", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s 加入了 %(count)s 次", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s 加入了", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s 離開了 %(count)s 次", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s 離開了", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s 離開了 %(count)s 次", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s 離開了", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s 加入並離開了 %(count)s 次", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s 加入並離開了", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s 加入並離開了 %(count)s 次", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s 加入並離開了", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s 離開並重新加入了 %(count)s 次", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s 離開並重新加入了", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s 離開並重新加入了 %(count)s 次", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s 離開並重新加入了", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s 回絕了他們的邀請 %(count)s 次", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s 回絕了他們的邀請", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s 回絕了他們的邀請 %(count)s 次", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s 回絕了他們的邀請", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s 撤回了他們的邀請 %(count)s 次", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)s 撤回了他們的邀請", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)s 撤回了他們的邀請 %(count)s 次", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)s 撤回了他們的邀請", + "were invited %(count)s times|other": "被邀請了 %(count)s 次", + "were invited %(count)s times|one": "被邀請了", + "was invited %(count)s times|other": "被邀請了 %(count)s 次", + "was invited %(count)s times|one": "被邀請了", + "were banned %(count)s times|other": "被阻擋了 %(count)s 次", + "were banned %(count)s times|one": "被阻擋了", + "was banned %(count)s times|other": "被阻擋了 %(count)s 次", + "was banned %(count)s times|one": "被阻擋了", + "were unbanned %(count)s times|other": "被取消阻擋了 %(count)s 次", + "were unbanned %(count)s times|one": "被取消阻擋了", + "was unbanned %(count)s times|other": "被取消阻擋了 %(count)s 次", + "was unbanned %(count)s times|one": "被取消阻擋了", + "were kicked %(count)s times|other": "被踢除了 %(count)s 次", + "were kicked %(count)s times|one": "被踢除了", + "was kicked %(count)s times|other": "被踢除了 %(count)s 次", + "was kicked %(count)s times|one": "被踢除了", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s 變更了他們的名稱 %(count)s 次", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s 變更了他們的名稱", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s 變更了他們的名稱 %(count)s 次", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s 變更了他們的名稱", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s 變更了他們的大頭貼 %(count)s 次", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s 變更了他們的大頭貼", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s 變更了他們的大頭貼 %(count)s 次", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s 變更了他們的大頭貼", + "%(items)s and %(count)s others|other": "%(items)s 與其他 %(count)s 個", + "%(items)s and %(count)s others|one": "%(items)s 與其他一個", + "collapse": "摺疊", + "expand": "展開", + "Custom of %(powerLevel)s": "自訂 %(powerLevel)s", + "And %(count)s more...|other": "與更多 %(count)s 個……", + "Matrix ID": "Matrix ID", + "Matrix Room ID": "Matrix 聊天室 ID", + "email address": "電子郵件地址", + "Try using one of the following valid address types: %(validTypesList)s.": "嘗試使用下列有效地地址格式中的其中一個:%(validTypesList)s。", + "You have entered an invalid address.": "您輸入了無效的地址。", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "社群 ID 只能包含 a-z, 0-9, or '=_-./' 等字元", + "Something went wrong whilst creating your community": "建立社群時發生問題", + "Create Community": "建立社群", + "Community Name": "社群名稱", + "Community ID": "社群 ID", + "example": "範例", + "Advanced options": "進階選項", + "Block users on other matrix homeservers from joining this room": "阻擋在其他 matrix 家伺服器的使用者加入此聊天室", + "This setting cannot be changed later!": "這個設定無法在之後變更!", + "

    HTML for your community's page

    \n

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

    \n

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

    \n": "

    您社群頁面的 HTML

    \n

    \n 使用長描述來為社群的新成員簡介,或是散發\n 一些重要連結\n

    \n

    \n 您甚至可以使用 'img' 標籤\n

    \n", + "Add rooms to the community summary": "新增聊天室到社群摘要中", + "Which rooms would you like to add to this summary?": "您想要新增哪個聊天室到此摘要中?", + "Add to summary": "新增到摘要", + "Failed to add the following rooms to the summary of %(groupId)s:": "新增以下聊天室到 %(groupId)s 的摘要中失敗:", + "Add a Room": "新增聊天室", + "Failed to remove the room from the summary of %(groupId)s": "從 %(groupId)s 的摘要中移除聊天室失敗", + "The room '%(roomName)s' could not be removed from the summary.": "聊天室「%(roomName)s」無法從摘要中移除。", + "Add users to the community summary": "新增使用者到社群摘要中", + "Who would you like to add to this summary?": "您想要新增誰到此摘要中?", + "Failed to add the following users to the summary of %(groupId)s:": "新增下列使用者到 %(groupId)s 的摘要中失敗:", + "Add a User": "新增使用者", + "Failed to remove a user from the summary of %(groupId)s": "從 %(groupId)s 的摘要中移除使用者失敗", + "The user '%(displayName)s' could not be removed from the summary.": "使用者「%(displayName)s」無法從摘要中移除。", + "Failed to update community": "更新社群失敗", + "Unable to accept invite": "無法接受邀請", + "Unable to reject invite": "無法回絕邀請", + "Leave Community": "離開社群", + "Leave %(groupName)s?": "離開 %(groupName)s?", + "Leave": "離開", + "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 已經邀請您加入此社群", + "You are an administrator of this community": "您是此社群的管理員", + "You are a member of this community": "您是此社群的成員", + "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "您的社群尚未有長描述,一個顯示給社群成員的 HTML 頁面。
    點按這裡以開啟設並建立一個!", + "Long Description (HTML)": "長描述(HTML)", + "Description": "描述", + "Community %(groupId)s not found": "找不到社群 %(groupId)s", + "This Home server does not support communities": "這個家伺服器不支援社群", + "Failed to load %(groupId)s": "載入 %(groupId)s 失敗", + "Old cryptography data detected": "偵測到舊的加密資料", + "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 的資料。這將會造成舊版的端到端加密失敗。在此版本中使用最近在舊版本交換的金鑰可能無法解密訊息。這也會造成與此版本的訊息交換失敗。若您遇到問題,請登出並重新登入。要保留訊息歷史,請匯出並重新匯入您的金鑰。", + "Your Communities": "您的社群", + "Error whilst fetching joined communities": "擷取已加入的社群時發生錯誤", + "Create a new community": "建立新社群", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "建立社群以將使用者與聊天室湊成一組!建立自訂的首頁以在 Matrix 宇宙中標出您的空間。", + "Join an existing community": "加入既有的社群", + "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "要加入既有的社群,您必須知道它的社群標記符號;其看起來像是 +example:matrix.org.", + "%(count)s of your messages have not been sent.|one": "您的訊息尚未傳送。", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "現在重新傳送全部取消全部。您也可以選取單一訊息以重新傳送或取消。", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "現在重新傳送訊息取消訊息。", + "Warning": "警告", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "沒有其他人了!您想要邀請其他人停止關於空聊天室的警告嗎?", + "Light theme": "亮色主題", + "Dark theme": "暗色主題", + "Status.im theme": "Status.im 主題", + "Ignored Users": "已忽略的使用者", + "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.": "得知更多關於我們如何使用分析資料的資訊。", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "電子郵件已傳送至 %(emailAddress)s。您必須跟隨其中包含了連結,點按下面的連結。", + "Please note you are logging into the %(hs)s server, not matrix.org.": "請注意,您正在登入 %(hs)s 伺服器,不是 matrix.org。", + "This homeserver doesn't offer any login flows which are supported by this client.": "這個家伺服器不提供任何此客戶端支援的登入流程。", + "Sign in to get started": "登入以開始", + "Ignores a user, hiding their messages from you": "忽略使用者,從您這裡隱藏他們的訊息", + "Stops ignoring a user, showing their messages going forward": "停止忽略使用者,顯示他們的訊息", + "Notify the whole room": "通知整個聊天室", + "Room Notification": "聊天室通知", + "The information being sent to us to help make Riot.im better includes:": "協助讓 Riot.im 變得更好的傳送給我們的資訊包含了:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "這個頁面包含了可識別的資訊,如聊天室、使用者或群組 ID,這些資料會在傳到伺服器前被刪除。", + "The platform you're on": "您使用的平臺是", + "The version of Riot.im": "Riot.im 的版本", + "Whether or not you're logged in (we don't record your user name)": "您是否登入(我們不會紀錄您的使用者名稱)", + "Your language of choice": "您選擇的語言", + "Which officially provided instance you are using, if any": "您正在使用的任何官方實體,如果有的話", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "您是否正在使用豐富文字編輯器的豐富文字模式", + "Your homeserver's URL": "您的家伺服器 URL", + "Your identity server's URL": "您的驗證伺服器 URL", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", + "This room is not public. You will not be able to rejoin without an invite.": "這個聊天室並未公開。您在沒有邀請的情況下將無法重新加入。", + "Community IDs cannot not be empty.": "社群 ID 不能為空。", + "Show devices, send anyway or cancel.": "顯示裝置無論如何都要傳送取消。", + "In reply to ": "回覆給 ", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 變更了他們的顯示名稱為 %(displayName)s 。", + "Failed to set direct chat tag": "設定直接聊天標籤失敗", + "Failed to remove tag %(tagName)s from room": "從聊天室移除標籤 %(tagName)s 失敗", + "Failed to add tag %(tagName)s to room": "新增標籤 %(tagName)s 到聊天室失敗", + "Did you know: you can use communities to filter your Riot.im experience!": "您知道嗎:您可以使用社群來強化您的 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.": "要設定過濾器,拖曳社群大頭貼到位於螢幕最左邊的過濾器面板。您可以在任何時候在過濾器面板中的大頭貼上點按以檢視與該社群關聯的聊天室與夥伴。", + "Clear filter": "清除過濾器", + "Disable Community Filter Panel": "停用社群過濾面板", + "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.": "金鑰分享請求已自動傳送到您的其他裝置。若您在您的其他裝置上回絕了金鑰分享請求,點按這裡以再次請求這個工作階段的金鑰。", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "若您的其他裝置沒有這個訊息的金鑰,您將無法將它們解密。", + "Key request sent.": "金鑰請求已傳送。", + "Re-request encryption keys from your other devices.": "從您的其他裝置重新請求加密金鑰。", + "%(user)s is a %(userRole)s": "%(user)s 是 %(userRole)s", + "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 contain messages.": "如果您透過 GitHub 來回報錯誤,除錯訊息可以用來追蹤問題。除錯訊息包含應用程式的使用資料,包括您的使用者名稱、您所造訪的房間/群組的 ID 或別名、其他使用者的使用者名稱等,其中不包含訊息本身。", + "Submit debug logs": "傳送除錯訊息", + "Opens the Developer Tools dialog": "開啟開發者工具對話視窗", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "被 %(displayName)s (%(userName)s) 於 %(dateTime)s 看過", + "Unable to join community": "無法加入社群", + "Unable to leave community": "無法離開社群", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "對您的社群的名稱大頭貼的變更可能在最多30分鐘內不會被其他使用者看到。", + "Join this community": "加入此社群", + "Leave this community": "離開此社群", + "Stickerpack": "貼圖包", + "You don't currently have any stickerpacks enabled": "您目前未啟用任何貼圖包", + "Add a stickerpack": "新增貼圖包", + "Hide Stickers": "隱藏貼圖", + "Show Stickers": "顯示貼圖", + "Who can join this community?": "誰可以加入此社群?", + "Everyone": "每個人", + "Fetching third party location failed": "抓取第三方位置失敗", + "A new version of Riot is available.": "Riot 釋出了新版本。", + "I understand the risks and wish to continue": "我了解這些風險並願意繼續", + "Couldn't load home page": "無法載入首頁", + "Send Account Data": "傳送帳號資料", + "Advanced notification settings": "進階通知設定", + "Uploading report": "上傳報告", + "Sunday": "星期日", + "Notification targets": "通知目標", + "Today": "今天", + "Failed to get protocol list from Home Server": "無法從主機伺服器取得協定清單", + "You are not receiving desktop notifications": "你將不會收到桌面通知", + "Friday": "星期五", + "Update": "更新", + "Unable to fetch notification target list": "無法抓取通知的目標清單", + "Add an email address above to configure email notifications": "在上面新增電子郵件以設定電子郵件通知", + "Expand panel": "展開面板", + "On": "開啟", + "%(count)s Members|other": "%(count)s 個成員", + "Filter room names": "過濾聊天室名稱", + "Changelog": "變更記錄", + "Waiting for response from server": "正在等待來自伺服器的回應", + "Uploaded on %(date)s by %(user)s": "由 %(user)s 在 %(date)s 上傳", + "Send Custom Event": "傳送自訂事件", + "All notifications are currently disabled for all targets.": "目前所有的通知功能已停用。", + "Failed to send logs: ": "無法傳送除錯訊息: ", + "delete the alias.": "刪除別名。", + "To return to your account in future you need to set a password": "未來若需回來使用您的帳號,您需要 設定密碼", + "Forget": "忘記", + "Hide panel": "隱藏面板", + "You cannot delete this image. (%(code)s)": "你不能刪除這個圖片。(%(code)s)", + "Cancel Sending": "取消傳送", + "This Room": "這個聊天室", + "The Home Server may be too old to support third party networks": "主機伺服器可能太老舊無法支援第三方網路", + "Resend": "重新傳送", + "Room not found": "找不到聊天室", + "Messages containing my display name": "訊息中有包含我的顯示名稱", + "Messages in one-to-one chats": "在一對一聊天中的訊息", + "Unavailable": "無法取得", + "Error saving email notification preferences": "儲存電子郵件通知偏好設定時出錯", + "View Decrypted Source": "檢視解密的來源", + "Failed to update keywords": "無法更新關鍵字", + "Notes:": "備註:", + "remove %(name)s from the directory.": "自目錄中移除 %(name)s。", + "Notifications on the following keywords follow rules which can’t be displayed here:": "以下關鍵字依照規則其通知將不會顯示在此:", + "Safari and Opera work too.": "SafariOpera 也可以運作。", + "Please set a password!": "請設定密碼!", + "You have successfully set a password!": "您已經成功設定密碼!", + "An error occurred whilst saving your email notification preferences.": "在儲存你的電子郵件通知偏好時發生錯誤。", + "Explore Room State": "探索聊天室狀態", + "Source URL": "來源網址", + "Messages sent by bot": "由機器人送出的訊息", + "Filter results": "過濾結果", + "Members": "成員", + "No update available.": "沒有可用的更新。", + "Noisy": "吵鬧", + "Files": "檔案", + "Collecting app version information": "收集應用程式版本資訊", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "刪除聊天室別名 %(alias)s 並從目錄移除 %(name)s?", + "This will allow you to return to your account after signing out, and sign in on other devices.": "這讓您可以在登入後回到您帳號,並在其他裝置上登入。", + "Enable notifications for this account": "本帳號啟用通知", + "Directory": "目錄", + "Invite to this community": "邀請至此社群", + "Search for a room": "搜尋聊天室", + "Messages containing keywords": "訊息包含 關鍵字", + "When I'm invited to a room": "當我被邀請加入聊天室", + "Tuesday": "星期二", + "Enter keywords separated by a comma:": "輸入以逗號隔開的關鍵字:", + "Forward Message": "轉寄訊息", + "You have successfully set a password and an email address!": "您已經成功設定密碼與電子郵件地址!", + "Remove %(name)s from the directory?": "自目錄中移除 %(name)s?", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot 使用了許多先進的瀏覽器功能,有些在你目前所用的瀏覽器上無法使用或僅為實驗中的功能。", + "Developer Tools": "開發者工具", + "Preparing to send logs": "準備傳送除錯訊息", + "Enable desktop notifications": "啟用桌面通知", + "Explore Account Data": "探索帳號資料", + "All messages (noisy)": "所有訊息(吵鬧)", + "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 問題回報連結:", + "You must specify an event type!": "您必須指定事件類型!", + "(HTTP status %(httpStatus)s)": "(HTTP 狀態 %(httpStatus)s)", + "All Rooms": "所有的聊天室", + "What's New": "新鮮事", + "Please install Chrome or Firefox for the best experience.": "請安裝 ChromeFirefox 以取得最佳體驗。", + "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": "關鍵字", + "Can't update user notification settings": "無法更新使用者的通知設定", + "Notify for all other messages/rooms": "通知其他所有的訊息/聊天室", + "Unable to look up room ID from server": "無法從伺服器找到聊天室 ID", + "Couldn't find a matching Matrix room": "不能找到符合 Matrix 的聊天室", + "Invite to this room": "邀請加入這個聊天室", + "You cannot delete this message. (%(code)s)": "你不能刪除這個訊息。(%(code)s)", + "Thursday": "星期四", + "Search…": "搜尋…", + "Logs sent": "除錯訊息已經傳送", + "Back": "返回", + "Reply": "回覆", + "Show message in desktop notification": "在桌面通知中顯示訊息", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "除錯訊息包含應用程式的使用資料,包括您的使用者名稱、您所造訪的房間/群組的 ID 或別名、其他使用者的使用者名稱等,其中不包含訊息本身。", + "Unhide Preview": "取消隱藏預覽", + "Unable to join network": "無法加入網路", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "你也許不曾在其它 Riot 之外的客戶端設定它們。在 Riot 底下你無法調整它們但其仍然可用", + "Sorry, your browser is not able to run Riot.": "可惜,您的瀏覽器 無法 執行 Riot.", + "Messages in group chats": "在群組聊天中的訊息", + "Yesterday": "昨天", + "Error encountered (%(errorDetail)s).": "遇到錯誤 (%(errorDetail)s)。", + "Login": "登入", + "Low Priority": "低優先度", + "Riot does not know how to join a room on this network": "Riot 不知道如何在此網路中加入聊天室", + "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": "有些進階的通知並未在此顯示", + "Missing roomId.": "缺少 roomid。", + "Picture": "圖片", + "Every page you use in the app": "您在應用程式內使用的每一頁", + "e.g. ": "範例:", + "Your User Agent": "您的使用者代理字串", + "Your device resolution": "您的裝置解析度", + "Always show encryption icons": "總是顯示加密圖示", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "目前無法使用檔案回覆,所以這次傳送並不會以回覆的形式出現。", + "Unable to reply": "無法回覆", + "At this time it is not possible to reply with an emote.": "目前無法使用表情符號回覆。", + "Popout widget": "彈出式小工具", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "無法載入要回覆的活動,它可能不存在或是您沒有權限檢視它。", + "Riot bugs are tracked on GitHub: create a GitHub issue.": "Riot 的臭蟲在 GitHub 上追蹤:在 GitHub 上建立議題。", + "Log out and remove encryption keys?": "登出或移除加密金鑰?", + "Send Logs": "傳送紀錄", + "Clear Storage and Sign Out": "清除儲存的東西並登出", + "Refresh": "重新整理", + "We encountered an error trying to restore your previous session.": "我們在嘗試復原您先前的工作階段時遇到了一點錯誤。", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "清除您瀏覽器的儲存的東西也許可以修復問題,但會將您登出並造成任何已加密的聊天都無法讀取。", + "Collapse Reply Thread": "摺疊回覆討論串", + "Enable widget screenshots on supported widgets": "在支援的小工具上啟用小工具螢幕快照" } diff --git a/src/languageHandler.js b/src/languageHandler.js index e732927a75..4e24c04d36 100644 --- a/src/languageHandler.js +++ b/src/languageHandler.js @@ -40,7 +40,7 @@ export function _td(s) { // Wrapper for counterpart's translation function so that it handles nulls and undefineds properly // Takes the same arguments as counterpart.translate() -function safeCounterpartTranslate(...args) { +function safeCounterpartTranslate(text, options) { // Horrible hack to avoid https://github.com/vector-im/riot-web/issues/4191 // The interpolation library that counterpart uses does not support undefined/null // values and instead will throw an error. This is a problem since everywhere else @@ -48,19 +48,28 @@ function safeCounterpartTranslate(...args) { // valid ES6 template strings to i18n strings it's extremely easy to pass undefined/null // if there are no existing null guards. To avoid this making the app completely inoperable, // we'll check all the values for undefined/null and stringify them here. - if (args[1] && typeof args[1] === 'object') { - Object.keys(args[1]).forEach((k) => { - if (args[1][k] === undefined) { + let count; + + if (options && typeof options === 'object') { + count = options['count']; + Object.keys(options).forEach((k) => { + if (options[k] === undefined) { console.warn("safeCounterpartTranslate called with undefined interpolation name: " + k); - args[1][k] = 'undefined'; + options[k] = 'undefined'; } - if (args[1][k] === null) { + if (options[k] === null) { console.warn("safeCounterpartTranslate called with null interpolation name: " + k); - args[1][k] = 'null'; + options[k] = 'null'; } }); } - return counterpart.translate(...args); + let translated = counterpart.translate(text, options); + if (translated === undefined && count !== undefined) { + // counterpart does not do fallback if no pluralisation exists + // in the preferred language, so do it here + translated = counterpart.translate(text, Object.assign({}, options, {locale: 'en'})); + } + return translated; } /* 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..93a52ba1aa --- /dev/null +++ b/src/rageshake/rageshake.js @@ -0,0 +1,471 @@ +/* +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} 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} 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(); + } + }); +} + + +module.exports = { + + /** + * Configure rage shaking support for sending bug reports. + * Modifies globals. + * @return {Promise} Resolves when set up. + */ + init: function() { + if (global.mx_rage_initPromise) { + return global.mx_rage_initPromise; + } + global.mx_rage_logger = new ConsoleLogger(); + global.mx_rage_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) { + global.mx_rage_store = new IndexedDBLogStore(indexedDB, global.mx_rage_logger); + global.mx_rage_initPromise = global.mx_rage_store.connect(); + return global.mx_rage_initPromise; + } + global.mx_rage_initPromise = Promise.resolve(); + return global.mx_rage_initPromise; + }, + + flush: function() { + if (!global.mx_rage_store) { + return; + } + global.mx_rage_store.flush(); + }, + + /** + * Clean up old logs. + * @return Promise Resolves if cleaned logs. + */ + cleanup: async function() { + if (!global.mx_rage_store) { + return; + } + await global.mx_rage_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 (!global.mx_rage_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 (global.mx_rage_store) { + // flush most recent logs + await global.mx_rage_store.flush(); + return await global.mx_rage_store.consume(); + } + else { + return [{ + lines: global.mx_rage_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/ratelimitedfunc.js b/src/ratelimitedfunc.js index d8c30f5d03..20f6db79b8 100644 --- a/src/ratelimitedfunc.js +++ b/src/ratelimitedfunc.js @@ -35,13 +35,17 @@ module.exports = function(f, minIntervalMs) { if (self.lastCall < now - minIntervalMs) { f.apply(this); - self.lastCall = now; + // get the time again now the function has finished, so if it + // took longer than the delay time to execute, it doesn't + // immediately become eligible to run again. + self.lastCall = Date.now(); } else if (self.scheduledCall === undefined) { self.scheduledCall = setTimeout( () => { self.scheduledCall = undefined; f.apply(this); - self.lastCall = now; + // get time again as per above + self.lastCall = Date.now(); }, (self.lastCall + minIntervalMs) - now, ); diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 519d2dd39a..b1bc4161fd 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -88,12 +88,6 @@ export const SETTINGS = { supportedLevels: LEVELS_FEATURE, default: false, }, - "feature_presence_management": { - isFeature: true, - displayName: _td("Presence Management"), - supportedLevels: LEVELS_FEATURE, - default: false, - }, "feature_tag_panel": { isFeature: true, displayName: _td("Tag Panel"), @@ -150,6 +144,11 @@ export const SETTINGS = { displayName: _td('Autoplay GIFs and videos'), default: false, }, + "alwaysShowEncryptionIcons": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + displayName: _td('Always show encryption icons'), + default: true, + }, "enableSyntaxHighlightLanguageDetection": { supportedLevels: LEVELS_ACCOUNT_SETTINGS, displayName: _td('Enable automatic language detection for syntax highlighting'), @@ -188,6 +187,11 @@ export const SETTINGS = { displayName: _td('Mirror local video feed'), default: false, }, + "TagPanel.disableTagPanel": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + displayName: _td('Disable Community Filter Panel'), + default: false, + }, "theme": { supportedLevels: LEVELS_ACCOUNT_SETTINGS, default: "light", @@ -209,11 +213,15 @@ export const SETTINGS = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: "en", }, - "analyticsOptOut": { + "analyticsOptIn": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, - displayName: _td('Opt out of analytics'), + displayName: _td('Send analytics data'), default: false, }, + "showCookieBar": { + supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, + default: true, + }, "autocompleteDelay": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: 200, @@ -261,4 +269,9 @@ export const SETTINGS = { default: true, controller: new AudioNotificationsEnabledController(), }, + "enableWidgetScreenshots": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + displayName: _td('Enable widget screenshots on supported widgets'), + default: false, + }, }; diff --git a/src/settings/handlers/AccountSettingsHandler.js b/src/settings/handlers/AccountSettingsHandler.js index e50358a728..b822709573 100644 --- a/src/settings/handlers/AccountSettingsHandler.js +++ b/src/settings/handlers/AccountSettingsHandler.js @@ -25,19 +25,20 @@ export default class AccountSettingHandler extends SettingsHandler { getValue(settingName, roomId) { // Special case URL previews if (settingName === "urlPreviewsEnabled") { - const content = this._getSettings("org.matrix.preview_urls"); + const content = this._getSettings("org.matrix.preview_urls") || {}; // Check to make sure that we actually got a boolean if (typeof(content['disable']) !== "boolean") return null; return !content['disable']; } - let preferredValue = this._getSettings()[settingName]; + const settings = this._getSettings() || {}; + let preferredValue = settings[settingName]; if (preferredValue === null || preferredValue === undefined) { // Honour the old setting on read only if (settingName === "hideAvatarChanges" || settingName === "hideDisplaynameChanges") { - preferredValue = this._getSettings()["hideAvatarDisplaynameChanges"]; + preferredValue = settings["hideAvatarDisplaynameChanges"]; } } @@ -47,12 +48,12 @@ export default class AccountSettingHandler extends SettingsHandler { setValue(settingName, roomId, newValue) { // Special case URL previews if (settingName === "urlPreviewsEnabled") { - const content = this._getSettings("org.matrix.preview_urls"); + const content = this._getSettings("org.matrix.preview_urls") || {}; content['disable'] = !newValue; return MatrixClientPeg.get().setAccountData("org.matrix.preview_urls", content); } - const content = this._getSettings(); + const content = this._getSettings() || {}; content[settingName] = newValue; return MatrixClientPeg.get().setAccountData("im.vector.web.settings", content); } @@ -68,9 +69,10 @@ export default class AccountSettingHandler extends SettingsHandler { _getSettings(eventType = "im.vector.web.settings") { const cli = MatrixClientPeg.get(); - if (!cli) return {}; + if (!cli) return null; + const event = cli.getAccountData(eventType); - if (!event || !event.getContent()) return {}; + if (!event || !event.getContent()) return null; return event.getContent(); } } diff --git a/src/settings/handlers/DeviceSettingsHandler.js b/src/settings/handlers/DeviceSettingsHandler.js index 22f6140a80..b2a225e190 100644 --- a/src/settings/handlers/DeviceSettingsHandler.js +++ b/src/settings/handlers/DeviceSettingsHandler.js @@ -53,7 +53,8 @@ export default class DeviceSettingsHandler extends SettingsHandler { return null; // wrong type or otherwise not set } - return this._getSettings()[settingName]; + const settings = this._getSettings() || {}; + return settings[settingName]; } setValue(settingName, roomId, newValue) { @@ -74,7 +75,7 @@ export default class DeviceSettingsHandler extends SettingsHandler { return Promise.resolve(); } - const settings = this._getSettings(); + const settings = this._getSettings() || {}; settings[settingName] = newValue; localStorage.setItem("mx_local_settings", JSON.stringify(settings)); @@ -91,7 +92,7 @@ export default class DeviceSettingsHandler extends SettingsHandler { _getSettings() { const value = localStorage.getItem("mx_local_settings"); - if (!value) return {}; + if (!value) return null; return JSON.parse(value); } @@ -101,7 +102,7 @@ export default class DeviceSettingsHandler extends SettingsHandler { _readFeature(featureName) { if (MatrixClientPeg.get() && MatrixClientPeg.get().isGuest()) { // Guests should not have any labs features enabled. - return {enabled: false}; + return false; } const value = localStorage.getItem("mx_labs_feature_" + featureName); diff --git a/src/settings/handlers/RoomAccountSettingsHandler.js b/src/settings/handlers/RoomAccountSettingsHandler.js index e946581807..74dbf9eed0 100644 --- a/src/settings/handlers/RoomAccountSettingsHandler.js +++ b/src/settings/handlers/RoomAccountSettingsHandler.js @@ -24,7 +24,7 @@ export default class RoomAccountSettingsHandler extends SettingsHandler { getValue(settingName, roomId) { // Special case URL previews if (settingName === "urlPreviewsEnabled") { - const content = this._getSettings(roomId, "org.matrix.room.preview_urls"); + const content = this._getSettings(roomId, "org.matrix.room.preview_urls") || {}; // Check to make sure that we actually got a boolean if (typeof(content['disable']) !== "boolean") return null; @@ -35,16 +35,18 @@ export default class RoomAccountSettingsHandler extends SettingsHandler { if (settingName === "roomColor") { // The event content should already be in an appropriate format, we just need // to get the right value. + // don't fallback to {} because thats truthy and would imply there is an event specifying tint return this._getSettings(roomId, "org.matrix.room.color_scheme"); } - return this._getSettings(roomId)[settingName]; + const settings = this._getSettings(roomId) || {}; + return settings[settingName]; } setValue(settingName, roomId, newValue) { // Special case URL previews if (settingName === "urlPreviewsEnabled") { - const content = this._getSettings(roomId, "org.matrix.room.preview_urls"); + const content = this._getSettings(roomId, "org.matrix.room.preview_urls") || {}; content['disable'] = !newValue; return MatrixClientPeg.get().setRoomAccountData(roomId, "org.matrix.room.preview_urls", content); } @@ -55,7 +57,7 @@ export default class RoomAccountSettingsHandler extends SettingsHandler { return MatrixClientPeg.get().setRoomAccountData(roomId, "org.matrix.room.color_scheme", newValue); } - const content = this._getSettings(roomId); + const content = this._getSettings(roomId) || {}; content[settingName] = newValue; return MatrixClientPeg.get().setRoomAccountData(roomId, "im.vector.web.settings", content); } @@ -74,10 +76,10 @@ export default class RoomAccountSettingsHandler extends SettingsHandler { _getSettings(roomId, eventType = "im.vector.settings") { const room = MatrixClientPeg.get().getRoom(roomId); - if (!room) return {}; + if (!room) return null; const event = room.getAccountData(eventType); - if (!event || !event.getContent()) return {}; + if (!event || !event.getContent()) return null; return event.getContent(); } } diff --git a/src/settings/handlers/RoomSettingsHandler.js b/src/settings/handlers/RoomSettingsHandler.js index cb3e836c7f..71abff94f6 100644 --- a/src/settings/handlers/RoomSettingsHandler.js +++ b/src/settings/handlers/RoomSettingsHandler.js @@ -24,25 +24,26 @@ export default class RoomSettingsHandler extends SettingsHandler { getValue(settingName, roomId) { // Special case URL previews if (settingName === "urlPreviewsEnabled") { - const content = this._getSettings(roomId, "org.matrix.room.preview_urls"); + const content = this._getSettings(roomId, "org.matrix.room.preview_urls") || {}; // Check to make sure that we actually got a boolean if (typeof(content['disable']) !== "boolean") return null; return !content['disable']; } - return this._getSettings(roomId)[settingName]; + const settings = this._getSettings(roomId) || {}; + return settings[settingName]; } setValue(settingName, roomId, newValue) { // Special case URL previews if (settingName === "urlPreviewsEnabled") { - const content = this._getSettings(roomId, "org.matrix.room.preview_urls"); + const content = this._getSettings(roomId, "org.matrix.room.preview_urls") || {}; content['disable'] = !newValue; return MatrixClientPeg.get().sendStateEvent(roomId, "org.matrix.room.preview_urls", content); } - const content = this._getSettings(roomId); + const content = this._getSettings(roomId) || {}; content[settingName] = newValue; return MatrixClientPeg.get().sendStateEvent(roomId, "im.vector.web.settings", content, ""); } @@ -65,9 +66,10 @@ export default class RoomSettingsHandler extends SettingsHandler { _getSettings(roomId, eventType = "im.vector.web.settings") { const room = MatrixClientPeg.get().getRoom(roomId); - if (!room) return {}; + if (!room) return null; + const event = room.currentState.getStateEvents(eventType, ""); - if (!event || !event.getContent()) return {}; + if (!event || !event.getContent()) return null; return event.getContent(); } } diff --git a/src/shouldHideEvent.js b/src/shouldHideEvent.js index 1ecd1ac051..3aad05a976 100644 --- a/src/shouldHideEvent.js +++ b/src/shouldHideEvent.js @@ -27,10 +27,11 @@ function memberEventDiff(ev) { const content = ev.getContent(); const prevContent = ev.getPrevContent(); - diff.isJoin = content.membership === 'join' && prevContent.membership !== 'ban'; - diff.isPart = content.membership === 'leave' && ev.getStateKey() === ev.getSender(); + const isMembershipChanged = content.membership !== prevContent.membership; + diff.isJoin = isMembershipChanged && content.membership === 'join'; + diff.isPart = isMembershipChanged && content.membership === 'leave' && ev.getStateKey() === ev.getSender(); - const isJoinToJoin = content.membership === prevContent.membership && content.membership === 'join'; + const isJoinToJoin = !isMembershipChanged && content.membership === 'join'; diff.isDisplaynameChange = isJoinToJoin && content.displayname !== prevContent.displayname; diff.isAvatarChange = isJoinToJoin && content.avatar_url !== prevContent.avatar_url; return diff; diff --git a/src/stores/FlairStore.js b/src/stores/FlairStore.js index 7a3aa31e4e..c8b4d75010 100644 --- a/src/stores/FlairStore.js +++ b/src/stores/FlairStore.js @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import EventEmitter from 'events'; import Promise from 'bluebird'; const BULK_REQUEST_DEBOUNCE_MS = 200; @@ -28,8 +29,9 @@ const GROUP_PROFILES_CACHE_BUST_MS = 1800000; // 30 mins /** * Stores data used by */ -class FlairStore { +class FlairStore extends EventEmitter { constructor(matrixClient) { + super(); this._matrixClient = matrixClient; this._userGroups = { // $userId: ['+group1:domain', '+group2:domain', ...] @@ -152,19 +154,29 @@ class FlairStore { return this._groupProfiles[groupId]; } - // No request yet, start one - if (!this._groupProfilesPromise[groupId]) { - this._groupProfilesPromise[groupId] = matrixClient.getGroupProfile(groupId); + // A request is ongoing, wait for it to complete and return the group profile. + if (this._groupProfilesPromise[groupId]) { + try { + await this._groupProfilesPromise[groupId]; + } catch (e) { + // Don't log the error; this is done below + return null; + } + return this._groupProfiles[groupId]; } + // No request yet, start one + console.log('FlairStore: Request group profile of ' + groupId); + this._groupProfilesPromise[groupId] = matrixClient.getGroupProfile(groupId); + let profile; try { profile = await this._groupProfilesPromise[groupId]; } catch (e) { - console.log('Failed to get group profile for ' + groupId, e); + console.log('FlairStore: Failed to get group profile for ' + groupId, e); // Don't retry, but allow a retry when the profile is next requested delete this._groupProfilesPromise[groupId]; - return; + return null; } this._groupProfiles[groupId] = { @@ -175,12 +187,24 @@ class FlairStore { }; delete this._groupProfilesPromise[groupId]; + /// XXX: This is verging on recreating a third "Flux"-looking Store. We really + /// should replace FlairStore with a Flux store and some async actions. + console.log('FlairStore: Emit updateGroupProfile for ' + groupId); + this.emit('updateGroupProfile'); + setTimeout(() => { - delete this._groupProfiles[groupId]; + this.refreshGroupProfile(matrixClient, groupId); }, GROUP_PROFILES_CACHE_BUST_MS); return this._groupProfiles[groupId]; } + + refreshGroupProfile(matrixClient, groupId) { + // Invalidate the cache + delete this._groupProfiles[groupId]; + // Fetch new profile data, and cache it + return this.getGroupProfileCached(matrixClient, groupId); + } } if (global.singletonFlairStore === undefined) { diff --git a/src/stores/GroupStore.js b/src/stores/GroupStore.js index 9dce15fb53..bc2be37f51 100644 --- a/src/stores/GroupStore.js +++ b/src/stores/GroupStore.js @@ -19,84 +19,142 @@ import { groupMemberFromApiObject, groupRoomFromApiObject } from '../groups'; import FlairStore from './FlairStore'; import MatrixClientPeg from '../MatrixClientPeg'; -/** - * Stores the group summary for a room and provides an API to change it and - * other useful group APIs that may have an effect on the group summary. - */ -export default class GroupStore extends EventEmitter { +function parseMembersResponse(response) { + return response.chunk.map((apiMember) => groupMemberFromApiObject(apiMember)); +} - static STATE_KEY = { +function parseRoomsResponse(response) { + return response.chunk.map((apiRoom) => groupRoomFromApiObject(apiRoom)); +} + +// The number of ongoing group requests +let ongoingRequestCount = 0; + +// This has arbitrarily been set to a small number to lower the priority +// of doing group-related requests because we care about other important +// requests like hitting /sync. +const LIMIT = 3; // Maximum number of ongoing group requests + +// FIFO queue of functions to call in the backlog +const backlogQueue = [ + // () => {...} +]; + +// Pull from the FIFO queue +function checkBacklog() { + const item = backlogQueue.shift(); + if (typeof item === 'function') item(); +} + +// Limit the maximum number of ongoing promises returned by fn to LIMIT and +// use a FIFO queue to handle the backlog. +async function limitConcurrency(fn) { + if (ongoingRequestCount >= LIMIT) { + // Enqueue this request for later execution + await new Promise((resolve, reject) => { + backlogQueue.push(resolve); + }); + } + + ongoingRequestCount++; + try { + return await fn(); + } catch (err) { + // We explicitly do not handle the error here, but let it propogate. + throw err; + } finally { + ongoingRequestCount--; + checkBacklog(); + } +} + +/** + * Global store for tracking group summary, members, invited members and rooms. + */ +class GroupStore extends EventEmitter { + STATE_KEY = { GroupMembers: 'GroupMembers', GroupInvitedMembers: 'GroupInvitedMembers', Summary: 'Summary', GroupRooms: 'GroupRooms', }; - constructor(groupId) { + constructor() { super(); - if (!groupId) { - throw new Error('GroupStore needs a valid groupId to be created'); - } - this.groupId = groupId; - this._summary = {}; - this._rooms = []; - this._members = []; - this._invitedMembers = []; - this._ready = {}; + this._state = {}; + this._state[this.STATE_KEY.Summary] = {}; + this._state[this.STATE_KEY.GroupRooms] = {}; + this._state[this.STATE_KEY.GroupMembers] = {}; + this._state[this.STATE_KEY.GroupInvitedMembers] = {}; - this.on('error', (err) => { - console.error(`GroupStore for ${this.groupId} encountered error`, err); + this._ready = {}; + this._ready[this.STATE_KEY.Summary] = {}; + this._ready[this.STATE_KEY.GroupRooms] = {}; + this._ready[this.STATE_KEY.GroupMembers] = {}; + this._ready[this.STATE_KEY.GroupInvitedMembers] = {}; + + this._fetchResourcePromise = { + [this.STATE_KEY.Summary]: {}, + [this.STATE_KEY.GroupRooms]: {}, + [this.STATE_KEY.GroupMembers]: {}, + [this.STATE_KEY.GroupInvitedMembers]: {}, + }; + + this._resourceFetcher = { + [this.STATE_KEY.Summary]: (groupId) => { + return limitConcurrency( + () => MatrixClientPeg.get().getGroupSummary(groupId), + ); + }, + [this.STATE_KEY.GroupRooms]: (groupId) => { + return limitConcurrency( + () => MatrixClientPeg.get().getGroupRooms(groupId).then(parseRoomsResponse), + ); + }, + [this.STATE_KEY.GroupMembers]: (groupId) => { + return limitConcurrency( + () => MatrixClientPeg.get().getGroupUsers(groupId).then(parseMembersResponse), + ); + }, + [this.STATE_KEY.GroupInvitedMembers]: (groupId) => { + return limitConcurrency( + () => MatrixClientPeg.get().getGroupInvitedUsers(groupId).then(parseMembersResponse), + ); + }, + }; + + this.on('error', (err, groupId) => { + console.error(`GroupStore encountered error whilst fetching data for ${groupId}`, err); }); } - _fetchMembers() { - MatrixClientPeg.get().getGroupUsers(this.groupId).then((result) => { - this._members = result.chunk.map((apiMember) => { - return groupMemberFromApiObject(apiMember); - }); - this._ready[GroupStore.STATE_KEY.GroupMembers] = true; - this._notifyListeners(); - }).catch((err) => { - console.error("Failed to get group member list: " + err); - this.emit('error', err); - }); + _fetchResource(stateKey, groupId) { + // Ongoing request, ignore + if (this._fetchResourcePromise[stateKey][groupId]) return; - MatrixClientPeg.get().getGroupInvitedUsers(this.groupId).then((result) => { - this._invitedMembers = result.chunk.map((apiMember) => { - return groupMemberFromApiObject(apiMember); - }); - this._ready[GroupStore.STATE_KEY.GroupInvitedMembers] = true; + const clientPromise = this._resourceFetcher[stateKey](groupId); + + // Indicate ongoing request + this._fetchResourcePromise[stateKey][groupId] = clientPromise; + + clientPromise.then((result) => { + this._state[stateKey][groupId] = result; + this._ready[stateKey][groupId] = true; this._notifyListeners(); }).catch((err) => { // Invited users not visible to non-members - if (err.httpStatus === 403) { + if (stateKey === this.STATE_KEY.GroupInvitedMembers && err.httpStatus === 403) { return; } - console.error("Failed to get group invited member list: " + err); - this.emit('error', err); - }); - } - _fetchSummary() { - MatrixClientPeg.get().getGroupSummary(this.groupId).then((resp) => { - this._summary = resp; - this._ready[GroupStore.STATE_KEY.Summary] = true; - this._notifyListeners(); - }).catch((err) => { - this.emit('error', err); + console.error(`Failed to get resource ${stateKey} for ${groupId}`, err); + this.emit('error', err, groupId); + }).finally(() => { + // Indicate finished request, allow for future fetches + delete this._fetchResourcePromise[stateKey][groupId]; }); - } - _fetchRooms() { - MatrixClientPeg.get().getGroupRooms(this.groupId).then((resp) => { - this._rooms = resp.chunk.map((apiRoom) => { - return groupRoomFromApiObject(apiRoom); - }); - this._ready[GroupStore.STATE_KEY.GroupRooms] = true; - this._notifyListeners(); - }).catch((err) => { - this.emit('error', err); - }); + return clientPromise; } _notifyListeners() { @@ -108,24 +166,29 @@ export default class GroupStore extends EventEmitter { * immediately triggers an update to send the current state of the * store (which could be the initial state). * - * XXX: This also causes a fetch of all group data, which effectively - * causes 4 separate HTTP requests. This is bad, we should at least - * deduplicate these in order to fix: - * https://github.com/vector-im/riot-web/issues/5901 + * If a group ID is specified, this also causes a fetch of all data + * of the specified group, which might cause 4 separate HTTP + * requests, but only if said requests aren't already ongoing. * + * @param {string?} groupId the ID of the group to fetch data for. + * Optional. * @param {function} fn the function to call when the store updates. * @return {Object} tok a registration "token" with a single * property `unregister`, a function that can * be called to unregister the listener such * that it won't be called any more. */ - registerListener(fn) { + registerListener(groupId, fn) { this.on('update', fn); // Call to set initial state (before fetching starts) this.emit('update'); - this._fetchSummary(); - this._fetchRooms(); - this._fetchMembers(); + + if (groupId) { + this._fetchResource(this.STATE_KEY.Summary, groupId); + this._fetchResource(this.STATE_KEY.GroupRooms, groupId); + this._fetchResource(this.STATE_KEY.GroupMembers, groupId); + this._fetchResource(this.STATE_KEY.GroupInvitedMembers, groupId); + } // Similar to the Store of flux/utils, we return a "token" that // can be used to unregister the listener. @@ -140,95 +203,137 @@ export default class GroupStore extends EventEmitter { this.removeListener('update', fn); } - isStateReady(id) { - return this._ready[id]; + isStateReady(groupId, id) { + return this._ready[id][groupId]; } - getSummary() { - return this._summary; + getSummary(groupId) { + return this._state[this.STATE_KEY.Summary][groupId] || {}; } - getGroupRooms() { - return this._rooms; + getGroupRooms(groupId) { + return this._state[this.STATE_KEY.GroupRooms][groupId] || []; } - getGroupMembers( ) { - return this._members; + getGroupMembers(groupId) { + return this._state[this.STATE_KEY.GroupMembers][groupId] || []; } - getGroupInvitedMembers( ) { - return this._invitedMembers; + getGroupInvitedMembers(groupId) { + return this._state[this.STATE_KEY.GroupInvitedMembers][groupId] || []; } - getGroupPublicity() { - return this._summary.user ? this._summary.user.is_publicised : null; + getGroupPublicity(groupId) { + return (this._state[this.STATE_KEY.Summary][groupId] || {}).user ? + (this._state[this.STATE_KEY.Summary][groupId] || {}).user.is_publicised : null; } - isUserPrivileged() { - return this._summary.user ? this._summary.user.is_privileged : null; + isUserPrivileged(groupId) { + return (this._state[this.STATE_KEY.Summary][groupId] || {}).user ? + (this._state[this.STATE_KEY.Summary][groupId] || {}).user.is_privileged : null; } - addRoomToGroup(roomId, isPublic) { + refreshGroupRooms(groupId) { + return this._fetchResource(this.STATE_KEY.GroupRooms, groupId); + } + + refreshGroupMembers(groupId) { + return this._fetchResource(this.STATE_KEY.GroupMembers, groupId); + } + + addRoomToGroup(groupId, roomId, isPublic) { return MatrixClientPeg.get() - .addRoomToGroup(this.groupId, roomId, isPublic) - .then(this._fetchRooms.bind(this)); + .addRoomToGroup(groupId, roomId, isPublic) + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupRooms, groupId)); } - updateGroupRoomVisibility(roomId, isPublic) { + updateGroupRoomVisibility(groupId, roomId, isPublic) { return MatrixClientPeg.get() - .updateGroupRoomVisibility(this.groupId, roomId, isPublic) - .then(this._fetchRooms.bind(this)); + .updateGroupRoomVisibility(groupId, roomId, isPublic) + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupRooms, groupId)); } - removeRoomFromGroup(roomId) { + removeRoomFromGroup(groupId, roomId) { return MatrixClientPeg.get() - .removeRoomFromGroup(this.groupId, roomId) + .removeRoomFromGroup(groupId, roomId) // Room might be in the summary, refresh just in case - .then(this._fetchSummary.bind(this)) - .then(this._fetchRooms.bind(this)); + .then(this._fetchResource.bind(this, this.STATE_KEY.Summary, groupId)) + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupRooms, groupId)); } - inviteUserToGroup(userId) { - return MatrixClientPeg.get().inviteUserToGroup(this.groupId, userId) - .then(this._fetchMembers.bind(this)); + inviteUserToGroup(groupId, userId) { + return MatrixClientPeg.get().inviteUserToGroup(groupId, userId) + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupInvitedMembers, groupId)); } - acceptGroupInvite() { - return MatrixClientPeg.get().acceptGroupInvite(this.groupId) + acceptGroupInvite(groupId) { + return MatrixClientPeg.get().acceptGroupInvite(groupId) + // The user should now be able to access (personal) group settings + .then(this._fetchResource.bind(this, this.STATE_KEY.Summary, groupId)) // The user might be able to see more rooms now - .then(this._fetchRooms.bind(this)) + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupRooms, groupId)) // The user should now appear as a member - .then(this._fetchMembers.bind(this)); + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupMembers, groupId)) + // The user should now not appear as an invited member + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupInvitedMembers, groupId)); } - addRoomToGroupSummary(roomId, categoryId) { - return MatrixClientPeg.get() - .addRoomToGroupSummary(this.groupId, roomId, categoryId) - .then(this._fetchSummary.bind(this)); + joinGroup(groupId) { + return MatrixClientPeg.get().joinGroup(groupId) + // The user should now be able to access (personal) group settings + .then(this._fetchResource.bind(this, this.STATE_KEY.Summary, groupId)) + // The user might be able to see more rooms now + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupRooms, groupId)) + // The user should now appear as a member + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupMembers, groupId)) + // The user should now not appear as an invited member + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupInvitedMembers, groupId)); } - addUserToGroupSummary(userId, roleId) { - return MatrixClientPeg.get() - .addUserToGroupSummary(this.groupId, userId, roleId) - .then(this._fetchSummary.bind(this)); + leaveGroup(groupId) { + return MatrixClientPeg.get().leaveGroup(groupId) + // The user should now not be able to access group settings + .then(this._fetchResource.bind(this, this.STATE_KEY.Summary, groupId)) + // The user might only be able to see a subset of rooms now + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupRooms, groupId)) + // The user should now not appear as a member + .then(this._fetchResource.bind(this, this.STATE_KEY.GroupMembers, groupId)); } - removeRoomFromGroupSummary(roomId) { + addRoomToGroupSummary(groupId, roomId, categoryId) { return MatrixClientPeg.get() - .removeRoomFromGroupSummary(this.groupId, roomId) - .then(this._fetchSummary.bind(this)); + .addRoomToGroupSummary(groupId, roomId, categoryId) + .then(this._fetchResource.bind(this, this.STATE_KEY.Summary, groupId)); } - removeUserFromGroupSummary(userId) { + addUserToGroupSummary(groupId, userId, roleId) { return MatrixClientPeg.get() - .removeUserFromGroupSummary(this.groupId, userId) - .then(this._fetchSummary.bind(this)); + .addUserToGroupSummary(groupId, userId, roleId) + .then(this._fetchResource.bind(this, this.STATE_KEY.Summary, groupId)); } - setGroupPublicity(isPublished) { + removeRoomFromGroupSummary(groupId, roomId) { return MatrixClientPeg.get() - .setGroupPublicity(this.groupId, isPublished) + .removeRoomFromGroupSummary(groupId, roomId) + .then(this._fetchResource.bind(this, this.STATE_KEY.Summary, groupId)); + } + + removeUserFromGroupSummary(groupId, userId) { + return MatrixClientPeg.get() + .removeUserFromGroupSummary(groupId, userId) + .then(this._fetchResource.bind(this, this.STATE_KEY.Summary, groupId)); + } + + setGroupPublicity(groupId, isPublished) { + return MatrixClientPeg.get() + .setGroupPublicity(groupId, isPublished) .then(() => { FlairStore.invalidatePublicisedGroups(MatrixClientPeg.get().credentials.userId); }) - .then(this._fetchSummary.bind(this)); + .then(this._fetchResource.bind(this, this.STATE_KEY.Summary, groupId)); } } + +let singletonGroupStore = null; +if (!singletonGroupStore) { + singletonGroupStore = new GroupStore(); +} +module.exports = singletonGroupStore; diff --git a/src/stores/GroupStoreCache.js b/src/stores/GroupStoreCache.js deleted file mode 100644 index 8b4286831b..0000000000 --- a/src/stores/GroupStoreCache.js +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright 2017 New Vector Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import GroupStore from './GroupStore'; - -class GroupStoreCache { - constructor() { - this.groupStore = null; - } - - getGroupStore(groupId) { - if (!this.groupStore || this.groupStore.groupId !== groupId) { - // This effectively throws away the reference to any previous GroupStore, - // allowing it to be GCd once the components referencing it have stopped - // referencing it. - this.groupStore = new GroupStore(groupId); - } - return this.groupStore; - } -} - -if (global.singletonGroupStoreCache === undefined) { - global.singletonGroupStoreCache = new GroupStoreCache(); -} -export default global.singletonGroupStoreCache; diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js new file mode 100644 index 0000000000..b6d0949dd3 --- /dev/null +++ b/src/stores/RoomListStore.js @@ -0,0 +1,302 @@ +/* +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 {Store} from 'flux/utils'; +import dis from '../dispatcher'; +import DMRoomMap from '../utils/DMRoomMap'; +import Unread from '../Unread'; + +/** + * A class for storing application state for categorising rooms in + * the RoomList. + */ +class RoomListStore extends Store { + + static _listOrders = { + "m.favourite": "manual", + "im.vector.fake.invite": "recent", + "im.vector.fake.recent": "recent", + "im.vector.fake.direct": "recent", + "m.lowpriority": "recent", + "im.vector.fake.archived": "recent", + }; + + constructor() { + super(dis); + + this._init(); + this._getManualComparator = this._getManualComparator.bind(this); + this._recentsComparator = this._recentsComparator.bind(this); + } + + _init() { + // Initialise state + this._state = { + lists: { + "im.vector.fake.invite": [], + "m.favourite": [], + "im.vector.fake.recent": [], + "im.vector.fake.direct": [], + "m.lowpriority": [], + "im.vector.fake.archived": [], + }, + ready: false, + }; + } + + _setState(newState) { + this._state = Object.assign(this._state, newState); + this.__emitChange(); + } + + __onDispatch(payload) { + switch (payload.action) { + // Initialise state after initial sync + case 'MatrixActions.sync': { + if (!(payload.prevState !== 'PREPARED' && payload.state === 'PREPARED')) { + break; + } + + this._matrixClient = payload.matrixClient; + this._generateRoomLists(); + } + break; + case 'MatrixActions.Room.tags': { + if (!this._state.ready) break; + this._generateRoomLists(); + } + break; + case 'MatrixActions.Room.timeline': { + if (!this._state.ready || + !payload.isLiveEvent || + !payload.isLiveUnfilteredRoomTimelineEvent || + !this._eventTriggersRecentReorder(payload.event) + ) break; + this._generateRoomLists(); + } + break; + // When an event is decrypted, it could mean we need to reorder the room + // list because we now know the type of the event. + case 'MatrixActions.Event.decrypted': { + // We may not have synced or done an initial generation of the lists + if (!this._matrixClient || !this._state.ready) break; + + const roomId = payload.event.getRoomId(); + + // We may have decrypted an event without a roomId (e.g to_device) + if (!roomId) break; + + const room = this._matrixClient.getRoom(roomId); + + // We somehow decrypted an event for a room our client is unaware of + if (!room) break; + + const liveTimeline = room.getLiveTimeline(); + const eventTimeline = room.getTimelineForEvent(payload.event.getId()); + + // Either this event was not added to the live timeline (e.g. pagination) + // or it doesn't affect the ordering of the room list. + if (liveTimeline !== eventTimeline || + !this._eventTriggersRecentReorder(payload.event) + ) break; + this._generateRoomLists(); + } + break; + case 'MatrixActions.accountData': { + if (payload.event_type !== 'm.direct') break; + this._generateRoomLists(); + } + break; + case 'MatrixActions.RoomMember.membership': { + if (!this._matrixClient || payload.member.userId !== this._matrixClient.credentials.userId) break; + this._generateRoomLists(); + } + break; + // This could be a new room that we've been invited to, joined or created + // we won't get a RoomMember.membership for these cases if we're not already + // a member. + case 'MatrixActions.Room': { + if (!this._state.ready || !this._matrixClient.credentials.userId) break; + this._generateRoomLists(); + } + break; + case 'RoomListActions.tagRoom.pending': { + // XXX: we only show one optimistic update at any one time. + // Ideally we should be making a list of in-flight requests + // that are backed by transaction IDs. Until the js-sdk + // supports this, we're stuck with only being able to use + // the most recent optimistic update. + this._generateRoomLists(payload.request); + } + break; + case 'RoomListActions.tagRoom.failure': { + // Reset state according to js-sdk + this._generateRoomLists(); + } + break; + case 'on_logged_out': { + // Reset state without pushing an update to the view, which generally assumes that + // the matrix client isn't `null` and so causing a re-render will cause NPEs. + this._init(); + this._matrixClient = null; + } + break; + } + } + + _generateRoomLists(optimisticRequest) { + const lists = { + "im.vector.fake.invite": [], + "m.favourite": [], + "im.vector.fake.recent": [], + "im.vector.fake.direct": [], + "m.lowpriority": [], + "im.vector.fake.archived": [], + }; + + + const dmRoomMap = DMRoomMap.shared(); + + // If somehow we dispatched a RoomListActions.tagRoom.failure before a MatrixActions.sync + if (!this._matrixClient) return; + + this._matrixClient.getRooms().forEach((room, index) => { + const me = room.getMember(this._matrixClient.credentials.userId); + if (!me) return; + + if (me.membership == "invite") { + lists["im.vector.fake.invite"].push(room); + } else if (me.membership == "join" || me.membership === "ban" || + (me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey())) { + // Used to split rooms via tags + let tagNames = Object.keys(room.tags); + + if (optimisticRequest && optimisticRequest.room === room) { + // Remove old tag + tagNames = tagNames.filter((tagName) => tagName !== optimisticRequest.oldTag); + // Add new tag + if (optimisticRequest.newTag && + !tagNames.includes(optimisticRequest.newTag) + ) { + tagNames.push(optimisticRequest.newTag); + } + } + + if (tagNames.length) { + for (let i = 0; i < tagNames.length; i++) { + const tagName = tagNames[i]; + lists[tagName] = lists[tagName] || []; + lists[tagName].push(room); + } + } else if (dmRoomMap.getUserIdForRoomId(room.roomId)) { + // "Direct Message" rooms (that we're still in and that aren't otherwise tagged) + lists["im.vector.fake.direct"].push(room); + } else { + lists["im.vector.fake.recent"].push(room); + } + } else if (me.membership === "leave") { + lists["im.vector.fake.archived"].push(room); + } else { + console.error("unrecognised membership: " + me.membership + " - this should never happen"); + } + }); + + Object.keys(lists).forEach((listKey) => { + let comparator; + switch (RoomListStore._listOrders[listKey]) { + case "recent": + comparator = this._recentsComparator; + break; + case "manual": + default: + comparator = this._getManualComparator(listKey, optimisticRequest); + break; + } + lists[listKey].sort(comparator); + }); + + this._setState({ + lists, + ready: true, // Ready to receive updates via Room.tags events + }); + } + + _eventTriggersRecentReorder(ev) { + return ev.getTs() && ( + Unread.eventTriggersUnreadCount(ev) || + ev.getSender() === this._matrixClient.credentials.userId + ); + } + + _tsOfNewestEvent(room) { + for (let i = room.timeline.length - 1; i >= 0; --i) { + const ev = room.timeline[i]; + if (this._eventTriggersRecentReorder(ev)) { + return ev.getTs(); + } + } + + // we might only have events that don't trigger the unread indicator, + // in which case use the oldest event even if normally it wouldn't count. + // This is better than just assuming the last event was forever ago. + if (room.timeline.length && room.timeline[0].getTs()) { + return room.timeline[0].getTs(); + } else { + return Number.MAX_SAFE_INTEGER; + } + } + + _recentsComparator(roomA, roomB) { + // XXX: We could use a cache here and update it when we see new + // events that trigger a reorder + return this._tsOfNewestEvent(roomB) - this._tsOfNewestEvent(roomA); + } + + _lexicographicalComparator(roomA, roomB) { + return roomA.name > roomB.name ? 1 : -1; + } + + _getManualComparator(tagName, optimisticRequest) { + return (roomA, roomB) => { + let metaA = roomA.tags[tagName]; + let metaB = roomB.tags[tagName]; + + if (optimisticRequest && roomA === optimisticRequest.room) metaA = optimisticRequest.metaData; + if (optimisticRequest && roomB === optimisticRequest.room) metaB = optimisticRequest.metaData; + + // Make sure the room tag has an order element, if not set it to be the bottom + const a = metaA.order; + const b = metaB.order; + + // Order undefined room tag orders to the bottom + if (a === undefined && b !== undefined) { + return 1; + } else if (a !== undefined && b === undefined) { + return -1; + } + + return a == b ? this._lexicographicalComparator(roomA, roomB) : ( a > b ? 1 : -1); + }; + } + + getRoomLists() { + return this._state.lists; + } +} + +if (global.singletonRoomListStore === undefined) { + global.singletonRoomListStore = new RoomListStore(); +} +export default global.singletonRoomListStore; diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js index cf895d2190..1e7e50eae0 100644 --- a/src/stores/RoomViewStore.js +++ b/src/stores/RoomViewStore.js @@ -111,10 +111,11 @@ class RoomViewStore extends Store { forwardingEvent: payload.event, }); break; - case 'quote_event': + case 'reply_to_event': this._setState({ - quotingEvent: payload.event, + replyingToEvent: payload.event, }); + break; } } @@ -132,6 +133,8 @@ class RoomViewStore extends Store { shouldPeek: payload.should_peek === undefined ? true : payload.should_peek, // have we sent a join request for this room and are waiting for a response? joining: payload.joining || false, + // Reset replyingToEvent because we don't want cross-room because bad UX + replyingToEvent: null, }; if (this._state.forwardingEvent) { @@ -295,7 +298,7 @@ class RoomViewStore extends Store { // The mxEvent if one is currently being replied to/quoted getQuotingEvent() { - return this._state.quotingEvent; + return this._state.replyingToEvent; } shouldPeek() { diff --git a/src/stores/TagOrderStore.js b/src/stores/TagOrderStore.js index 9c9427284e..eef078d8da 100644 --- a/src/stores/TagOrderStore.js +++ b/src/stores/TagOrderStore.js @@ -48,13 +48,14 @@ class TagOrderStore extends Store { switch (payload.action) { // Initialise state after initial sync case 'MatrixActions.sync': { - if (!(payload.prevState === 'PREPARED' && payload.state === 'SYNCING')) { + if (!(payload.prevState !== 'PREPARED' && payload.state === 'PREPARED')) { break; } const tagOrderingEvent = payload.matrixClient.getAccountData('im.vector.web.tag_ordering'); const tagOrderingEventContent = tagOrderingEvent ? tagOrderingEvent.getContent() : {}; this._setState({ orderedTagsAccountData: tagOrderingEventContent.tags || null, + removedTagsAccountData: tagOrderingEventContent.removedTags || null, hasSynced: true, }); this._updateOrderedTags(); @@ -63,8 +64,14 @@ class TagOrderStore extends Store { // Get ordering from account data case 'MatrixActions.accountData': { if (payload.event_type !== 'im.vector.web.tag_ordering') break; + + // Ignore remote echos caused by this store so as to avoid setting + // state back to old state. + if (payload.event_content._storeId === this.getStoreId()) break; + this._setState({ orderedTagsAccountData: payload.event_content ? payload.event_content.tags : null, + removedTagsAccountData: payload.event_content ? payload.event_content.removedTags : null, }); this._updateOrderedTags(); break; @@ -78,24 +85,20 @@ class TagOrderStore extends Store { this._updateOrderedTags(); break; } - // Puts payload.tag at payload.targetTag, placing the targetTag before or after the tag - case 'order_tag': { - if (!this._state.orderedTags || - !payload.tag || - !payload.targetTag || - payload.tag === payload.targetTag - ) return; - - const tags = this._state.orderedTags; - - let orderedTags = tags.filter((t) => t !== payload.tag); - const newIndex = orderedTags.indexOf(payload.targetTag) + (payload.after ? 1 : 0); - orderedTags = [ - ...orderedTags.slice(0, newIndex), - payload.tag, - ...orderedTags.slice(newIndex), - ]; - this._setState({orderedTags}); + case 'TagOrderActions.moveTag.pending': { + // Optimistic update of a moved tag + this._setState({ + orderedTags: payload.request.tags, + removedTagsAccountData: payload.request.removedTags, + }); + break; + } + case 'TagOrderActions.removeTag.pending': { + // Optimistic update of a removed tag + this._setState({ + removedTagsAccountData: payload.request.removedTags, + }); + this._updateOrderedTags(); break; } case 'select_tag': { @@ -173,13 +176,15 @@ class TagOrderStore extends Store { _mergeGroupsAndTags() { const groupIds = this._state.joinedGroupIds || []; const tags = this._state.orderedTagsAccountData || []; + const removedTags = new Set(this._state.removedTagsAccountData || []); + const tagsToKeep = tags.filter( - (t) => t[0] !== '+' || groupIds.includes(t), + (t) => (t[0] !== '+' || groupIds.includes(t)) && !removedTags.has(t), ); const groupIdsToAdd = groupIds.filter( - (groupId) => !tags.includes(groupId), + (groupId) => !tags.includes(groupId) && !removedTags.has(groupId), ); return tagsToKeep.concat(groupIdsToAdd); @@ -189,6 +194,17 @@ class TagOrderStore extends Store { return this._state.orderedTags; } + getRemovedTagsAccountData() { + return this._state.removedTagsAccountData; + } + + getStoreId() { + // Generate a random ID to prevent this store from clobbering its + // state with redundant remote echos. + if (!this._id) this._id = Math.random().toString(16).slice(2, 10); + return this._id; + } + getSelectedTags() { return this._state.selectedTags; } diff --git a/src/utils/DecryptFile.js b/src/utils/DecryptFile.js index cb5e407407..92c2e3644d 100644 --- a/src/utils/DecryptFile.js +++ b/src/utils/DecryptFile.js @@ -1,5 +1,6 @@ /* Copyright 2016 OpenMarket Ltd +Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -22,25 +23,62 @@ import 'isomorphic-fetch'; import MatrixClientPeg from '../MatrixClientPeg'; import Promise from 'bluebird'; +// WARNING: We have to be very careful about what mime-types we allow into blobs, +// as for performance reasons these are now rendered via URL.createObjectURL() +// rather than by converting into data: URIs. +// +// This means that the content is rendered using the origin of the script which +// called createObjectURL(), and so if the content contains any scripting then it +// will pose a XSS vulnerability when the browser renders it. This is particularly +// bad if the user right-clicks the URI and pastes it into a new window or tab, +// as the blob will then execute with access to Riot's full JS environment(!) +// +// See https://github.com/matrix-org/matrix-react-sdk/pull/1820#issuecomment-385210647 +// for details. +// +// We mitigate this by only allowing mime-types into blobs which we know don't +// contain any scripting, and instantiate all others as application/octet-stream +// regardless of what mime-type the event claimed. Even if the payload itself +// is some malicious HTML, the fact we instantiate it with a media mimetype or +// application/octet-stream means the browser doesn't try to render it as such. +// +// One interesting edge case is image/svg+xml, which empirically *is* rendered +// correctly if the blob is set to the src attribute of an img tag (for thumbnails) +// *even if the mimetype is application/octet-stream*. However, empirically JS +// in the SVG isn't executed in this scenario, so we seem to be okay. +// +// Tested on Chrome 65 and Firefox 60 +// +// The list below is taken mainly from +// https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats +// N.B. Matrix doesn't currently specify which mimetypes are valid in given +// events, so we pick the ones which HTML5 browsers should be able to display +// +// For the record, mime-types which must NEVER enter this list below include: +// text/html, text/xhtml, image/svg, image/svg+xml, image/pdf, and similar. -/** - * Read blob as a data:// URI. - * @return {Promise} A promise that resolves with the data:// URI. - */ -export function readBlobAsDataUri(file) { - const deferred = Promise.defer(); - const reader = new FileReader(); - reader.onload = function(e) { - deferred.resolve(e.target.result); - }; - reader.onerror = function(e) { - deferred.reject(e); - }; - reader.readAsDataURL(file); - return deferred.promise; +const ALLOWED_BLOB_MIMETYPES = { + 'image/jpeg': true, + 'image/gif': true, + 'image/png': true, + + 'video/mp4': true, + 'video/webm': true, + 'video/ogg': true, + + 'audio/mp4': true, + 'audio/webm': true, + 'audio/aac': true, + 'audio/mpeg': true, + 'audio/ogg': true, + 'audio/wave': true, + 'audio/wav': true, + 'audio/x-wav': true, + 'audio/x-pn-wav': true, + 'audio/flac': true, + 'audio/x-flac': true, } - /** * Decrypt a file attached to a matrix event. * @param file {Object} The json taken from the matrix event. @@ -61,7 +99,17 @@ export function decryptFile(file) { return encrypt.decryptAttachment(responseData, file); }).then(function(dataArray) { // Turn the array into a Blob and give it the correct MIME-type. - const blob = new Blob([dataArray], {type: file.mimetype}); + + // IMPORTANT: we must not allow scriptable mime-types into Blobs otherwise + // they introduce XSS attacks if the Blob URI is viewed directly in the + // browser (e.g. by copying the URI into a new tab or window.) + // See warning at top of file. + let mimetype = file.mimetype ? file.mimetype.split(";")[0].trim() : ''; + if (!ALLOWED_BLOB_MIMETYPES[mimetype]) { + mimetype = 'application/octet-stream'; + } + + const blob = new Blob([dataArray], {type: mimetype}); return blob; }); } 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/src/utils/MultiInviter.js b/src/utils/MultiInviter.js index a0f33f5c39..b3e7fc495a 100644 --- a/src/utils/MultiInviter.js +++ b/src/utils/MultiInviter.js @@ -18,7 +18,7 @@ limitations under the License. import MatrixClientPeg from '../MatrixClientPeg'; import {getAddressType} from '../UserAddress'; import {inviteToRoom} from '../RoomInvite'; -import GroupStoreCache from '../stores/GroupStoreCache'; +import GroupStore from '../stores/GroupStore'; import Promise from 'bluebird'; /** @@ -118,9 +118,7 @@ export default class MultiInviter { let doInvite; if (this.groupId !== null) { - doInvite = GroupStoreCache - .getGroupStore(this.groupId) - .inviteUserToGroup(addr); + doInvite = GroupStore.inviteUserToGroup(this.groupId, addr); } else { doInvite = inviteToRoom(this.roomId, addr); } diff --git a/src/utils/widgets.js b/src/utils/widgets.js new file mode 100644 index 0000000000..338df184e2 --- /dev/null +++ b/src/utils/widgets.js @@ -0,0 +1,90 @@ +import MatrixClientPeg from '../MatrixClientPeg'; + +/** + * Get all widgets (user and room) for the current user + * @param {object} room The room to get widgets for + * @return {[object]} Array containing current / active room and user widget state events + */ +function getWidgets(room) { + const widgets = getRoomWidgets(room); + widgets.concat(getUserWidgetsArray()); + return widgets; +} + +/** + * Get room specific widgets + * @param {object} room The room to get widgets force + * @return {[object]} Array containing current / active room widgets + */ +function getRoomWidgets(room) { + const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); + if (!appsStateEvents) { + return []; + } + + return appsStateEvents.filter((ev) => { + return ev.getContent().type && ev.getContent().url; + }); +} + +/** + * Get user specific widgets (not linked to a specific room) + * @return {object} Event content object containing current / active user widgets + */ +function getUserWidgets() { + const client = MatrixClientPeg.get(); + if (!client) { + throw new Error('User not logged in'); + } + const userWidgets = client.getAccountData('m.widgets'); + let userWidgetContent = {}; + if (userWidgets && userWidgets.getContent()) { + userWidgetContent = userWidgets.getContent(); + } + return userWidgetContent; +} + +/** + * Get user specific widgets (not linked to a specific room) as an array + * @return {[object]} Array containing current / active user widgets + */ +function getUserWidgetsArray() { + return Object.values(getUserWidgets()); +} + +/** + * Get active stickerpicker widgets (stickerpickers are user widgets by nature) + * @return {[object]} Array containing current / active stickerpicker widgets + */ +function getStickerpickerWidgets() { + const widgets = getUserWidgetsArray(); + return widgets.filter((widget) => widget.content && widget.content.type === "m.stickerpicker"); +} + +/** + * Remove all stickerpicker widgets (stickerpickers are user widgets by nature) + * @return {Promise} Resolves on account data updated + */ +function removeStickerpickerWidgets() { + const client = MatrixClientPeg.get(); + if (!client) { + throw new Error('User not logged in'); + } + const userWidgets = client.getAccountData('m.widgets').getContent() || {}; + Object.entries(userWidgets).forEach(([key, widget]) => { + if (widget.content && widget.content.type === 'm.stickerpicker') { + delete userWidgets[key]; + } + }); + return client.setAccountData('m.widgets', userWidgets); +} + + +export default { + getWidgets, + getRoomWidgets, + getUserWidgets, + getUserWidgetsArray, + getStickerpickerWidgets, + removeStickerpickerWidgets, +}; diff --git a/test/components/structures/GroupView-test.js b/test/components/structures/GroupView-test.js new file mode 100644 index 0000000000..3b3510f26e --- /dev/null +++ b/test/components/structures/GroupView-test.js @@ -0,0 +1,358 @@ +/* +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 ReactDOM from 'react-dom'; +import ReactTestUtils from 'react-dom/test-utils'; +import expect from 'expect'; + +import MockHttpBackend from 'matrix-mock-request'; +import MatrixClientPeg from '../../../src/MatrixClientPeg'; +import sdk from 'matrix-react-sdk'; +import Matrix from 'matrix-js-sdk'; + +import * as TestUtils from 'test-utils'; +const { waitForUpdate } = TestUtils; + +const GroupView = sdk.getComponent('structures.GroupView'); +const WrappedGroupView = TestUtils.wrapInMatrixClientContext(GroupView); + +const Spinner = sdk.getComponent('elements.Spinner'); + +describe('GroupView', function() { + let root; + let rootElement; + let httpBackend; + let summaryResponse; + let summaryResponseWithComplicatedLongDesc; + let summaryResponseWithNoLongDesc; + let summaryResponseWithBadImg; + let groupId; + let groupIdEncoded; + + // Summary response fields + const user = { + is_privileged: true, // can edit the group + is_public: true, // appear as a member to non-members + is_publicised: true, // display flair + }; + const usersSection = { + roles: {}, + total_user_count_estimate: 0, + users: [], + }; + const roomsSection = { + categories: {}, + rooms: [], + total_room_count_estimate: 0, + }; + + beforeEach(function() { + TestUtils.beforeEach(this); + + httpBackend = new MockHttpBackend(); + + Matrix.request(httpBackend.requestFn); + + MatrixClientPeg.get = () => Matrix.createClient({ + baseUrl: 'https://my.home.server', + userId: '@me:here', + accessToken: '123456789', + }); + + summaryResponse = { + profile: { + avatar_url: "mxc://someavatarurl", + is_openly_joinable: true, + is_public: true, + long_description: "This is a LONG description.", + name: "The name of a community", + short_description: "This is a community", + }, + user, + users_section: usersSection, + rooms_section: roomsSection, + }; + summaryResponseWithNoLongDesc = { + profile: { + avatar_url: "mxc://someavatarurl", + is_openly_joinable: true, + is_public: true, + long_description: null, + name: "The name of a community", + short_description: "This is a community", + }, + user, + users_section: usersSection, + rooms_section: roomsSection, + }; + summaryResponseWithComplicatedLongDesc = { + profile: { + avatar_url: "mxc://someavatarurl", + is_openly_joinable: true, + is_public: true, + long_description: ` +

    This is a more complicated group page

    +

    With paragraphs

    +
      +
    • And lists!
    • +
    • With list items.
    • +
    +

    And also images:

    `, + name: "The name of a community", + short_description: "This is a community", + }, + user, + users_section: usersSection, + rooms_section: roomsSection, + }; + + summaryResponseWithBadImg = { + profile: { + avatar_url: "mxc://someavatarurl", + is_openly_joinable: true, + is_public: true, + long_description: '

    Evil image:

    ', + name: "The name of a community", + short_description: "This is a community", + }, + user, + users_section: usersSection, + rooms_section: roomsSection, + }; + + groupId = "+" + Math.random().toString(16).slice(2) + ':domain'; + groupIdEncoded = encodeURIComponent(groupId); + + rootElement = document.createElement('div'); + root = ReactDOM.render(, rootElement); + }); + + afterEach(function() { + ReactDOM.unmountComponentAtNode(rootElement); + }); + + it('should show a spinner when first displayed', function() { + ReactTestUtils.findRenderedComponentWithType(root, Spinner); + + // If we don't respond here, the rate limiting done to ensure a maximum of + // 3 concurrent network requests for GroupStore will block subsequent requests + // in other tests. + // + // This is a good case for doing the rate limiting somewhere other than the module + // scope of GroupStore.js + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/summary').respond(200, summaryResponse); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/invited_users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/rooms').respond(200, { chunk: [] }); + + return httpBackend.flush(undefined, undefined, 0); + }); + + it('should indicate failure after failed /summary', function() { + const groupView = ReactTestUtils.findRenderedComponentWithType(root, GroupView); + const prom = waitForUpdate(groupView).then(() => { + ReactTestUtils.findRenderedDOMComponentWithClass(root, 'mx_GroupView_error'); + }); + + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/summary').respond(500, {}); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/invited_users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/rooms').respond(200, { chunk: [] }); + + httpBackend.flush(undefined, undefined, 0); + return prom; + }); + + it('should show a group avatar, name, id and short description after successful /summary', function() { + const groupView = ReactTestUtils.findRenderedComponentWithType(root, GroupView); + const prom = waitForUpdate(groupView).then(() => { + ReactTestUtils.findRenderedDOMComponentWithClass(root, 'mx_GroupView'); + + const avatar = ReactTestUtils.findRenderedComponentWithType(root, sdk.getComponent('avatars.GroupAvatar')); + const img = ReactTestUtils.findRenderedDOMComponentWithTag(avatar, 'img'); + const avatarImgElement = ReactDOM.findDOMNode(img); + expect(avatarImgElement).toExist(); + expect(avatarImgElement.src).toInclude( + 'https://my.home.server/_matrix/media/v1/thumbnail/' + + 'someavatarurl?width=48&height=48&method=crop', + ); + + const name = ReactTestUtils.findRenderedDOMComponentWithClass(root, 'mx_GroupView_header_name'); + const nameElement = ReactDOM.findDOMNode(name); + expect(nameElement).toExist(); + expect(nameElement.innerText).toInclude('The name of a community'); + expect(nameElement.innerText).toInclude(groupId); + + const shortDesc = ReactTestUtils.findRenderedDOMComponentWithClass(root, 'mx_GroupView_header_shortDesc'); + const shortDescElement = ReactDOM.findDOMNode(shortDesc); + expect(shortDescElement).toExist(); + expect(shortDescElement.innerText).toBe('This is a community'); + }); + + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/summary').respond(200, summaryResponse); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/invited_users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/rooms').respond(200, { chunk: [] }); + + httpBackend.flush(undefined, undefined, 0); + return prom; + }); + + it('should show a simple long description after successful /summary', function() { + const groupView = ReactTestUtils.findRenderedComponentWithType(root, GroupView); + const prom = waitForUpdate(groupView).then(() => { + ReactTestUtils.findRenderedDOMComponentWithClass(root, 'mx_GroupView'); + + const longDesc = ReactTestUtils.findRenderedDOMComponentWithClass(root, 'mx_GroupView_groupDesc'); + const longDescElement = ReactDOM.findDOMNode(longDesc); + expect(longDescElement).toExist(); + expect(longDescElement.innerText).toBe('This is a LONG description.'); + expect(longDescElement.innerHTML).toBe('
    This is a LONG description.
    '); + }); + + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/summary').respond(200, summaryResponse); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/invited_users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/rooms').respond(200, { chunk: [] }); + + httpBackend.flush(undefined, undefined, 0); + return prom; + }); + + it('should show a placeholder if a long description is not set', function() { + const groupView = ReactTestUtils.findRenderedComponentWithType(root, GroupView); + const prom = waitForUpdate(groupView).then(() => { + const placeholder = ReactTestUtils + .findRenderedDOMComponentWithClass(root, 'mx_GroupView_groupDesc_placeholder'); + const placeholderElement = ReactDOM.findDOMNode(placeholder); + expect(placeholderElement).toExist(); + }); + + httpBackend + .when('GET', '/groups/' + groupIdEncoded + '/summary') + .respond(200, summaryResponseWithNoLongDesc); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/invited_users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/rooms').respond(200, { chunk: [] }); + + httpBackend.flush(undefined, undefined, 0); + return prom; + }); + + it('should show a complicated long description after successful /summary', function() { + const groupView = ReactTestUtils.findRenderedComponentWithType(root, GroupView); + const prom = waitForUpdate(groupView).then(() => { + const longDesc = ReactTestUtils.findRenderedDOMComponentWithClass(root, 'mx_GroupView_groupDesc'); + const longDescElement = ReactDOM.findDOMNode(longDesc); + expect(longDescElement).toExist(); + + expect(longDescElement.innerHTML).toInclude('

    This is a more complicated group page

    '); + expect(longDescElement.innerHTML).toInclude('

    With paragraphs

    '); + expect(longDescElement.innerHTML).toInclude('
      '); + expect(longDescElement.innerHTML).toInclude('
    • And lists!
    • '); + + const imgSrc = "https://my.home.server/_matrix/media/v1/thumbnail/someimageurl?width=800&height=600"; + expect(longDescElement.innerHTML).toInclude(''); + }); + + httpBackend + .when('GET', '/groups/' + groupIdEncoded + '/summary') + .respond(200, summaryResponseWithComplicatedLongDesc); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/invited_users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/rooms').respond(200, { chunk: [] }); + + httpBackend.flush(undefined, undefined, 0); + return prom; + }); + + it('should disallow images with non-mxc URLs', function() { + const groupView = ReactTestUtils.findRenderedComponentWithType(root, GroupView); + const prom = waitForUpdate(groupView).then(() => { + const longDesc = ReactTestUtils.findRenderedDOMComponentWithClass(root, 'mx_GroupView_groupDesc'); + const longDescElement = ReactDOM.findDOMNode(longDesc); + expect(longDescElement).toExist(); + + // If this fails, the URL could be in an img `src`, which is what we care about but + // there's no harm in keeping this simple and checking the entire HTML string. + expect(longDescElement.innerHTML).toExclude('evilimageurl'); + }); + + httpBackend + .when('GET', '/groups/' + groupIdEncoded + '/summary') + .respond(200, summaryResponseWithBadImg); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/invited_users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/rooms').respond(200, { chunk: [] }); + + httpBackend.flush(undefined, undefined, 0); + return prom; + }); + + it('should show a RoomDetailList after a successful /summary & /rooms (no rooms returned)', function() { + const groupView = ReactTestUtils.findRenderedComponentWithType(root, GroupView); + const prom = waitForUpdate(groupView).then(() => { + const roomDetailList = ReactTestUtils.findRenderedDOMComponentWithClass(root, 'mx_RoomDetailList'); + const roomDetailListElement = ReactDOM.findDOMNode(roomDetailList); + expect(roomDetailListElement).toExist(); + }); + + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/summary').respond(200, summaryResponse); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/invited_users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/rooms').respond(200, { chunk: [] }); + + httpBackend.flush(undefined, undefined, 0); + return prom; + }); + + it('should show a RoomDetailList after a successful /summary & /rooms (with a single room)', function() { + const groupView = ReactTestUtils.findRenderedComponentWithType(root, GroupView); + const prom = waitForUpdate(groupView).then(() => { + const roomDetailList = ReactTestUtils.findRenderedDOMComponentWithClass(root, 'mx_RoomDetailList'); + const roomDetailListElement = ReactDOM.findDOMNode(roomDetailList); + expect(roomDetailListElement).toExist(); + + const roomDetailListRoomName = ReactTestUtils.findRenderedDOMComponentWithClass( + root, + 'mx_RoomDirectory_name', + ); + const roomDetailListRoomNameElement = ReactDOM.findDOMNode(roomDetailListRoomName); + + expect(roomDetailListRoomNameElement).toExist(); + expect(roomDetailListRoomNameElement.innerText).toEqual('Some room name'); + }); + + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/summary').respond(200, summaryResponse); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/invited_users').respond(200, { chunk: [] }); + httpBackend.when('GET', '/groups/' + groupIdEncoded + '/rooms').respond(200, { chunk: [{ + avatar_url: "mxc://someroomavatarurl", + canonical_alias: "#somealias:domain", + guest_can_join: true, + is_public: true, + name: "Some room name", + num_joined_members: 123, + room_id: "!someroomid", + topic: "some topic", + world_readable: true, + }] }); + + httpBackend.flush(undefined, undefined, 0); + return prom; + }); +}); diff --git a/test/components/views/elements/MemberEventListSummary-test.js b/test/components/views/elements/MemberEventListSummary-test.js index 436133c717..b593923ef9 100644 --- a/test/components/views/elements/MemberEventListSummary-test.js +++ b/test/components/views/elements/MemberEventListSummary-test.js @@ -1,12 +1,15 @@ -const expect = require('expect'); -const React = require('react'); -const ReactDOM = require("react-dom"); -const ReactTestUtils = require('react-addons-test-utils'); -const sdk = require('matrix-react-sdk'); -const MemberEventListSummary = sdk.getComponent('views.elements.MemberEventListSummary'); +import expect from 'expect'; +import React from 'react'; +import ReactTestUtils from 'react-addons-test-utils'; +import sdk from 'matrix-react-sdk'; import * as languageHandler from '../../../../src/languageHandler'; +import * as testUtils from '../../../test-utils'; + +// Give MELS a matrixClient in its child context +const MemberEventListSummary = testUtils.wrapInMatrixClientContext( + sdk.getComponent('views.elements.MemberEventListSummary'), +); -const testUtils = require('../../../test-utils'); describe('MemberEventListSummary', function() { let sandbox; @@ -113,7 +116,6 @@ describe('MemberEventListSummary', function() { renderer.render(); const result = renderer.getRenderOutput(); - expect(result.type).toBe('div'); expect(result.props.children).toEqual([
      Expanded membership
      , ]); @@ -136,7 +138,6 @@ describe('MemberEventListSummary', function() { renderer.render(); const result = renderer.getRenderOutput(); - expect(result.type).toBe('div'); expect(result.props.children).toEqual([
      Expanded membership
      ,
      Expanded membership
      , diff --git a/test/components/views/rooms/MessageComposerInput-test.js b/test/components/views/rooms/MessageComposerInput-test.js index 1f0ede6ae2..eadd923726 100644 --- a/test/components/views/rooms/MessageComposerInput-test.js +++ b/test/components/views/rooms/MessageComposerInput-test.js @@ -75,39 +75,37 @@ describe('MessageComposerInput', () => { }); it('should not send messages when composer is empty', () => { - const textSpy = sinon.spy(client, 'sendTextMessage'); - const htmlSpy = sinon.spy(client, 'sendHtmlMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(true); mci.handleReturn(sinon.stub()); - expect(textSpy.calledOnce).toEqual(false, 'should not send text message'); - expect(htmlSpy.calledOnce).toEqual(false, 'should not send html message'); + expect(spy.calledOnce).toEqual(false, 'should not send message'); }); it('should not change content unnecessarily on RTE -> Markdown conversion', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(true); addTextToDraft('a'); mci.handleKeyCommand('toggle-mode'); mci.handleReturn(sinon.stub()); expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1]).toEqual('a'); + expect(spy.args[0][1].body).toEqual('a'); }); it('should not change content unnecessarily on Markdown -> RTE conversion', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('a'); mci.handleKeyCommand('toggle-mode'); mci.handleReturn(sinon.stub()); expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1]).toEqual('a'); + expect(spy.args[0][1].body).toEqual('a'); }); it('should send emoji messages when rich text is enabled', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(true); addTextToDraft('☹'); mci.handleReturn(sinon.stub()); @@ -116,7 +114,7 @@ describe('MessageComposerInput', () => { }); it('should send emoji messages when Markdown is enabled', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('☹'); mci.handleReturn(sinon.stub()); @@ -149,98 +147,98 @@ describe('MessageComposerInput', () => { // }); it('should insert formatting characters in Markdown mode', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); mci.handleKeyCommand('italic'); mci.handleReturn(sinon.stub()); - expect(['__', '**']).toContain(spy.args[0][1]); + expect(['__', '**']).toContain(spy.args[0][1].body); }); it('should not entity-encode " in Markdown mode', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('"'); mci.handleReturn(sinon.stub()); expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1]).toEqual('"'); + expect(spy.args[0][1].body).toEqual('"'); }); it('should escape characters without other markup in Markdown mode', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('\\*escaped\\*'); mci.handleReturn(sinon.stub()); expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1]).toEqual('*escaped*'); + expect(spy.args[0][1].body).toEqual('*escaped*'); }); it('should escape characters with other markup in Markdown mode', () => { - const spy = sinon.spy(client, 'sendHtmlMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('\\*escaped\\* *italic*'); mci.handleReturn(sinon.stub()); expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1]).toEqual('\\*escaped\\* *italic*'); - expect(spy.args[0][2]).toEqual('*escaped* italic'); + expect(spy.args[0][1].body).toEqual('\\*escaped\\* *italic*'); + expect(spy.args[0][1].formatted_body).toEqual('*escaped* italic'); }); it('should not convert -_- into a horizontal rule in Markdown mode', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('-_-'); mci.handleReturn(sinon.stub()); expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1]).toEqual('-_-'); + expect(spy.args[0][1].body).toEqual('-_-'); }); it('should not strip tags in Markdown mode', () => { - const spy = sinon.spy(client, 'sendHtmlMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('striked-out'); mci.handleReturn(sinon.stub()); expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1]).toEqual('striked-out'); - expect(spy.args[0][2]).toEqual('striked-out'); + expect(spy.args[0][1].body).toEqual('striked-out'); + expect(spy.args[0][1].formatted_body).toEqual('striked-out'); }); it('should not strike-through ~~~ in Markdown mode', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('~~~striked-out~~~'); mci.handleReturn(sinon.stub()); expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1]).toEqual('~~~striked-out~~~'); + expect(spy.args[0][1].body).toEqual('~~~striked-out~~~'); }); it('should not mark single unmarkedup paragraphs as HTML in Markdown mode', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('Lorem ipsum dolor sit amet, consectetur adipiscing elit.'); mci.handleReturn(sinon.stub()); expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1]).toEqual('Lorem ipsum dolor sit amet, consectetur adipiscing elit.'); + expect(spy.args[0][1].body).toEqual('Lorem ipsum dolor sit amet, consectetur adipiscing elit.'); }); it('should not mark two unmarkedup paragraphs as HTML in Markdown mode', () => { - const spy = sinon.spy(client, 'sendTextMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\nFusce congue sapien sed neque molestie volutpat.'); mci.handleReturn(sinon.stub()); expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1]).toEqual('Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\nFusce congue sapien sed neque molestie volutpat.'); + expect(spy.args[0][1].body).toEqual('Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\nFusce congue sapien sed neque molestie volutpat.'); }); it('should strip tab-completed mentions so that only the display name is sent in the plain body in Markdown mode', () => { // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendHtmlMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(false); mci.setDisplayedCompletion({ completion: 'Some Member', @@ -250,11 +248,11 @@ describe('MessageComposerInput', () => { mci.handleReturn(sinon.stub()); - expect(spy.args[0][1]).toEqual( + expect(spy.args[0][1].body).toEqual( 'Some Member', 'the plaintext body should only include the display name', ); - expect(spy.args[0][2]).toEqual( + expect(spy.args[0][1].formatted_body).toEqual( 'Some Member', 'the html body should contain an anchor tag with a matrix.to href and display name text', ); @@ -262,7 +260,7 @@ describe('MessageComposerInput', () => { it('should strip tab-completed mentions so that only the display name is sent in the plain body in RTE mode', () => { // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendHtmlMessage'); + const spy = sinon.spy(client, 'sendMessage'); mci.enableRichtext(true); mci.setDisplayedCompletion({ completion: 'Some Member', @@ -272,33 +270,33 @@ describe('MessageComposerInput', () => { mci.handleReturn(sinon.stub()); - expect(spy.args[0][1]).toEqual('Some Member'); - expect(spy.args[0][2]).toEqual('Some Member'); + expect(spy.args[0][1].body).toEqual('Some Member'); + expect(spy.args[0][1].formatted_body).toEqual('Some Member'); }); it('should not strip non-tab-completed mentions when manually typing MD', () => { // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendHtmlMessage'); + const spy = sinon.spy(client, 'sendMessage'); // Markdown mode enabled mci.enableRichtext(false); addTextToDraft('[My Not-Tab-Completed Mention](https://matrix.to/#/@some_member:domain.bla)'); mci.handleReturn(sinon.stub()); - expect(spy.args[0][1]).toEqual('[My Not-Tab-Completed Mention](https://matrix.to/#/@some_member:domain.bla)'); - expect(spy.args[0][2]).toEqual('My Not-Tab-Completed Mention'); + expect(spy.args[0][1].body).toEqual('[My Not-Tab-Completed Mention](https://matrix.to/#/@some_member:domain.bla)'); + expect(spy.args[0][1].formatted_body).toEqual('My Not-Tab-Completed Mention'); }); it('should not strip arbitrary typed (i.e. not tab-completed) MD links', () => { // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendHtmlMessage'); + const spy = sinon.spy(client, 'sendMessage'); // Markdown mode enabled mci.enableRichtext(false); addTextToDraft('[Click here](https://some.lovely.url)'); mci.handleReturn(sinon.stub()); - expect(spy.args[0][1]).toEqual('[Click here](https://some.lovely.url)'); - expect(spy.args[0][2]).toEqual('Click here'); + expect(spy.args[0][1].body).toEqual('[Click here](https://some.lovely.url)'); + expect(spy.args[0][1].formatted_body).toEqual('Click here'); }); }); diff --git a/test/components/views/rooms/RoomList-test.js b/test/components/views/rooms/RoomList-test.js new file mode 100644 index 0000000000..f40a89777b --- /dev/null +++ b/test/components/views/rooms/RoomList-test.js @@ -0,0 +1,293 @@ +import React from 'react'; +import ReactTestUtils from 'react-addons-test-utils'; +import ReactDOM from 'react-dom'; +import expect from 'expect'; +import lolex from 'lolex'; + +import * as TestUtils from 'test-utils'; + +import sdk from '../../../../src/index'; +import MatrixClientPeg from '../../../../src/MatrixClientPeg'; +import { DragDropContext } from 'react-beautiful-dnd'; + +import dis from '../../../../src/dispatcher'; +import DMRoomMap from '../../../../src/utils/DMRoomMap.js'; +import GroupStore from '../../../../src/stores/GroupStore.js'; + +import { Room, RoomMember } from 'matrix-js-sdk'; + +function generateRoomId() { + return '!' + Math.random().toString().slice(2, 10) + ':domain'; +} + +function createRoom(opts) { + const room = new Room(generateRoomId()); + if (opts) { + Object.assign(room, opts); + } + return room; +} + +describe('RoomList', () => { + let parentDiv = null; + let sandbox = null; + let client = null; + let root = null; + const myUserId = '@me:domain'; + let clock = null; + + const movingRoomId = '!someroomid'; + let movingRoom; + let otherRoom; + + let myMember; + let myOtherMember; + + beforeEach(function() { + TestUtils.beforeEach(this); + sandbox = TestUtils.stubClient(sandbox); + client = MatrixClientPeg.get(); + client.credentials = {userId: myUserId}; + + clock = lolex.install(); + + DMRoomMap.makeShared(); + + parentDiv = document.createElement('div'); + document.body.appendChild(parentDiv); + + const RoomList = sdk.getComponent('views.rooms.RoomList'); + const WrappedRoomList = TestUtils.wrapInMatrixClientContext(RoomList); + root = ReactDOM.render( + + + + , parentDiv); + ReactTestUtils.findRenderedComponentWithType(root, RoomList); + + movingRoom = createRoom({name: 'Moving room'}); + expect(movingRoom.roomId).toNotBe(null); + + // Mock joined member + myMember = new RoomMember(movingRoomId, myUserId); + myMember.membership = 'join'; + movingRoom.getMember = (userId) => ({ + [client.credentials.userId]: myMember, + }[userId]); + + otherRoom = createRoom({name: 'Other room'}); + myOtherMember = new RoomMember(otherRoom.roomId, myUserId); + myOtherMember.membership = 'join'; + otherRoom.getMember = (userId) => ({ + [client.credentials.userId]: myOtherMember, + }[userId]); + + // Mock the matrix client + client.getRooms = () => [ + movingRoom, + otherRoom, + createRoom({tags: {'m.favourite': {order: 0.1}}, name: 'Some other room'}), + createRoom({tags: {'m.favourite': {order: 0.2}}, name: 'Some other room 2'}), + createRoom({tags: {'m.lowpriority': {}}, name: 'Some unimportant room'}), + createRoom({tags: {'custom.tag': {}}, name: 'Some room customly tagged'}), + ]; + + const roomMap = {}; + client.getRooms().forEach((r) => { + roomMap[r.roomId] = r; + }); + + client.getRoom = (roomId) => roomMap[roomId]; + }); + + afterEach((done) => { + if (parentDiv) { + ReactDOM.unmountComponentAtNode(parentDiv); + parentDiv.remove(); + parentDiv = null; + } + sandbox.restore(); + + clock.uninstall(); + + done(); + }); + + function expectRoomInSubList(room, subListTest) { + const RoomSubList = sdk.getComponent('structures.RoomSubList'); + const RoomTile = sdk.getComponent('views.rooms.RoomTile'); + + const subLists = ReactTestUtils.scryRenderedComponentsWithType(root, RoomSubList); + const containingSubList = subLists.find(subListTest); + + let expectedRoomTile; + try { + const roomTiles = ReactTestUtils.scryRenderedComponentsWithType(containingSubList, RoomTile); + console.info({roomTiles: roomTiles.length}); + expectedRoomTile = roomTiles.find((tile) => tile.props.room === room); + } catch (err) { + // truncate the error message because it's spammy + err.message = 'Error finding RoomTile for ' + room.roomId + ' in ' + + subListTest + ': ' + + err.message.split('componentType')[0] + '...'; + throw err; + } + + expect(expectedRoomTile).toExist(); + expect(expectedRoomTile.props.room).toBe(room); + } + + function expectCorrectMove(oldTag, newTag) { + const getTagSubListTest = (tag) => { + if (tag === undefined) return (s) => s.props.label.endsWith('Rooms'); + return (s) => s.props.tagName === tag; + }; + + // Default to finding the destination sublist with newTag + const destSubListTest = getTagSubListTest(newTag); + const srcSubListTest = getTagSubListTest(oldTag); + + // Set up the room that will be moved such that it has the correct state for a room in + // the section for oldTag + if (['m.favourite', 'm.lowpriority'].includes(oldTag)) movingRoom.tags = {[oldTag]: {}}; + if (oldTag === 'im.vector.fake.direct') { + // Mock inverse m.direct + DMRoomMap.shared().roomToUser = { + [movingRoom.roomId]: '@someotheruser:domain', + }; + } + + dis.dispatch({action: 'MatrixActions.sync', prevState: null, state: 'PREPARED', matrixClient: client}); + + clock.runAll(); + + expectRoomInSubList(movingRoom, srcSubListTest); + + dis.dispatch({action: 'RoomListActions.tagRoom.pending', request: { + oldTag, newTag, room: movingRoom, + }}); + + // Run all setTimeouts for dispatches and room list rate limiting + clock.runAll(); + + expectRoomInSubList(movingRoom, destSubListTest); + } + + function itDoesCorrectOptimisticUpdatesForDraggedRoomTiles() { + describe('does correct optimistic update when dragging from', () => { + it('rooms to people', () => { + expectCorrectMove(undefined, 'im.vector.fake.direct'); + }); + + it('rooms to favourites', () => { + expectCorrectMove(undefined, 'm.favourite'); + }); + + it('rooms to low priority', () => { + expectCorrectMove(undefined, 'm.lowpriority'); + }); + + // XXX: Known to fail - the view does not update immediately to reflect the change. + // Whe running the app live, it updates when some other event occurs (likely the + // m.direct arriving) that these tests do not fire. + xit('people to rooms', () => { + expectCorrectMove('im.vector.fake.direct', undefined); + }); + + it('people to favourites', () => { + expectCorrectMove('im.vector.fake.direct', 'm.favourite'); + }); + + it('people to lowpriority', () => { + expectCorrectMove('im.vector.fake.direct', 'm.lowpriority'); + }); + + it('low priority to rooms', () => { + expectCorrectMove('m.lowpriority', undefined); + }); + + it('low priority to people', () => { + expectCorrectMove('m.lowpriority', 'im.vector.fake.direct'); + }); + + it('low priority to low priority', () => { + expectCorrectMove('m.lowpriority', 'm.lowpriority'); + }); + + it('favourites to rooms', () => { + expectCorrectMove('m.favourite', undefined); + }); + + it('favourites to people', () => { + expectCorrectMove('m.favourite', 'im.vector.fake.direct'); + }); + + it('favourites to low priority', () => { + expectCorrectMove('m.favourite', 'm.lowpriority'); + }); + }); + } + + describe('when no tags are selected', () => { + itDoesCorrectOptimisticUpdatesForDraggedRoomTiles(); + }); + + describe('when tags are selected', () => { + function setupSelectedTag() { + // Simulate a complete sync BEFORE dispatching anything else + dis.dispatch({ + action: 'MatrixActions.sync', + prevState: null, + state: 'PREPARED', + matrixClient: client, + }, true); + + // Simulate joined groups being received + dis.dispatch({ + action: 'GroupActions.fetchJoinedGroups.success', + result: { + groups: ['+group:domain'], + }, + }, true); + + // Simulate receiving tag ordering account data + dis.dispatch({ + action: 'MatrixActions.accountData', + event_type: 'im.vector.web.tag_ordering', + event_content: { + tags: ['+group:domain'], + }, + }, true); + + // GroupStore is not flux, mock and notify + GroupStore.getGroupRooms = (groupId) => { + return [movingRoom]; + }; + GroupStore._notifyListeners(); + + // Select tag + dis.dispatch({action: 'select_tag', tag: '+group:domain'}, true); + } + + beforeEach(() => { + setupSelectedTag(); + }); + + it('displays the correct rooms when the groups rooms are changed', () => { + GroupStore.getGroupRooms = (groupId) => { + return [movingRoom, otherRoom]; + }; + GroupStore._notifyListeners(); + + // Run through RoomList debouncing + clock.runAll(); + + // By default, the test will + expectRoomInSubList(otherRoom, (s) => s.props.label.endsWith('Rooms')); + }); + + itDoesCorrectOptimisticUpdatesForDraggedRoomTiles(); + }); +}); + + diff --git a/test/components/views/rooms/RoomSettings-test.js b/test/components/views/rooms/RoomSettings-test.js new file mode 100644 index 0000000000..ffcecf1725 --- /dev/null +++ b/test/components/views/rooms/RoomSettings-test.js @@ -0,0 +1,190 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import expect, {createSpy} from 'expect'; +import Promise from 'bluebird'; +import * as testUtils from '../../../test-utils'; +import sdk from 'matrix-react-sdk'; +const WrappedRoomSettings = testUtils.wrapInMatrixClientContext(sdk.getComponent('views.rooms.RoomSettings')); +import MatrixClientPeg from '../../../../src/MatrixClientPeg'; +import SettingsStore from '../../../../src/settings/SettingsStore'; + + +describe('RoomSettings', () => { + let parentDiv = null; + let sandbox = null; + let client = null; + let roomSettings = null; + const room = testUtils.mkStubRoom('!DdJkzRliezrwpNebLk:matrix.org'); + + function expectSentStateEvent(roomId, eventType, expectedEventContent) { + let found = false; + for (const call of client.sendStateEvent.calls) { + const [ + actualRoomId, + actualEventType, + actualEventContent, + ] = call.arguments.slice(0, 3); + + if (roomId === actualRoomId && actualEventType === eventType) { + expect(actualEventContent).toEqual(expectedEventContent); + found = true; + break; + } + } + expect(found).toBe(true); + } + + beforeEach(function(done) { + testUtils.beforeEach(this); + sandbox = testUtils.stubClient(); + client = MatrixClientPeg.get(); + client.credentials = {userId: '@me:domain.com'}; + + client.setRoomName = createSpy().andReturn(Promise.resolve()); + client.setRoomTopic = createSpy().andReturn(Promise.resolve()); + client.setRoomDirectoryVisibility = createSpy().andReturn(Promise.resolve()); + + // Covers any room state event (e.g. name, avatar, topic) + client.sendStateEvent = createSpy().andReturn(Promise.resolve()); + + // Covers room tagging + client.setRoomTag = createSpy().andReturn(Promise.resolve()); + client.deleteRoomTag = createSpy().andReturn(Promise.resolve()); + + // Covers any setting in the SettingsStore + // (including local client settings not stored via matrix) + SettingsStore.setValue = createSpy().andReturn(Promise.resolve()); + + parentDiv = document.createElement('div'); + document.body.appendChild(parentDiv); + + const gatherWrappedRef = (r) => {roomSettings = r;}; + + // get use wrappedRef because we're using wrapInMatrixClientContext + ReactDOM.render( + , + parentDiv, + done, + ); + }); + + afterEach((done) => { + if (parentDiv) { + ReactDOM.unmountComponentAtNode(parentDiv); + parentDiv.remove(); + parentDiv = null; + } + sandbox.restore(); + done(); + }); + + it('should not set when no setting is changed', (done) => { + roomSettings.save().then(() => { + expect(client.sendStateEvent).toNotHaveBeenCalled(); + expect(client.setRoomTag).toNotHaveBeenCalled(); + expect(client.deleteRoomTag).toNotHaveBeenCalled(); + done(); + }); + }); + + // XXX: Apparently we do call SettingsStore.setValue + xit('should not settings via the SettingsStore when no setting is changed', (done) => { + roomSettings.save().then(() => { + expect(SettingsStore.setValue).toNotHaveBeenCalled(); + done(); + }); + }); + + it('should set room name when it has changed', (done) => { + const name = "My Room Name"; + roomSettings.setName(name); + + roomSettings.save().then(() => { + expect(client.setRoomName.calls[0].arguments.slice(0, 2)) + .toEqual(['!DdJkzRliezrwpNebLk:matrix.org', name]); + + done(); + }); + }); + + it('should set room topic when it has changed', (done) => { + const topic = "this is a topic"; + roomSettings.setTopic(topic); + + roomSettings.save().then(() => { + expect(client.setRoomTopic.calls[0].arguments.slice(0, 2)) + .toEqual(['!DdJkzRliezrwpNebLk:matrix.org', topic]); + + done(); + }); + }); + + it('should set history visibility when it has changed', (done) => { + const historyVisibility = "translucent"; + roomSettings.setState({ + history_visibility: historyVisibility, + }); + + roomSettings.save().then(() => { + expectSentStateEvent( + "!DdJkzRliezrwpNebLk:matrix.org", + "m.room.history_visibility", {history_visibility: historyVisibility}, + ); + done(); + }); + }); + + // XXX: Can't test this because we `getRoomDirectoryVisibility` in `componentWillMount` + xit('should set room directory publicity when set to true', (done) => { + const isRoomPublished = true; + roomSettings.setState({ + isRoomPublished, + }, () => { + roomSettings.save().then(() => { + expect(client.setRoomDirectoryVisibility.calls[0].arguments.slice(0, 2)) + .toEqual("!DdJkzRliezrwpNebLk:matrix.org", isRoomPublished ? "public" : "private"); + done(); + }); + }); + }); + + it('should set power levels when changed', (done) => { + roomSettings.onPowerLevelsChanged(42, "invite"); + + roomSettings.save().then(() => { + expectSentStateEvent( + "!DdJkzRliezrwpNebLk:matrix.org", + "m.room.power_levels", { invite: 42 }, + ); + done(); + }); + }); + + it('should set event power levels when changed', (done) => { + roomSettings.onPowerLevelsChanged(42, "event_levels_m.room.message"); + + roomSettings.save().then(() => { + // We expect all state events to be set to the state_default (50) + // See powerLevelDescriptors in RoomSettings + expectSentStateEvent( + "!DdJkzRliezrwpNebLk:matrix.org", + "m.room.power_levels", { + events: { + 'm.room.message': 42, + 'm.room.avatar': 50, + 'm.room.name': 50, + 'm.room.canonical_alias': 50, + 'm.room.history_visibility': 50, + 'm.room.power_levels': 50, + 'm.room.topic': 50, + 'im.vector.modular.widgets': 50, + }, + }, + ); + done(); + }); + }); +}); 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); + }); + }); +}); diff --git a/test/test-utils.js b/test/test-utils.js index 0b536f5766..0e8fb1df79 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -2,7 +2,8 @@ import sinon from 'sinon'; import Promise from 'bluebird'; - +import React from 'react'; +import PropTypes from 'prop-types'; import peg from '../src/MatrixClientPeg'; import dis from '../src/dispatcher'; import jssdk from 'matrix-js-sdk'; @@ -67,10 +68,13 @@ export function createTestClient() { return { getHomeserverUrl: sinon.stub(), getIdentityServerUrl: sinon.stub(), + getDomain: sinon.stub().returns("matrix.rog"), + getUserId: sinon.stub().returns("@userId:matrix.rog"), getPushActionsForEvent: sinon.stub(), getRoom: sinon.stub().returns(mkStubRoom()), getRooms: sinon.stub().returns([]), + getGroups: sinon.stub().returns([]), loginFlows: sinon.stub(), on: sinon.stub(), removeListener: sinon.stub(), @@ -80,6 +84,7 @@ export function createTestClient() { paginateEventTimeline: sinon.stub().returns(Promise.resolve()), sendReadReceipt: sinon.stub().returns(Promise.resolve()), getRoomIdForAlias: sinon.stub().returns(Promise.resolve()), + getRoomDirectoryVisibility: sinon.stub().returns(Promise.resolve()), getProfileInfo: sinon.stub().returns(Promise.resolve({})), getAccountData: (type) => { return mkEvent({ @@ -88,10 +93,10 @@ export function createTestClient() { content: {}, }); }, + mxcUrlToHttp: (mxc) => 'http://this.is.a.url/', setAccountData: sinon.stub(), sendTyping: sinon.stub().returns(Promise.resolve({})), - sendTextMessage: () => Promise.resolve({}), - sendHtmlMessage: () => Promise.resolve({}), + sendMessage: () => Promise.resolve({}), getSyncState: () => "SYNCING", generateClientSecret: () => "t35tcl1Ent5ECr3T", isGuest: () => false, @@ -243,6 +248,7 @@ export function mkStubRoom(roomId = null) { roomId: roomId, getAvatarUrl: () => 'mxc://avatar.url/image.png', }), + getMembersWithMembership: sinon.stub().returns([]), getJoinedMembers: sinon.stub().returns([]), getPendingEvents: () => [], getLiveTimeline: () => stubTimeline, @@ -251,8 +257,16 @@ export function mkStubRoom(roomId = null) { hasMembershipState: () => null, currentState: { getStateEvents: sinon.stub(), + mayClientSendStateEvent: sinon.stub().returns(true), + maySendStateEvent: sinon.stub().returns(true), members: [], }, + tags: { + "m.favourite": { + order: 0.5, + }, + }, + setBlacklistUnverifiedDevices: sinon.stub(), }; } @@ -265,3 +279,46 @@ export function getDispatchForStore(store) { dis._isDispatching = false; }; } + +export function wrapInMatrixClientContext(WrappedComponent) { + class Wrapper extends React.Component { + static childContextTypes = { + matrixClient: PropTypes.object, + } + + getChildContext() { + return { + matrixClient: this._matrixClient, + }; + } + + componentWillMount() { + this._matrixClient = peg.get(); + } + + render() { + return ; + } + } + return Wrapper; +} + +/** + * Call fn before calling componentDidUpdate on a react component instance, inst. + * @param {React.Component} inst an instance of a React component. + * @returns {Promise} promise that resolves when componentDidUpdate is called on + * given component instance. + */ +export function waitForUpdate(inst) { + return new Promise((resolve, reject) => { + const cdu = inst.componentDidUpdate; + + inst.componentDidUpdate = (prevProps, prevState, snapshot) => { + resolve(); + + if (cdu) cdu(prevProps, prevState, snapshot); + + inst.componentDidUpdate = cdu; + }; + }); +}