Merge branch 'develop' into rav/handle_received_room_key_requests

This commit is contained in:
Richard van der Hoff 2017-06-20 00:25:14 +01:00
commit a0534e7477
106 changed files with 6339 additions and 1548 deletions

184
.eslintignore.errorfiles Normal file
View file

@ -0,0 +1,184 @@
# autogenerated file: run scripts/generate-eslint-error-ignore-file to update.
src/AddThreepid.js
src/async-components/views/dialogs/EncryptedEventDialog.js
src/autocomplete/AutocompleteProvider.js
src/autocomplete/Autocompleter.js
src/autocomplete/Components.js
src/autocomplete/DuckDuckGoProvider.js
src/autocomplete/EmojiProvider.js
src/autocomplete/RoomProvider.js
src/autocomplete/UserProvider.js
src/Avatar.js
src/BasePlatform.js
src/CallHandler.js
src/component-index.js
src/components/structures/ContextualMenu.js
src/components/structures/CreateRoom.js
src/components/structures/FilePanel.js
src/components/structures/InteractiveAuth.js
src/components/structures/LoggedInView.js
src/components/structures/login/ForgotPassword.js
src/components/structures/login/Login.js
src/components/structures/login/PostRegistration.js
src/components/structures/login/Registration.js
src/components/structures/MessagePanel.js
src/components/structures/NotificationPanel.js
src/components/structures/RoomStatusBar.js
src/components/structures/RoomView.js
src/components/structures/ScrollPanel.js
src/components/structures/TimelinePanel.js
src/components/structures/UploadBar.js
src/components/views/avatars/BaseAvatar.js
src/components/views/avatars/MemberAvatar.js
src/components/views/avatars/RoomAvatar.js
src/components/views/create_room/CreateRoomButton.js
src/components/views/create_room/Presets.js
src/components/views/create_room/RoomAlias.js
src/components/views/dialogs/ChatCreateOrReuseDialog.js
src/components/views/dialogs/ChatInviteDialog.js
src/components/views/dialogs/DeactivateAccountDialog.js
src/components/views/dialogs/InteractiveAuthDialog.js
src/components/views/dialogs/SetMxIdDialog.js
src/components/views/dialogs/UnknownDeviceDialog.js
src/components/views/elements/AccessibleButton.js
src/components/views/elements/ActionButton.js
src/components/views/elements/AddressSelector.js
src/components/views/elements/AddressTile.js
src/components/views/elements/CreateRoomButton.js
src/components/views/elements/DeviceVerifyButtons.js
src/components/views/elements/DirectorySearchBox.js
src/components/views/elements/Dropdown.js
src/components/views/elements/EditableText.js
src/components/views/elements/EditableTextContainer.js
src/components/views/elements/HomeButton.js
src/components/views/elements/LanguageDropdown.js
src/components/views/elements/MemberEventListSummary.js
src/components/views/elements/PowerSelector.js
src/components/views/elements/ProgressBar.js
src/components/views/elements/RoomDirectoryButton.js
src/components/views/elements/SettingsButton.js
src/components/views/elements/StartChatButton.js
src/components/views/elements/TintableSvg.js
src/components/views/elements/TruncatedList.js
src/components/views/elements/UserSelector.js
src/components/views/login/CaptchaForm.js
src/components/views/login/CasLogin.js
src/components/views/login/CountryDropdown.js
src/components/views/login/CustomServerDialog.js
src/components/views/login/InteractiveAuthEntryComponents.js
src/components/views/login/LoginHeader.js
src/components/views/login/PasswordLogin.js
src/components/views/login/RegistrationForm.js
src/components/views/login/ServerConfig.js
src/components/views/messages/MAudioBody.js
src/components/views/messages/MessageEvent.js
src/components/views/messages/MFileBody.js
src/components/views/messages/MImageBody.js
src/components/views/messages/MVideoBody.js
src/components/views/messages/RoomAvatarEvent.js
src/components/views/messages/TextualBody.js
src/components/views/messages/TextualEvent.js
src/components/views/room_settings/AliasSettings.js
src/components/views/room_settings/ColorSettings.js
src/components/views/room_settings/UrlPreviewSettings.js
src/components/views/rooms/Autocomplete.js
src/components/views/rooms/AuxPanel.js
src/components/views/rooms/EntityTile.js
src/components/views/rooms/EventTile.js
src/components/views/rooms/LinkPreviewWidget.js
src/components/views/rooms/MemberDeviceInfo.js
src/components/views/rooms/MemberInfo.js
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/MessageComposerInputOld.js
src/components/views/rooms/PresenceLabel.js
src/components/views/rooms/ReadReceiptMarker.js
src/components/views/rooms/RoomHeader.js
src/components/views/rooms/RoomList.js
src/components/views/rooms/RoomNameEditor.js
src/components/views/rooms/RoomPreviewBar.js
src/components/views/rooms/RoomSettings.js
src/components/views/rooms/RoomTile.js
src/components/views/rooms/RoomTopicEditor.js
src/components/views/rooms/SearchableEntityList.js
src/components/views/rooms/SearchResultTile.js
src/components/views/rooms/TabCompleteBar.js
src/components/views/rooms/TopUnreadMessagesBar.js
src/components/views/rooms/UserTile.js
src/components/views/settings/AddPhoneNumber.js
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/DevicesPanelEntry.js
src/components/views/settings/EnableNotificationsButton.js
src/components/views/voip/CallView.js
src/components/views/voip/IncomingCallBox.js
src/components/views/voip/VideoFeed.js
src/components/views/voip/VideoView.js
src/ContentMessages.js
src/createRoom.js
src/DateUtils.js
src/email.js
src/Entities.js
src/extend.js
src/HtmlUtils.js
src/ImageUtils.js
src/Invite.js
src/languageHandler.js
src/linkify-matrix.js
src/Login.js
src/Markdown.js
src/MatrixClientPeg.js
src/Modal.js
src/Notifier.js
src/ObjectUtils.js
src/PasswordReset.js
src/PlatformPeg.js
src/Presence.js
src/ratelimitedfunc.js
src/Resend.js
src/RichText.js
src/Roles.js
src/RoomListSorter.js
src/RoomNotifs.js
src/Rooms.js
src/ScalarAuthClient.js
src/ScalarMessaging.js
src/SdkConfig.js
src/Skinner.js
src/SlashCommands.js
src/stores/LifecycleStore.js
src/TabComplete.js
src/TabCompleteEntries.js
src/TextForEvent.js
src/Tinter.js
src/UiEffects.js
src/Unread.js
src/UserActivity.js
src/utils/DecryptFile.js
src/utils/DMRoomMap.js
src/utils/FormattingUtils.js
src/utils/MultiInviter.js
src/utils/Receipt.js
src/Velociraptor.js
src/VelocityBounce.js
src/WhoIsTyping.js
src/wrappers/WithMatrixClient.js
test/all-tests.js
test/components/structures/login/Registration-test.js
test/components/structures/MessagePanel-test.js
test/components/structures/ScrollPanel-test.js
test/components/structures/TimelinePanel-test.js
test/components/stub-component.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/skinned-sdk.js
test/stores/RoomViewStore-test.js
test/test-utils.js

View file

@ -5,6 +5,4 @@ install:
- npm install - npm install
- (cd node_modules/matrix-js-sdk && npm install) - (cd node_modules/matrix-js-sdk && npm install)
script: script:
# don't run the riot tests unless the react-sdk tests pass, otherwise ./scripts/travis.sh
# the output is confusing.
- npm run test && ./.travis-test-riot.sh

View file

@ -1,3 +1,177 @@
Changes in [0.9.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.4) (2017-06-14)
===================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.3...v0.9.4)
* Ask for email address after setting password for the first time
[\#1090](https://github.com/matrix-org/matrix-react-sdk/pull/1090)
* DM guessing: prefer oldest joined member
[\#1087](https://github.com/matrix-org/matrix-react-sdk/pull/1087)
* More translations
Changes in [0.9.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.3) (2017-06-12)
===================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.3-rc.2...v0.9.3)
* Add more translations & fix some existing ones
Changes in [0.9.3-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.3-rc.2) (2017-06-09)
=============================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.3-rc.1...v0.9.3-rc.2)
* Fix flux dependency
* Fix translations on conference call bar
Changes in [0.9.3-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.3-rc.1) (2017-06-09)
=============================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.2...v0.9.3-rc.1)
* When ChatCreateOrReuseDialog is cancelled by a guest, go home
[\#1069](https://github.com/matrix-org/matrix-react-sdk/pull/1069)
* Update from Weblate.
[\#1065](https://github.com/matrix-org/matrix-react-sdk/pull/1065)
* Goto /home when forgetting the last room
[\#1067](https://github.com/matrix-org/matrix-react-sdk/pull/1067)
* Default to home page when settings is closed
[\#1066](https://github.com/matrix-org/matrix-react-sdk/pull/1066)
* Update from Weblate.
[\#1063](https://github.com/matrix-org/matrix-react-sdk/pull/1063)
* When joining, use a roomAlias if we have it
[\#1062](https://github.com/matrix-org/matrix-react-sdk/pull/1062)
* Control currently viewed event via RoomViewStore
[\#1058](https://github.com/matrix-org/matrix-react-sdk/pull/1058)
* Better error messages for login
[\#1060](https://github.com/matrix-org/matrix-react-sdk/pull/1060)
* Add remaining translations
[\#1056](https://github.com/matrix-org/matrix-react-sdk/pull/1056)
* Added button that copies code to clipboard
[\#1040](https://github.com/matrix-org/matrix-react-sdk/pull/1040)
* de-lint MegolmExportEncryption + test
[\#1059](https://github.com/matrix-org/matrix-react-sdk/pull/1059)
* Better RTL support
[\#1021](https://github.com/matrix-org/matrix-react-sdk/pull/1021)
* make mels emoji capable
[\#1057](https://github.com/matrix-org/matrix-react-sdk/pull/1057)
* Make travis check for lint on files which are clean to start with
[\#1055](https://github.com/matrix-org/matrix-react-sdk/pull/1055)
* Update from Weblate.
[\#1053](https://github.com/matrix-org/matrix-react-sdk/pull/1053)
* Add some logging around switching rooms
[\#1054](https://github.com/matrix-org/matrix-react-sdk/pull/1054)
* Update from Weblate.
[\#1052](https://github.com/matrix-org/matrix-react-sdk/pull/1052)
* Use user_directory endpoint to populate ChatInviteDialog
[\#1050](https://github.com/matrix-org/matrix-react-sdk/pull/1050)
* Various Analytics changes/fixes/improvements
[\#1046](https://github.com/matrix-org/matrix-react-sdk/pull/1046)
* Use an arrow function to allow `this`
[\#1051](https://github.com/matrix-org/matrix-react-sdk/pull/1051)
* New guest access
[\#937](https://github.com/matrix-org/matrix-react-sdk/pull/937)
* Translate src/components/structures
[\#1048](https://github.com/matrix-org/matrix-react-sdk/pull/1048)
* Cancel 'join room' action if 'log in' is clicked
[\#1049](https://github.com/matrix-org/matrix-react-sdk/pull/1049)
* fix copy and paste derp and rip out unused imports
[\#1015](https://github.com/matrix-org/matrix-react-sdk/pull/1015)
* Update from Weblate.
[\#1042](https://github.com/matrix-org/matrix-react-sdk/pull/1042)
* Reset 'first sync' flag / promise on log in
[\#1041](https://github.com/matrix-org/matrix-react-sdk/pull/1041)
* Remove DM-guessing code (again)
[\#1036](https://github.com/matrix-org/matrix-react-sdk/pull/1036)
* Cancel deferred actions
[\#1039](https://github.com/matrix-org/matrix-react-sdk/pull/1039)
* Merge develop, add i18n for SetMxIdDialog
[\#1034](https://github.com/matrix-org/matrix-react-sdk/pull/1034)
* Defer an intention for creating a room
[\#1038](https://github.com/matrix-org/matrix-react-sdk/pull/1038)
* Fix 'create room' button
[\#1037](https://github.com/matrix-org/matrix-react-sdk/pull/1037)
* Always show the spinner during the first sync
[\#1033](https://github.com/matrix-org/matrix-react-sdk/pull/1033)
* Only view welcome user if we are not looking at a room
[\#1032](https://github.com/matrix-org/matrix-react-sdk/pull/1032)
* Update from Weblate.
[\#1030](https://github.com/matrix-org/matrix-react-sdk/pull/1030)
* Keep deferred actions for view_user_settings and view_create_chat
[\#1031](https://github.com/matrix-org/matrix-react-sdk/pull/1031)
* Don't do a deferred start chat if user is welcome user
[\#1029](https://github.com/matrix-org/matrix-react-sdk/pull/1029)
* Introduce state `peekLoading` to avoid collision with `roomLoading`
[\#1028](https://github.com/matrix-org/matrix-react-sdk/pull/1028)
* Update from Weblate.
[\#1016](https://github.com/matrix-org/matrix-react-sdk/pull/1016)
* Fix accepting a 3pid invite
[\#1013](https://github.com/matrix-org/matrix-react-sdk/pull/1013)
* Propagate room join errors to the UI
[\#1007](https://github.com/matrix-org/matrix-react-sdk/pull/1007)
* Implement /user/@userid:domain?action=chat
[\#1006](https://github.com/matrix-org/matrix-react-sdk/pull/1006)
* Show People/Rooms emptySubListTip even when total rooms !== 0
[\#967](https://github.com/matrix-org/matrix-react-sdk/pull/967)
* Fix to show the correct room
[\#995](https://github.com/matrix-org/matrix-react-sdk/pull/995)
* Remove cachedPassword from localStorage on_logged_out
[\#977](https://github.com/matrix-org/matrix-react-sdk/pull/977)
* Add /start to show the setMxId above HomePage
[\#964](https://github.com/matrix-org/matrix-react-sdk/pull/964)
* Allow pressing Enter to submit setMxId
[\#961](https://github.com/matrix-org/matrix-react-sdk/pull/961)
* add login link to SetMxIdDialog
[\#954](https://github.com/matrix-org/matrix-react-sdk/pull/954)
* Block user settings with view_set_mxid
[\#936](https://github.com/matrix-org/matrix-react-sdk/pull/936)
* Show "Something went wrong!" when errcode undefined
[\#935](https://github.com/matrix-org/matrix-react-sdk/pull/935)
* Reset store state when logging out
[\#930](https://github.com/matrix-org/matrix-react-sdk/pull/930)
* Set the displayname to the mxid once PWLU
[\#933](https://github.com/matrix-org/matrix-react-sdk/pull/933)
* Fix view_next_room, view_previous_room and view_indexed_room
[\#929](https://github.com/matrix-org/matrix-react-sdk/pull/929)
* Use RVS to indicate "joining" when setting a mxid
[\#928](https://github.com/matrix-org/matrix-react-sdk/pull/928)
* Don't show notif nag bar if guest
[\#932](https://github.com/matrix-org/matrix-react-sdk/pull/932)
* Show "Password" instead of "New Password"
[\#927](https://github.com/matrix-org/matrix-react-sdk/pull/927)
* Remove warm-fuzzy after setting mxid
[\#926](https://github.com/matrix-org/matrix-react-sdk/pull/926)
* Allow teamServerConfig to be missing
[\#925](https://github.com/matrix-org/matrix-react-sdk/pull/925)
* Remove GuestWarningBar
[\#923](https://github.com/matrix-org/matrix-react-sdk/pull/923)
* Make left panel better for new users (mk III)
[\#924](https://github.com/matrix-org/matrix-react-sdk/pull/924)
* Implement default welcome page and allow custom URL /w config
[\#922](https://github.com/matrix-org/matrix-react-sdk/pull/922)
* Implement a store for RoomView
[\#921](https://github.com/matrix-org/matrix-react-sdk/pull/921)
* Add prop to toggle whether new password input is autoFocused
[\#915](https://github.com/matrix-org/matrix-react-sdk/pull/915)
* Implement warm-fuzzy success dialog for SetMxIdDialog
[\#905](https://github.com/matrix-org/matrix-react-sdk/pull/905)
* Write some tests for the RTS UI
[\#893](https://github.com/matrix-org/matrix-react-sdk/pull/893)
* Make confirmation optional on ChangePassword
[\#890](https://github.com/matrix-org/matrix-react-sdk/pull/890)
* Remove "Current Password" input if mx_pass exists
[\#881](https://github.com/matrix-org/matrix-react-sdk/pull/881)
* Replace NeedToRegisterDialog /w SetMxIdDialog
[\#889](https://github.com/matrix-org/matrix-react-sdk/pull/889)
* Invite the welcome user after registration if configured
[\#882](https://github.com/matrix-org/matrix-react-sdk/pull/882)
* Prevent ROUs from creating new chats/new rooms
[\#879](https://github.com/matrix-org/matrix-react-sdk/pull/879)
* Redesign mxID chooser, add availability checking
[\#877](https://github.com/matrix-org/matrix-react-sdk/pull/877)
* Show password nag bar when user is PWLU
[\#864](https://github.com/matrix-org/matrix-react-sdk/pull/864)
* fix typo
[\#858](https://github.com/matrix-org/matrix-react-sdk/pull/858)
* Initial implementation: SetDisplayName -> SetMxIdDialog
[\#849](https://github.com/matrix-org/matrix-react-sdk/pull/849)
Changes in [0.9.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.2) (2017-06-06) Changes in [0.9.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.2) (2017-06-06)
=================================================================================================== ===================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.1...v0.9.2) [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.1...v0.9.2)

View file

@ -21,6 +21,11 @@ npm run test
# run eslint # run eslint
npm run lintall -- -f checkstyle -o eslint.xml || true npm run lintall -- -f checkstyle -o eslint.xml || true
# re-run the linter, excluding any files known to have errors or warnings.
./node_modules/.bin/eslint --max-warnings 0 \
--ignore-path .eslintignore.errorfiles \
src test
# delete the old tarball, if it exists # delete the old tarball, if it exists
rm -f matrix-react-sdk-*.tgz rm -f matrix-react-sdk-*.tgz

View file

@ -1,6 +1,6 @@
{ {
"name": "matrix-react-sdk", "name": "matrix-react-sdk",
"version": "0.9.2", "version": "0.9.4",
"description": "SDK for matrix.org using React", "description": "SDK for matrix.org using React",
"author": "matrix.org", "author": "matrix.org",
"repository": { "repository": {
@ -57,14 +57,14 @@
"emojione": "2.2.3", "emojione": "2.2.3",
"file-saver": "^1.3.3", "file-saver": "^1.3.3",
"filesize": "3.5.6", "filesize": "3.5.6",
"flux": "^2.0.3", "flux": "2.1.1",
"fuse.js": "^2.2.0", "fuse.js": "^2.2.0",
"glob": "^5.0.14", "glob": "^5.0.14",
"highlight.js": "^8.9.1", "highlight.js": "^8.9.1",
"isomorphic-fetch": "^2.2.1", "isomorphic-fetch": "^2.2.1",
"linkifyjs": "^2.1.3", "linkifyjs": "^2.1.3",
"lodash": "^4.13.1", "lodash": "^4.13.1",
"matrix-js-sdk": "0.7.10", "matrix-js-sdk": "0.7.11",
"optimist": "^0.6.1", "optimist": "^0.6.1",
"prop-types": "^15.5.8", "prop-types": "^15.5.8",
"q": "^1.4.1", "q": "^1.4.1",

47
scripts/copy-i18n.py Executable file
View file

@ -0,0 +1,47 @@
#!/usr/bin/env python
import json
import sys
import os
if len(sys.argv) < 3:
print "Usage: %s <source> <dest>" % (sys.argv[0],)
print "eg. %s pt_BR.json pt.json" % (sys.argv[0],)
print
print "Adds any translations to <dest> that exist in <source> but not <dest>"
sys.exit(1)
srcpath = sys.argv[1]
dstpath = sys.argv[2]
tmppath = dstpath + ".tmp"
with open(srcpath) as f:
src = json.load(f)
with open(dstpath) as f:
dst = json.load(f)
toAdd = {}
for k,v in src.iteritems():
if k not in dst:
print "Adding %s" % (k,)
toAdd[k] = v
# don't just json.dumps as we'll probably re-order all the keys (and they're
# not in any given order so we can't just sort_keys). Append them to the end.
with open(dstpath) as ifp:
with open(tmppath, 'w') as ofp:
for line in ifp:
strippedline = line.strip()
if strippedline in ('{', '}'):
ofp.write(line)
elif strippedline.endswith(','):
ofp.write(line)
else:
ofp.write(' '+strippedline+',')
toAddStr = json.dumps(toAdd, indent=4, separators=(',', ': '), ensure_ascii=False, encoding="utf8").strip("{}\n")
ofp.write("\n")
ofp.write(toAddStr.encode('utf8'))
ofp.write("\n")
os.rename(tmppath, dstpath)

View file

@ -61,6 +61,16 @@ You are already in a call.
You cannot place VoIP calls in this browser. You cannot place VoIP calls in this browser.
You cannot place a call with yourself. You cannot place a call with yourself.
Your email address does not appear to be associated with a Matrix ID on this Homeserver. Your email address does not appear to be associated with a Matrix ID on this Homeserver.
Guest users can't upload files. Please register to upload.
Some of your messages have not been sent.
This room is private or inaccessible to guests. You may be able to join if you register.
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 you do not have permission to view the message in question.
This action cannot be performed by a guest user. Please register to be able to do this.
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 you do not have permission to view the message in question.
You are trying to access %(roomName)s.
You will not be able to undo this change as you are promoting the user to have the same power level as yourself.
EOT EOT
)]; )];
} }
@ -84,7 +94,7 @@ if ($_ =~ m/^(\s+)"(.*?)"(: *)"(.*?)"(,?)$/) {
$sub = 1; $sub = 1;
} }
if ($src eq $fixup && $dst !~ /\.$/) { if ($ARGV !~ /(zh_Hans|zh_Hant|th)\.json$/ && $src eq $fixup && $dst !~ /\.$/) {
print STDERR "fixing up dst: $dst\n"; print STDERR "fixing up dst: $dst\n";
$dst .= '.'; $dst .= '.';
$sub = 1; $sub = 1;

View file

@ -0,0 +1,21 @@
#!/bin/sh
#
# generates .eslintignore.errorfiles to list the files which have errors in,
# so that they can be ignored in future automated linting.
out=.eslintignore.errorfiles
cd `dirname $0`/..
echo "generating $out"
{
cat <<EOF
# autogenerated file: run scripts/generate-eslint-error-ignore-file to update.
EOF
./node_modules/.bin/eslint --no-ignore -f json src test |
jq -r '.[] | select((.errorCount + .warningCount) > 0) | .filePath' |
sed -e 's/.*matrix-react-sdk\///';
} > "$out"

11
scripts/travis.sh Executable file
View file

@ -0,0 +1,11 @@
#!/bin/sh
set -ex
npm run test
./.travis-test-riot.sh
# run the linter, but exclude any files known to have errors or warnings.
./node_modules/.bin/eslint --max-warnings 0 \
--ignore-path .eslintignore.errorfiles \
src test

View file

@ -20,9 +20,9 @@ import PlatformPeg from './PlatformPeg';
import SdkConfig from './SdkConfig'; import SdkConfig from './SdkConfig';
function getRedactedUrl() { function getRedactedUrl() {
const base = window.location.pathname.split('/').slice(-2).join('/');
const redactedHash = window.location.hash.replace(/#\/(room|user)\/(.+)/, "#/$1/<redacted>"); const redactedHash = window.location.hash.replace(/#\/(room|user)\/(.+)/, "#/$1/<redacted>");
return base + redactedHash; // hardcoded url to make piwik happy
return 'https://riot.im/app/' + redactedHash;
} }
const customVariables = { const customVariables = {
@ -30,6 +30,7 @@ const customVariables = {
'App Version': 2, 'App Version': 2,
'User Type': 3, 'User Type': 3,
'Chosen Language': 4, 'Chosen Language': 4,
'Instance': 5,
}; };
@ -55,6 +56,7 @@ class Analytics {
* but this is second best, Piwik should not pull anything implicitly. * but this is second best, Piwik should not pull anything implicitly.
*/ */
disable() { disable() {
this.trackEvent('Analytics', 'opt-out');
this.disabled = true; this.disabled = true;
} }
@ -86,6 +88,10 @@ class Analytics {
this._setVisitVariable('Chosen Language', getCurrentLanguage()); this._setVisitVariable('Chosen Language', getCurrentLanguage());
if (window.location.hostname === 'riot.im') {
this._setVisitVariable('Instance', window.location.pathname);
}
(function() { (function() {
const g = document.createElement('script'); const g = document.createElement('script');
const s = document.getElementsByTagName('script')[0]; const s = document.getElementsByTagName('script')[0];

View file

@ -51,13 +51,14 @@ limitations under the License.
* } * }
*/ */
var MatrixClientPeg = require('./MatrixClientPeg'); import MatrixClientPeg from './MatrixClientPeg';
var PlatformPeg = require("./PlatformPeg"); import UserSettingsStore from './UserSettingsStore';
var Modal = require('./Modal'); import PlatformPeg from './PlatformPeg';
var sdk = require('./index'); import Modal from './Modal';
import sdk from './index';
import { _t } from './languageHandler'; import { _t } from './languageHandler';
var Matrix = require("matrix-js-sdk"); import Matrix from 'matrix-js-sdk';
var dis = require("./dispatcher"); import dis from './dispatcher';
global.mxCalls = { global.mxCalls = {
//room_id: MatrixCall //room_id: MatrixCall
@ -257,9 +258,9 @@ function _onAction(payload) {
} }
else if (members.length === 2) { else if (members.length === 2) {
console.log("Place %s call in %s", payload.type, payload.room_id); console.log("Place %s call in %s", payload.type, payload.room_id);
var call = Matrix.createNewMatrixCall( const call = Matrix.createNewMatrixCall(MatrixClientPeg.get(), payload.room_id, {
MatrixClientPeg.get(), payload.room_id forceTURN: UserSettingsStore.getLocalSetting('webRtcForceTURN', false),
); });
placeCall(call); placeCall(call);
} }
else { // > 2 else { // > 2

View file

@ -345,6 +345,7 @@ export function bodyToHtml(content, highlights, opts) {
} }
safeBody = sanitizeHtml(body, sanitizeHtmlParams); safeBody = sanitizeHtml(body, sanitizeHtmlParams);
safeBody = unicodeToImage(safeBody); safeBody = unicodeToImage(safeBody);
safeBody = addCodeCopyButton(safeBody);
} }
finally { finally {
delete sanitizeHtmlParams.textFilter; delete sanitizeHtmlParams.textFilter;
@ -363,6 +364,23 @@ export function bodyToHtml(content, highlights, opts) {
return <span className={className} dangerouslySetInnerHTML={{ __html: safeBody }} dir="auto" />; return <span className={className} dangerouslySetInnerHTML={{ __html: safeBody }} dir="auto" />;
} }
function addCodeCopyButton(safeBody) {
// Adds 'copy' buttons to pre blocks
// Note that this only manipulates the markup to add the buttons:
// we need to add the event handlers once the nodes are in the DOM
// since we can't save functions in the markup.
// This is done in TextualBody
const el = document.createElement("div");
el.innerHTML = safeBody;
const codeBlocks = Array.from(el.getElementsByTagName("pre"));
codeBlocks.forEach(p => {
const button = document.createElement("span");
button.className = "mx_EventTile_copyButton";
p.appendChild(button);
});
return el.innerHTML;
}
export function emojifyText(text) { export function emojifyText(text) {
return { return {
__html: unicodeToImage(escape(text)), __html: unicodeToImage(escape(text)),

View file

@ -19,6 +19,7 @@ import q from 'q';
import Matrix from 'matrix-js-sdk'; import Matrix from 'matrix-js-sdk';
import MatrixClientPeg from './MatrixClientPeg'; import MatrixClientPeg from './MatrixClientPeg';
import createMatrixClient from './utils/createMatrixClient';
import Analytics from './Analytics'; import Analytics from './Analytics';
import Notifier from './Notifier'; import Notifier from './Notifier';
import UserActivity from './UserActivity'; import UserActivity from './UserActivity';
@ -34,29 +35,20 @@ import { _t } from './languageHandler';
* Called at startup, to attempt to build a logged-in Matrix session. It tries * Called at startup, to attempt to build a logged-in Matrix session. It tries
* a number of things: * a number of things:
* *
* 0. if it looks like we are in the middle of a registration process, it does
* nothing.
* *
* 1. if we have a loginToken in the (real) query params, it uses that to log * 1. if we have a guest access token in the fragment query params, it uses
* in.
*
* 2. if we have a guest access token in the fragment query params, it uses
* that. * that.
* *
* 3. if an access token is stored in local storage (from a previous session), * 2. if an access token is stored in local storage (from a previous session),
* it uses that. * it uses that.
* *
* 4. it attempts to auto-register as a guest user. * 3. it attempts to auto-register as a guest user.
* *
* If any of steps 1-4 are successful, it will call {setLoggedIn}, which in * If any of steps 1-4 are successful, it will call {_doSetLoggedIn}, which in
* turn will raise on_logged_in and will_start_client events. * turn will raise on_logged_in and will_start_client events.
* *
* @param {object} opts * @param {object} opts
* *
* @param {object} opts.realQueryParams: string->string map of the
* query-parameters extracted from the real query-string of the starting
* URI.
*
* @param {object} opts.fragmentQueryParams: string->string map of the * @param {object} opts.fragmentQueryParams: string->string map of the
* query-parameters extracted from the #-fragment of the starting URI. * query-parameters extracted from the #-fragment of the starting URI.
* *
@ -70,54 +62,38 @@ import { _t } from './languageHandler';
* true; defines the IS to use. * true; defines the IS to use.
* *
* @returns {Promise} a promise which resolves when the above process completes. * @returns {Promise} a promise which resolves when the above process completes.
* Resolves to `true` if we ended up starting a session, or `false` if we
* failed.
*/ */
export function loadSession(opts) { export function loadSession(opts) {
const realQueryParams = opts.realQueryParams || {};
const fragmentQueryParams = opts.fragmentQueryParams || {}; const fragmentQueryParams = opts.fragmentQueryParams || {};
let enableGuest = opts.enableGuest || false; let enableGuest = opts.enableGuest || false;
const guestHsUrl = opts.guestHsUrl; const guestHsUrl = opts.guestHsUrl;
const guestIsUrl = opts.guestIsUrl; const guestIsUrl = opts.guestIsUrl;
const defaultDeviceDisplayName = opts.defaultDeviceDisplayName; const defaultDeviceDisplayName = opts.defaultDeviceDisplayName;
if (fragmentQueryParams.client_secret && fragmentQueryParams.sid) {
// this happens during email validation: the email contains a link to the
// IS, which in turn redirects back to vector. We let MatrixChat create a
// Registration component which completes the next stage of registration.
console.log("Not registering as guest: registration already in progress.");
return q();
}
if (!guestHsUrl) { if (!guestHsUrl) {
console.warn("Cannot enable guest access: can't determine HS URL to use"); console.warn("Cannot enable guest access: can't determine HS URL to use");
enableGuest = false; enableGuest = false;
} }
if (realQueryParams.loginToken) {
if (!realQueryParams.homeserver) {
console.warn("Cannot log in with token: can't determine HS URL to use");
} else {
return _loginWithToken(realQueryParams, defaultDeviceDisplayName);
}
}
if (enableGuest && if (enableGuest &&
fragmentQueryParams.guest_user_id && fragmentQueryParams.guest_user_id &&
fragmentQueryParams.guest_access_token fragmentQueryParams.guest_access_token
) { ) {
console.log("Using guest access credentials"); console.log("Using guest access credentials");
setLoggedIn({ return _doSetLoggedIn({
userId: fragmentQueryParams.guest_user_id, userId: fragmentQueryParams.guest_user_id,
accessToken: fragmentQueryParams.guest_access_token, accessToken: fragmentQueryParams.guest_access_token,
homeserverUrl: guestHsUrl, homeserverUrl: guestHsUrl,
identityServerUrl: guestIsUrl, identityServerUrl: guestIsUrl,
guest: true, guest: true,
}); }, true).then(() => true);
return q();
} }
return _restoreFromLocalStorage().then((success) => { return _restoreFromLocalStorage().then((success) => {
if (success) { if (success) {
return; return true;
} }
if (enableGuest) { if (enableGuest) {
@ -125,10 +101,30 @@ export function loadSession(opts) {
} }
// fall back to login screen // fall back to login screen
return false;
}); });
} }
function _loginWithToken(queryParams, defaultDeviceDisplayName) { /**
* @param {Object} queryParams string->string map of the
* query-parameters extracted from the real query-string of the starting
* URI.
*
* @param {String} defaultDeviceDisplayName
*
* @returns {Promise} promise which resolves to true if we completed the token
* login, else false
*/
export function attemptTokenLogin(queryParams, defaultDeviceDisplayName) {
if (!queryParams.loginToken) {
return q(false);
}
if (!queryParams.homeserver) {
console.warn("Cannot log in with token: can't determine HS URL to use");
return q(false);
}
// create a temporary MatrixClient to do the login // create a temporary MatrixClient to do the login
const client = Matrix.createClient({ const client = Matrix.createClient({
baseUrl: queryParams.homeserver, baseUrl: queryParams.homeserver,
@ -141,7 +137,8 @@ function _loginWithToken(queryParams, defaultDeviceDisplayName) {
}, },
).then(function(data) { ).then(function(data) {
console.log("Logged in with token"); console.log("Logged in with token");
setLoggedIn({ return _clearStorage().then(() => {
_persistCredentialsToLocalStorage({
userId: data.user_id, userId: data.user_id,
deviceId: data.device_id, deviceId: data.device_id,
accessToken: data.access_token, accessToken: data.access_token,
@ -149,9 +146,12 @@ function _loginWithToken(queryParams, defaultDeviceDisplayName) {
identityServerUrl: queryParams.identityServer, identityServerUrl: queryParams.identityServer,
guest: false, guest: false,
}); });
}, (err) => { return true;
});
}).catch((err) => {
console.error("Failed to log in with login token: " + err + " " + console.error("Failed to log in with login token: " + err + " " +
err.data); err.data);
return false;
}); });
} }
@ -172,16 +172,17 @@ function _registerAsGuest(hsUrl, isUrl, defaultDeviceDisplayName) {
}, },
}).then((creds) => { }).then((creds) => {
console.log("Registered as guest: %s", creds.user_id); console.log("Registered as guest: %s", creds.user_id);
setLoggedIn({ return _doSetLoggedIn({
userId: creds.user_id, userId: creds.user_id,
deviceId: creds.device_id, deviceId: creds.device_id,
accessToken: creds.access_token, accessToken: creds.access_token,
homeserverUrl: hsUrl, homeserverUrl: hsUrl,
identityServerUrl: isUrl, identityServerUrl: isUrl,
guest: true, guest: true,
}); }, true).then(() => true);
}, (err) => { }, (err) => {
console.error("Failed to register as guest: " + err + " " + err.data); console.error("Failed to register as guest: " + err + " " + err.data);
return false;
}); });
} }
@ -216,15 +217,14 @@ function _restoreFromLocalStorage() {
if (accessToken && userId && hsUrl) { if (accessToken && userId && hsUrl) {
console.log("Restoring session for %s", userId); console.log("Restoring session for %s", userId);
try { try {
setLoggedIn({ return _doSetLoggedIn({
userId: userId, userId: userId,
deviceId: deviceId, deviceId: deviceId,
accessToken: accessToken, accessToken: accessToken,
homeserverUrl: hsUrl, homeserverUrl: hsUrl,
identityServerUrl: isUrl, identityServerUrl: isUrl,
guest: isGuest, guest: isGuest,
}); }, false).then(() => true);
return q(true);
} catch (e) { } catch (e) {
return _handleRestoreFailure(e); return _handleRestoreFailure(e);
} }
@ -245,7 +245,7 @@ function _handleRestoreFailure(e) {
+ ' This is a once off; sorry for the inconvenience.', + ' This is a once off; sorry for the inconvenience.',
); );
_clearLocalStorage(); _clearStorage();
return q.reject(new Error( return q.reject(new Error(
_t('Unable to restore previous session') + ': ' + msg, _t('Unable to restore previous session') + ': ' + msg,
@ -266,7 +266,7 @@ function _handleRestoreFailure(e) {
return def.promise.then((success) => { return def.promise.then((success) => {
if (success) { if (success) {
// user clicked continue. // user clicked continue.
_clearLocalStorage(); _clearStorage();
return false; return false;
} }
@ -277,17 +277,40 @@ function _handleRestoreFailure(e) {
let rtsClient = null; let rtsClient = null;
export function initRtsClient(url) { export function initRtsClient(url) {
if (url) {
rtsClient = new RtsClient(url); rtsClient = new RtsClient(url);
} else {
rtsClient = null;
}
} }
/** /**
* Transitions to a logged-in state using the given credentials * Transitions to a logged-in state using the given credentials.
*
* Starts the matrix client and all other react-sdk services that
* listen for events while a session is logged in.
*
* Also stops the old MatrixClient and clears old credentials/etc out of
* storage before starting the new client.
*
* @param {MatrixClientCreds} credentials The credentials to use * @param {MatrixClientCreds} credentials The credentials to use
*/ */
export function setLoggedIn(credentials) { export function setLoggedIn(credentials) {
credentials.guest = Boolean(credentials.guest); stopMatrixClient();
_doSetLoggedIn(credentials, true);
}
Analytics.setGuest(credentials.guest); /**
* fires on_logging_in, optionally clears localstorage, persists new credentials
* to localstorage, starts the new client.
*
* @param {MatrixClientCreds} credentials
* @param {Boolean} clearStorage
*
* returns a Promise which resolves once the client has been started
*/
async function _doSetLoggedIn(credentials, clearStorage) {
credentials.guest = Boolean(credentials.guest);
console.log( console.log(
"setLoggedIn: mxid:", credentials.userId, "setLoggedIn: mxid:", credentials.userId,
@ -295,32 +318,26 @@ export function setLoggedIn(credentials) {
"guest:", credentials.guest, "guest:", credentials.guest,
"hs:", credentials.homeserverUrl, "hs:", credentials.homeserverUrl,
); );
// This is dispatched to indicate that the user is still in the process of logging in // This is dispatched to indicate that the user is still in the process of logging in
// because `teamPromise` may take some time to resolve, breaking the assumption that // because `teamPromise` may take some time to resolve, breaking the assumption that
// `setLoggedIn` takes an "instant" to complete, and dispatch `on_logged_in` a few ms // `setLoggedIn` takes an "instant" to complete, and dispatch `on_logged_in` a few ms
// later than MatrixChat might assume. // later than MatrixChat might assume.
dis.dispatch({action: 'on_logging_in'}); dis.dispatch({action: 'on_logging_in'});
if (clearStorage) {
await _clearStorage();
}
Analytics.setGuest(credentials.guest);
// Resolves by default // Resolves by default
let teamPromise = Promise.resolve(null); let teamPromise = Promise.resolve(null);
// persist the session
if (localStorage) { if (localStorage) {
try { try {
localStorage.setItem("mx_hs_url", credentials.homeserverUrl); _persistCredentialsToLocalStorage(credentials);
localStorage.setItem("mx_is_url", credentials.identityServerUrl);
localStorage.setItem("mx_user_id", credentials.userId);
localStorage.setItem("mx_access_token", credentials.accessToken);
localStorage.setItem("mx_is_guest", JSON.stringify(credentials.guest));
// if we didn't get a deviceId from the login, leave mx_device_id unset,
// rather than setting it to "undefined".
//
// (in this case MatrixClient doesn't bother with the crypto stuff
// - that's fine for us).
if (credentials.deviceId) {
localStorage.setItem("mx_device_id", credentials.deviceId);
}
// The user registered as a PWLU (PassWord-Less User), the generated password // The user registered as a PWLU (PassWord-Less User), the generated password
// is cached here such that the user can change it at a later time. // is cached here such that the user can change it at a later time.
@ -331,8 +348,6 @@ export function setLoggedIn(credentials) {
cachedPassword: credentials.password, cachedPassword: credentials.password,
}); });
} }
console.log("Session persisted for %s", credentials.userId);
} catch (e) { } catch (e) {
console.warn("Error using local storage: can't persist session!", e); console.warn("Error using local storage: can't persist session!", e);
} }
@ -349,9 +364,6 @@ export function setLoggedIn(credentials) {
console.warn("No local storage available: can't persist session!"); console.warn("No local storage available: can't persist session!");
} }
// stop any running clients before we create a new one with these new credentials
stopMatrixClient();
MatrixClientPeg.replaceUsingCreds(credentials); MatrixClientPeg.replaceUsingCreds(credentials);
teamPromise.then((teamToken) => { teamPromise.then((teamToken) => {
@ -364,6 +376,25 @@ export function setLoggedIn(credentials) {
startMatrixClient(); startMatrixClient();
} }
function _persistCredentialsToLocalStorage(credentials) {
localStorage.setItem("mx_hs_url", credentials.homeserverUrl);
localStorage.setItem("mx_is_url", credentials.identityServerUrl);
localStorage.setItem("mx_user_id", credentials.userId);
localStorage.setItem("mx_access_token", credentials.accessToken);
localStorage.setItem("mx_is_guest", JSON.stringify(credentials.guest));
// if we didn't get a deviceId from the login, leave mx_device_id unset,
// rather than setting it to "undefined".
//
// (in this case MatrixClient doesn't bother with the crypto stuff
// - that's fine for us).
if (credentials.deviceId) {
localStorage.setItem("mx_device_id", credentials.deviceId);
}
console.log("Session persisted for %s", credentials.userId);
}
/** /**
* Logs the current session out and transitions to the logged-out state * Logs the current session out and transitions to the logged-out state
*/ */
@ -400,7 +431,7 @@ export function logout() {
* Starts the matrix client and all other react-sdk services that * Starts the matrix client and all other react-sdk services that
* listen for events while a session is logged in. * listen for events while a session is logged in.
*/ */
export function startMatrixClient() { function startMatrixClient() {
// dispatch this before starting the matrix client: it's used // dispatch this before starting the matrix client: it's used
// to add listeners for the 'sync' event so otherwise we'd have // to add listeners for the 'sync' event so otherwise we'd have
// a race condition (and we need to dispatch synchronously for this // a race condition (and we need to dispatch synchronously for this
@ -416,20 +447,22 @@ export function startMatrixClient() {
} }
/* /*
* Stops a running client and all related services, used after * Stops a running client and all related services, and clears persistent
* a session has been logged out / ended. * storage. Used after a session has been logged out.
*/ */
export function onLoggedOut() { export function onLoggedOut() {
_clearLocalStorage();
stopMatrixClient(); stopMatrixClient();
_clearStorage().done();
dis.dispatch({action: 'on_logged_out'}); dis.dispatch({action: 'on_logged_out'});
} }
function _clearLocalStorage() { /**
* @returns {Promise} promise which resolves once the stores have been cleared
*/
function _clearStorage() {
Analytics.logout(); Analytics.logout();
if (!window.localStorage) {
return; if (window.localStorage) {
}
const hsUrl = window.localStorage.getItem("mx_hs_url"); const hsUrl = window.localStorage.getItem("mx_hs_url");
const isUrl = window.localStorage.getItem("mx_is_url"); const isUrl = window.localStorage.getItem("mx_is_url");
window.localStorage.clear(); window.localStorage.clear();
@ -440,10 +473,18 @@ function _clearLocalStorage() {
// NB. We do clear the device ID (as well as all the settings) // NB. We do clear the device ID (as well as all the settings)
if (hsUrl) window.localStorage.setItem("mx_hs_url", hsUrl); if (hsUrl) window.localStorage.setItem("mx_hs_url", hsUrl);
if (isUrl) window.localStorage.setItem("mx_is_url", isUrl); if (isUrl) window.localStorage.setItem("mx_is_url", isUrl);
}
// create a temporary client to clear out the persistent stores.
const cli = createMatrixClient({
// we'll never make any requests, so can pass a bogus HS URL
baseUrl: "",
});
return cli.clearStores();
} }
/** /**
* Stop all the background processes related to the current client * Stop all the background processes related to the current client.
*/ */
export function stopMatrixClient() { export function stopMatrixClient() {
Notifier.stop(); Notifier.stop();
@ -454,7 +495,6 @@ export function stopMatrixClient() {
if (cli) { if (cli) {
cli.stopClient(); cli.stopClient();
cli.removeAllListeners(); cli.removeAllListeners();
cli.store.deleteAllData();
MatrixClientPeg.unset(); MatrixClientPeg.unset();
} }
} }

View file

@ -97,11 +97,6 @@ export default class Login {
guest: true guest: true
}; };
}, (error) => { }, (error) => {
if (error.httpStatus === 403) {
error.friendlyText = _t("Guest access is disabled on this Home Server.");
} else {
error.friendlyText = _t("Failed to register as guest:") + ' ' + error.data;
}
throw error; throw error;
}); });
} }
@ -157,15 +152,7 @@ export default class Login {
accessToken: data.access_token accessToken: data.access_token
}); });
}, function(error) { }, function(error) {
if (error.httpStatus == 400 && loginParams.medium) { if (error.httpStatus === 403) {
error.friendlyText = (
_t('This Home Server does not support login using email address.')
);
}
else if (error.httpStatus === 403) {
error.friendlyText = (
_t('Incorrect username and/or password.')
);
if (self._fallbackHsUrl) { if (self._fallbackHsUrl) {
var fbClient = Matrix.createClient({ var fbClient = Matrix.createClient({
baseUrl: self._fallbackHsUrl, baseUrl: self._fallbackHsUrl,
@ -186,21 +173,23 @@ export default class Login {
}); });
} }
} }
else {
error.friendlyText = (
_t("There was a problem logging in.") + ' (HTTP ' + error.httpStatus + ")"
);
}
throw error; throw error;
}); });
} }
redirectToCas() { redirectToCas() {
var client = this._createTemporaryClient(); const client = this._createTemporaryClient();
var parsedUrl = url.parse(window.location.href, true); const parsedUrl = url.parse(window.location.href, true);
// XXX: at this point, the fragment will always be #/login, which is no
// use to anyone. Ideally, we would get the intended fragment from
// MatrixChat.screenAfterLogin so that you could follow #/room links etc
// through a CAS login.
parsedUrl.hash = "";
parsedUrl.query["homeserver"] = client.getHomeserverUrl(); parsedUrl.query["homeserver"] = client.getHomeserverUrl();
parsedUrl.query["identityServer"] = client.getIdentityServerUrl(); parsedUrl.query["identityServer"] = client.getIdentityServerUrl();
var casUrl = client.getCasLoginUrl(url.format(parsedUrl)); const casUrl = client.getCasLoginUrl(url.format(parsedUrl));
window.location.href = casUrl; window.location.href = casUrl;
} }
} }

View file

@ -16,12 +16,10 @@ limitations under the License.
'use strict'; 'use strict';
import Matrix from 'matrix-js-sdk';
import utils from 'matrix-js-sdk/lib/utils'; import utils from 'matrix-js-sdk/lib/utils';
import EventTimeline from 'matrix-js-sdk/lib/models/event-timeline'; import EventTimeline from 'matrix-js-sdk/lib/models/event-timeline';
import EventTimelineSet from 'matrix-js-sdk/lib/models/event-timeline-set'; import EventTimelineSet from 'matrix-js-sdk/lib/models/event-timeline-set';
import createMatrixClient from './utils/createMatrixClient';
const localStorage = window.localStorage;
interface MatrixClientCreds { interface MatrixClientCreds {
homeserverUrl: string, homeserverUrl: string,
@ -129,22 +127,7 @@ class MatrixClientPeg {
timelineSupport: true, timelineSupport: true,
}; };
if (localStorage) { this.matrixClient = createMatrixClient(opts);
opts.sessionStore = new Matrix.WebStorageSessionStore(localStorage);
}
if (window.indexedDB && localStorage) {
// FIXME: bodge to remove old database. Remove this after a few weeks.
window.indexedDB.deleteDatabase("matrix-js-sdk:default");
opts.store = new Matrix.IndexedDBStore({
indexedDB: window.indexedDB,
dbName: "riot-web-sync",
localStorage: localStorage,
workerScript: this.indexedDbWorkerScript,
});
}
this.matrixClient = Matrix.createClient(opts);
// we're going to add eventlisteners for each matrix event tile, so the // we're going to add eventlisteners for each matrix event tile, so the
// potential number of event listeners is quite high. // potential number of event listeners is quite high.

View file

@ -64,7 +64,6 @@ const AsyncWrapper = React.createClass({
render: function() { render: function() {
const {loader, ...otherProps} = this.props; const {loader, ...otherProps} = this.props;
if (this.state.component) { if (this.state.component) {
const Component = this.state.component; const Component = this.state.component;
return <Component {...otherProps} />; return <Component {...otherProps} />;
@ -199,4 +198,7 @@ class ModalManager {
} }
} }
export default new ModalManager(); if (!global.singletonModalManager) {
global.singletonModalManager = new ModalManager();
}
export default global.singletonModalManager;

View file

@ -144,7 +144,18 @@ export function guessDMRoomTarget(room, me) {
let oldestTs; let oldestTs;
let oldestUser; let oldestUser;
// Pick the user who's been here longest (and isn't us) // Pick the joined user who's been here longest (and isn't us),
for (const user of room.getJoinedMembers()) {
if (user.userId == me.userId) continue;
if (oldestTs === undefined || user.events.member.getTs() < oldestTs) {
oldestUser = user;
oldestTs = user.events.member.getTs();
}
}
if (oldestUser) return oldestUser;
// if there are no joined members other than us, use the oldest member
for (const user of room.currentState.getMembers()) { for (const user of room.currentState.getMembers()) {
if (user.userId == me.userId) continue; if (user.userId == me.userId) continue;

View file

@ -1,5 +1,7 @@
import 'whatwg-fetch'; import 'whatwg-fetch';
let fetchFunction = fetch;
function checkStatus(response) { function checkStatus(response) {
if (!response.ok) { if (!response.ok) {
return response.text().then((text) => { return response.text().then((text) => {
@ -31,7 +33,7 @@ const request = (url, opts) => {
opts.body = JSON.stringify(opts.body); opts.body = JSON.stringify(opts.body);
opts.headers['Content-Type'] = 'application/json'; opts.headers['Content-Type'] = 'application/json';
} }
return fetch(url, opts) return fetchFunction(url, opts)
.then(checkStatus) .then(checkStatus)
.then(parseJson); .then(parseJson);
}; };
@ -64,7 +66,7 @@ export default class RtsClient {
client_secret: clientSecret, client_secret: clientSecret,
}, },
method: 'POST', method: 'POST',
} },
); );
} }
@ -74,7 +76,7 @@ export default class RtsClient {
qs: { qs: {
team_token: teamToken, team_token: teamToken,
}, },
} },
); );
} }
@ -91,7 +93,12 @@ export default class RtsClient {
qs: { qs: {
user_id: userId, user_id: userId,
}, },
} },
); );
} }
// allow fetch to be replaced, for testing.
static setFetch(fn) {
fetchFunction = fn;
}
} }

View file

@ -13,9 +13,8 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import MatrixClientPeg from "./MatrixClientPeg";
var MatrixClientPeg = require("./MatrixClientPeg"); import CallHandler from "./CallHandler";
var CallHandler = require("./CallHandler");
import { _t } from './languageHandler'; import { _t } from './languageHandler';
import * as Roles from './Roles'; import * as Roles from './Roles';
@ -142,9 +141,21 @@ function textForCallAnswerEvent(event) {
} }
function textForCallHangupEvent(event) { function textForCallHangupEvent(event) {
var senderName = event.sender ? event.sender.name : _t('Someone'); const senderName = event.sender ? event.sender.name : _t('Someone');
var supported = MatrixClientPeg.get().supportsVoip() ? "" : _t('(not supported by this browser)'); const eventContent = event.getContent();
return _t('%(senderName)s ended the call.', {senderName: senderName}) + ' ' + supported; let reason = "";
if(!MatrixClientPeg.get().supportsVoip()) {
reason = _t('(not supported by this browser)');
} else if(eventContent.reason) {
if (eventContent.reason === "ice_failed") {
reason = _t('(could not connect media)');
} else if (eventContent.reason === "invite_timeout") {
reason = _t('(no answer)');
} else {
reason = _t('(unknown failure: %(reason)s)', {reason: eventContent.reason});
}
}
return _t('%(senderName)s ended the call.', {senderName}) + ' ' + reason;
} }
function textForCallInviteEvent(event) { function textForCallInviteEvent(event) {

View file

@ -81,11 +81,13 @@ export default React.createClass({
FileSaver.saveAs(blob, 'riot-keys.txt'); FileSaver.saveAs(blob, 'riot-keys.txt');
this.props.onFinished(true); this.props.onFinished(true);
}).catch((e) => { }).catch((e) => {
console.error("Error exporting e2e keys:", e);
if (this._unmounted) { if (this._unmounted) {
return; return;
} }
const msg = e.friendlyText || _t('Unknown error');
this.setState({ this.setState({
errStr: e.message, errStr: msg,
phase: PHASE_EDIT, phase: PHASE_EDIT,
}); });
}); });
@ -120,7 +122,7 @@ export default React.createClass({
'you have received in encrypted rooms to a local file. You ' + 'you have received in encrypted rooms to a local file. You ' +
'will then be able to import the file into another Matrix ' + 'will then be able to import the file into another Matrix ' +
'client in the future, so that client will also be able to ' + 'client in the future, so that client will also be able to ' +
'decrypt these messages.' 'decrypt these messages.',
) } ) }
</p> </p>
<p> <p>
@ -130,7 +132,7 @@ export default React.createClass({
'careful to keep it secure. To help with this, you should enter ' + 'careful to keep it secure. To help with this, you should enter ' +
'a passphrase below, which will be used to encrypt the exported ' + 'a passphrase below, which will be used to encrypt the exported ' +
'data. It will only be possible to import the data by using the ' + 'data. It will only be possible to import the data by using the ' +
'same passphrase.' 'same passphrase.',
) } ) }
</p> </p>
<div className='error'> <div className='error'>

View file

@ -89,11 +89,13 @@ export default React.createClass({
// TODO: it would probably be nice to give some feedback about what we've imported here. // TODO: it would probably be nice to give some feedback about what we've imported here.
this.props.onFinished(true); this.props.onFinished(true);
}).catch((e) => { }).catch((e) => {
console.error("Error importing e2e keys:", e);
if (this._unmounted) { if (this._unmounted) {
return; return;
} }
const msg = e.friendlyText || _t('Unknown error');
this.setState({ this.setState({
errStr: e.message, errStr: msg,
phase: PHASE_EDIT, phase: PHASE_EDIT,
}); });
}); });
@ -122,13 +124,13 @@ export default React.createClass({
'This process allows you to import encryption keys ' + 'This process allows you to import encryption keys ' +
'that you had previously exported from another Matrix ' + 'that you had previously exported from another Matrix ' +
'client. You will then be able to decrypt any ' + 'client. You will then be able to decrypt any ' +
'messages that the other client could decrypt.' 'messages that the other client could decrypt.',
) } ) }
</p> </p>
<p> <p>
{ _t( { _t(
'The export file will be protected with a passphrase. ' + 'The export file will be protected with a passphrase. ' +
'You should enter the passphrase here, to decrypt the file.' 'You should enter the passphrase here, to decrypt the file.',
) } ) }
</p> </p>
<div className='error'> <div className='error'>

View file

@ -231,7 +231,7 @@ module.exports = React.createClass({
if (curr_phase == this.phases.ERROR) { if (curr_phase == this.phases.ERROR) {
error_box = ( error_box = (
<div className="mx_Error"> <div className="mx_Error">
{_t('An error occured: %(error_string)s', {error_string: this.state.error_string})} {_t('An error occurred: %(error_string)s', {error_string: this.state.error_string})}
</div> </div>
); );
} }

View file

@ -223,10 +223,8 @@ export default React.createClass({
ref='roomView' ref='roomView'
autoJoin={this.props.autoJoin} autoJoin={this.props.autoJoin}
onRegistered={this.props.onRegistered} onRegistered={this.props.onRegistered}
eventId={this.props.initialEventId}
thirdPartyInvite={this.props.thirdPartyInvite} thirdPartyInvite={this.props.thirdPartyInvite}
oobData={this.props.roomOobData} oobData={this.props.roomOobData}
highlightedEventId={this.props.highlightedEventId}
eventPixelOffset={this.props.initialEventPixelOffset} eventPixelOffset={this.props.initialEventPixelOffset}
key={this.props.currentRoomId || 'roomview'} key={this.props.currentRoomId || 'roomview'}
opacity={this.props.middleOpacity} opacity={this.props.middleOpacity}
@ -241,7 +239,6 @@ export default React.createClass({
page_element = <UserSettings page_element = <UserSettings
onClose={this.props.onUserSettingsClose} onClose={this.props.onUserSettingsClose}
brand={this.props.config.brand} brand={this.props.config.brand}
collapsedRhs={this.props.collapse_rhs}
enableLabs={this.props.config.enableLabs} enableLabs={this.props.config.enableLabs}
referralBaseUrl={this.props.config.referralBaseUrl} referralBaseUrl={this.props.config.referralBaseUrl}
teamToken={this.props.teamToken} teamToken={this.props.teamToken}
@ -272,7 +269,6 @@ export default React.createClass({
this.props.config.teamServerConfig.teamServerURL : null; this.props.config.teamServerConfig.teamServerURL : null;
page_element = <HomePage page_element = <HomePage
collapsedRhs={this.props.collapse_rhs}
teamServerUrl={teamServerUrl} teamServerUrl={teamServerUrl}
teamToken={this.props.teamToken} teamToken={this.props.teamToken}
homePageUrl={this.props.config.welcomePageUrl} homePageUrl={this.props.config.welcomePageUrl}

View file

@ -35,7 +35,7 @@ import * as Rooms from '../../Rooms';
import linkifyMatrix from "../../linkify-matrix"; import linkifyMatrix from "../../linkify-matrix";
import * as Lifecycle from '../../Lifecycle'; import * as Lifecycle from '../../Lifecycle';
// LifecycleStore is not used but does listen to and dispatch actions // LifecycleStore is not used but does listen to and dispatch actions
import LifecycleStore from '../../stores/LifecycleStore'; require('../../stores/LifecycleStore');
import RoomViewStore from '../../stores/RoomViewStore'; import RoomViewStore from '../../stores/RoomViewStore';
import PageTypes from '../../PageTypes'; import PageTypes from '../../PageTypes';
@ -44,7 +44,41 @@ import * as UDEHandler from '../../UnknownDeviceErrorHandler';
import KeyRequestHandler from '../../KeyRequestHandler'; import KeyRequestHandler from '../../KeyRequestHandler';
import { _t, getCurrentLanguage } from '../../languageHandler'; import { _t, getCurrentLanguage } from '../../languageHandler';
/** constants for MatrixChat.state.view */
const VIEWS = {
// a special initial state which is only used at startup, while we are
// trying to re-animate a matrix client or register as a guest.
LOADING: 0,
// we are showing the login view
LOGIN: 1,
// we are showing the registration view
REGISTER: 2,
// completeing the registration flow
POST_REGISTRATION: 3,
// showing the 'forgot password' view
FORGOT_PASSWORD: 4,
// we have valid matrix credentials (either via an explicit login, via the
// initial re-animation/guest registration, or via a registration), and are
// now setting up a matrixclient to talk to it. This isn't an instant
// process because (a) we need to clear out indexeddb, and (b) we need to
// talk to the team server; while it is going on we show a big spinner.
LOGGING_IN: 5,
// we are logged in with an active matrix client.
LOGGED_IN: 6,
};
module.exports = React.createClass({ module.exports = React.createClass({
// we export this so that the integration tests can use it :-S
statics: {
VIEWS: VIEWS,
},
displayName: 'MatrixChat', displayName: 'MatrixChat',
propTypes: { propTypes: {
@ -60,8 +94,8 @@ module.exports = React.createClass({
// the initial queryParams extracted from the hash-fragment of the URI // the initial queryParams extracted from the hash-fragment of the URI
startingFragmentQueryParams: React.PropTypes.object, startingFragmentQueryParams: React.PropTypes.object,
// called when the session load completes // called when we have completed a token login
onLoadCompleted: React.PropTypes.func, onTokenLoginCompleted: React.PropTypes.func,
// Represents the screen to display as a result of parsing the initial // Represents the screen to display as a result of parsing the initial
// window.location // window.location
@ -94,8 +128,10 @@ module.exports = React.createClass({
getInitialState: function() { getInitialState: function() {
const s = { const s = {
loading: true, // the master view we are showing.
screen: undefined, view: VIEWS.LOADING,
// a thing to call showScreen with once login completes.
screenAfterLogin: this.props.initialScreenAfterLogin, screenAfterLogin: this.props.initialScreenAfterLogin,
// Stashed guest credentials if the user logs out // Stashed guest credentials if the user logs out
@ -114,8 +150,6 @@ module.exports = React.createClass({
// If we're trying to just view a user ID (i.e. /user URL), this is it // If we're trying to just view a user ID (i.e. /user URL), this is it
viewUserId: null, viewUserId: null,
loggedIn: false,
loggingIn: false,
collapse_lhs: false, collapse_lhs: false,
collapse_rhs: false, collapse_rhs: false,
ready: false, ready: false,
@ -129,11 +163,6 @@ module.exports = React.createClass({
hasNewVersion: false, hasNewVersion: false,
newVersionReleaseNotes: null, newVersionReleaseNotes: null,
// The username to default to when upgrading an account from a guest
upgradeUsername: null,
// The access token we had for our guest account, used when upgrading to a normal account
guestAccessToken: null,
// Parameters used in the registration dance with the IS // Parameters used in the registration dance with the IS
register_client_secret: null, register_client_secret: null,
register_session_id: null, register_session_id: null,
@ -149,7 +178,7 @@ module.exports = React.createClass({
realQueryParams: {}, realQueryParams: {},
startingFragmentQueryParams: {}, startingFragmentQueryParams: {},
config: {}, config: {},
onLoadCompleted: () => {}, onTokenLoginCompleted: () => {},
}; };
}, },
@ -192,7 +221,7 @@ module.exports = React.createClass({
componentWillMount: function() { componentWillMount: function() {
SdkConfig.put(this.props.config); SdkConfig.put(this.props.config);
RoomViewStore.addListener(this._onRoomViewStoreUpdated); this._roomViewStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdated);
this._onRoomViewStoreUpdated(); this._onRoomViewStoreUpdated();
if (!UserSettingsStore.getLocalSetting('analyticsOptOut', false)) Analytics.enable(); if (!UserSettingsStore.getLocalSetting('analyticsOptOut', false)) Analytics.enable();
@ -269,17 +298,36 @@ module.exports = React.createClass({
window.addEventListener('resize', this.handleResize); window.addEventListener('resize', this.handleResize);
this.handleResize(); this.handleResize();
if (this.props.config.teamServerConfig && const teamServerConfig = this.props.config.teamServerConfig || {};
this.props.config.teamServerConfig.teamServerURL Lifecycle.initRtsClient(teamServerConfig.teamServerURL);
) {
Lifecycle.initRtsClient(this.props.config.teamServerConfig.teamServerURL); // the first thing to do is to try the token params in the query-string
Lifecycle.attemptTokenLogin(this.props.realQueryParams).then((loggedIn) => {
if(loggedIn) {
this.props.onTokenLoginCompleted();
// don't do anything else until the page reloads - just stay in
// the 'loading' state.
return;
}
// if the user has followed a login or register link, don't reanimate
// the old creds, but rather go straight to the relevant page
const firstScreen = this.state.screenAfterLogin ?
this.state.screenAfterLogin.screen : null;
if (firstScreen === 'login' ||
firstScreen === 'register' ||
firstScreen === 'forgot_password') {
this.setState({loading: false});
this._showScreenAfterLogin();
return;
} }
// the extra q() ensures that synchronous exceptions hit the same codepath as // the extra q() ensures that synchronous exceptions hit the same codepath as
// asynchronous ones. // asynchronous ones.
q().then(() => { return q().then(() => {
return Lifecycle.loadSession({ return Lifecycle.loadSession({
realQueryParams: this.props.realQueryParams,
fragmentQueryParams: this.props.startingFragmentQueryParams, fragmentQueryParams: this.props.startingFragmentQueryParams,
enableGuest: this.props.enableGuest, enableGuest: this.props.enableGuest,
guestHsUrl: this.getCurrentHsUrl(), guestHsUrl: this.getCurrentHsUrl(),
@ -288,11 +336,14 @@ module.exports = React.createClass({
}); });
}).catch((e) => { }).catch((e) => {
console.error("Unable to load session", e); console.error("Unable to load session", e);
}).done(()=>{ return false;
// stuff this through the dispatcher so that it happens }).then((loadedSession) => {
// after the on_logged_in action. if (!loadedSession) {
dis.dispatch({action: 'load_completed'}); // fall back to showing the login screen
dis.dispatch({action: "start_login"});
}
}); });
}).done();
}, },
componentWillUnmount: function() { componentWillUnmount: function() {
@ -301,6 +352,7 @@ module.exports = React.createClass({
UDEHandler.stopListening(); UDEHandler.stopListening();
window.removeEventListener("focus", this.onFocus); window.removeEventListener("focus", this.onFocus);
window.removeEventListener('resize', this.handleResize); window.removeEventListener('resize', this.handleResize);
this._roomViewStoreToken.remove();
}, },
componentDidUpdate: function() { componentDidUpdate: function() {
@ -310,20 +362,19 @@ module.exports = React.createClass({
} }
}, },
setStateForNewScreen: function(state) { setStateForNewView: function(state) {
if (state.view === undefined) {
throw new Error("setStateForNewView with no view!");
}
const newState = { const newState = {
screen: undefined,
viewUserId: null, viewUserId: null,
loggedIn: false,
ready: false,
upgradeUsername: null,
guestAccessToken: null,
}; };
Object.assign(newState, state); Object.assign(newState, state);
this.setState(newState); this.setState(newState);
}, },
onAction: function(payload) { onAction: function(payload) {
// console.log(`MatrixClientPeg.onAction: ${payload.action}`);
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
@ -342,38 +393,19 @@ module.exports = React.createClass({
guestCreds: MatrixClientPeg.getCredentials(), guestCreds: MatrixClientPeg.getCredentials(),
}); });
} }
this.setStateForNewScreen({ this.setStateForNewView({
screen: 'login', view: VIEWS.LOGIN,
}); });
this.notifyNewScreen('login'); this.notifyNewScreen('login');
break; break;
case 'start_post_registration': case 'start_post_registration':
this.setState({ // don't clobber loggedIn status this.setState({
screen: 'post_registration', view: VIEWS.POST_REGISTRATION,
}); });
break; break;
case 'start_upgrade_registration':
// also stash our credentials, then if we restore the session,
// we can just do it the same way whether we started upgrade
// registration or explicitly logged out
this.setStateForNewScreen({
guestCreds: MatrixClientPeg.getCredentials(),
screen: "register",
upgradeUsername: MatrixClientPeg.get().getUserIdLocalpart(),
guestAccessToken: MatrixClientPeg.get().getAccessToken(),
});
// stop the client: if we are syncing whilst the registration
// is completed in another browser, we'll be 401ed for using
// a guest access token for a non-guest account.
// It will be restarted in onReturnToGuestClick
Lifecycle.stopMatrixClient();
this.notifyNewScreen('register');
break;
case 'start_password_recovery': case 'start_password_recovery':
this.setStateForNewScreen({ this.setStateForNewView({
screen: 'forgot_password', view: VIEWS.FORGOT_PASSWORD,
}); });
this.notifyNewScreen('forgot_password'); this.notifyNewScreen('forgot_password');
break; break;
@ -397,7 +429,7 @@ module.exports = React.createClass({
MatrixClientPeg.get().leave(payload.room_id).done(() => { MatrixClientPeg.get().leave(payload.room_id).done(() => {
modal.close(); modal.close();
if (this.currentRoomId === payload.room_id) { if (this.state.currentRoomId === payload.room_id) {
dis.dispatch({action: 'view_next_room'}); dis.dispatch({action: 'view_next_room'});
} }
}, (err) => { }, (err) => {
@ -467,7 +499,7 @@ module.exports = React.createClass({
this.notifyNewScreen('home'); this.notifyNewScreen('home');
break; break;
case 'view_set_mxid': case 'view_set_mxid':
this._setMxId(); this._setMxId(payload);
break; break;
case 'view_start_chat_or_reuse': case 'view_start_chat_or_reuse':
this._chatCreateOrReuse(payload.user_id); this._chatCreateOrReuse(payload.user_id);
@ -517,7 +549,10 @@ module.exports = React.createClass({
// and also that we're not ready (we'll be marked as logged // and also that we're not ready (we'll be marked as logged
// in once the login completes, then ready once the sync // in once the login completes, then ready once the sync
// completes). // completes).
this.setState({loggingIn: true, ready: false}); this.setStateForNewView({
view: VIEWS.LOGGING_IN,
ready: false,
});
break; break;
case 'on_logged_in': case 'on_logged_in':
this._onLoggedIn(payload.teamToken); this._onLoggedIn(payload.teamToken);
@ -528,15 +563,15 @@ module.exports = React.createClass({
case 'will_start_client': case 'will_start_client':
this._onWillStartClient(); this._onWillStartClient();
break; break;
case 'load_completed':
this._onLoadCompleted();
break;
case 'new_version': case 'new_version':
this.onVersion( this.onVersion(
payload.currentVersion, payload.newVersion, payload.currentVersion, payload.newVersion,
payload.releaseNotes, payload.releaseNotes,
); );
break; break;
case 'send_event':
this.onSendEvent(payload.room_id, payload.event);
break;
} }
}, },
@ -551,8 +586,8 @@ module.exports = React.createClass({
}, },
_startRegistration: function(params) { _startRegistration: function(params) {
this.setStateForNewScreen({ this.setStateForNewView({
screen: 'register', view: VIEWS.REGISTER,
// these params may be undefined, but if they are, // these params may be undefined, but if they are,
// unset them from our state: we don't want to // unset them from our state: we don't want to
// resume a previous registration session if the // resume a previous registration session if the
@ -571,6 +606,15 @@ module.exports = React.createClass({
const allRooms = RoomListSorter.mostRecentActivityFirst( const allRooms = RoomListSorter.mostRecentActivityFirst(
MatrixClientPeg.get().getRooms(), MatrixClientPeg.get().getRooms(),
); );
// If there are 0 rooms or 1 room, view the home page because otherwise
// if there are 0, we end up trying to index into an empty array, and
// if there is 1, we end up viewing the same room.
if (allRooms.length < 2) {
dis.dispatch({
action: 'view_home_page',
});
return;
}
let roomIndex = -1; let roomIndex = -1;
for (let i = 0; i < allRooms.length; ++i) { for (let i = 0; i < allRooms.length; ++i) {
if (allRooms[i].roomId == this.state.currentRoomId) { if (allRooms[i].roomId == this.state.currentRoomId) {
@ -608,6 +652,8 @@ module.exports = React.createClass({
// @param {boolean=} roomInfo.show_settings Makes RoomView show the room settings dialog. // @param {boolean=} roomInfo.show_settings Makes RoomView show the room settings dialog.
// @param {string=} roomInfo.event_id ID of the event in this room to show: this will cause a switch to the // @param {string=} roomInfo.event_id ID of the event in this room to show: this will cause a switch to the
// context of that particular event. // context of that particular event.
// @param {boolean=} roomInfo.highlighted If true, add event_id to the hash of the URL
// and alter the EventTile to appear highlighted.
// @param {Object=} roomInfo.third_party_invite Object containing data about the third party // @param {Object=} roomInfo.third_party_invite Object containing data about the third party
// we received to join the room, if any. // we received to join the room, if any.
// @param {string=} roomInfo.third_party_invite.inviteSignUrl 3pid invite sign URL // @param {string=} roomInfo.third_party_invite.inviteSignUrl 3pid invite sign URL
@ -619,30 +665,21 @@ module.exports = React.createClass({
this.focusComposer = true; this.focusComposer = true;
const newState = { const newState = {
initialEventId: roomInfo.event_id,
highlightedEventId: roomInfo.event_id,
initialEventPixelOffset: undefined,
page_type: PageTypes.RoomView, page_type: PageTypes.RoomView,
thirdPartyInvite: roomInfo.third_party_invite, thirdPartyInvite: roomInfo.third_party_invite,
roomOobData: roomInfo.oob_data, roomOobData: roomInfo.oob_data,
currentRoomAlias: roomInfo.room_alias,
autoJoin: roomInfo.auto_join, autoJoin: roomInfo.auto_join,
}; };
if (!roomInfo.room_alias) { if (roomInfo.room_alias) {
newState.currentRoomId = roomInfo.room_id; console.log(
} `Switching to room alias ${roomInfo.room_alias} at event ` +
roomInfo.event_id,
// if we aren't given an explicit event id, look for one in the );
// scrollStateMap. } else {
// console.log(`Switching to room id ${roomInfo.room_id} at event ` +
// TODO: do this in RoomView rather than here roomInfo.event_id,
if (!roomInfo.event_id && this.refs.loggedInView) { );
const scrollState = this.refs.loggedInView.getScrollStateForRoom(roomInfo.room_id);
if (scrollState) {
newState.initialEventId = scrollState.focussedEvent;
newState.initialEventPixelOffset = scrollState.pixelOffset;
}
} }
// Wait for the first sync to complete so that if a room does have an alias, // Wait for the first sync to complete so that if a room does have an alias,
@ -670,7 +707,7 @@ module.exports = React.createClass({
} }
} }
if (roomInfo.event_id) { if (roomInfo.event_id && roomInfo.highlighted) {
presentedId += "/" + roomInfo.event_id; presentedId += "/" + roomInfo.event_id;
} }
this.notifyNewScreen('room/' + presentedId); this.notifyNewScreen('room/' + presentedId);
@ -679,7 +716,7 @@ module.exports = React.createClass({
}); });
}, },
_setMxId: function() { _setMxId: function(payload) {
const SetMxIdDialog = sdk.getComponent('views.dialogs.SetMxIdDialog'); const SetMxIdDialog = sdk.getComponent('views.dialogs.SetMxIdDialog');
const close = Modal.createDialog(SetMxIdDialog, { const close = Modal.createDialog(SetMxIdDialog, {
homeserverUrl: MatrixClientPeg.get().getHomeserverUrl(), homeserverUrl: MatrixClientPeg.get().getHomeserverUrl(),
@ -688,6 +725,11 @@ module.exports = React.createClass({
dis.dispatch({ dis.dispatch({
action: 'cancel_after_sync_prepared', action: 'cancel_after_sync_prepared',
}); });
if (payload.go_home_on_cancel) {
dis.dispatch({
action: 'view_home_page',
});
}
return; return;
} }
this.onRegistered(credentials); this.onRegistered(credentials);
@ -739,8 +781,8 @@ module.exports = React.createClass({
title: _t('Create Room'), title: _t('Create Room'),
description: _t('Room name (optional)'), description: _t('Room name (optional)'),
button: _t('Create Room'), button: _t('Create Room'),
onFinished: (should_create, name) => { onFinished: (shouldCreate, name) => {
if (should_create) { if (shouldCreate) {
const createOpts = {}; const createOpts = {};
if (name) createOpts.name = name; if (name) createOpts.name = name;
createRoom({createOpts}).done(); createRoom({createOpts}).done();
@ -768,6 +810,11 @@ module.exports = React.createClass({
} }
dis.dispatch({ dis.dispatch({
action: 'view_set_mxid', action: 'view_set_mxid',
// If the set_mxid dialog is cancelled, view /home because if the browser
// was pointing at /user/@someone:domain?action=chat, the URL needs to be
// reset so that they can revisit /user/.. // (and trigger
// `_chatCreateOrReuse` again)
go_home_on_cancel: true,
}); });
return; return;
} }
@ -848,22 +895,6 @@ module.exports = React.createClass({
}); });
}, },
/**
* Called when the sessionloader has finished
*/
_onLoadCompleted: function() {
this.props.onLoadCompleted();
this.setState({loading: false});
// Show screens (like 'register') that need to be shown without _onLoggedIn
// being called. 'register' needs to be routed here when the email confirmation
// link is clicked on.
if (this.state.screenAfterLogin &&
['register'].indexOf(this.state.screenAfterLogin.screen) !== -1) {
this._showScreenAfterLogin();
}
},
/** /**
* Called whenever someone changes the theme * Called whenever someone changes the theme
* *
@ -916,9 +947,8 @@ module.exports = React.createClass({
*/ */
_onLoggedIn: function(teamToken) { _onLoggedIn: function(teamToken) {
this.setState({ this.setState({
view: VIEWS.LOGGED_IN,
guestCreds: null, guestCreds: null,
loggedIn: true,
loggingIn: false,
}); });
if (teamToken) { if (teamToken) {
@ -960,6 +990,7 @@ module.exports = React.createClass({
this.state.screenAfterLogin.screen, this.state.screenAfterLogin.screen,
this.state.screenAfterLogin.params, this.state.screenAfterLogin.params,
); );
// XXX: is this necessary? `showScreen` should do it for us.
this.notifyNewScreen(this.state.screenAfterLogin.screen); this.notifyNewScreen(this.state.screenAfterLogin.screen);
this.setState({screenAfterLogin: null}); this.setState({screenAfterLogin: null});
} else if (localStorage && localStorage.getItem('mx_last_room_id')) { } else if (localStorage && localStorage.getItem('mx_last_room_id')) {
@ -978,8 +1009,8 @@ module.exports = React.createClass({
*/ */
_onLoggedOut: function() { _onLoggedOut: function() {
this.notifyNewScreen('login'); this.notifyNewScreen('login');
this.setStateForNewScreen({ this.setStateForNewView({
loggedIn: false, view: VIEWS.LOGIN,
ready: false, ready: false,
collapse_lhs: false, collapse_lhs: false,
collapse_rhs: false, collapse_rhs: false,
@ -1135,6 +1166,10 @@ module.exports = React.createClass({
const payload = { const payload = {
action: 'view_room', action: 'view_room',
event_id: eventId, event_id: eventId,
// If an event ID is given in the URL hash, notify RoomViewStore to mark
// it as highlighted, which will propagate to RoomView and highlight the
// associated EventTile.
highlighted: Boolean(eventId),
third_party_invite: thirdPartyInvite, third_party_invite: thirdPartyInvite,
oob_data: oobData, oob_data: oobData,
}; };
@ -1146,7 +1181,7 @@ module.exports = React.createClass({
// we can't view a room unless we're logged in // we can't view a room unless we're logged in
// (a guest account is fine) // (a guest account is fine)
if (this.state.loggedIn) { if (this.state.view === VIEWS.LOGGED_IN) {
dis.dispatch(payload); dis.dispatch(payload);
} }
} else if (screen.indexOf('user/') == 0) { } else if (screen.indexOf('user/') == 0) {
@ -1247,6 +1282,8 @@ module.exports = React.createClass({
onReturnToGuestClick: function() { onReturnToGuestClick: function() {
// reanimate our guest login // reanimate our guest login
if (this.state.guestCreds) { if (this.state.guestCreds) {
// TODO: this is probably a bit broken - we don't want to be
// clearing storage when we reanimate the guest creds.
Lifecycle.setLoggedIn(this.state.guestCreds); Lifecycle.setLoggedIn(this.state.guestCreds);
this.setState({guestCreds: null}); this.setState({guestCreds: null});
} }
@ -1264,7 +1301,7 @@ module.exports = React.createClass({
onFinishPostRegistration: function() { onFinishPostRegistration: function() {
// Don't confuse this with "PageType" which is the middle window to show // Don't confuse this with "PageType" which is the middle window to show
this.setState({ this.setState({
screen: undefined, view: VIEWS.LOGGED_IN,
}); });
this.showScreen("settings"); this.showScreen("settings");
}, },
@ -1278,6 +1315,27 @@ module.exports = React.createClass({
}); });
}, },
onSendEvent: function(roomId, event) {
const cli = MatrixClientPeg.get();
if (!cli) {
dis.dispatch({action: 'message_send_failed'});
return;
}
cli.sendEvent(roomId, event.getType(), event.getContent()).done(() => {
dis.dispatch({action: 'message_sent'});
}, (err) => {
if (err.name === 'UnknownDeviceError') {
dis.dispatch({
action: 'unknown_device_error',
err: err,
room: cli.getRoom(roomId),
});
}
dis.dispatch({action: 'message_send_failed'});
});
},
updateStatusIndicator: function(state, prevState) { updateStatusIndicator: function(state, prevState) {
let notifCount = 0; let notifCount = 0;
@ -1319,7 +1377,7 @@ module.exports = React.createClass({
}); });
} else { } else {
dis.dispatch({ dis.dispatch({
action: 'view_room_directory', action: 'view_home_page',
}); });
} }
}, },
@ -1332,11 +1390,9 @@ module.exports = React.createClass({
}, },
render: function() { render: function() {
// `loading` might be set to false before `loggedIn = true`, causing the default // console.log(`Rendering MatrixChat with view ${this.state.view}`);
// (`<Login>`) to be visible for a few MS (say, whilst a request is in-flight to
// the RTS). So in the meantime, use `loggingIn`, which is true between if (this.state.view === VIEWS.LOADING || this.state.view === VIEWS.LOGGING_IN) {
// actions `on_logging_in` and `on_logged_in`.
if (this.state.loading || this.state.loggingIn) {
const Spinner = sdk.getComponent('elements.Spinner'); const Spinner = sdk.getComponent('elements.Spinner');
return ( return (
<div className="mx_MatrixChat_splash"> <div className="mx_MatrixChat_splash">
@ -1346,7 +1402,7 @@ module.exports = React.createClass({
} }
// needs to be before normal PageTypes as you are logged in technically // needs to be before normal PageTypes as you are logged in technically
if (this.state.screen == 'post_registration') { if (this.state.view === VIEWS.POST_REGISTRATION) {
const PostRegistration = sdk.getComponent('structures.login.PostRegistration'); const PostRegistration = sdk.getComponent('structures.login.PostRegistration');
return ( return (
<PostRegistration <PostRegistration
@ -1354,10 +1410,11 @@ module.exports = React.createClass({
); );
} }
// `ready` and `loggedIn` may be set before `page_type` (because the if (this.state.view === VIEWS.LOGGED_IN) {
// `ready` and `view==LOGGED_IN` may be set before `page_type` (because the
// latter is set via the dispatcher). If we don't yet have a `page_type`, // latter is set via the dispatcher). If we don't yet have a `page_type`,
// keep showing the spinner for now. // keep showing the spinner for now.
if (this.state.loggedIn && this.state.ready && this.state.page_type) { if (this.state.ready && this.state.page_type) {
/* for now, we stuff the entirety of our props and state into the LoggedInView. /* for now, we stuff the entirety of our props and state into the LoggedInView.
* we should go through and figure out what we actually need to pass down, as well * we should go through and figure out what we actually need to pass down, as well
* as using something like redux to avoid having a billion bits of state kicking around. * as using something like redux to avoid having a billion bits of state kicking around.
@ -1374,7 +1431,7 @@ module.exports = React.createClass({
{...this.state} {...this.state}
/> />
); );
} else if (this.state.loggedIn) { } else {
// we think we are logged in, but are still waiting for the /sync to complete // we think we are logged in, but are still waiting for the /sync to complete
const Spinner = sdk.getComponent('elements.Spinner'); const Spinner = sdk.getComponent('elements.Spinner');
return ( return (
@ -1385,7 +1442,10 @@ module.exports = React.createClass({
</a> </a>
</div> </div>
); );
} else if (this.state.screen == 'register') { }
}
if (this.state.view === VIEWS.REGISTER) {
const Registration = sdk.getComponent('structures.login.Registration'); const Registration = sdk.getComponent('structures.login.Registration');
return ( return (
<Registration <Registration
@ -1394,8 +1454,6 @@ module.exports = React.createClass({
idSid={this.state.register_id_sid} idSid={this.state.register_id_sid}
email={this.props.startingFragmentQueryParams.email} email={this.props.startingFragmentQueryParams.email}
referrer={this.props.startingFragmentQueryParams.referrer} referrer={this.props.startingFragmentQueryParams.referrer}
username={this.state.upgradeUsername}
guestAccessToken={this.state.guestAccessToken}
defaultHsUrl={this.getDefaultHsUrl()} defaultHsUrl={this.getDefaultHsUrl()}
defaultIsUrl={this.getDefaultIsUrl()} defaultIsUrl={this.getDefaultIsUrl()}
brand={this.props.config.brand} brand={this.props.config.brand}
@ -1410,7 +1468,10 @@ module.exports = React.createClass({
onCancelClick={this.state.guestCreds ? this.onReturnToGuestClick : null} onCancelClick={this.state.guestCreds ? this.onReturnToGuestClick : null}
/> />
); );
} else if (this.state.screen == 'forgot_password') { }
if (this.state.view === VIEWS.FORGOT_PASSWORD) {
const ForgotPassword = sdk.getComponent('structures.login.ForgotPassword'); const ForgotPassword = sdk.getComponent('structures.login.ForgotPassword');
return ( return (
<ForgotPassword <ForgotPassword
@ -1422,7 +1483,9 @@ module.exports = React.createClass({
onRegisterClick={this.onRegisterClick} onRegisterClick={this.onRegisterClick}
onLoginClick={this.onLoginClick} /> onLoginClick={this.onLoginClick} />
); );
} else { }
if (this.state.view === VIEWS.LOGIN) {
const Login = sdk.getComponent('structures.login.Login'); const Login = sdk.getComponent('structures.login.Login');
return ( return (
<Login <Login
@ -1440,5 +1503,7 @@ module.exports = React.createClass({
/> />
); );
} }
console.error(`Unknown view ${this.state.view}`);
}, },
}); });

View file

@ -83,36 +83,8 @@ module.exports = React.createClass({
// * invited us tovthe room // * invited us tovthe room
oobData: React.PropTypes.object, oobData: React.PropTypes.object,
// id of an event to jump to. If not given, will go to the end of the
// live timeline.
eventId: React.PropTypes.string,
// where to position the event given by eventId, in pixels from the
// bottom of the viewport. If not given, will try to put the event
// 1/3 of the way down the viewport.
eventPixelOffset: React.PropTypes.number,
// ID of an event to highlight. If undefined, no event will be highlighted.
// Typically this will either be the same as 'eventId', or undefined.
highlightedEventId: React.PropTypes.string,
// is the RightPanel collapsed? // is the RightPanel collapsed?
collapsedRhs: React.PropTypes.bool, collapsedRhs: React.PropTypes.bool,
// a map from room id to scroll state, which will be updated on unmount.
//
// If there is no special scroll state (ie, we are following the live
// timeline), the scroll state is null. Otherwise, it is an object with
// the following properties:
//
// focussedEvent: the ID of the 'focussed' event. Typically this is
// the last event fully visible in the viewport, though if we
// have done an explicit scroll to an explicit event, it will be
// that event.
//
// pixelOffset: the number of pixels the window is scrolled down
// from the focussedEvent.
scrollStateMap: React.PropTypes.object,
}, },
getInitialState: function() { getInitialState: function() {
@ -121,6 +93,14 @@ module.exports = React.createClass({
roomId: null, roomId: null,
roomLoading: true, roomLoading: true,
peekLoading: false, peekLoading: false,
shouldPeek: true,
// The event to be scrolled to initially
initialEventId: null,
// The offset in pixels from the event with which to scroll vertically
initialEventPixelOffset: null,
// Whether to highlight the event scrolled to
isInitialEventHighlighted: null,
forwardingEvent: null, forwardingEvent: null,
editingRoomSettings: false, editingRoomSettings: false,
@ -180,15 +160,59 @@ module.exports = React.createClass({
if (this.unmounted) { if (this.unmounted) {
return; return;
} }
this.setState({ const newState = {
roomId: RoomViewStore.getRoomId(), roomId: RoomViewStore.getRoomId(),
roomAlias: RoomViewStore.getRoomAlias(), roomAlias: RoomViewStore.getRoomAlias(),
roomLoading: RoomViewStore.isRoomLoading(), roomLoading: RoomViewStore.isRoomLoading(),
roomLoadError: RoomViewStore.getRoomLoadError(), roomLoadError: RoomViewStore.getRoomLoadError(),
joining: RoomViewStore.isJoining(), joining: RoomViewStore.isJoining(),
}, () => { initialEventId: RoomViewStore.getInitialEventId(),
initialEventPixelOffset: RoomViewStore.getInitialEventPixelOffset(),
isInitialEventHighlighted: RoomViewStore.isInitialEventHighlighted(),
forwardingEvent: RoomViewStore.getForwardingEvent(),
shouldPeek: RoomViewStore.shouldPeek(),
};
// finished joining, start waiting for a room and show a spinner. See onRoom.
newState.waitingForRoom = this.state.joining && !newState.joining &&
!RoomViewStore.getJoinError();
// Temporary logging to diagnose https://github.com/vector-im/riot-web/issues/4307
console.log(
'RVS update:',
newState.roomId,
newState.roomAlias,
'loading?', newState.roomLoading,
'joining?', newState.joining,
'initial?', initial,
'waiting?', newState.waitingForRoom,
'shouldPeek?', newState.shouldPeek,
);
// NB: This does assume that the roomID will not change for the lifetime of
// the RoomView instance
if (initial) {
newState.room = MatrixClientPeg.get().getRoom(newState.roomId);
}
// Clear the search results when clicking a search result (which changes the
// currently scrolled to event, this.state.initialEventId).
if (this.state.initialEventId !== newState.initialEventId) {
newState.searchResults = null;
}
// Store the scroll state for the previous room so that we can return to this
// position when viewing this room in future.
if (this.state.roomId !== newState.roomId) {
this._updateScrollMap(this.state.roomId);
}
this.setState(newState, () => {
// At this point, this.state.roomId could be null (e.g. the alias might not
// have been resolved yet) so anything called here must handle this case.
if (initial) {
this._onHaveRoom(); this._onHaveRoom();
this.onRoom(MatrixClientPeg.get().getRoom(this.state.roomId)); }
}); });
}, },
@ -204,25 +228,24 @@ module.exports = React.createClass({
// which must be by alias or invite wherever possible (peeking currently does // which must be by alias or invite wherever possible (peeking currently does
// not work over federation). // not work over federation).
// NB. We peek if we are not in the room, although if we try to peek into // NB. We peek if we have never seen the room before (i.e. js-sdk does not know
// a room in which we have a member event (ie. we've left) synapse will just // about it). We don't peek in the historical case where we were joined but are
// send us the same data as we get in the sync (ie. the last events we saw). // now not joined because the js-sdk peeking API will clobber our historical room,
const room = MatrixClientPeg.get().getRoom(this.state.roomId); // making it impossible to indicate a newly joined room.
let isUserJoined = null; const room = this.state.room;
if (room) { if (room) {
isUserJoined = room.hasMembershipState(
MatrixClientPeg.get().credentials.userId, 'join',
);
this._updateAutoComplete(room); this._updateAutoComplete(room);
this.tabComplete.loadEntries(room); this.tabComplete.loadEntries(room);
this.setState({
unsentMessageError: this._getUnsentMessageError(room),
});
this._onRoomLoaded(room);
} }
if (!isUserJoined && !this.state.joining && this.state.roomId) { if (!this.state.joining && this.state.roomId) {
if (this.props.autoJoin) { if (this.props.autoJoin) {
this.onJoinButtonClicked(); this.onJoinButtonClicked();
} else if (this.state.roomId) { } else if (!room && this.state.shouldPeek) {
console.log("Attempting to peek into room %s", this.state.roomId); console.log("Attempting to peek into room %s", this.state.roomId);
this.setState({ this.setState({
peekLoading: true, peekLoading: true,
}); });
@ -246,12 +269,9 @@ module.exports = React.createClass({
} }
}).done(); }).done();
} }
} else if (isUserJoined) { } else if (room) {
// Stop peeking because we have joined this room previously
MatrixClientPeg.get().stopPeeking(); MatrixClientPeg.get().stopPeeking();
this.setState({
unsentMessageError: this._getUnsentMessageError(room),
});
this._onRoomLoaded(room);
} }
}, },
@ -287,13 +307,6 @@ module.exports = React.createClass({
} }
}, },
componentWillReceiveProps: function(newProps) {
if (newProps.eventId != this.props.eventId) {
// when we change focussed event id, hide the search results.
this.setState({searchResults: null});
}
},
shouldComponentUpdate: function(nextProps, nextState) { shouldComponentUpdate: function(nextProps, nextState) {
return (!ObjectUtils.shallowEqual(this.props, nextProps) || return (!ObjectUtils.shallowEqual(this.props, nextProps) ||
!ObjectUtils.shallowEqual(this.state, nextState)); !ObjectUtils.shallowEqual(this.state, nextState));
@ -319,7 +332,7 @@ module.exports = React.createClass({
this.unmounted = true; this.unmounted = true;
// update the scroll map before we get unmounted // update the scroll map before we get unmounted
this._updateScrollMap(); this._updateScrollMap(this.state.roomId);
if (this.refs.roomView) { if (this.refs.roomView) {
// disconnect the D&D event listeners from the room view. This // disconnect the D&D event listeners from the room view. This
@ -445,11 +458,6 @@ module.exports = React.createClass({
callState: callState callState: callState
}); });
break;
case 'forward_event':
this.setState({
forwardingEvent: payload.content,
});
break; break;
} }
}, },
@ -598,12 +606,25 @@ module.exports = React.createClass({
}); });
}, },
_updateScrollMap(roomId) {
// No point updating scroll state if the room ID hasn't been resolved yet
if (!roomId) {
return;
}
dis.dispatch({
action: 'update_scroll_state',
room_id: roomId,
scroll_state: this._getScrollState(),
});
},
onRoom: function(room) { onRoom: function(room) {
if (!room || room.roomId !== this.state.roomId) { if (!room || room.roomId !== this.state.roomId) {
return; return;
} }
this.setState({ this.setState({
room: room, room: room,
waitingForRoom: false,
}, () => { }, () => {
this._onRoomLoaded(room); this._onRoomLoaded(room);
}); });
@ -659,8 +680,15 @@ module.exports = React.createClass({
onRoomMemberMembership: function(ev, member, oldMembership) { onRoomMemberMembership: function(ev, member, oldMembership) {
if (member.userId == MatrixClientPeg.get().credentials.userId) { if (member.userId == MatrixClientPeg.get().credentials.userId) {
if (member.membership === 'join') {
this.setState({
waitingForRoom: false,
});
} else {
this.forceUpdate(); this.forceUpdate();
} }
}
}, },
// rate limited because a power level change will emit an event for every // rate limited because a power level change will emit an event for every
@ -1137,8 +1165,13 @@ module.exports = React.createClass({
this.updateTint(); this.updateTint();
this.setState({ this.setState({
editingRoomSettings: false, editingRoomSettings: false,
forwardingEvent: null,
}); });
if (this.state.forwardingEvent) {
dis.dispatch({
action: 'forward_event',
event: null,
});
}
dis.dispatch({action: 'focus_composer'}); dis.dispatch({action: 'focus_composer'});
}, },
@ -1240,21 +1273,6 @@ module.exports = React.createClass({
} }
}, },
// update scrollStateMap on unmount
_updateScrollMap: function() {
if (!this.state.room) {
// we were instantiated on a room alias and haven't yet joined the room.
return;
}
if (!this.props.scrollStateMap) return;
var roomId = this.state.room.roomId;
var state = this._getScrollState();
this.props.scrollStateMap[roomId] = state;
},
// get the current scroll position of the room, so that it can be // get the current scroll position of the room, so that it can be
// restored when we switch back to it. // restored when we switch back to it.
// //
@ -1428,6 +1446,10 @@ module.exports = React.createClass({
const Loader = sdk.getComponent("elements.Spinner"); const Loader = sdk.getComponent("elements.Spinner");
const TimelinePanel = sdk.getComponent("structures.TimelinePanel"); const TimelinePanel = sdk.getComponent("structures.TimelinePanel");
// Whether the preview bar spinner should be shown. We do this when joining or
// when waiting for a room to be returned by js-sdk when joining
const previewBarSpinner = this.state.joining || this.state.waitingForRoom;
if (!this.state.room) { if (!this.state.room) {
if (this.state.roomLoading || this.state.peekLoading) { if (this.state.roomLoading || this.state.peekLoading) {
return ( return (
@ -1447,7 +1469,7 @@ module.exports = React.createClass({
// We have no room object for this room, only the ID. // We have no room object for this room, only the ID.
// We've got to this room by following a link, possibly a third party invite. // We've got to this room by following a link, possibly a third party invite.
var room_alias = this.state.room_alias; const roomAlias = this.state.roomAlias;
return ( return (
<div className="mx_RoomView"> <div className="mx_RoomView">
<RoomHeader ref="header" <RoomHeader ref="header"
@ -1460,8 +1482,8 @@ module.exports = React.createClass({
onForgetClick={ this.onForgetClick } onForgetClick={ this.onForgetClick }
onRejectClick={ this.onRejectThreepidInviteButtonClicked } onRejectClick={ this.onRejectThreepidInviteButtonClicked }
canPreview={ false } error={ this.state.roomLoadError } canPreview={ false } error={ this.state.roomLoadError }
roomAlias={room_alias} roomAlias={roomAlias}
spinner={this.state.joining} spinner={previewBarSpinner}
inviterName={inviterName} inviterName={inviterName}
invitedEmail={invitedEmail} invitedEmail={invitedEmail}
room={this.state.room} room={this.state.room}
@ -1504,7 +1526,7 @@ module.exports = React.createClass({
onRejectClick={ this.onRejectButtonClicked } onRejectClick={ this.onRejectButtonClicked }
inviterName={ inviterName } inviterName={ inviterName }
canPreview={ false } canPreview={ false }
spinner={this.state.joining} spinner={previewBarSpinner}
room={this.state.room} room={this.state.room}
/> />
</div> </div>
@ -1560,7 +1582,7 @@ module.exports = React.createClass({
} else if (this.state.uploadingRoomSettings) { } else if (this.state.uploadingRoomSettings) {
aux = <Loader/>; aux = <Loader/>;
} else if (this.state.forwardingEvent !== null) { } else if (this.state.forwardingEvent !== null) {
aux = <ForwardMessage onCancelClick={this.onCancelClick} currentRoomId={this.state.room.roomId} mxEvent={this.state.forwardingEvent} />; aux = <ForwardMessage onCancelClick={this.onCancelClick} />;
} else if (this.state.searching) { } else if (this.state.searching) {
hideCancel = true; // has own cancel hideCancel = true; // has own cancel
aux = <SearchBar ref="search_bar" searchInProgress={this.state.searchInProgress } onCancelClick={this.onCancelSearchClick} onSearch={this.onSearch}/>; aux = <SearchBar ref="search_bar" searchInProgress={this.state.searchInProgress } onCancelClick={this.onCancelSearchClick} onSearch={this.onSearch}/>;
@ -1580,7 +1602,7 @@ module.exports = React.createClass({
<RoomPreviewBar onJoinClick={this.onJoinButtonClicked} <RoomPreviewBar onJoinClick={this.onJoinButtonClicked}
onForgetClick={ this.onForgetClick } onForgetClick={ this.onForgetClick }
onRejectClick={this.onRejectThreepidInviteButtonClicked} onRejectClick={this.onRejectThreepidInviteButtonClicked}
spinner={this.state.joining} spinner={previewBarSpinner}
inviterName={inviterName} inviterName={inviterName}
invitedEmail={invitedEmail} invitedEmail={invitedEmail}
canPreview={this.state.canPeek} canPreview={this.state.canPeek}
@ -1677,6 +1699,14 @@ module.exports = React.createClass({
hideMessagePanel = true; hideMessagePanel = true;
} }
const shouldHighlight = this.state.isInitialEventHighlighted;
let highlightedEventId = null;
if (this.state.forwardingEvent) {
highlightedEventId = this.state.forwardingEvent.getId();
} else if (shouldHighlight) {
highlightedEventId = this.state.initialEventId;
}
// console.log("ShowUrlPreview for %s is %s", this.state.room.roomId, this.state.showUrlPreview); // console.log("ShowUrlPreview for %s is %s", this.state.room.roomId, this.state.showUrlPreview);
var messagePanel = ( var messagePanel = (
<TimelinePanel ref={this._gatherTimelinePanelRef} <TimelinePanel ref={this._gatherTimelinePanelRef}
@ -1684,9 +1714,9 @@ module.exports = React.createClass({
manageReadReceipts={!UserSettingsStore.getSyncedSetting('hideReadReceipts', false)} manageReadReceipts={!UserSettingsStore.getSyncedSetting('hideReadReceipts', false)}
manageReadMarkers={true} manageReadMarkers={true}
hidden={hideMessagePanel} hidden={hideMessagePanel}
highlightedEventId={this.state.forwardingEvent ? this.state.forwardingEvent.getId() : this.props.highlightedEventId} highlightedEventId={highlightedEventId}
eventId={this.props.eventId} eventId={this.state.initialEventId}
eventPixelOffset={this.props.eventPixelOffset} eventPixelOffset={this.state.initialEventPixelOffset}
onScroll={ this.onMessageListScroll } onScroll={ this.onMessageListScroll }
onReadMarkerUpdated={ this._updateTopUnreadMessagesBar } onReadMarkerUpdated={ this._updateTopUnreadMessagesBar }
showUrlPreview = { this.state.showUrlPreview } showUrlPreview = { this.state.showUrlPreview }

View file

@ -352,13 +352,14 @@ module.exports = React.createClass({
const tile = tiles[backwards ? i : tiles.length - 1 - i]; const tile = tiles[backwards ? i : tiles.length - 1 - i];
// Subtract height of tile as if it were unpaginated // Subtract height of tile as if it were unpaginated
excessHeight -= tile.clientHeight; excessHeight -= tile.clientHeight;
//If removing the tile would lead to future pagination, break before setting scroll token
if (tile.clientHeight > excessHeight) {
break;
}
// The tile may not have a scroll token, so guard it // The tile may not have a scroll token, so guard it
if (tile.dataset.scrollTokens) { if (tile.dataset.scrollTokens) {
markerScrollToken = tile.dataset.scrollTokens.split(',')[0]; markerScrollToken = tile.dataset.scrollTokens.split(',')[0];
} }
if (tile.clientHeight > excessHeight) {
break;
}
} }
if (markerScrollToken) { if (markerScrollToken) {

View file

@ -902,6 +902,9 @@ var TimelinePanel = React.createClass({
var onError = (error) => { var onError = (error) => {
this.setState({timelineLoading: false}); this.setState({timelineLoading: false});
console.error(
`Error loading timeline panel at ${eventId}: ${error}`,
);
var msg = error.message ? error.message : JSON.stringify(error); var msg = error.message ? error.message : JSON.stringify(error);
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");

View file

@ -110,6 +110,13 @@ const ANALYTICS_SETTINGS_LABELS = [
}, },
]; ];
const WEBRTC_SETTINGS_LABELS = [
{
id: 'webRtcForceTURN',
label: 'Disable Peer-to-Peer for 1:1 calls',
},
];
// Warning: Each "label" string below must be added to i18n/strings/en_EN.json, // Warning: Each "label" string below must be added to i18n/strings/en_EN.json,
// since they will be translated when rendered. // since they will be translated when rendered.
const CRYPTO_SETTINGS_LABELS = [ const CRYPTO_SETTINGS_LABELS = [
@ -162,9 +169,6 @@ module.exports = React.createClass({
// The base URL to use in the referral link. Defaults to window.location.origin. // The base URL to use in the referral link. Defaults to window.location.origin.
referralBaseUrl: React.PropTypes.string, referralBaseUrl: React.PropTypes.string,
// true if RightPanel is collapsed
collapsedRhs: React.PropTypes.bool,
// Team token for the referral link. If falsy, the referral section will // Team token for the referral link. If falsy, the referral section will
// not appear // not appear
teamToken: React.PropTypes.string, teamToken: React.PropTypes.string,
@ -310,11 +314,6 @@ module.exports = React.createClass({
}, },
onAvatarPickerClick: function(ev) { onAvatarPickerClick: function(ev) {
if (MatrixClientPeg.get().isGuest()) {
dis.dispatch({action: 'view_set_mxid'});
return;
}
if (this.refs.file_label) { if (this.refs.file_label) {
this.refs.file_label.click(); this.refs.file_label.click();
} }
@ -389,17 +388,14 @@ module.exports = React.createClass({
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {
title: _t("Success"), title: _t("Success"),
description: _t("Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them") + ".", description: _t(
"Your password was successfully changed. You will not receive " +
"push notifications on other devices until you log back in to them",
) + ".",
}); });
dis.dispatch({action: 'password_changed'}); dis.dispatch({action: 'password_changed'});
}, },
onUpgradeClicked: function() {
dis.dispatch({
action: "start_upgrade_registration",
});
},
onEnableNotificationsChange: function(event) { onEnableNotificationsChange: function(event) {
UserSettingsStore.setEnableNotifications(event.target.checked); UserSettingsStore.setEnableNotifications(event.target.checked);
}, },
@ -427,7 +423,10 @@ module.exports = React.createClass({
this._addThreepid.addEmailAddress(emailAddress, true).done(() => { this._addThreepid.addEmailAddress(emailAddress, true).done(() => {
Modal.createDialog(QuestionDialog, { Modal.createDialog(QuestionDialog, {
title: _t("Verification Pending"), title: _t("Verification Pending"),
description: _t("Please check your email and click on the link it contains. Once this is done, click continue."), description: _t(
"Please check your email and click on the link it contains. Once this " +
"is done, click continue.",
),
button: _t('Continue'), button: _t('Continue'),
onFinished: this.onEmailDialogFinished, onFinished: this.onEmailDialogFinished,
}); });
@ -447,7 +446,7 @@ module.exports = React.createClass({
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
Modal.createDialog(QuestionDialog, { Modal.createDialog(QuestionDialog, {
title: _t("Remove Contact Information?"), title: _t("Remove Contact Information?"),
description: _t("Remove %(threePid)s?", { threePid : threepid.address }), description: _t("Remove %(threePid)s?", { threePid: threepid.address }),
button: _t('Remove'), button: _t('Remove'),
onFinished: (submit) => { onFinished: (submit) => {
if (submit) { if (submit) {
@ -489,7 +488,7 @@ module.exports = React.createClass({
this.setState({email_add_pending: false}); this.setState({email_add_pending: false});
if (err.errcode == 'M_THREEPID_AUTH_FAILED') { if (err.errcode == 'M_THREEPID_AUTH_FAILED') {
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
let message = _t("Unable to verify email address.") + " " + const message = _t("Unable to verify email address.") + " " +
_t("Please check your email and click on the link it contains. Once this is done, click continue."); _t("Please check your email and click on the link it contains. Once this is done, click continue.");
Modal.createDialog(QuestionDialog, { Modal.createDialog(QuestionDialog, {
title: _t("Verification Pending"), title: _t("Verification Pending"),
@ -608,7 +607,7 @@ module.exports = React.createClass({
} }
}, },
_renderLanguageSetting: function () { _renderLanguageSetting: function() {
const LanguageDropdown = sdk.getComponent('views.elements.LanguageDropdown'); const LanguageDropdown = sdk.getComponent('views.elements.LanguageDropdown');
return <div> return <div>
<label htmlFor="languageSelector">{_t('Interface Language')}</label> <label htmlFor="languageSelector">{_t('Interface Language')}</label>
@ -639,7 +638,7 @@ module.exports = React.createClass({
<input id="urlPreviewsDisabled" <input id="urlPreviewsDisabled"
type="checkbox" type="checkbox"
defaultChecked={ UserSettingsStore.getUrlPreviewsDisabled() } defaultChecked={ UserSettingsStore.getUrlPreviewsDisabled() }
onChange={ (e) => UserSettingsStore.setUrlPreviewsDisabled(e.target.checked) } onChange={ this._onPreviewsDisabledChanged }
/> />
<label htmlFor="urlPreviewsDisabled"> <label htmlFor="urlPreviewsDisabled">
{ _t("Disable inline URL previews by default") } { _t("Disable inline URL previews by default") }
@ -647,17 +646,24 @@ module.exports = React.createClass({
</div>; </div>;
}, },
_onPreviewsDisabledChanged: function(e) {
UserSettingsStore.setUrlPreviewsDisabled(e.target.checked);
},
_renderSyncedSetting: function(setting) { _renderSyncedSetting: function(setting) {
// TODO: this ought to be a separate component so that we don't need
// to rebind the onChange each time we render
const onChange = (e) => {
UserSettingsStore.setSyncedSetting(setting.id, e.target.checked);
if (setting.fn) setting.fn(e.target.checked);
};
return <div className="mx_UserSettings_toggle" key={ setting.id }> return <div className="mx_UserSettings_toggle" key={ setting.id }>
<input id={ setting.id } <input id={ setting.id }
type="checkbox" type="checkbox"
defaultChecked={ this._syncedSettings[setting.id] } defaultChecked={ this._syncedSettings[setting.id] }
onChange={ onChange={ onChange }
(e) => {
UserSettingsStore.setSyncedSetting(setting.id, e.target.checked);
if (setting.fn) setting.fn(e.target.checked);
}
}
/> />
<label htmlFor={ setting.id }> <label htmlFor={ setting.id }>
{ _t(setting.label) } { _t(setting.label) }
@ -666,13 +672,9 @@ module.exports = React.createClass({
}, },
_renderThemeSelector: function(setting) { _renderThemeSelector: function(setting) {
return <div className="mx_UserSettings_toggle" key={ setting.id + "_" + setting.value }> // TODO: this ought to be a separate component so that we don't need
<input id={ setting.id + "_" + setting.value } // to rebind the onChange each time we render
type="radio" const onChange = (e) => {
name={ setting.id }
value={ setting.value }
defaultChecked={ this._syncedSettings[setting.id] === setting.value }
onChange={ (e) => {
if (e.target.checked) { if (e.target.checked) {
UserSettingsStore.setSyncedSetting(setting.id, setting.value); UserSettingsStore.setSyncedSetting(setting.id, setting.value);
} }
@ -680,8 +682,14 @@ module.exports = React.createClass({
action: 'set_theme', action: 'set_theme',
value: setting.value, value: setting.value,
}); });
} };
} return <div className="mx_UserSettings_toggle" key={ setting.id + "_" + setting.value }>
<input id={ setting.id + "_" + setting.value }
type="radio"
name={ setting.id }
value={ setting.value }
defaultChecked={ this._syncedSettings[setting.id] === setting.value }
onChange={ onChange }
/> />
<label htmlFor={ setting.id + "_" + setting.value }> <label htmlFor={ setting.id + "_" + setting.value }>
{ setting.label } { setting.label }
@ -720,8 +728,10 @@ module.exports = React.createClass({
<h3>{ _t("Cryptography") }</h3> <h3>{ _t("Cryptography") }</h3>
<div className="mx_UserSettings_section mx_UserSettings_cryptoSection"> <div className="mx_UserSettings_section mx_UserSettings_cryptoSection">
<ul> <ul>
<li><label>{_t("Device ID:")}</label> <span><code>{deviceId}</code></span></li> <li><label>{_t("Device ID:")}</label>
<li><label>{_t("Device key:")}</label> <span><code><b>{identityKey}</b></code></span></li> <span><code>{deviceId}</code></span></li>
<li><label>{_t("Device key:")}</label>
<span><code><b>{identityKey}</b></code></span></li>
</ul> </ul>
{ importExportButtons } { importExportButtons }
</div> </div>
@ -733,16 +743,18 @@ module.exports = React.createClass({
}, },
_renderLocalSetting: function(setting) { _renderLocalSetting: function(setting) {
// TODO: this ought to be a separate component so that we don't need
// to rebind the onChange each time we render
const onChange = (e) => {
UserSettingsStore.setLocalSetting(setting.id, e.target.checked);
if (setting.fn) setting.fn(e.target.checked);
};
return <div className="mx_UserSettings_toggle" key={ setting.id }> return <div className="mx_UserSettings_toggle" key={ setting.id }>
<input id={ setting.id } <input id={ setting.id }
type="checkbox" type="checkbox"
defaultChecked={ this._localSettings[setting.id] } defaultChecked={ this._localSettings[setting.id] }
onChange={ onChange={ onChange }
(e) => {
UserSettingsStore.setLocalSetting(setting.id, e.target.checked);
if (setting.fn) setting.fn(e.target.checked);
}
}
/> />
<label htmlFor={ setting.id }> <label htmlFor={ setting.id }>
{ _t(setting.label) } { _t(setting.label) }
@ -794,26 +806,27 @@ module.exports = React.createClass({
if (this.props.enableLabs === false) return null; if (this.props.enableLabs === false) return null;
UserSettingsStore.doTranslations(); UserSettingsStore.doTranslations();
const features = UserSettingsStore.LABS_FEATURES.map((feature) => ( const features = UserSettingsStore.LABS_FEATURES.map((feature) => {
// TODO: this ought to be a separate component so that we don't need
// to rebind the onChange each time we render
const onChange = (e) => {
UserSettingsStore.setFeatureEnabled(feature.id, e.target.checked);
this.forceUpdate();
};
return (
<div key={feature.id} className="mx_UserSettings_toggle"> <div key={feature.id} className="mx_UserSettings_toggle">
<input <input
type="checkbox" type="checkbox"
id={feature.id} id={feature.id}
name={feature.id} name={feature.id}
defaultChecked={ UserSettingsStore.isFeatureEnabled(feature.id) } defaultChecked={ UserSettingsStore.isFeatureEnabled(feature.id) }
onChange={(e) => { onChange={ onChange }
if (MatrixClientPeg.get().isGuest()) { />
e.target.checked = false;
dis.dispatch({action: 'view_set_mxid'});
return;
}
UserSettingsStore.setFeatureEnabled(feature.id, e.target.checked);
this.forceUpdate();
}}/>
<label htmlFor={feature.id}>{feature.name}</label> <label htmlFor={feature.id}>{feature.name}</label>
</div> </div>
)); );
});
return ( return (
<div> <div>
<h3>{ _t("Labs") }</h3> <h3>{ _t("Labs") }</h3>
@ -826,9 +839,6 @@ module.exports = React.createClass({
}, },
_renderDeactivateAccount: function() { _renderDeactivateAccount: function() {
// We can't deactivate a guest account.
if (MatrixClientPeg.get().isGuest()) return null;
return <div> return <div>
<h3>{ _t("Deactivate Account") }</h3> <h3>{ _t("Deactivate Account") }</h3>
<div className="mx_UserSettings_section"> <div className="mx_UserSettings_section">
@ -865,9 +875,10 @@ module.exports = React.createClass({
if (!this.state.rejectingInvites) { if (!this.state.rejectingInvites) {
// bind() the invited rooms so any new invites that may come in as this button is clicked // bind() the invited rooms so any new invites that may come in as this button is clicked
// don't inadvertently get rejected as well. // don't inadvertently get rejected as well.
const onClick = this._onRejectAllInvitesClicked.bind(this, invitedRooms);
reject = ( reject = (
<AccessibleButton className="mx_UserSettings_button danger" <AccessibleButton className="mx_UserSettings_button danger"
onClick={this._onRejectAllInvitesClicked.bind(this, invitedRooms)}> onClick={onClick}>
{_t("Reject all %(invitedRooms)s invites", {invitedRooms: invitedRooms.length})} {_t("Reject all %(invitedRooms)s invites", {invitedRooms: invitedRooms.length})}
</AccessibleButton> </AccessibleButton>
); );
@ -885,8 +896,6 @@ module.exports = React.createClass({
const settings = this.state.electron_settings; const settings = this.state.electron_settings;
if (!settings) return; if (!settings) return;
const {ipcRenderer} = require('electron');
return <div> return <div>
<h3>{ _t('Desktop specific') }</h3> <h3>{ _t('Desktop specific') }</h3>
<div className="mx_UserSettings_section"> <div className="mx_UserSettings_section">
@ -894,9 +903,7 @@ module.exports = React.createClass({
<input type="checkbox" <input type="checkbox"
name="auto-launch" name="auto-launch"
defaultChecked={settings['auto-launch']} defaultChecked={settings['auto-launch']}
onChange={(e) => { onChange={this._onAutoLaunchChanged}
ipcRenderer.send('settings_set', 'auto-launch', e.target.checked);
}}
/> />
<label htmlFor="auto-launch">{_t('Start automatically after system login')}</label> <label htmlFor="auto-launch">{_t('Start automatically after system login')}</label>
</div> </div>
@ -904,6 +911,11 @@ module.exports = React.createClass({
</div>; </div>;
}, },
_onAutoLaunchChanged: function(e) {
const {ipcRenderer} = require('electron');
ipcRenderer.send('settings_set', 'auto-launch', e.target.checked);
},
_mapWebRtcDevicesToSpans: function(devices) { _mapWebRtcDevicesToSpans: function(devices) {
return devices.map((device) => <span key={device.deviceId}>{device.label}</span>); return devices.map((device) => <span key={device.deviceId}>{device.label}</span>);
}, },
@ -937,16 +949,13 @@ module.exports = React.createClass({
} }
}, },
_renderWebRtcSettings: function() { _renderWebRtcDeviceSettings: function() {
if (this.state.mediaDevices === false) { if (this.state.mediaDevices === false) {
return <div> return (
<h3>{_t('VoIP')}</h3>
<div className="mx_UserSettings_section">
<p className="mx_UserSettings_link" onClick={this._requestMediaPermissions}> <p className="mx_UserSettings_link" onClick={this._requestMediaPermissions}>
{_t('Missing Media Permissions, click here to request.')} {_t('Missing Media Permissions, click here to request.')}
</p> </p>
</div> );
</div>;
} else if (!this.state.mediaDevices) return; } else if (!this.state.mediaDevices) return;
const Dropdown = sdk.getComponent('elements.Dropdown'); const Dropdown = sdk.getComponent('elements.Dropdown');
@ -1000,10 +1009,17 @@ module.exports = React.createClass({
} }
return <div> return <div>
<h3>{_t('VoIP')}</h3>
<div className="mx_UserSettings_section">
{microphoneDropdown} {microphoneDropdown}
{webcamDropdown} {webcamDropdown}
</div>;
},
_renderWebRtcSettings: function() {
return <div>
<h3>{_t('VoIP')}</h3>
<div className="mx_UserSettings_section">
{ WEBRTC_SETTINGS_LABELS.map(this._renderLocalSetting) }
{ this._renderWebRtcDeviceSettings() }
</div> </div>
</div>; </div>;
}, },
@ -1060,6 +1076,9 @@ module.exports = React.createClass({
const threepidsSection = this.state.threepids.map((val, pidIndex) => { const threepidsSection = this.state.threepids.map((val, pidIndex) => {
const id = "3pid-" + val.address; const id = "3pid-" + val.address;
// TODO; make a separate component to avoid having to rebind onClick
// each time we render
const onRemoveClick = (e) => this.onRemoveThreepidClicked(val);
return ( return (
<div className="mx_UserSettings_profileTableRow" key={pidIndex}> <div className="mx_UserSettings_profileTableRow" key={pidIndex}>
<div className="mx_UserSettings_profileLabelCell"> <div className="mx_UserSettings_profileLabelCell">
@ -1071,7 +1090,8 @@ module.exports = React.createClass({
/> />
</div> </div>
<div className="mx_UserSettings_threepidButton mx_filterFlipColor"> <div className="mx_UserSettings_threepidButton mx_filterFlipColor">
<img src="img/cancel-small.svg" width="14" height="14" alt={ _t("Remove") } onClick={this.onRemoveThreepidClicked.bind(this, val)} /> <img src="img/cancel-small.svg" width="14" height="14" alt={ _t("Remove") }
onClick={onRemoveClick} />
</div> </div>
</div> </div>
); );
@ -1079,7 +1099,7 @@ module.exports = React.createClass({
let addEmailSection; let addEmailSection;
if (this.state.email_add_pending) { if (this.state.email_add_pending) {
addEmailSection = <Loader key="_email_add_spinner" />; addEmailSection = <Loader key="_email_add_spinner" />;
} else if (!MatrixClientPeg.get().isGuest()) { } else {
addEmailSection = ( addEmailSection = (
<div className="mx_UserSettings_profileTableRow" key="_newEmail"> <div className="mx_UserSettings_profileTableRow" key="_newEmail">
<div className="mx_UserSettings_profileLabelCell"> <div className="mx_UserSettings_profileLabelCell">
@ -1107,16 +1127,7 @@ module.exports = React.createClass({
threepidsSection.push(addEmailSection); threepidsSection.push(addEmailSection);
threepidsSection.push(addMsisdnSection); threepidsSection.push(addMsisdnSection);
let accountJsx; const accountJsx = (
if (MatrixClientPeg.get().isGuest()) {
accountJsx = (
<div className="mx_UserSettings_button" onClick={this.onUpgradeClicked}>
{ _t("Create an account") }
</div>
);
} else {
accountJsx = (
<ChangePassword <ChangePassword
className="mx_UserSettings_accountTable" className="mx_UserSettings_accountTable"
rowClassName="mx_UserSettings_profileTableRow" rowClassName="mx_UserSettings_profileTableRow"
@ -1126,9 +1137,9 @@ module.exports = React.createClass({
onError={this.onPasswordChangeError} onError={this.onPasswordChangeError}
onFinished={this.onPasswordChanged} /> onFinished={this.onPasswordChanged} />
); );
}
let notificationArea; let notificationArea;
if (!MatrixClientPeg.get().isGuest() && this.state.threepids !== undefined) { if (this.state.threepids !== undefined) {
notificationArea = (<div> notificationArea = (<div>
<h3>{ _t("Notifications") }</h3> <h3>{ _t("Notifications") }</h3>
@ -1150,7 +1161,6 @@ module.exports = React.createClass({
<div className="mx_UserSettings"> <div className="mx_UserSettings">
<SimpleRoomHeader <SimpleRoomHeader
title={ _t("Settings") } title={ _t("Settings") }
collapsedRhs={ this.props.collapsedRhs }
onCancelClick={ this.props.onClose } onCancelClick={ this.props.onClose }
/> />
@ -1222,7 +1232,12 @@ module.exports = React.createClass({
{ _t("Logged in as:") } {this._me} { _t("Logged in as:") } {this._me}
</div> </div>
<div className="mx_UserSettings_advanced"> <div className="mx_UserSettings_advanced">
{_t('Access Token:')} <span className="mx_UserSettings_advanced_spoiler" onClick={this._showSpoiler} data-spoiler={ MatrixClientPeg.get().getAccessToken() }>&lt;{ _t("click to reveal") }&gt;</span> {_t('Access Token:')}
<span className="mx_UserSettings_advanced_spoiler"
onClick={this._showSpoiler}
data-spoiler={ MatrixClientPeg.get().getAccessToken() }>
&lt;{ _t("click to reveal") }&gt;
</span>
</div> </div>
<div className="mx_UserSettings_advanced"> <div className="mx_UserSettings_advanced">
{ _t("Homeserver is") } { MatrixClientPeg.get().getHomeserverUrl() } { _t("Homeserver is") } { MatrixClientPeg.get().getHomeserverUrl() }

View file

@ -87,7 +87,27 @@ module.exports = React.createClass({
).then((data) => { ).then((data) => {
this.props.onLoggedIn(data); this.props.onLoggedIn(data);
}, (error) => { }, (error) => {
this._setStateFromError(error, true); let errorText;
// Some error strings only apply for logging in
const usingEmail = username.indexOf("@") > 0;
if (error.httpStatus == 400 && usingEmail) {
errorText = _t('This Home Server does not support login using email address.');
} else if (error.httpStatus === 401 || error.httpStatus === 403) {
errorText = _t('Incorrect username and/or password.');
} else {
// other errors, not specific to doing a password login
errorText = this._errorTextFromError(error);
}
this.setState({
errorText: errorText,
// 401 would be the sensible status code for 'incorrect password'
// but the login API gives a 403 https://matrix.org/jira/browse/SYN-744
// mentions this (although the bug is for UI auth which is not this)
// We treat both as an incorrect password
loginIncorrect: error.httpStatus === 401 || error.httpStatus == 403,
});
}).finally(() => { }).finally(() => {
this.setState({ this.setState({
busy: false busy: false
@ -110,7 +130,16 @@ module.exports = React.createClass({
this._loginLogic.loginAsGuest().then(function(data) { this._loginLogic.loginAsGuest().then(function(data) {
self.props.onLoggedIn(data); self.props.onLoggedIn(data);
}, function(error) { }, function(error) {
self._setStateFromError(error, true); let errorText;
if (error.httpStatus === 403) {
errorText = _t("Guest access is disabled on this Home Server.");
} else {
errorText = self._errorTextFromError(error);
}
self.setState({
errorText: errorText,
loginIncorrect: false,
});
}).finally(function() { }).finally(function() {
self.setState({ self.setState({
busy: false busy: false
@ -183,31 +212,22 @@ module.exports = React.createClass({
currentFlow: self._getCurrentFlowStep(), currentFlow: self._getCurrentFlowStep(),
}); });
}, function(err) { }, function(err) {
self._setStateFromError(err, false); self.setState({
errorText: self._errorTextFromError(err),
loginIncorrect: false,
});
}).finally(function() { }).finally(function() {
self.setState({ self.setState({
busy: false, busy: false,
}); });
}); }).done();
}, },
_getCurrentFlowStep: function() { _getCurrentFlowStep: function() {
return this._loginLogic ? this._loginLogic.getCurrentFlowStep() : null; return this._loginLogic ? this._loginLogic.getCurrentFlowStep() : null;
}, },
_setStateFromError: function(err, isLoginAttempt) {
this.setState({
errorText: this._errorTextFromError(err),
// https://matrix.org/jira/browse/SYN-744
loginIncorrect: isLoginAttempt && (err.httpStatus == 401 || err.httpStatus == 403)
});
},
_errorTextFromError(err) { _errorTextFromError(err) {
if (err.friendlyText) {
return err.friendlyText;
}
let errCode = err.errcode; let errCode = err.errcode;
if (!errCode && err.httpStatus) { if (!errCode && err.httpStatus) {
errCode = "HTTP " + err.httpStatus; errCode = "HTTP " + err.httpStatus;
@ -219,8 +239,8 @@ module.exports = React.createClass({
if (err.cors === 'rejected') { if (err.cors === 'rejected') {
if (window.location.protocol === 'https:' && if (window.location.protocol === 'https:' &&
(this.state.enteredHomeserverUrl.startsWith("http:") || (this.state.enteredHomeserverUrl.startsWith("http:") ||
!this.state.enteredHomeserverUrl.startsWith("http"))) !this.state.enteredHomeserverUrl.startsWith("http"))
{ ) {
errorText = <span> errorText = <span>
{ _tJsx("Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. " + { _tJsx("Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. " +
"Either use HTTPS or <a>enable unsafe scripts</a>.", "Either use HTTPS or <a>enable unsafe scripts</a>.",
@ -228,10 +248,9 @@ module.exports = React.createClass({
(sub) => { return <a href="https://www.google.com/search?&q=enable%20unsafe%20scripts">{ sub }</a>; } (sub) => { return <a href="https://www.google.com/search?&q=enable%20unsafe%20scripts">{ sub }</a>; }
)} )}
</span>; </span>;
} } else {
else {
errorText = <span> errorText = <span>
{ _tJsx("Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.", { _tJsx("Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.",
/<a>(.*?)<\/a>/, /<a>(.*?)<\/a>/,
(sub) => { return <a href={this.state.enteredHomeserverUrl}>{ sub }</a>; } (sub) => { return <a href={this.state.enteredHomeserverUrl}>{ sub }</a>; }
)} )}

View file

@ -45,8 +45,6 @@ module.exports = React.createClass({
brand: React.PropTypes.string, brand: React.PropTypes.string,
email: React.PropTypes.string, email: React.PropTypes.string,
referrer: React.PropTypes.string, referrer: React.PropTypes.string,
username: React.PropTypes.string,
guestAccessToken: React.PropTypes.string,
teamServerConfig: React.PropTypes.shape({ teamServerConfig: React.PropTypes.shape({
// Email address to request new teams // Email address to request new teams
supportEmail: React.PropTypes.string.isRequired, supportEmail: React.PropTypes.string.isRequired,
@ -295,17 +293,6 @@ module.exports = React.createClass({
}, },
_makeRegisterRequest: function(auth) { _makeRegisterRequest: function(auth) {
let guestAccessToken = this.props.guestAccessToken;
if (
this.state.formVals.username !== this.props.username ||
this.state.hsUrl != this.props.defaultHsUrl
) {
// don't try to upgrade if we changed our username
// or are registering on a different HS
guestAccessToken = null;
}
// Only send the bind params if we're sending username / pw params // Only send the bind params if we're sending username / pw params
// (Since we need to send no params at all to use the ones saved in the // (Since we need to send no params at all to use the ones saved in the
// session). // session).
@ -320,7 +307,7 @@ module.exports = React.createClass({
undefined, // session id: included in the auth dict already undefined, // session id: included in the auth dict already
auth, auth,
bindThreepids, bindThreepids,
guestAccessToken, null,
); );
}, },
@ -357,10 +344,6 @@ module.exports = React.createClass({
} else if (this.state.busy || this.state.teamServerBusy) { } else if (this.state.busy || this.state.teamServerBusy) {
registerBody = <Spinner />; registerBody = <Spinner />;
} else { } else {
let guestUsername = this.props.username;
if (this.state.hsUrl != this.props.defaultHsUrl) {
guestUsername = null;
}
let errorSection; let errorSection;
if (this.state.errorText) { if (this.state.errorText) {
errorSection = <div className="mx_Login_error">{this.state.errorText}</div>; errorSection = <div className="mx_Login_error">{this.state.errorText}</div>;
@ -374,7 +357,6 @@ module.exports = React.createClass({
defaultPhoneNumber={this.state.formVals.phoneNumber} defaultPhoneNumber={this.state.formVals.phoneNumber}
defaultPassword={this.state.formVals.password} defaultPassword={this.state.formVals.password}
teamsConfig={this.state.teamsConfig} teamsConfig={this.state.teamsConfig}
guestUsername={guestUsername}
minPasswordLength={MIN_PASSWORD_LENGTH} minPasswordLength={MIN_PASSWORD_LENGTH}
onError={this.onFormValidationFailed} onError={this.onFormValidationFailed}
onRegisterClick={this.onFormSubmit} onRegisterClick={this.onFormSubmit}

View file

@ -17,6 +17,7 @@ limitations under the License.
'use strict'; 'use strict';
var React = require('react'); var React = require('react');
import { _t } from '../../../languageHandler';
var Presets = { var Presets = {
PrivateChat: "private_chat", PrivateChat: "private_chat",
@ -46,9 +47,9 @@ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<select className="mx_Presets" onChange={this.onValueChanged} value={this.props.preset}> <select className="mx_Presets" onChange={this.onValueChanged} value={this.props.preset}>
<option value={this.Presets.PrivateChat}>Private Chat</option> <option value={this.Presets.PrivateChat}>{_t("Private Chat")}</option>
<option value={this.Presets.PublicChat}>Public Chat</option> <option value={this.Presets.PublicChat}>{_t("Public Chat")}</option>
<option value={this.Presets.Custom}>Custom</option> <option value={this.Presets.Custom}>{_t("Custom")}</option>
</select> </select>
); );
} }

View file

@ -15,6 +15,7 @@ limitations under the License.
*/ */
var React = require('react'); var React = require('react');
import { _t } from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'RoomAlias', displayName: 'RoomAlias',
@ -94,7 +95,7 @@ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<input type="text" className="mx_RoomAlias" placeholder="Alias (optional)" <input type="text" className="mx_RoomAlias" placeholder={_t("Alias (optional)")}
onChange={this.onValueChanged} onFocus={this.onFocus} onBlur={this.onBlur} onChange={this.onValueChanged} onFocus={this.onFocus} onBlur={this.onBlur}
value={this.props.alias}/> value={this.props.alias}/>
); );

View file

@ -24,8 +24,10 @@ import DMRoomMap from '../../../utils/DMRoomMap';
import Modal from '../../../Modal'; import Modal from '../../../Modal';
import AccessibleButton from '../elements/AccessibleButton'; import AccessibleButton from '../elements/AccessibleButton';
import q from 'q'; import q from 'q';
import dis from '../../../dispatcher';
const TRUNCATE_QUERY_LIST = 40; const TRUNCATE_QUERY_LIST = 40;
const QUERY_USER_DIRECTORY_DEBOUNCE_MS = 200;
module.exports = React.createClass({ module.exports = React.createClass({
displayName: "ChatInviteDialog", displayName: "ChatInviteDialog",
@ -40,13 +42,13 @@ module.exports = React.createClass({
roomId: React.PropTypes.string, roomId: React.PropTypes.string,
button: React.PropTypes.string, button: React.PropTypes.string,
focus: React.PropTypes.bool, focus: React.PropTypes.bool,
onFinished: React.PropTypes.func.isRequired onFinished: React.PropTypes.func.isRequired,
}, },
getDefaultProps: function() { getDefaultProps: function() {
return { return {
value: "", value: "",
focus: true focus: true,
}; };
}, },
@ -54,12 +56,20 @@ module.exports = React.createClass({
return { return {
error: false, error: false,
// List of AddressTile.InviteAddressType objects represeting // List of AddressTile.InviteAddressType objects representing
// the list of addresses we're going to invite // the list of addresses we're going to invite
inviteList: [], inviteList: [],
// List of AddressTile.InviteAddressType objects represeting // Whether a search is ongoing
// the set of autocompletion results for the current search busy: false,
// An error message generated during the user directory search
searchError: null,
// Whether the server supports the user_directory API
serverSupportsUserDirectory: true,
// The query being searched for
query: "",
// List of AddressTile.InviteAddressType objects representing
// the set of auto-completion results for the current search
// query. // query.
queryList: [], queryList: [],
}; };
@ -70,7 +80,6 @@ module.exports = React.createClass({
// Set the cursor at the end of the text input // Set the cursor at the end of the text input
this.refs.textinput.value = this.props.value; this.refs.textinput.value = this.props.value;
} }
this._updateUserList();
}, },
onButtonClick: function() { onButtonClick: function() {
@ -94,7 +103,7 @@ module.exports = React.createClass({
const ChatCreateOrReuseDialog = sdk.getComponent( const ChatCreateOrReuseDialog = sdk.getComponent(
"views.dialogs.ChatCreateOrReuseDialog", "views.dialogs.ChatCreateOrReuseDialog",
); );
Modal.createDialog(ChatCreateOrReuseDialog, { const close = Modal.createDialog(ChatCreateOrReuseDialog, {
userId: userId, userId: userId,
onFinished: (success) => { onFinished: (success) => {
this.props.onFinished(success); this.props.onFinished(success);
@ -104,14 +113,16 @@ module.exports = React.createClass({
action: 'start_chat', action: 'start_chat',
user_id: userId, user_id: userId,
}); });
close(true);
}, },
onExistingRoomSelected: (roomId) => { onExistingRoomSelected: (roomId) => {
dis.dispatch({ dis.dispatch({
action: 'view_room', action: 'view_room',
user_id: roomId, room_id: roomId,
}); });
close(true);
}, },
}); }).close;
} else { } else {
this._startChat(inviteList); this._startChat(inviteList);
} }
@ -137,15 +148,15 @@ module.exports = React.createClass({
} else if (e.keyCode === 38) { // up arrow } else if (e.keyCode === 38) { // up arrow
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
this.addressSelector.moveSelectionUp(); if (this.addressSelector) this.addressSelector.moveSelectionUp();
} else if (e.keyCode === 40) { // down arrow } else if (e.keyCode === 40) { // down arrow
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
this.addressSelector.moveSelectionDown(); if (this.addressSelector) this.addressSelector.moveSelectionDown();
} else if (this.state.queryList.length > 0 && (e.keyCode === 188 || e.keyCode === 13 || e.keyCode === 9)) { // comma or enter or tab } else if (this.state.queryList.length > 0 && (e.keyCode === 188 || e.keyCode === 13 || e.keyCode === 9)) { // comma or enter or tab
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
this.addressSelector.chooseSelection(); if (this.addressSelector) this.addressSelector.chooseSelection();
} else if (this.refs.textinput.value.length === 0 && this.state.inviteList.length && e.keyCode === 8) { // backspace } else if (this.refs.textinput.value.length === 0 && this.state.inviteList.length && e.keyCode === 8) { // backspace
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
@ -168,74 +179,36 @@ module.exports = React.createClass({
onQueryChanged: function(ev) { onQueryChanged: function(ev) {
const query = ev.target.value.toLowerCase(); const query = ev.target.value.toLowerCase();
let queryList = [];
if (query.length < 2) {
return;
}
if (this.queryChangedDebouncer) { if (this.queryChangedDebouncer) {
clearTimeout(this.queryChangedDebouncer); clearTimeout(this.queryChangedDebouncer);
} }
this.queryChangedDebouncer = setTimeout(() => {
// Only do search if there is something to search // Only do search if there is something to search
if (query.length > 0 && query != '@') { if (query.length > 0 && query != '@' && query.length >= 2) {
this._userList.forEach((user) => { this.queryChangedDebouncer = setTimeout(() => {
if (user.userId.toLowerCase().indexOf(query) === -1 && if (this.state.serverSupportsUserDirectory) {
user.displayName.toLowerCase().indexOf(query) === -1 this._doUserDirectorySearch(query);
) { } else {
return; this._doLocalSearch(query);
}
// Return objects, structure of which is defined
// by InviteAddressType
queryList.push({
addressType: 'mx',
address: user.userId,
displayName: user.displayName,
avatarMxc: user.avatarUrl,
isKnown: true,
order: user.getLastActiveTs(),
});
});
queryList = queryList.sort((a,b) => {
return a.order < b.order;
});
// If the query is a valid address, add an entry for that
// This is important, otherwise there's no way to invite
// a perfectly valid address if there are close matches.
const addrType = getAddressType(query);
if (addrType !== null) {
queryList.unshift({
addressType: addrType,
address: query,
isKnown: false,
});
if (this._cancelThreepidLookup) this._cancelThreepidLookup();
if (addrType == 'email') {
this._lookupThreepid(addrType, query).done();
}
}
} }
}, QUERY_USER_DIRECTORY_DEBOUNCE_MS);
} else {
this.setState({ this.setState({
queryList: queryList, queryList: [],
error: false, query: "",
}, () => { searchError: null,
this.addressSelector.moveSelectionTop();
}); });
}, 200); }
}, },
onDismissed: function(index) { onDismissed: function(index) {
var self = this; var self = this;
return function() { return () => {
var inviteList = self.state.inviteList.slice(); var inviteList = self.state.inviteList.slice();
inviteList.splice(index, 1); inviteList.splice(index, 1);
self.setState({ self.setState({
inviteList: inviteList, inviteList: inviteList,
queryList: [], queryList: [],
query: "",
}); });
if (this._cancelThreepidLookup) this._cancelThreepidLookup(); if (this._cancelThreepidLookup) this._cancelThreepidLookup();
}; };
@ -254,10 +227,108 @@ module.exports = React.createClass({
this.setState({ this.setState({
inviteList: inviteList, inviteList: inviteList,
queryList: [], queryList: [],
query: "",
}); });
if (this._cancelThreepidLookup) this._cancelThreepidLookup(); if (this._cancelThreepidLookup) this._cancelThreepidLookup();
}, },
_doUserDirectorySearch: function(query) {
this.setState({
busy: true,
query,
searchError: null,
});
MatrixClientPeg.get().searchUserDirectory({
term: query,
}).then((resp) => {
// The query might have changed since we sent the request, so ignore
// responses for anything other than the latest query.
if (this.state.query !== query) {
return;
}
this._processResults(resp.results, query);
}).catch((err) => {
console.error('Error whilst searching user directory: ', err);
this.setState({
searchError: err.errcode ? err.message : _t('Something went wrong!'),
});
if (err.errcode === 'M_UNRECOGNIZED') {
this.setState({
serverSupportsUserDirectory: false,
});
// Do a local search immediately
this._doLocalSearch(query);
}
}).done(() => {
this.setState({
busy: false,
});
});
},
_doLocalSearch: function(query) {
this.setState({
query,
searchError: null,
});
const results = [];
MatrixClientPeg.get().getUsers().forEach((user) => {
if (user.userId.toLowerCase().indexOf(query) === -1 &&
user.displayName.toLowerCase().indexOf(query) === -1
) {
return;
}
// Put results in the format of the new API
results.push({
user_id: user.userId,
display_name: user.displayName,
avatar_url: user.avatarUrl,
});
});
this._processResults(results, query);
},
_processResults: function(results, query) {
const queryList = [];
results.forEach((user) => {
if (user.user_id === MatrixClientPeg.get().credentials.userId) {
return;
}
// Return objects, structure of which is defined
// by InviteAddressType
queryList.push({
addressType: 'mx',
address: user.user_id,
displayName: user.display_name,
avatarMxc: user.avatar_url,
isKnown: true,
});
});
// If the query is a valid address, add an entry for that
// This is important, otherwise there's no way to invite
// a perfectly valid address if there are close matches.
const addrType = getAddressType(query);
if (addrType !== null) {
queryList.unshift({
addressType: addrType,
address: query,
isKnown: false,
});
if (this._cancelThreepidLookup) this._cancelThreepidLookup();
if (addrType == 'email') {
this._lookupThreepid(addrType, query).done();
}
}
this.setState({
queryList,
error: false,
}, () => {
if (this.addressSelector) this.addressSelector.moveSelectionTop();
});
},
_getDirectMessageRooms: function(addr) { _getDirectMessageRooms: function(addr) {
const dmRoomMap = new DMRoomMap(MatrixClientPeg.get()); const dmRoomMap = new DMRoomMap(MatrixClientPeg.get());
const dmRooms = dmRoomMap.getDMRoomsForUserId(addr); const dmRooms = dmRoomMap.getDMRoomsForUserId(addr);
@ -342,16 +413,6 @@ module.exports = React.createClass({
this.props.onFinished(true, addrTexts); this.props.onFinished(true, addrTexts);
}, },
_updateUserList: function() {
// Get all the users
this._userList = MatrixClientPeg.get().getUsers();
// Remove current user
const meIx = this._userList.findIndex((u) => {
return u.userId === MatrixClientPeg.get().credentials.userId;
});
this._userList.splice(meIx, 1);
},
_isOnInviteList: function(uid) { _isOnInviteList: function(uid) {
for (let i = 0; i < this.state.inviteList.length; i++) { for (let i = 0; i < this.state.inviteList.length; i++) {
if ( if (
@ -419,6 +480,7 @@ module.exports = React.createClass({
this.setState({ this.setState({
inviteList: inviteList, inviteList: inviteList,
queryList: [], queryList: [],
query: "",
}); });
if (this._cancelThreepidLookup) this._cancelThreepidLookup(); if (this._cancelThreepidLookup) this._cancelThreepidLookup();
return inviteList; return inviteList;
@ -454,7 +516,7 @@ module.exports = React.createClass({
displayName: res.displayname, displayName: res.displayname,
avatarMxc: res.avatar_url, avatarMxc: res.avatar_url,
isKnown: true, isKnown: true,
}] }],
}); });
}); });
}, },
@ -486,23 +548,27 @@ module.exports = React.createClass({
placeholder={this.props.placeholder} placeholder={this.props.placeholder}
defaultValue={this.props.value} defaultValue={this.props.value}
autoFocus={this.props.focus}> autoFocus={this.props.focus}>
</textarea> </textarea>,
); );
var error; let error;
var addressSelector; let addressSelector;
if (this.state.error) { if (this.state.error) {
error = <div className="mx_ChatInviteDialog_error">{_t("You have entered an invalid contact. Try using their Matrix ID or email address.")}</div>; error = <div className="mx_ChatInviteDialog_error">{_t("You have entered an invalid contact. Try using their Matrix ID or email address.")}</div>;
} else if (this.state.searchError) {
error = <div className="mx_ChatInviteDialog_error">{this.state.searchError}</div>;
} else if (
this.state.query.length > 0 &&
this.state.queryList.length === 0 &&
!this.state.busy
) {
error = <div className="mx_ChatInviteDialog_error">{_t("No results")}</div>;
} else { } else {
const addressSelectorHeader = <div className="mx_ChatInviteDialog_addressSelectHeader">
Searching known users
</div>;
addressSelector = ( addressSelector = (
<AddressSelector ref={(ref) => {this.addressSelector = ref;}} <AddressSelector ref={(ref) => {this.addressSelector = ref;}}
addressList={ this.state.queryList } addressList={ this.state.queryList }
onSelected={ this.onSelected } onSelected={ this.onSelected }
truncateAt={ TRUNCATE_QUERY_LIST } truncateAt={ TRUNCATE_QUERY_LIST }
header={ addressSelectorHeader }
/> />
); );
} }

View file

@ -86,7 +86,7 @@ export default class DeactivateAccountDialog extends React.Component {
passwordBoxClass = 'error'; passwordBoxClass = 'error';
} }
const okLabel = this.state.busy ? <Loader /> : 'Deactivate Account'; const okLabel = this.state.busy ? <Loader /> : _t('Deactivate Account');
const okEnabled = this.state.confirmButtonEnabled && !this.state.busy; const okEnabled = this.state.confirmButtonEnabled && !this.state.busy;
let cancelButton = null; let cancelButton = null;

View file

@ -78,7 +78,7 @@ export default React.createClass({
<AccessibleButton onClick={this._onDismissClick} <AccessibleButton onClick={this._onDismissClick}
className="mx_UserSettings_button" className="mx_UserSettings_button"
> >
Dismiss {_t("Dismiss")}
</AccessibleButton> </AccessibleButton>
</div> </div>
); );

View file

@ -1,72 +0,0 @@
/*
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.
*/
/*
* Usage:
* Modal.createDialog(NeedToRegisterDialog, {
* title: "some text", (default: "Registration required")
* description: "some more text",
* onFinished: someFunction,
* });
*/
import React from 'react';
import dis from '../../../dispatcher';
import sdk from '../../../index';
import { _t } from '../../../languageHandler';
module.exports = React.createClass({
displayName: 'NeedToRegisterDialog',
propTypes: {
title: React.PropTypes.string,
description: React.PropTypes.oneOfType([
React.PropTypes.element,
React.PropTypes.string,
]),
onFinished: React.PropTypes.func.isRequired,
},
onRegisterClicked: function() {
dis.dispatch({
action: "start_upgrade_registration",
});
if (this.props.onFinished) {
this.props.onFinished();
}
},
render: function() {
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
return (
<BaseDialog className="mx_NeedToRegisterDialog"
onFinished={this.props.onFinished}
title={this.props.title || _t('Registration required')}
>
<div className="mx_Dialog_content">
{this.props.description || _t('A registered account is required for this action')}
</div>
<div className="mx_Dialog_buttons">
<button className="mx_Dialog_primary" onClick={this.props.onFinished} autoFocus={true}>
{_t("Cancel")}
</button>
<button onClick={this.onRegisterClicked}>
{_t("Register")}
</button>
</div>
</BaseDialog>
);
},
});

View file

@ -18,7 +18,7 @@ import React from 'react';
import sdk from '../../../index'; import sdk from '../../../index';
import SdkConfig from '../../../SdkConfig'; import SdkConfig from '../../../SdkConfig';
import Modal from '../../../Modal'; import Modal from '../../../Modal';
import { _t } from '../../../languageHandler'; import { _t, _tJsx } from '../../../languageHandler';
export default React.createClass({ export default React.createClass({
@ -44,8 +44,11 @@ export default React.createClass({
if (SdkConfig.get().bug_report_endpoint_url) { if (SdkConfig.get().bug_report_endpoint_url) {
bugreport = ( bugreport = (
<p>Otherwise, <a onClick={this._sendBugReport} href='#'> <p>
click here</a> to send a bug report. {_tJsx(
"Otherwise, <a>click here</a> to send a bug report.",
/<a>(.*?)<\/a>/, (sub) => <a onClick={this._sendBugReport} key="bugreport" href='#'>{sub}</a>,
)}
</p> </p>
); );
} }

View file

@ -0,0 +1,164 @@
/*
Copyright 2017 Vector Creations Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from 'react';
import sdk from '../../../index';
import Email from '../../../email';
import AddThreepid from '../../../AddThreepid';
import { _t } from '../../../languageHandler';
import Modal from '../../../Modal';
/**
* Prompt the user to set an email address.
*
* On success, `onFinished(true)` is called.
*/
export default React.createClass({
displayName: 'SetEmailDialog',
propTypes: {
onFinished: React.PropTypes.func.isRequired,
},
getInitialState: function() {
return {
emailAddress: null,
emailBusy: false,
};
},
componentDidMount: function() {
},
onEmailAddressChanged: function(value) {
this.setState({
emailAddress: value,
});
},
onSubmit: function() {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
const emailAddress = this.state.emailAddress;
if (!Email.looksValid(emailAddress)) {
Modal.createDialog(ErrorDialog, {
title: _t("Invalid Email Address"),
description: _t("This doesn't appear to be a valid email address"),
});
return;
}
this._addThreepid = new AddThreepid();
// we always bind emails when registering, so let's do the
// same here.
this._addThreepid.addEmailAddress(emailAddress, true).done(() => {
Modal.createDialog(QuestionDialog, {
title: _t("Verification Pending"),
description: _t(
"Please check your email and click on the link it contains. Once this " +
"is done, click continue.",
),
button: _t('Continue'),
onFinished: this.onEmailDialogFinished,
});
}, (err) => {
this.setState({emailBusy: false});
console.error("Unable to add email address " + emailAddress + " " + err);
Modal.createDialog(ErrorDialog, {
title: _t("Unable to add email address"),
description: ((err && err.message) ? err.message : _t("Operation failed")),
});
});
this.setState({emailBusy: true});
},
onCancelled: function() {
this.props.onFinished(false);
},
onEmailDialogFinished: function(ok) {
if (ok) {
this.verifyEmailAddress();
} else {
this.setState({emailBusy: false});
}
},
verifyEmailAddress: function() {
this._addThreepid.checkEmailLinkClicked().done(() => {
this.props.onFinished(true);
}, (err) => {
this.setState({emailBusy: false});
if (err.errcode == 'M_THREEPID_AUTH_FAILED') {
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
const message = _t("Unable to verify email address.") + " " +
_t("Please check your email and click on the link it contains. Once this is done, click continue.");
Modal.createDialog(QuestionDialog, {
title: _t("Verification Pending"),
description: message,
button: _t('Continue'),
onFinished: this.onEmailDialogFinished,
});
} else {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Unable to verify email address: " + err);
Modal.createDialog(ErrorDialog, {
title: _t("Unable to verify email address."),
description: ((err && err.message) ? err.message : _t("Operation failed")),
});
}
});
},
render: function() {
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
const Spinner = sdk.getComponent('elements.Spinner');
const EditableText = sdk.getComponent('elements.EditableText');
const emailInput = this.state.emailBusy ? <Spinner /> : <EditableText
className="mx_SetEmailDialog_email_input"
placeholder={ _t("Email address") }
placeholderClassName="mx_SetEmailDialog_email_input_placeholder"
blurToCancel={ false }
onValueChanged={ this.onEmailAddressChanged } />;
return (
<BaseDialog className="mx_SetEmailDialog"
onFinished={this.onCancelled}
title={this.props.title}
>
<div className="mx_Dialog_content">
<p>
{ _t('This will allow you to reset your password and receive notifications.') }
</p>
{ emailInput }
</div>
<div className="mx_Dialog_buttons">
<input className="mx_Dialog_primary"
type="submit"
value={_t("Continue")}
onClick={this.onSubmit}
/>
<input
type="submit"
value={_t("Cancel")}
onClick={this.onCancelled}
/>
</div>
</BaseDialog>
);
},
});

View file

@ -125,7 +125,7 @@ export default React.createClass({
break; break;
case "M_INVALID_USERNAME": case "M_INVALID_USERNAME":
newState.usernameError = _t( newState.usernameError = _t(
'Username invalid: %(errMessage)', 'Username invalid: %(errMessage)s',
{ errMessage: err.message}, { errMessage: err.message},
); );
break; break;
@ -139,8 +139,8 @@ export default React.createClass({
break; break;
default: default:
newState.usernameError = _t( newState.usernameError = _t(
'An error occurred: %(errMessage)', 'An error occurred: %(error_string)s',
{ errMessage: err.message }, { error_string: err.message },
); );
break; break;
} }

View file

@ -145,7 +145,7 @@ export default React.createClass({
console.log("UnknownDeviceDialog closed by escape"); console.log("UnknownDeviceDialog closed by escape");
this.props.onFinished(); this.props.onFinished();
}} }}
title='Room contains unknown devices' title={_t('Room contains unknown devices')}
> >
<GeminiScrollbar autoshow={false} className="mx_Dialog_content"> <GeminiScrollbar autoshow={false} className="mx_Dialog_content">
<h4> <h4>
@ -162,7 +162,7 @@ export default React.createClass({
this.props.onFinished(); this.props.onFinished();
Resend.resendUnsentEvents(this.props.room); Resend.resendUnsentEvents(this.props.room);
}}> }}>
Send anyway {_t("Send anyway")}
</button> </button>
<button className="mx_Dialog_primary" autoFocus={ true } <button className="mx_Dialog_primary" autoFocus={ true }
onClick={() => { onClick={() => {

View file

@ -23,7 +23,7 @@ const HomeButton = function(props) {
const ActionButton = sdk.getComponent('elements.ActionButton'); const ActionButton = sdk.getComponent('elements.ActionButton');
return ( return (
<ActionButton action="view_home_page" <ActionButton action="view_home_page"
label={ _t("Welcome page") } label={ _t("Home") }
iconPath="img/icons-home.svg" iconPath="img/icons-home.svg"
size={props.size} size={props.size}
tooltip={props.tooltip} tooltip={props.tooltip}

View file

@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import React from 'react'; import React from 'react';
import sdk from '../../../index';
const MemberAvatar = require('../avatars/MemberAvatar.js'); const MemberAvatar = require('../avatars/MemberAvatar.js');
import { _t } from '../../../languageHandler'; import { _t } from '../../../languageHandler';
@ -111,9 +112,13 @@ module.exports = React.createClass({
return null; return null;
} }
const EmojiText = sdk.getComponent('elements.EmojiText');
return ( return (
<span className="mx_TextualEvent mx_MemberEventListSummary_summary"> <span className="mx_TextualEvent mx_MemberEventListSummary_summary">
<EmojiText>
{summaries.join(", ")} {summaries.join(", ")}
</EmojiText>
</span> </span>
); );
}, },
@ -222,7 +227,6 @@ module.exports = React.createClass({
? _t("%(severalUsers)sjoined", { severalUsers: "" }) ? _t("%(severalUsers)sjoined", { severalUsers: "" })
: _t("%(oneUser)sjoined", { oneUser: "" }); : _t("%(oneUser)sjoined", { oneUser: "" });
} }
break; break;
case "left": case "left":
if (repeats > 1) { if (repeats > 1) {
@ -233,7 +237,8 @@ module.exports = React.createClass({
res = (plural) res = (plural)
? _t("%(severalUsers)sleft", { severalUsers: "" }) ? _t("%(severalUsers)sleft", { severalUsers: "" })
: _t("%(oneUser)sleft", { oneUser: "" }); : _t("%(oneUser)sleft", { oneUser: "" });
} break; }
break;
case "joined_and_left": case "joined_and_left":
if (repeats > 1) { if (repeats > 1) {
res = (plural) res = (plural)
@ -254,7 +259,7 @@ module.exports = React.createClass({
res = (plural) res = (plural)
? _t("%(severalUsers)sleft and rejoined", { severalUsers: "" }) ? _t("%(severalUsers)sleft and rejoined", { severalUsers: "" })
: _t("%(oneUser)sleft and rejoined", { oneUser: "" }); : _t("%(oneUser)sleft and rejoined", { oneUser: "" });
} break; }
break; break;
case "invite_reject": case "invite_reject":
if (repeats > 1) { if (repeats > 1) {

View file

@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
var React = require('react'); var React = require('react');
import { _t } from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'TruncatedList', displayName: 'TruncatedList',
@ -33,7 +34,7 @@ module.exports = React.createClass({
truncateAt: 2, truncateAt: 2,
createOverflowElement: function(overflowCount, totalCount) { createOverflowElement: function(overflowCount, totalCount) {
return ( return (
<div>And {overflowCount} more...</div> <div>{_t("And %(count)s more...", {count: overflowCount})}</div>
); );
} }
}; };

View file

@ -46,6 +46,10 @@ module.exports = React.createClass({
}; };
}, },
componentWillMount: function() {
this._captchaWidgetId = null;
},
componentDidMount: function() { componentDidMount: function() {
// Just putting a script tag into the returned jsx doesn't work, annoyingly, // Just putting a script tag into the returned jsx doesn't work, annoyingly,
// so we do this instead. // so we do this instead.
@ -75,6 +79,10 @@ module.exports = React.createClass({
} }
}, },
componentWillUnmount: function() {
this._resetRecaptcha();
},
_renderRecaptcha: function(divId) { _renderRecaptcha: function(divId) {
if (!global.grecaptcha) { if (!global.grecaptcha) {
console.error("grecaptcha not loaded!"); console.error("grecaptcha not loaded!");
@ -90,12 +98,18 @@ module.exports = React.createClass({
} }
console.log("Rendering to %s", divId); console.log("Rendering to %s", divId);
global.grecaptcha.render(divId, { this._captchaWidgetId = global.grecaptcha.render(divId, {
sitekey: publicKey, sitekey: publicKey,
callback: this.props.onCaptchaResponse, callback: this.props.onCaptchaResponse,
}); });
}, },
_resetRecaptcha: function() {
if (this._captchaWidgetId !== null) {
global.grecaptcha.reset(this._captchaWidgetId);
}
},
_onCaptchaLoaded: function() { _onCaptchaLoaded: function() {
console.log("Loaded recaptcha script."); console.log("Loaded recaptcha script.");
try { try {

View file

@ -440,7 +440,7 @@ export const FallbackAuthEntry = React.createClass({
render: function() { render: function() {
return ( return (
<div> <div>
<a onClick={this._onShowFallbackClick}>Start authentication</a> <a onClick={this._onShowFallbackClick}>{_t("Start authentication")}</a>
<div className="error"> <div className="error">
{this.props.errorText} {this.props.errorText}
</div> </div>

View file

@ -54,11 +54,6 @@ module.exports = React.createClass({
})).required, })).required,
}), }),
// A username that will be used if no username is entered.
// Specifying this param will also warn the user that entering
// a different username will cause a fresh account to be generated.
guestUsername: React.PropTypes.string,
minPasswordLength: React.PropTypes.number, minPasswordLength: React.PropTypes.number,
onError: React.PropTypes.func, onError: React.PropTypes.func,
onRegisterClick: React.PropTypes.func.isRequired, // onRegisterClick(Object) => ?Promise onRegisterClick: React.PropTypes.func.isRequired, // onRegisterClick(Object) => ?Promise
@ -101,7 +96,7 @@ module.exports = React.createClass({
if (this.refs.email.value == '') { if (this.refs.email.value == '') {
var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
Modal.createDialog(QuestionDialog, { Modal.createDialog(QuestionDialog, {
title: "Warning!", title: _t("Warning!"),
description: description:
<div> <div>
{_t("If you don't specify an email address, you won't be able to reset your password. " + {_t("If you don't specify an email address, you won't be able to reset your password. " +
@ -123,7 +118,7 @@ module.exports = React.createClass({
_doSubmit: function(ev) { _doSubmit: function(ev) {
let email = this.refs.email.value.trim(); let email = this.refs.email.value.trim();
var promise = this.props.onRegisterClick({ var promise = this.props.onRegisterClick({
username: this.refs.username.value.trim() || this.props.guestUsername, username: this.refs.username.value.trim(),
password: this.refs.password.value.trim(), password: this.refs.password.value.trim(),
email: email, email: email,
phoneCountry: this.state.phoneCountry, phoneCountry: this.state.phoneCountry,
@ -191,7 +186,7 @@ module.exports = React.createClass({
break; break;
case FIELD_USERNAME: case FIELD_USERNAME:
// XXX: SPEC-1 // XXX: SPEC-1
var username = this.refs.username.value.trim() || this.props.guestUsername; var username = this.refs.username.value.trim();
if (encodeURIComponent(username) != username) { if (encodeURIComponent(username) != username) {
this.markFieldValid( this.markFieldValid(
field_id, field_id,
@ -335,13 +330,10 @@ module.exports = React.createClass({
); );
const registerButton = ( const registerButton = (
<input className="mx_Login_submit" type="submit" value="Register" /> <input className="mx_Login_submit" type="submit" value={_t("Register")} />
); );
let placeholderUserName = _t("User name"); let placeholderUserName = _t("User name");
if (this.props.guestUsername) {
placeholderUserName += " " + _t("(default: %(userName)s)", {userName: this.props.guestUsername});
}
return ( return (
<div> <div>
@ -354,9 +346,6 @@ module.exports = React.createClass({
className={this._classForField(FIELD_USERNAME, 'mx_Login_field')} className={this._classForField(FIELD_USERNAME, 'mx_Login_field')}
onBlur={function() {self.validateField(FIELD_USERNAME);}} /> onBlur={function() {self.validateField(FIELD_USERNAME);}} />
<br /> <br />
{ this.props.guestUsername ?
<div className="mx_Login_fieldLabel">{_t("Setting a user name will create a fresh account")}</div> : null
}
<input type="password" ref="password" <input type="password" ref="password"
className={this._classForField(FIELD_PASSWORD, 'mx_Login_field')} className={this._classForField(FIELD_PASSWORD, 'mx_Login_field')}
onBlur={function() {self.validateField(FIELD_PASSWORD);}} onBlur={function() {self.validateField(FIELD_PASSWORD);}}

View file

@ -62,8 +62,8 @@ module.exports = React.createClass({
var url = ContentRepo.getHttpUriForMxc( var url = ContentRepo.getHttpUriForMxc(
MatrixClientPeg.get().getHomeserverUrl(), MatrixClientPeg.get().getHomeserverUrl(),
ev.getContent().url, ev.getContent().url,
14 * window.devicePixelRatio, Math.ceil(14 * window.devicePixelRatio),
14 * window.devicePixelRatio, Math.ceil(14 * window.devicePixelRatio),
'crop' 'crop'
); );

View file

@ -30,7 +30,7 @@ export default function SenderProfile(props) {
} }
return ( return (
<EmojiText className="mx_SenderProfile" <EmojiText className="mx_SenderProfile" dir="auto"
onClick={props.onClick}>{`${name || ''} ${props.aux || ''}`}</EmojiText> onClick={props.onClick}>{`${name || ''} ${props.aux || ''}`}</EmojiText>
); );
} }

View file

@ -63,6 +63,19 @@ module.exports = React.createClass({
}; };
}, },
copyToClipboard: function(text) {
const textArea = document.createElement("textarea");
textArea.value = text;
document.body.appendChild(textArea);
textArea.select();
try {
const successful = document.execCommand('copy');
} catch (err) {
console.log('Unable to copy');
}
document.body.removeChild(textArea);
},
componentDidMount: function() { componentDidMount: function() {
this._unmounted = false; this._unmounted = false;
@ -81,6 +94,14 @@ module.exports = React.createClass({
} }
}, 10); }, 10);
} }
// add event handlers to the 'copy code' buttons
const buttons = ReactDOM.findDOMNode(this).getElementsByClassName("mx_EventTile_copyButton");
for (let i = 0; i < buttons.length; i++) {
buttons[i].onclick = (e) => {
const copyCode = buttons[i].parentNode.getElementsByTagName("code")[0];
this.copyToClipboard(copyCode.textContent);
};
}
} }
}, },

View file

@ -19,7 +19,7 @@ import MatrixClientPeg from "../../../MatrixClientPeg";
import sdk from '../../../index'; import sdk from '../../../index';
import dis from "../../../dispatcher"; import dis from "../../../dispatcher";
import ObjectUtils from '../../../ObjectUtils'; import ObjectUtils from '../../../ObjectUtils';
import { _t } from '../../../languageHandler'; import { _t, _tJsx} from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
@ -78,7 +78,7 @@ module.exports = React.createClass({
fileDropTarget = ( fileDropTarget = (
<div className="mx_RoomView_fileDropTarget"> <div className="mx_RoomView_fileDropTarget">
<div className="mx_RoomView_fileDropTargetLabel" <div className="mx_RoomView_fileDropTargetLabel"
title="Drop File Here"> title={_t("Drop File Here")}>
<TintableSvg src="img/upload-big.svg" width="45" height="59"/> <TintableSvg src="img/upload-big.svg" width="45" height="59"/>
<br/> <br/>
{_t("Drop file here to upload")} {_t("Drop file here to upload")}
@ -89,21 +89,31 @@ module.exports = React.createClass({
var conferenceCallNotification = null; var conferenceCallNotification = null;
if (this.props.displayConfCallNotification) { if (this.props.displayConfCallNotification) {
var supportedText, joinText; let supportedText = '';
let joinNode;
if (!MatrixClientPeg.get().supportsVoip()) { if (!MatrixClientPeg.get().supportsVoip()) {
supportedText = _t(" (unsupported)"); supportedText = _t(" (unsupported)");
} }
else { else {
joinText = (<span> joinNode = (<span>
Join as <a onClick={(event)=>{ this.onConferenceNotificationClick(event, 'voice');}} {_tJsx(
href="#">voice</a> or <a onClick={(event)=>{ this.onConferenceNotificationClick(event, 'video'); }} "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.",
href="#">video</a>. [/<voiceText>(.*?)<\/voiceText>/, /<videoText>(.*?)<\/videoText>/],
[
(sub) => <a onClick={(event)=>{ this.onConferenceNotificationClick(event, 'voice');}} href="#">{sub}</a>,
(sub) => <a onClick={(event)=>{ this.onConferenceNotificationClick(event, 'video');}} href="#">{sub}</a>,
]
)}
</span>); </span>);
} }
// XXX: the translation here isn't great: appending ' (unsupported)' is likely to not make sense in many languages,
// but there are translations for this in the languages we do have so I'm leaving it for now.
conferenceCallNotification = ( conferenceCallNotification = (
<div className="mx_RoomView_ongoingConfCallNotification"> <div className="mx_RoomView_ongoingConfCallNotification">
{_t("Ongoing conference call%(supportedText)s. %(joinText)s", {supportedText: supportedText, joinText: joinText})} {_t("Ongoing conference call%(supportedText)s.", {supportedText: supportedText})}
&nbsp;
{joinNode}
</div> </div>
); );
} }

View file

@ -21,6 +21,7 @@ var React = require('react');
var MatrixClientPeg = require('../../../MatrixClientPeg'); var MatrixClientPeg = require('../../../MatrixClientPeg');
var sdk = require('../../../index'); var sdk = require('../../../index');
import AccessibleButton from '../elements/AccessibleButton'; import AccessibleButton from '../elements/AccessibleButton';
import { _t } from '../../../languageHandler';
var PRESENCE_CLASS = { var PRESENCE_CLASS = {
@ -115,7 +116,7 @@ module.exports = React.createClass({
nameEl = ( nameEl = (
<div className="mx_EntityTile_details"> <div className="mx_EntityTile_details">
<img className="mx_EntityTile_chevron" src="img/member_chevron.png" width="8" height="12"/> <img className="mx_EntityTile_chevron" src="img/member_chevron.png" width="8" height="12"/>
<EmojiText element="div" className="mx_EntityTile_name_hover">{name}</EmojiText> <EmojiText element="div" className="mx_EntityTile_name_hover" dir="auto">{name}</EmojiText>
<PresenceLabel activeAgo={ activeAgo } <PresenceLabel activeAgo={ activeAgo }
currentlyActive={this.props.presenceCurrentlyActive} currentlyActive={this.props.presenceCurrentlyActive}
presenceState={this.props.presenceState} /> presenceState={this.props.presenceState} />
@ -124,7 +125,7 @@ module.exports = React.createClass({
} }
else { else {
nameEl = ( nameEl = (
<EmojiText element="div" className="mx_EntityTile_name">{name}</EmojiText> <EmojiText element="div" className="mx_EntityTile_name" dir="auto">{name}</EmojiText>
); );
} }
@ -140,10 +141,10 @@ module.exports = React.createClass({
var power; var power;
var powerLevel = this.props.powerLevel; var powerLevel = this.props.powerLevel;
if (powerLevel >= 50 && powerLevel < 99) { if (powerLevel >= 50 && powerLevel < 99) {
power = <img src="img/mod.svg" className="mx_EntityTile_power" width="16" height="17" alt="Mod"/>; power = <img src="img/mod.svg" className="mx_EntityTile_power" width="16" height="17" alt={_t("Moderator")}/>;
} }
if (powerLevel >= 99) { if (powerLevel >= 99) {
power = <img src="img/admin.svg" className="mx_EntityTile_power" width="16" height="17" alt="Admin"/>; power = <img src="img/admin.svg" className="mx_EntityTile_power" width="16" height="17" alt={_t("Admin")}/>;
} }

View file

@ -381,6 +381,7 @@ module.exports = WithMatrixClient(React.createClass({
dis.dispatch({ dis.dispatch({
action: 'view_room', action: 'view_room',
event_id: this.props.mxEvent.getId(), event_id: this.props.mxEvent.getId(),
highlighted: true,
room_id: this.props.mxEvent.getRoomId(), room_id: this.props.mxEvent.getRoomId(),
}); });
}, },
@ -487,22 +488,22 @@ module.exports = WithMatrixClient(React.createClass({
let e2e; let e2e;
// cosmetic padlocks: // cosmetic padlocks:
if ((e2eEnabled && this.props.eventSendStatus) || this.props.mxEvent.getType() === 'm.room.encryption') { if ((e2eEnabled && this.props.eventSendStatus) || this.props.mxEvent.getType() === 'm.room.encryption') {
e2e = <img style={{ cursor: 'initial', marginLeft: '-1px' }} className="mx_EventTile_e2eIcon" alt="Encrypted by verified device" src="img/e2e-verified.svg" width="10" height="12" />; e2e = <img style={{ cursor: 'initial', marginLeft: '-1px' }} className="mx_EventTile_e2eIcon" alt={_t("Encrypted by a verified device")} src="img/e2e-verified.svg" width="10" height="12" />;
} }
// real padlocks // real padlocks
else if (this.props.mxEvent.isEncrypted() || (e2eEnabled && this.props.eventSendStatus)) { else if (this.props.mxEvent.isEncrypted() || (e2eEnabled && this.props.eventSendStatus)) {
if (this.props.mxEvent.getContent().msgtype === 'm.bad.encrypted') { if (this.props.mxEvent.getContent().msgtype === 'm.bad.encrypted') {
e2e = <img onClick={ this.onCryptoClicked } className="mx_EventTile_e2eIcon" alt="Undecryptable" src="img/e2e-blocked.svg" width="12" height="12" style={{ marginLeft: "-1px" }} />; e2e = <img onClick={ this.onCryptoClicked } className="mx_EventTile_e2eIcon" alt={_t("Undecryptable")} src="img/e2e-blocked.svg" width="12" height="12" style={{ marginLeft: "-1px" }} />;
} }
else if (this.state.verified == true || (e2eEnabled && this.props.eventSendStatus)) { else if (this.state.verified == true || (e2eEnabled && this.props.eventSendStatus)) {
e2e = <img onClick={ this.onCryptoClicked } className="mx_EventTile_e2eIcon" alt="Encrypted by verified device" src="img/e2e-verified.svg" width="10" height="12"/>; e2e = <img onClick={ this.onCryptoClicked } className="mx_EventTile_e2eIcon" alt={_t("Encrypted by a verified device")} src="img/e2e-verified.svg" width="10" height="12"/>;
} }
else { else {
e2e = <img onClick={ this.onCryptoClicked } className="mx_EventTile_e2eIcon" alt="Encrypted by unverified device" src="img/e2e-warning.svg" width="15" height="12" style={{ marginLeft: "-2px" }}/>; e2e = <img onClick={ this.onCryptoClicked } className="mx_EventTile_e2eIcon" alt={_t("Encrypted by an unverified device")} src="img/e2e-warning.svg" width="15" height="12" style={{ marginLeft: "-2px" }}/>;
} }
} }
else if (e2eEnabled) { else if (e2eEnabled) {
e2e = <img onClick={ this.onCryptoClicked } className="mx_EventTile_e2eIcon" alt="Unencrypted message" src="img/e2e-unencrypted.svg" width="12" height="12"/>; e2e = <img onClick={ this.onCryptoClicked } className="mx_EventTile_e2eIcon" alt={_t("Unencrypted message")} src="img/e2e-unencrypted.svg" width="12" height="12"/>;
} }
const timestamp = this.props.mxEvent.getTs() ? const timestamp = this.props.mxEvent.getTs() ?
<MessageTimestamp showTwelveHour={this.props.isTwelveHour} ts={this.props.mxEvent.getTs()} /> : null; <MessageTimestamp showTwelveHour={this.props.isTwelveHour} ts={this.props.mxEvent.getTs()} /> : null;

View file

@ -17,7 +17,6 @@
import React from 'react'; import React from 'react';
import { _t } from '../../../languageHandler'; import { _t } from '../../../languageHandler';
import MatrixClientPeg from '../../../MatrixClientPeg';
import dis from '../../../dispatcher'; import dis from '../../../dispatcher';
import KeyCode from '../../../KeyCode'; import KeyCode from '../../../KeyCode';
@ -26,11 +25,6 @@ module.exports = React.createClass({
displayName: 'ForwardMessage', displayName: 'ForwardMessage',
propTypes: { propTypes: {
currentRoomId: React.PropTypes.string.isRequired,
/* the MatrixEvent to be forwarded */
mxEvent: React.PropTypes.object.isRequired,
onCancelClick: React.PropTypes.func.isRequired, onCancelClick: React.PropTypes.func.isRequired,
}, },
@ -44,7 +38,6 @@ module.exports = React.createClass({
}, },
componentDidMount: function() { componentDidMount: function() {
this.dispatcherRef = dis.register(this.onAction);
document.addEventListener('keydown', this._onKeyDown); document.addEventListener('keydown', this._onKeyDown);
}, },
@ -54,30 +47,9 @@ module.exports = React.createClass({
sideOpacity: 1.0, sideOpacity: 1.0,
middleOpacity: 1.0, middleOpacity: 1.0,
}); });
dis.unregister(this.dispatcherRef);
document.removeEventListener('keydown', this._onKeyDown); document.removeEventListener('keydown', this._onKeyDown);
}, },
onAction: function(payload) {
if (payload.action === 'view_room') {
const event = this.props.mxEvent;
const Client = MatrixClientPeg.get();
Client.sendEvent(payload.room_id, event.getType(), event.getContent()).done(() => {
dis.dispatch({action: 'message_sent'});
}, (err) => {
if (err.name === "UnknownDeviceError") {
dis.dispatch({
action: 'unknown_device_error',
err: err,
room: Client.getRoom(payload.room_id),
});
}
dis.dispatch({action: 'message_send_failed'});
});
if (this.props.currentRoomId === payload.room_id) this.props.onCancelClick();
}
},
_onKeyDown: function(ev) { _onKeyDown: function(ev) {
switch (ev.keyCode) { switch (ev.keyCode) {
case KeyCode.ESCAPE: case KeyCode.ESCAPE:

View file

@ -26,19 +26,19 @@ export default class MemberDeviceInfo extends React.Component {
if (this.props.device.isBlocked()) { if (this.props.device.isBlocked()) {
indicator = ( indicator = (
<div className="mx_MemberDeviceInfo_blacklisted"> <div className="mx_MemberDeviceInfo_blacklisted">
<img src="img/e2e-blocked.svg" width="12" height="12" style={{ marginLeft: "-1px" }} alt="Blacklisted"/> <img src="img/e2e-blocked.svg" width="12" height="12" style={{ marginLeft: "-1px" }} alt={_t("Blacklisted")}/>
</div> </div>
); );
} else if (this.props.device.isVerified()) { } else if (this.props.device.isVerified()) {
indicator = ( indicator = (
<div className="mx_MemberDeviceInfo_verified"> <div className="mx_MemberDeviceInfo_verified">
<img src="img/e2e-verified.svg" width="10" height="12" alt="Verified"/> <img src="img/e2e-verified.svg" width="10" height="12" alt={_t("Verified")}/>
</div> </div>
); );
} else { } else {
indicator = ( indicator = (
<div className="mx_MemberDeviceInfo_unverified"> <div className="mx_MemberDeviceInfo_unverified">
<img src="img/e2e-warning.svg" width="15" height="12" style={{ marginLeft: "-2px" }} alt="Unverified"/> <img src="img/e2e-warning.svg" width="15" height="12" style={{ marginLeft: "-2px" }} alt={_t("Unverified")}/>
</div> </div>
); );
} }

View file

@ -38,6 +38,8 @@ import Unread from '../../../Unread';
import { findReadReceiptFromUserId } from '../../../utils/Receipt'; import { findReadReceiptFromUserId } from '../../../utils/Receipt';
import WithMatrixClient from '../../../wrappers/WithMatrixClient'; import WithMatrixClient from '../../../wrappers/WithMatrixClient';
import AccessibleButton from '../elements/AccessibleButton'; import AccessibleButton from '../elements/AccessibleButton';
import GeminiScrollbar from 'react-gemini-scrollbar';
module.exports = WithMatrixClient(React.createClass({ module.exports = WithMatrixClient(React.createClass({
displayName: 'MemberInfo', displayName: 'MemberInfo',
@ -432,7 +434,7 @@ module.exports = WithMatrixClient(React.createClass({
title: _t("Warning!"), title: _t("Warning!"),
description: description:
<div> <div>
{ _t("You will not be able to undo this change as you are promoting the user to have the same power level as yourself") }.<br/> { _t("You will not be able to undo this change as you are promoting the user to have the same power level as yourself.") }<br/>
{ _t("Are you sure?") } { _t("Are you sure?") }
</div>, </div>,
button: _t("Continue"), button: _t("Continue"),
@ -701,7 +703,7 @@ module.exports = WithMatrixClient(React.createClass({
if (kickButton || banButton || muteButton || giveModButton) { if (kickButton || banButton || muteButton || giveModButton) {
adminTools = adminTools =
<div> <div>
<h3>Admin tools</h3> <h3>{_t("Admin tools")}</h3>
<div className="mx_MemberInfo_buttons"> <div className="mx_MemberInfo_buttons">
{muteButton} {muteButton}
@ -727,6 +729,7 @@ module.exports = WithMatrixClient(React.createClass({
const EmojiText = sdk.getComponent('elements.EmojiText'); const EmojiText = sdk.getComponent('elements.EmojiText');
return ( return (
<div className="mx_MemberInfo"> <div className="mx_MemberInfo">
<GeminiScrollbar autoshow={true}>
<AccessibleButton className="mx_MemberInfo_cancel" onClick={this.onCancel}> <img src="img/cancel.svg" width="18" height="18"/></AccessibleButton> <AccessibleButton className="mx_MemberInfo_cancel" onClick={this.onCancel}> <img src="img/cancel.svg" width="18" height="18"/></AccessibleButton>
<div className="mx_MemberInfo_avatar"> <div className="mx_MemberInfo_avatar">
<MemberAvatar onClick={this.onMemberAvatarClick} member={this.props.member} width={48} height={48} /> <MemberAvatar onClick={this.onMemberAvatarClick} member={this.props.member} width={48} height={48} />
@ -739,7 +742,7 @@ module.exports = WithMatrixClient(React.createClass({
{ this.props.member.userId } { this.props.member.userId }
</div> </div>
<div className="mx_MemberInfo_profileField"> <div className="mx_MemberInfo_profileField">
{ _t("Level") }: <b><PowerSelector controlled={true} value={ parseInt(this.props.member.powerLevel) } disabled={ !this.state.can.modifyLevel } onChange={ this.onPowerChange }/></b> { _t("Level:") } <b><PowerSelector controlled={true} value={ parseInt(this.props.member.powerLevel) } disabled={ !this.state.can.modifyLevel } onChange={ this.onPowerChange }/></b>
</div> </div>
<div className="mx_MemberInfo_profileField"> <div className="mx_MemberInfo_profileField">
<PresenceLabel activeAgo={ presenceLastActiveAgo } <PresenceLabel activeAgo={ presenceLastActiveAgo }
@ -755,6 +758,7 @@ module.exports = WithMatrixClient(React.createClass({
{ this._renderDevices() } { this._renderDevices() }
{ spinner } { spinner }
</GeminiScrollbar>
</div> </div>
); );
} }

View file

@ -22,6 +22,7 @@ var MatrixClientPeg = require('../../../MatrixClientPeg');
var sdk = require('../../../index'); var sdk = require('../../../index');
var dis = require('../../../dispatcher'); var dis = require('../../../dispatcher');
var Modal = require("../../../Modal"); var Modal = require("../../../Modal");
import { _t } from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'MemberTile', displayName: 'MemberTile',
@ -63,7 +64,7 @@ module.exports = React.createClass({
}, },
getPowerLabel: function() { getPowerLabel: function() {
return this.props.member.userId + " (power " + this.props.member.powerLevel + ")"; return _t("%(userName)s (power %(powerLevelNumber)s)", {userName: this.props.member.userId, powerLevelNumber: this.props.member.powerLevel});
}, },
render: function() { render: function() {

View file

@ -109,7 +109,7 @@ export default class MessageComposer extends React.Component {
let fileList = []; let fileList = [];
for (let i=0; i<files.length; i++) { for (let i=0; i<files.length; i++) {
fileList.push(<li key={i}> fileList.push(<li key={i}>
<TintableSvg key={i} src="img/files.svg" width="16" height="16" /> {files[i].name || 'Attachment'} <TintableSvg key={i} src="img/files.svg" width="16" height="16" /> {files[i].name || _t('Attachment')}
</li>); </li>);
} }
@ -287,7 +287,7 @@ export default class MessageComposer extends React.Component {
const formattingButton = ( const formattingButton = (
<img className="mx_MessageComposer_formatting" <img className="mx_MessageComposer_formatting"
title="Show Text Formatting Toolbar" title={_t("Show Text Formatting Toolbar")}
src="img/button-text-formatting.svg" src="img/button-text-formatting.svg"
onClick={this.onToggleFormattingClicked} onClick={this.onToggleFormattingClicked}
style={{visibility: this.state.showFormatting || style={{visibility: this.state.showFormatting ||

View file

@ -721,6 +721,7 @@ export default class MessageComposerInput extends React.Component {
title={ this.state.isRichtextEnabled ? _t("Markdown is disabled") : _t("Markdown is enabled")} title={ this.state.isRichtextEnabled ? _t("Markdown is disabled") : _t("Markdown is enabled")}
src={`img/button-md-${!this.state.isRichtextEnabled}.png`} /> src={`img/button-md-${!this.state.isRichtextEnabled}.png`} />
<Editor ref="editor" <Editor ref="editor"
dir="auto"
placeholder={this.props.placeholder} placeholder={this.props.placeholder}
editorState={this.state.editorState} editorState={this.state.editorState}
onChange={this.onEditorContentChanged} onChange={this.onEditorContentChanged}

View file

@ -461,7 +461,7 @@ export default React.createClass({
render: function() { render: function() {
return ( return (
<div className="mx_MessageComposer_input" onClick={ this.onInputClick }> <div className="mx_MessageComposer_input" onClick={ this.onInputClick }>
<textarea autoFocus ref="textarea" rows="1" onKeyDown={this.onKeyDown} onKeyUp={this.onKeyUp} placeholder={this.props.placeholder} <textarea dir="auto" autoFocus ref="textarea" rows="1" onKeyDown={this.onKeyDown} onKeyUp={this.onKeyUp} placeholder={this.props.placeholder}
onPaste={this._onPaste} onPaste={this._onPaste}
/> />
</div> </div>

View file

@ -23,6 +23,7 @@ var sdk = require('../../../index');
var Velociraptor = require('../../../Velociraptor'); var Velociraptor = require('../../../Velociraptor');
require('../../../VelocityBounce'); require('../../../VelocityBounce');
import { _t } from '../../../languageHandler';
import DateUtils from '../../../DateUtils'; import DateUtils from '../../../DateUtils';
@ -169,8 +170,10 @@ module.exports = React.createClass({
let title; let title;
if (this.props.timestamp) { if (this.props.timestamp) {
title = "Seen by " + this.props.member.userId + " at " + title = _t(
DateUtils.formatDate(new Date(this.props.timestamp)); "Seen by %(userName)s at %(dateTime)s",
{userName: this.props.member.userId, dateTime: DateUtils.formatDate(new Date(this.props.timestamp))}
);
} }
return ( return (

View file

@ -213,7 +213,7 @@ module.exports = React.createClass({
// don't display the search count until the search completes and // don't display the search count until the search completes and
// gives us a valid (possibly zero) searchCount. // gives us a valid (possibly zero) searchCount.
if (this.props.searchInfo && this.props.searchInfo.searchCount !== undefined && this.props.searchInfo.searchCount !== null) { if (this.props.searchInfo && this.props.searchInfo.searchCount !== undefined && this.props.searchInfo.searchCount !== null) {
searchStatus = <div className="mx_RoomHeader_searchStatus">&nbsp;{ _t("(~%(searchCount)s results)", { searchCount: this.props.searchInfo.searchCount }) }</div>; searchStatus = <div className="mx_RoomHeader_searchStatus">&nbsp;{ _t("(~%(count)s results)", { count: this.props.searchInfo.searchCount }) }</div>;
} }
// XXX: this is a bit inefficient - we could just compare room.name for 'Empty room'... // XXX: this is a bit inefficient - we could just compare room.name for 'Empty room'...
@ -238,7 +238,7 @@ module.exports = React.createClass({
const emojiTextClasses = classNames('mx_RoomHeader_nametext', { mx_RoomHeader_settingsHint: settingsHint }); const emojiTextClasses = classNames('mx_RoomHeader_nametext', { mx_RoomHeader_settingsHint: settingsHint });
name = name =
<div className="mx_RoomHeader_name" onClick={this.props.onSettingsClick}> <div className="mx_RoomHeader_name" onClick={this.props.onSettingsClick}>
<EmojiText element="div" className={emojiTextClasses} title={roomName}>{ roomName }</EmojiText> <EmojiText dir="auto" element="div" className={emojiTextClasses} title={roomName}>{ roomName }</EmojiText>
{ searchStatus } { searchStatus }
</div>; </div>;
} }
@ -255,7 +255,7 @@ module.exports = React.createClass({
} }
} }
if (topic) { if (topic) {
topic_el = <div className="mx_RoomHeader_topic" ref="topic" title={ topic }>{ topic }</div>; topic_el = <div className="mx_RoomHeader_topic" ref="topic" title={ topic } dir="auto">{ topic }</div>;
} }
} }
@ -288,7 +288,7 @@ module.exports = React.createClass({
var settings_button; var settings_button;
if (this.props.onSettingsClick) { if (this.props.onSettingsClick) {
settings_button = settings_button =
<AccessibleButton className="mx_RoomHeader_button" onClick={this.props.onSettingsClick} title="Settings"> <AccessibleButton className="mx_RoomHeader_button" onClick={this.props.onSettingsClick} title={_t("Settings")}>
<TintableSvg src="img/icons-settings-room.svg" width="16" height="16"/> <TintableSvg src="img/icons-settings-room.svg" width="16" height="16"/>
</AccessibleButton>; </AccessibleButton>;
} }

View file

@ -578,7 +578,7 @@ module.exports = React.createClass({
onHeaderClick={ self.onSubListHeaderClick } onHeaderClick={ self.onSubListHeaderClick }
onShowMoreRooms={ self.onShowMoreRooms } /> onShowMoreRooms={ self.onShowMoreRooms } />
{ Object.keys(self.state.lists).map(function(tagName) { { Object.keys(self.state.lists).map((tagName) => {
if (!tagName.match(/^(m\.(favourite|lowpriority)|im\.vector\.fake\.(invite|recent|direct|archived))$/)) { if (!tagName.match(/^(m\.(favourite|lowpriority)|im\.vector\.fake\.(invite|recent|direct|archived))$/)) {
return <RoomSubList list={ self.state.lists[tagName] } return <RoomSubList list={ self.state.lists[tagName] }
key={ tagName } key={ tagName }

View file

@ -19,6 +19,7 @@ limitations under the License.
var React = require('react'); var React = require('react');
var sdk = require('../../../index'); var sdk = require('../../../index');
var MatrixClientPeg = require('../../../MatrixClientPeg'); var MatrixClientPeg = require('../../../MatrixClientPeg');
import { _t } from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'RoomNameEditor', displayName: 'RoomNameEditor',
@ -35,8 +36,8 @@ module.exports = React.createClass({
this._initialName = name ? name.getContent().name : ''; this._initialName = name ? name.getContent().name : '';
this._placeholderName = "Unnamed Room"; this._placeholderName = _t("Unnamed Room");
if (defaultName && defaultName !== 'Empty room') { if (defaultName && defaultName !== 'Empty room') { // default name from JS SDK, needs no translation as we don't ever show it.
this._placeholderName += " (" + defaultName + ")"; this._placeholderName += " (" + defaultName + ")";
} }
}, },
@ -55,9 +56,9 @@ module.exports = React.createClass({
placeholderClassName="mx_RoomHeader_placeholder" placeholderClassName="mx_RoomHeader_placeholder"
placeholder={ this._placeholderName } placeholder={ this._placeholderName }
blurToCancel={ false } blurToCancel={ false }
initialValue={ this._initialName }/> initialValue={ this._initialName }
dir="auto" />
</div> </div>
); );
}, },
}); });

View file

@ -21,7 +21,7 @@ var React = require('react');
var sdk = require('../../../index'); var sdk = require('../../../index');
var MatrixClientPeg = require('../../../MatrixClientPeg'); var MatrixClientPeg = require('../../../MatrixClientPeg');
import { _t } from '../../../languageHandler'; import { _t, _tJsx } from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'RoomPreviewBar', displayName: 'RoomPreviewBar',
@ -84,7 +84,7 @@ module.exports = React.createClass({
}, },
_roomNameElement: function(fallback) { _roomNameElement: function(fallback) {
fallback = fallback || 'a room'; fallback = fallback || _t('a room');
const name = this.props.room ? this.props.room.name : (this.props.room_alias || ""); const name = this.props.room ? this.props.room.name : (this.props.room_alias || "");
return name ? name : fallback; return name ? name : fallback;
}, },
@ -114,8 +114,7 @@ module.exports = React.createClass({
if (this.props.invitedEmail) { if (this.props.invitedEmail) {
if (this.state.threePidFetchError) { if (this.state.threePidFetchError) {
emailMatchBlock = <div className="error"> emailMatchBlock = <div className="error">
Unable to ascertain that the address this invite was {_t("Unable to ascertain that the address this invite was sent to matches one associated with your account.")}
sent to matches one associated with your account.
</div>; </div>;
} else if (this.state.invitedEmailMxid != MatrixClientPeg.get().credentials.userId) { } else if (this.state.invitedEmailMxid != MatrixClientPeg.get().credentials.userId) {
emailMatchBlock = emailMatchBlock =
@ -124,28 +123,35 @@ module.exports = React.createClass({
<img src="img/warning.svg" width="24" height="23" title= "/!\\" alt="/!\\" /> <img src="img/warning.svg" width="24" height="23" title= "/!\\" alt="/!\\" />
</div> </div>
<div className="mx_RoomPreviewBar_warningText"> <div className="mx_RoomPreviewBar_warningText">
This invitation was sent to <b><span className="email">{this.props.invitedEmail}</span></b>, which is not associated with this account.<br/> {_t("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. <b><span className="email">{this.props.invitedEmail}</span></b>
<br/>
{_t("You may wish to login with a different account, or add this email to this account.")}
</div> </div>
</div>; </div>;
} }
} }
// TODO: find a way to respect HTML in counterpart!
joinBlock = ( joinBlock = (
<div> <div>
<div className="mx_RoomPreviewBar_invite_text"> <div className="mx_RoomPreviewBar_invite_text">
{ _t('You have been invited to join this room by %(inviterName)s', {inviterName: this.props.inviterName}) } { _t('You have been invited to join this room by %(inviterName)s', {inviterName: this.props.inviterName}) }
</div> </div>
<div className="mx_RoomPreviewBar_join_text"> <div className="mx_RoomPreviewBar_join_text">
{ _t('Would you like to') } <a onClick={ this.props.onJoinClick }>{ _t('accept') }</a> { _t('or') } <a onClick={ this.props.onRejectClick }>{ _t('decline') }</a> { _t('this invitation?') } { _tJsx(
'Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?',
[/<acceptText>(.*?)<\/acceptText>/, /<declineText>(.*?)<\/declineText>/],
[
(sub) => <a onClick={ this.props.onJoinClick }>{sub}</a>,
(sub) => <a onClick={ this.props.onRejectClick }>{sub}</a>
]
)}
</div> </div>
{emailMatchBlock} {emailMatchBlock}
</div> </div>
); );
} else if (kicked || banned) { } else if (kicked || banned) {
const verb = kicked ? 'kicked' : 'banned'; const roomName = this._roomNameElement(_t('This room'));
const roomName = this._roomNameElement('this room');
const kickerMember = this.props.room.currentState.getMember( const kickerMember = this.props.room.currentState.getMember(
myMember.events.member.getSender() myMember.events.member.getSender()
); );
@ -153,29 +159,39 @@ module.exports = React.createClass({
kickerMember.name : myMember.events.member.getSender(); kickerMember.name : myMember.events.member.getSender();
let reason; let reason;
if (myMember.events.member.getContent().reason) { if (myMember.events.member.getContent().reason) {
reason = <div>Reason: {myMember.events.member.getContent().reason}</div> reason = <div>{_t("Reason: %(reasonText)s", {reasonText: myMember.events.member.getContent().reason})}</div>
} }
let rejoinBlock; let rejoinBlock;
if (!banned) { if (!banned) {
rejoinBlock = <div><a onClick={ this.props.onJoinClick }><b>Rejoin</b></a></div>; rejoinBlock = <div><a onClick={ this.props.onJoinClick }><b>{_t("Rejoin")}</b></a></div>;
} }
let actionText;
if (kicked) {
actionText = _t("You have been kicked from %(roomName)s by %(userName)s.", {roomName: roomName, userName: kickerName});
}
else if (banned) {
actionText = _t("You have been banned from %(roomName)s by %(userName)s.", {roomName: roomName, userName: kickerName});
} // no other options possible due to the kicked || banned check above.
joinBlock = ( joinBlock = (
<div> <div>
<div className="mx_RoomPreviewBar_join_text"> <div className="mx_RoomPreviewBar_join_text">
You have been {verb} from {roomName} by {kickerName}.<br /> {actionText}
<br />
{reason} {reason}
{rejoinBlock} {rejoinBlock}
<a onClick={ this.props.onForgetClick }><b>Forget</b></a> <a onClick={ this.props.onForgetClick }><b>{_t("Forget room")}</b></a>
</div> </div>
</div> </div>
); );
} else if (this.props.error) { } else if (this.props.error) {
var name = this.props.roomAlias || "This room"; var name = this.props.roomAlias || _t("This room");
var error; var error;
if (this.props.error.errcode == 'M_NOT_FOUND') { if (this.props.error.errcode == 'M_NOT_FOUND') {
error = name + " does not exist"; error = _t("%(roomName)s does not exist.", {roomName: name});
} else { } else {
error = name + " is not accessible at this time"; error = _t("%(roomName)s is not accessible at this time.", {roomName: name});
} }
joinBlock = ( joinBlock = (
<div> <div>
@ -189,8 +205,12 @@ module.exports = React.createClass({
joinBlock = ( joinBlock = (
<div> <div>
<div className="mx_RoomPreviewBar_join_text"> <div className="mx_RoomPreviewBar_join_text">
{ _t('You are trying to access %(roomName)s', {roomName: name}) }.<br/> { _t('You are trying to access %(roomName)s.', {roomName: name}) }
<a onClick={ this.props.onJoinClick }><b>{ _t('Click here') }</b></a> { _t('to join the discussion') }! <br/>
{ _tJsx("<a>Click here</a> to join the discussion!",
/<a>(.*?)<\/a>/,
(sub) => <a onClick={ this.props.onJoinClick }><b>{sub}</b></a>
)}
</div> </div>
</div> </div>
); );

View file

@ -17,7 +17,7 @@ limitations under the License.
import q from 'q'; import q from 'q';
import React from 'react'; import React from 'react';
import { _t } from '../../../languageHandler'; import { _t, _tJsx } from '../../../languageHandler';
import MatrixClientPeg from '../../../MatrixClientPeg'; import MatrixClientPeg from '../../../MatrixClientPeg';
import SdkConfig from '../../../SdkConfig'; import SdkConfig from '../../../SdkConfig';
import sdk from '../../../index'; import sdk from '../../../index';
@ -40,13 +40,14 @@ function parseIntWithDefault(val, def) {
const BannedUser = React.createClass({ const BannedUser = React.createClass({
propTypes: { propTypes: {
member: React.PropTypes.object.isRequired, // js-sdk RoomMember member: React.PropTypes.object.isRequired, // js-sdk RoomMember
reason: React.PropTypes.string,
}, },
_onUnbanClick: function() { _onUnbanClick: function() {
const ConfirmUserActionDialog = sdk.getComponent("dialogs.ConfirmUserActionDialog"); const ConfirmUserActionDialog = sdk.getComponent("dialogs.ConfirmUserActionDialog");
Modal.createDialog(ConfirmUserActionDialog, { Modal.createDialog(ConfirmUserActionDialog, {
member: this.props.member, member: this.props.member,
action: 'Unban', action: _t('Unban'),
danger: false, danger: false,
onFinished: (proceed) => { onFinished: (proceed) => {
if (!proceed) return; if (!proceed) return;
@ -73,10 +74,11 @@ const BannedUser = React.createClass({
> >
{ _t('Unban') } { _t('Unban') }
</AccessibleButton> </AccessibleButton>
{this.props.member.userId} <strong>{this.props.member.name}</strong> {this.props.member.userId}
{this.props.reason ? " " +_t('Reason') + ": " + this.props.reason : ""}
</li> </li>
); );
} },
}); });
module.exports = React.createClass({ module.exports = React.createClass({
@ -576,28 +578,26 @@ module.exports = React.createClass({
{ _t('Never send encrypted messages to unverified devices in this room from this device') }. { _t('Never send encrypted messages to unverified devices in this room from this device') }.
</label>; </label>;
if (!isEncrypted && if (!isEncrypted && roomState.mayClientSendStateEvent("m.room.encryption", cli)) {
roomState.mayClientSendStateEvent("m.room.encryption", cli)) {
return ( return (
<div> <div>
<label> <label>
<input type="checkbox" ref="encrypt" onClick={ this.onEnableEncryptionClick }/> <input type="checkbox" ref="encrypt" onClick={ this.onEnableEncryptionClick }/>
<img className="mx_RoomSettings_e2eIcon" src="img/e2e-unencrypted.svg" width="12" height="12" /> <img className="mx_RoomSettings_e2eIcon mx_filterFlipColor" src="img/e2e-unencrypted.svg" width="12" height="12" />
{ _t('Enable encryption') } { _t('(warning: cannot be disabled again!)') } { _t('Enable encryption') } { _t('(warning: cannot be disabled again!)') }
</label> </label>
{ settings } { settings }
</div> </div>
); );
} } else {
else {
return ( return (
<div> <div>
<label> <label>
{ isEncrypted { isEncrypted
? <img className="mx_RoomSettings_e2eIcon" src="img/e2e-verified.svg" width="10" height="12" /> ? <img className="mx_RoomSettings_e2eIcon" src="img/e2e-verified.svg" width="10" height="12" />
: <img className="mx_RoomSettings_e2eIcon" src="img/e2e-unencrypted.svg" width="12" height="12" /> : <img className="mx_RoomSettings_e2eIcon mx_filterFlipColor" src="img/e2e-unencrypted.svg" width="12" height="12" />
} }
{ isEncrypted ? "Encryption is enabled in this room" : "Encryption is not enabled in this room" }. { isEncrypted ? _t("Encryption is enabled in this room") : _t("Encryption is not enabled in this room") }.
</label> </label>
{ settings } { settings }
</div> </div>
@ -653,7 +653,7 @@ module.exports = React.createClass({
{Object.keys(user_levels).map(function(user, i) { {Object.keys(user_levels).map(function(user, i) {
return ( return (
<li className="mx_RoomSettings_userLevel" key={user}> <li className="mx_RoomSettings_userLevel" key={user}>
{ user } { _t('is a') } <PowerSelector value={ user_levels[user] } disabled={true}/> { _t("%(user)s is a", {user: user}) } <PowerSelector value={ user_levels[user] } disabled={true}/>
</li> </li>
); );
})} })}
@ -664,16 +664,17 @@ module.exports = React.createClass({
userLevelsSection = <div>{ _t('No users have specific privileges in this room') }.</div>; userLevelsSection = <div>{ _t('No users have specific privileges in this room') }.</div>;
} }
var banned = this.props.room.getMembersWithMembership("ban"); const banned = this.props.room.getMembersWithMembership("ban");
var bannedUsersSection; let bannedUsersSection;
if (banned.length) { if (banned.length) {
bannedUsersSection = bannedUsersSection =
<div> <div>
<h3>{ _t('Banned users') }</h3> <h3>{ _t('Banned users') }</h3>
<ul className="mx_RoomSettings_banned"> <ul className="mx_RoomSettings_banned">
{banned.map(function(member) { {banned.map(function(member) {
const banEvent = member.events.member.getContent();
return ( return (
<BannedUser key={member.userId} member={member} /> <BannedUser key={member.userId} member={member} reason={banEvent.reason} />
); );
})} })}
</ul> </ul>
@ -754,7 +755,11 @@ module.exports = React.createClass({
if (this.state.join_rule === "public" && aliasCount == 0) { if (this.state.join_rule === "public" && aliasCount == 0) {
addressWarning = addressWarning =
<div className="mx_RoomSettings_warning"> <div className="mx_RoomSettings_warning">
{ _t('To link to a room it must have') } <a href="#addresses"> { _t('an address') }</a>. { _tJsx(
'To link to a room it must have <a>an address</a>.',
/<a>(.*?)<\/a>/,
(sub) => <a href="#addresses">{sub}</a>
)}
</div>; </div>;
} }

View file

@ -224,13 +224,13 @@ module.exports = React.createClass({
if (this.props.selected) { if (this.props.selected) {
let nameSelected = <EmojiText>{name}</EmojiText>; let nameSelected = <EmojiText>{name}</EmojiText>;
label = <div title={ name } className={ nameClasses }>{ nameSelected }</div>; label = <div title={ name } className={ nameClasses } dir="auto">{ nameSelected }</div>;
} else { } else {
label = <EmojiText element="div" title={ name } className={ nameClasses }>{name}</EmojiText>; label = <EmojiText element="div" title={ name } className={ nameClasses } dir="auto">{name}</EmojiText>;
} }
} else if (this.state.hover) { } else if (this.state.hover) {
var RoomTooltip = sdk.getComponent("rooms.RoomTooltip"); var RoomTooltip = sdk.getComponent("rooms.RoomTooltip");
tooltip = <RoomTooltip className="mx_RoomTile_tooltip" room={this.props.room} />; tooltip = <RoomTooltip className="mx_RoomTile_tooltip" room={this.props.room} dir="auto" />;
} }
//var incomingCallBox; //var incomingCallBox;

View file

@ -46,7 +46,8 @@ module.exports = React.createClass({
placeholderClassName="mx_RoomHeader_placeholder" placeholderClassName="mx_RoomHeader_placeholder"
placeholder={_t("Add a topic")} placeholder={_t("Add a topic")}
blurToCancel={ false } blurToCancel={ false }
initialValue={ this._initialTopic }/> initialValue={ this._initialTopic }
dir="auto" />
); );
}, },
}); });

View file

@ -14,12 +14,10 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
'use strict';
import React from 'react'; import React from 'react';
import dis from '../../../dispatcher';
import AccessibleButton from '../elements/AccessibleButton'; import AccessibleButton from '../elements/AccessibleButton';
import sdk from '../../../index'; import sdk from '../../../index';
import { _t } from '../../../languageHandler';
// cancel button which is shared between room header and simple room header // cancel button which is shared between room header and simple room header
export function CancelButton(props) { export function CancelButton(props) {
@ -28,7 +26,7 @@ export function CancelButton(props) {
return ( return (
<AccessibleButton className='mx_RoomHeader_cancelButton' onClick={onClick}> <AccessibleButton className='mx_RoomHeader_cancelButton' onClick={onClick}>
<img src="img/cancel.svg" className='mx_filterFlipColor' <img src="img/cancel.svg" className='mx_filterFlipColor'
width="18" height="18" alt="Cancel"/> width="18" height="18" alt={_t("Cancel")}/>
</AccessibleButton> </AccessibleButton>
); );
} }
@ -44,17 +42,10 @@ export default React.createClass({
title: React.PropTypes.string, title: React.PropTypes.string,
onCancelClick: React.PropTypes.func, onCancelClick: React.PropTypes.func,
// is the RightPanel collapsed?
collapsedRhs: React.PropTypes.bool,
// `src` to a TintableSvg. Optional. // `src` to a TintableSvg. Optional.
icon: React.PropTypes.string, icon: React.PropTypes.string,
}, },
onShowRhsClick: function(ev) {
dis.dispatch({ action: 'show_right_panel' });
},
render: function() { render: function() {
let cancelButton; let cancelButton;
let icon; let icon;
@ -69,25 +60,12 @@ export default React.createClass({
/>; />;
} }
let showRhsButton;
/* // don't bother cluttering things up with this for now.
const TintableSvg = sdk.getComponent("elements.TintableSvg");
if (this.props.collapsedRhs) {
showRhsButton =
<div className="mx_RoomHeader_button" style={{ float: 'right' }} onClick={this.onShowRhsClick} title=">">
<TintableSvg src="img/minimise.svg" width="10" height="16"/>
</div>
}
*/
return ( return (
<div className="mx_RoomHeader" > <div className="mx_RoomHeader" >
<div className="mx_RoomHeader_wrapper"> <div className="mx_RoomHeader_wrapper">
<div className="mx_RoomHeader_simpleHeader"> <div className="mx_RoomHeader_simpleHeader">
{ icon } { icon }
{ this.props.title } { this.props.title }
{ showRhsButton }
{ cancelButton } { cancelButton }
</div> </div>
</div> </div>

View file

@ -41,7 +41,7 @@ module.exports = React.createClass({
</div> </div>
<img className="mx_TopUnreadMessagesBar_close mx_filterFlipColor" <img className="mx_TopUnreadMessagesBar_close mx_filterFlipColor"
src="img/cancel.svg" width="18" height="18" src="img/cancel.svg" width="18" height="18"
alt="Close" title="Close" alt={_t("Close")} title={_t("Close")}
onClick={this.props.onCloseClick} /> onClick={this.props.onCloseClick} />
</div> </div>
); );

View file

@ -165,7 +165,7 @@ export default WithMatrixClient(React.createClass({
</div> </div>
</div> </div>
<div className="mx_UserSettings_threepidButton mx_filterFlipColor"> <div className="mx_UserSettings_threepidButton mx_filterFlipColor">
<input type="image" value="Add" src="img/plus.svg" width="14" height="14" /> <input type="image" value={_t("Add")} src="img/plus.svg" width="14" height="14" />
</div> </div>
</form> </form>
); );

View file

@ -17,6 +17,7 @@ limitations under the License.
var React = require('react'); var React = require('react');
var MatrixClientPeg = require("../../../MatrixClientPeg"); var MatrixClientPeg = require("../../../MatrixClientPeg");
var sdk = require('../../../index'); var sdk = require('../../../index');
import { _t } from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'ChangeAvatar', displayName: 'ChangeAvatar',
@ -105,7 +106,7 @@ module.exports = React.createClass({
onError: function(error) { onError: function(error) {
this.setState({ this.setState({
errorText: "Failed to upload profile picture!" errorText: _t("Failed to upload profile picture!")
}); });
}, },
@ -127,7 +128,7 @@ module.exports = React.createClass({
if (this.props.showUploadSection) { if (this.props.showUploadSection) {
uploadSection = ( uploadSection = (
<div className={this.props.className}> <div className={this.props.className}>
Upload new: {_t("Upload new:")}
<input type="file" accept="image/*" onChange={this.onFileSelected}/> <input type="file" accept="image/*" onChange={this.onFileSelected}/>
{this.state.errorText} {this.state.errorText}
</div> </div>

View file

@ -18,6 +18,7 @@ limitations under the License.
var React = require('react'); var React = require('react');
var sdk = require('../../../index'); var sdk = require('../../../index');
var MatrixClientPeg = require("../../../MatrixClientPeg"); var MatrixClientPeg = require("../../../MatrixClientPeg");
import { _t } from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'ChangeDisplayName', displayName: 'ChangeDisplayName',
@ -52,7 +53,7 @@ module.exports = React.createClass({
return ( return (
<EditableTextContainer <EditableTextContainer
getInitialValue={this._getDisplayName} getInitialValue={this._getDisplayName}
placeholder="No display name" placeholder={_t("No display name")}
blurToSubmit={true} blurToSubmit={true}
onSubmit={this._changeDisplayName} /> onSubmit={this._changeDisplayName} />
); );

View file

@ -20,6 +20,8 @@ var React = require('react');
var MatrixClientPeg = require("../../../MatrixClientPeg"); var MatrixClientPeg = require("../../../MatrixClientPeg");
var Modal = require("../../../Modal"); var Modal = require("../../../Modal");
var sdk = require("../../../index"); var sdk = require("../../../index");
import q from 'q';
import AccessibleButton from '../elements/AccessibleButton'; import AccessibleButton from '../elements/AccessibleButton';
import { _t } from '../../../languageHandler'; import { _t } from '../../../languageHandler';
@ -53,7 +55,7 @@ module.exports = React.createClass({
onCheckPassword: function(oldPass, newPass, confirmPass) { onCheckPassword: function(oldPass, newPass, confirmPass) {
if (newPass !== confirmPass) { if (newPass !== confirmPass) {
return { return {
error: _t("New passwords don't match") + "." error: _t("New passwords don't match")
}; };
} else if (!newPass || newPass.length === 0) { } else if (!newPass || newPass.length === 0) {
return { return {
@ -140,7 +142,15 @@ module.exports = React.createClass({
}); });
cli.setPassword(authDict, newPassword).then(() => { cli.setPassword(authDict, newPassword).then(() => {
if (this.props.shouldAskForEmail) {
return this._optionallySetEmail().then((confirmed) => {
this.props.onFinished({
didSetEmail: confirmed,
});
});
} else {
this.props.onFinished(); this.props.onFinished();
}
}, (err) => { }, (err) => {
this.props.onError(err); this.props.onError(err);
}).finally(() => { }).finally(() => {
@ -150,6 +160,20 @@ module.exports = React.createClass({
}).done(); }).done();
}, },
_optionallySetEmail: function() {
const deferred = q.defer();
// Ask for an email otherwise the user has no way to reset their password
const SetEmailDialog = sdk.getComponent("dialogs.SetEmailDialog");
Modal.createDialog(SetEmailDialog, {
title: _t('Do you want to set an email address?'),
onFinished: (confirmed) => {
// ignore confirmed, setting an email is optional
deferred.resolve(confirmed);
},
});
return deferred.promise;
},
_onExportE2eKeysClicked: function() { _onExportE2eKeysClicked: function() {
Modal.createDialogAsync( Modal.createDialogAsync(
(cb) => { (cb) => {
@ -199,7 +223,7 @@ module.exports = React.createClass({
const passwordLabel = this.state.cachedPassword ? const passwordLabel = this.state.cachedPassword ?
_t('Password') : _t('New Password'); _t('Password') : _t('New Password');
return ( return (
<div className={this.props.className}> <form className={this.props.className} onSubmit={this.onClickChange}>
{ currentPassword } { currentPassword }
<div className={rowClassName}> <div className={rowClassName}>
<div className={rowLabelClassName}> <div className={rowLabelClassName}>
@ -222,7 +246,7 @@ module.exports = React.createClass({
element="button"> element="button">
{ _t('Change Password') } { _t('Change Password') }
</AccessibleButton> </AccessibleButton>
</div> </form>
); );
case this.Phases.Uploading: case this.Phases.Uploading:
var Loader = sdk.getComponent("elements.Spinner"); var Loader = sdk.getComponent("elements.Spinner");

View file

@ -19,6 +19,7 @@ import classNames from 'classnames';
import sdk from '../../../index'; import sdk from '../../../index';
import MatrixClientPeg from '../../../MatrixClientPeg'; import MatrixClientPeg from '../../../MatrixClientPeg';
import { _t } from '../../../languageHandler';
export default class DevicesPanel extends React.Component { export default class DevicesPanel extends React.Component {
@ -54,10 +55,10 @@ export default class DevicesPanel extends React.Component {
var errtxt; var errtxt;
if (error.httpStatus == 404) { if (error.httpStatus == 404) {
// 404 probably means the HS doesn't yet support the API. // 404 probably means the HS doesn't yet support the API.
errtxt = "Your home server does not support device management."; errtxt = _t("Your home server does not support device management.");
} else { } else {
console.error("Error loading devices:", error); console.error("Error loading devices:", error);
errtxt = "Unable to load device list."; errtxt = _t("Unable to load device list");
} }
this.setState({deviceLoadError: errtxt}); this.setState({deviceLoadError: errtxt});
} }
@ -127,9 +128,9 @@ export default class DevicesPanel extends React.Component {
return ( return (
<div className={classes}> <div className={classes}>
<div className="mx_DevicesPanel_header"> <div className="mx_DevicesPanel_header">
<div className="mx_DevicesPanel_deviceId">ID</div> <div className="mx_DevicesPanel_deviceId">{_t("Device ID")}</div>
<div className="mx_DevicesPanel_deviceName">Name</div> <div className="mx_DevicesPanel_deviceName">{_t("Device Name")}</div>
<div className="mx_DevicesPanel_deviceLastSeen">Last seen</div> <div className="mx_DevicesPanel_deviceLastSeen">{_t("Last seen")}</div>
<div className="mx_DevicesPanel_deviceButtons"></div> <div className="mx_DevicesPanel_deviceButtons"></div>
</div> </div>
{devices.map(this._renderDevice)} {devices.map(this._renderDevice)}

View file

@ -18,6 +18,7 @@ limitations under the License.
var React = require("react"); var React = require("react");
var Notifier = require("../../../Notifier"); var Notifier = require("../../../Notifier");
var dis = require("../../../dispatcher"); var dis = require("../../../dispatcher");
import { _t } from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'EnableNotificationsButton', displayName: 'EnableNotificationsButton',
@ -60,13 +61,13 @@ module.exports = React.createClass({
if (this.enabled()) { if (this.enabled()) {
return ( return (
<button className="mx_EnableNotificationsButton" onClick={this.onClick}> <button className="mx_EnableNotificationsButton" onClick={this.onClick}>
Disable Notifications {_t("Disable Notifications")}
</button> </button>
); );
} else { } else {
return ( return (
<button className="mx_EnableNotificationsButton" onClick={this.onClick}> <button className="mx_EnableNotificationsButton" onClick={this.onClick}>
Enable Notifications {_t("Enable Notifications")}
</button> </button>
); );
} }

View file

@ -18,6 +18,7 @@ var dis = require("../../../dispatcher");
var CallHandler = require("../../../CallHandler"); var CallHandler = require("../../../CallHandler");
var sdk = require('../../../index'); var sdk = require('../../../index');
var MatrixClientPeg = require("../../../MatrixClientPeg"); var MatrixClientPeg = require("../../../MatrixClientPeg");
import { _t } from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'CallView', displayName: 'CallView',
@ -130,7 +131,11 @@ module.exports = React.createClass({
var voice; var voice;
if (this.state.call && this.state.call.type === "voice" && this.props.showVoice) { if (this.state.call && this.state.call.type === "voice" && this.props.showVoice) {
var callRoom = MatrixClientPeg.get().getRoom(this.state.call.roomId); var callRoom = MatrixClientPeg.get().getRoom(this.state.call.roomId);
voice = <div className="mx_CallView_voice" onClick={ this.props.onClick }>Active call ({ callRoom.name })</div>; voice = (
<div className="mx_CallView_voice" onClick={ this.props.onClick }>
{_t("Active call (%(roomName)s)", {roomName: callRoom.name})}
</div>
);
} }
return ( return (

View file

@ -17,6 +17,7 @@ var React = require('react');
var MatrixClientPeg = require('../../../MatrixClientPeg'); var MatrixClientPeg = require('../../../MatrixClientPeg');
var dis = require("../../../dispatcher"); var dis = require("../../../dispatcher");
var CallHandler = require("../../../CallHandler"); var CallHandler = require("../../../CallHandler");
import { _t } from '../../../languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'IncomingCallBox', displayName: 'IncomingCallBox',
@ -45,23 +46,36 @@ module.exports = React.createClass({
room = MatrixClientPeg.get().getRoom(this.props.incomingCall.roomId); room = MatrixClientPeg.get().getRoom(this.props.incomingCall.roomId);
} }
var caller = room ? room.name : "unknown"; var caller = room ? room.name : _t("unknown caller");
let incomingCallText = null;
if (this.props.incomingCall) {
if (this.props.incomingCall.type === "voice") {
incomingCallText = _t("Incoming voice call from %(name)s", {name: caller});
}
else if (this.props.incomingCall.type === "video") {
incomingCallText = _t("Incoming video call from %(name)s", {name: caller});
}
else {
incomingCallText = _t("Incoming call from %(name)s", {name: caller});
}
}
return ( return (
<div className="mx_IncomingCallBox" id="incomingCallBox"> <div className="mx_IncomingCallBox" id="incomingCallBox">
<img className="mx_IncomingCallBox_chevron" src="img/chevron-left.png" width="9" height="16" /> <img className="mx_IncomingCallBox_chevron" src="img/chevron-left.png" width="9" height="16" />
<div className="mx_IncomingCallBox_title"> <div className="mx_IncomingCallBox_title">
Incoming { this.props.incomingCall ? this.props.incomingCall.type : '' } call from { caller } {incomingCallText}
</div> </div>
<div className="mx_IncomingCallBox_buttons"> <div className="mx_IncomingCallBox_buttons">
<div className="mx_IncomingCallBox_buttons_cell"> <div className="mx_IncomingCallBox_buttons_cell">
<div className="mx_IncomingCallBox_buttons_decline" onClick={this.onRejectClick}> <div className="mx_IncomingCallBox_buttons_decline" onClick={this.onRejectClick}>
Decline {_t("Decline")}
</div> </div>
</div> </div>
<div className="mx_IncomingCallBox_buttons_cell"> <div className="mx_IncomingCallBox_buttons_cell">
<div className="mx_IncomingCallBox_buttons_accept" onClick={this.onAnswerClick}> <div className="mx_IncomingCallBox_buttons_accept" onClick={this.onAnswerClick}>
Accept {_t("Accept")}
</div> </div>
</div> </div>
</div> </div>

View file

@ -100,6 +100,7 @@ function createRoom(opts) {
dis.dispatch({ dis.dispatch({
action: 'view_room', action: 'view_room',
room_id: roomId, room_id: roomId,
should_peek: false,
}); });
} }
return roomId; return roomId;

View file

@ -41,9 +41,6 @@ class MatrixDispatcher extends flux.Dispatcher {
} }
} }
// XXX this is a big anti-pattern, and makes testing hard. Because dispatches
// happen asynchronously, it is possible for actions dispatched in one thread
// to arrive in another, with *hilarious* consequences.
if (global.mxDispatcher === undefined) { if (global.mxDispatcher === undefined) {
global.mxDispatcher = new MatrixDispatcher(); global.mxDispatcher = new MatrixDispatcher();
} }

7
src/i18n/strings/ar.json Normal file
View file

@ -0,0 +1,7 @@
{
"ar-iq": "العربية",
"Continue": "استمر",
"Username available": "اسم المستخدم متاح",
"Username not available": "الإسم المستخدم غير موجود",
"Something went wrong!": "هناك خطأ ما!"
}

View file

@ -1,15 +1,15 @@
{ {
"Filter room members": "Raum-Benutzer filtern", "Filter room members": "Raum-Mitglieder filtern",
"You have no visible notifications": "Du hast keine sichtbaren Benachrichtigungen", "You have no visible notifications": "Du hast keine sichtbaren Benachrichtigungen",
"Invites": "Einladungen", "Invites": "Einladungen",
"Favourites": "Favoriten", "Favourites": "Favoriten",
"People": "Direkt-Chats", "People": "Direkt-Chats",
"Rooms": "Räume", "Rooms": "Räume",
"Low priority": "Niedrige Priorität", "Low priority": "Niedrige Priorität",
"Historical": "Historisch", "Historical": "Archiv",
"New passwords must match each other.": "Die neuen Passwörter müssen identisch sein.", "New passwords must match each other.": "Die neuen Passwörter müssen identisch sein.",
"A new password must be entered.": "Es muss ein neues Passwort eingegeben werden.", "A new password must be entered.": "Es muss ein neues Passwort eingegeben werden.",
"The email address linked to your account must be entered.": "Es muss die Email-Adresse eingeben werden, welche zum Account gehört.", "The email address linked to your account must be entered.": "Es muss die mit dem Benutzerkonto verbundene Email-Adresse eingegeben werden.",
"Failed to send email: ": "Email konnte nicht versendet werden: ", "Failed to send email: ": "Email konnte nicht versendet werden: ",
"unknown device": "Unbekanntes Gerät", "unknown device": "Unbekanntes Gerät",
"NOT verified": "NICHT verifiziert", "NOT verified": "NICHT verifiziert",
@ -31,18 +31,18 @@
"Event information": "Ereignis-Informationen", "Event information": "Ereignis-Informationen",
"Sender device information": "Absender Geräte Informationen", "Sender device information": "Absender Geräte Informationen",
"Displays action": "Zeigt Aktionen an", "Displays action": "Zeigt Aktionen an",
"Bans user with given id": "Sperrt Benutzer mit der angegebenen ID", "Bans user with given id": "Schließt den Benutzer mit der angegebenen ID dauerhaft aus dem Raum aus",
"Deops user with given id": "Entfernt OP beim Benutzer mit der angegebenen ID", "Deops user with given id": "Entfernt OP beim Benutzer mit der angegebenen ID",
"Invites user with given id to current room": "Lädt den Benutzer mit der angegebenen ID in den aktuellen Raum ein", "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": "Betrete Raum mit angegebenen Alias", "Joins room with given alias": "Betrete Raum mit angegebenen Alias",
"Kicks user with given id": "Kickt Benutzer mit angegebener ID", "Kicks user with given id": "Entfernt den Benutzer mit der angegebenen ID aus dem Raum",
"Changes your display nickname": "Ändert deinen angezeigten Nicknamen", "Changes your display nickname": "Ändert deinen angezeigten Nicknamen",
"Change Password": "Passwort ändern", "Change Password": "Passwort ändern",
"Searches DuckDuckGo for results": "Verwendet DuckDuckGo für Suchergebnisse", "Searches DuckDuckGo for results": "Verwendet DuckDuckGo für Suchergebnisse",
"Commands": "Kommandos", "Commands": "Kommandos",
"Emoji": "Emoji", "Emoji": "Emoji",
"Sorry, this homeserver is using a login which is not recognised ": "Entschuldigung, dieser Homeserver nutzt eine Anmeldetechnik, die nicht bekannt ist ", "Sorry, this homeserver is using a login which is not recognised ": "Entschuldigung, dieser Homeserver nutzt eine Anmeldetechnik, die nicht bekannt ist ",
"Login as guest": "Anmelden als Gast", "Login as guest": "Als Gast anmelden",
"Return to app": "Zurück zur Anwendung", "Return to app": "Zurück zur Anwendung",
"Sign in": "Anmelden", "Sign in": "Anmelden",
"Create a new account": "Erstelle einen neuen Benutzer", "Create a new account": "Erstelle einen neuen Benutzer",
@ -63,10 +63,10 @@
"Anyone who knows the room's link, apart from guests": "Alle, denen der Raum-Link bekannt ist, ausgenommen Gäste", "Anyone who knows the room's link, apart from guests": "Alle, denen der Raum-Link bekannt ist, ausgenommen Gäste",
"Anyone who knows the room's link, including guests": "Jeder der den Raum-Link kennt - auch Gäste", "Anyone who knows the room's link, including guests": "Jeder der den Raum-Link kennt - auch Gäste",
"Are you sure you want to leave the room?": "Bist du sicher, dass du den Raum verlassen willst?", "Are you sure you want to leave the room?": "Bist du sicher, dass du den Raum verlassen willst?",
"Are you sure you want to reject the invitation?": "Bist du sicher, dass die die Einladung ablehnen willst?", "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?", "Are you sure you want to upload the following files?": "Bist du sicher, dass du die folgenden Dateien hochladen möchtest?",
"banned": "gebannt", "banned": "gebannt",
"Banned users": "Gebannte Nutzer", "Banned users": "Dauerhaft aus dem Raum ausgeschlossene Benutzer",
"Bug Report": "Fehlerbericht", "Bug Report": "Fehlerbericht",
"changed avatar": "änderte Avatar", "changed avatar": "änderte Avatar",
"changed their display name from": "änderte seinen Anzeigenamen von", "changed their display name from": "änderte seinen Anzeigenamen von",
@ -75,20 +75,20 @@
"changed the topic to": "änderte das Thema zu", "changed the topic to": "änderte das Thema zu",
"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", "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", "Clear Cache and Reload": "Cache leeren und neu laden",
"Click here": "Klicke hier", "Click here": "Hier klicken,",
"Confirm your new password": "Neues Passwort bestätigen", "Confirm your new password": "Neues Passwort bestätigen",
"Continue": "Fortfahren", "Continue": "Fortfahren",
"Create an account": "Erstelle einen Account", "Create an account": "Erstelle einen Account",
"Create Room": "Raum erstellen", "Create Room": "Raum erstellen",
"Cryptography": "Verschlüsselung", "Cryptography": "Verschlüsselung",
"Deactivate Account": "Account deaktivieren", "Deactivate Account": "Benutzerkonto deaktivieren",
"Deactivate my account": "Meinen Account deaktivieren", "Deactivate my account": "Mein Benutzerkonto deaktivieren",
"decline": "Ablehnen", "decline": "Ablehnen",
"Devices will not yet be able to decrypt history from before they joined the room": "Geräte werden nicht in der Lage sein, den Chatverlauf vor dem Betreten des Raumes zu entschlüsseln", "Devices will not yet be able to decrypt history from before they joined the room": "Geräte werden nicht in der Lage sein, den Chatverlauf vor dem Betreten des Raumes zu entschlüsseln",
"Display name": "Anzeigename", "Display name": "Anzeigename",
"Email Address": "E-Mail-Adresse", "Email Address": "E-Mail-Adresse",
"Email, name or matrix ID": "E-Mail, Name oder Matrix-ID", "Email, name or matrix ID": "E-Mail, Name oder Matrix-ID",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Verschlüsselte Nachrichten werden an Clients nicht sichtbar sein, die Verschlüsselung noch nicht implementiert haben", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Verschlüsselte Nachrichten werden nicht in Matrix-Clients sichtbar sein, die die Verschlüsselung noch nicht implementiert haben",
"Encrypted room": "Verschlüsselter Raum", "Encrypted room": "Verschlüsselter Raum",
"Encryption is enabled in this room": "Verschlüsselung ist in diesem Raum aktiviert", "Encryption is enabled in this room": "Verschlüsselung ist in diesem Raum aktiviert",
"Encryption is not enabled in this room": "Verschlüsselung ist in diesem Raum nicht aktiviert", "Encryption is not enabled in this room": "Verschlüsselung ist in diesem Raum nicht aktiviert",
@ -96,7 +96,7 @@
"End-to-end encryption is in beta and may not be reliable": "Die Ende-zu-Ende-Verschlüsselung befindet sich aktuell im Beta-Stadium und ist eventuell noch nicht hundertprozentig zuverlässig", "End-to-end encryption is in beta and may not be reliable": "Die Ende-zu-Ende-Verschlüsselung befindet sich aktuell im Beta-Stadium und ist eventuell noch nicht hundertprozentig zuverlässig",
"Failed to send email": "Fehler beim Senden der E-Mail", "Failed to send email": "Fehler beim Senden der E-Mail",
"Account": "Konto", "Account": "Konto",
"Add phone number": "Füge Telefonnummer hinzu", "Add phone number": "Telefonnummer hinzufügen",
"an address": "an Adresse", "an address": "an Adresse",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Dein Passwort wurde erfolgreich geändert. Du wirst erst Benachrichtigungen auf anderen Geräten empfangen können, wenn du dich dort erneut anmeldest", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Dein Passwort wurde erfolgreich geändert. Du wirst erst Benachrichtigungen auf anderen Geräten empfangen können, wenn du dich dort erneut anmeldest",
"all room members": "Alle Raum-Mitglieder", "all room members": "Alle Raum-Mitglieder",
@ -111,23 +111,23 @@
"Default": "Standard", "Default": "Standard",
"demote": "Berechtigungslevel herabstufen", "demote": "Berechtigungslevel herabstufen",
"Export E2E room keys": "E2E-Raum-Schlüssel exportieren", "Export E2E room keys": "E2E-Raum-Schlüssel exportieren",
"Failed to change password. Is your password correct?": "Passwort-Änderung schlug fehl. Ist dein Passwort korrekt?", "Failed to change password. Is your password correct?": "Passwortänderung fehlgeschlagen. Ist dein Passwort richtig?",
"Failed to forget room": "Vergessen des Raums schlug fehl", "Failed to forget room": "Vergessen des Raums schlug fehl",
"Failed to leave room": "Verlassen des Raums fehlgeschlagen", "Failed to leave room": "Verlassen des Raums fehlgeschlagen",
"Failed to reject invitation": "Fehler beim Abweisen der Einladung", "Failed to reject invitation": "Einladung konnte nicht abgelehnt werden",
"Failed to set avatar.": "Fehler beim Setzen des Profilbilds.", "Failed to set avatar.": "Fehler beim Setzen des Profilbilds.",
"Failed to unban": "Entbannen fehlgeschlagen", "Failed to unban": "Dauerhaftes Ausschließen aus dem Raum konnte nicht aufgehoben werden",
"Failed to upload file": "Datei-Upload fehlgeschlagen", "Failed to upload file": "Datei-Upload fehlgeschlagen",
"Favourite": "Favorit", "Favourite": "Favorit",
"favourite": "Als Favorit setzen", "favourite": "Als Favorit setzen",
"Forget room": "Raum vergessen", "Forget room": "Raum entfernen",
"Forgot your password?": "Passwort vergessen?", "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, 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.", "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?", "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.", "Guests cannot join this room even if explicitly invited.": "Gäste können diesem Raum nicht beitreten, auch wenn sie explizit eingeladen wurden.",
"Guests can't set avatars. Please register.": "Gäste können kein Profilbild setzen. Bitte registrieren.", "Guests can't set avatars. Please register.": "Gäste können kein Profilbild setzen. Bitte registrieren.",
"Guest users can't upload files. Please register to upload.": "Gäste können keine Dateien hochladen. Bitte registrieren um hochzuladen.", "Guest users can't upload files. Please register to upload.": "Gäste können keine Dateien hochladen. Bitte zunächst registrieren.",
"had": "hatte", "had": "hatte",
"Hangup": "Auflegen", "Hangup": "Auflegen",
"Homeserver is": "Der Homeserver ist", "Homeserver is": "Der Homeserver ist",
@ -140,12 +140,12 @@
"is a": "ist ein", "is a": "ist ein",
"is trusted": "wird vertraut", "is trusted": "wird vertraut",
"Sign in with": "Ich möchte mich anmelden mit", "Sign in with": "Ich möchte mich anmelden mit",
"joined and left": "trat bei und ging", "joined and left": "hat den Raum betreten und wieder verlassen",
"joined": "trat bei", "joined": "hat den Raum betreten",
"joined the room": "trat dem Raum bei", "joined the room": "trat dem Raum bei",
"Leave room": "Verlasse Raum", "Leave room": "Verlasse Raum",
"left and rejoined": "ging(en) und trat(en) erneut bei", "left and rejoined": "ging(en) und trat(en) erneut bei",
"left": "ging", "left": "hat den Raum verlassen",
"left the room": "verließ den Raum", "left the room": "verließ den Raum",
"Logged in as": "Angemeldet als", "Logged in as": "Angemeldet als",
"Logout": "Abmelden", "Logout": "Abmelden",
@ -182,7 +182,7 @@
"Once you&#39;ve followed the link it contains, click below": "Nachdem du dem darin enthaltenen Link gefolgt bist, klicke unten", "Once you&#39;ve followed the link it contains, click below": "Nachdem du dem darin enthaltenen Link gefolgt bist, klicke unten",
"rejected the invitation.": "lehnte die Einladung ab.", "rejected the invitation.": "lehnte die Einladung ab.",
"Reject invitation": "Einladung ablehnen", "Reject invitation": "Einladung ablehnen",
"Remove Contact Information?": "Kontakt-Informationen löschen?", "Remove Contact Information?": "Kontakt-Informationen entfernen?",
"removed their display name": "löschte den eigenen Anzeigenamen", "removed their display name": "löschte den eigenen Anzeigenamen",
"Remove": "Entfernen", "Remove": "Entfernen",
"requested a VoIP conference": "hat eine VoIP-Konferenz angefordert", "requested a VoIP conference": "hat eine VoIP-Konferenz angefordert",
@ -193,7 +193,7 @@
"Room name (optional)": "Raumname (optional)", "Room name (optional)": "Raumname (optional)",
"Scroll to unread messages": "Zu den ungelesenen Nachrichten scrollen", "Scroll to unread messages": "Zu den ungelesenen Nachrichten scrollen",
"Send Invites": "Einladungen senden", "Send Invites": "Einladungen senden",
"Send Reset Email": "E-Mail für das Zurücksetzen senden", "Send Reset Email": "E-Mail zum Zurücksetzen senden",
"sent an image": "hat ein Bild gesendet", "sent an image": "hat ein Bild gesendet",
"sent an invitation to": "sandte eine Einladung an", "sent an invitation to": "sandte eine Einladung an",
"sent a video": "hat ein Video gesendet", "sent a video": "hat ein Video gesendet",
@ -204,14 +204,14 @@
"Signed Out": "Abgemeldet", "Signed Out": "Abgemeldet",
"Sign out": "Abmelden", "Sign out": "Abmelden",
"since the point in time of selecting this option": "ab dem Zeitpunkt, an dem diese Option gewählt wird", "since the point in time of selecting this option": "ab dem Zeitpunkt, an dem diese Option gewählt wird",
"since they joined": "seitdem sie beitraten", "since they joined": "ab dem Zeitpunkt, an dem sie beigetreten sind",
"since they were invited": "seitdem sie eingeladen wurden", "since they were invited": "ab dem Zeitpunkt, an dem sie eingeladen wurden",
"Someone": "Jemand", "Someone": "Jemand",
"Start a chat": "Starte einen Chat", "Start a chat": "Starte einen Chat",
"Start Chat": "Chat beginnen", "Start Chat": "Chat beginnen",
"Success": "Erfolg", "Success": "Erfolg",
"tag direct chat": "Zum kennzeichnen als direkten Chat", "tag direct chat": "Zum kennzeichnen als direkten Chat",
"The default role for new room members is": "Die Standard-Rolle für neue Raum-Mitglieder ist", "The default role for new room members is": "Das Standard-Berechtigungslevel für neue Raum-Mitglieder ist",
"their invitations": "ihre Einladungen", "their invitations": "ihre Einladungen",
"their invitation": "ihre Einladung", "their invitation": "ihre Einladung",
"These are experimental features that may break in unexpected ways. Use with caution": "Dies sind experimentelle Funktionen die in unerwarteter Weise Fehler verursachen können. Mit Vorsicht benutzen", "These are experimental features that may break in unexpected ways. Use with caution": "Dies sind experimentelle Funktionen die in unerwarteter Weise Fehler verursachen können. Mit Vorsicht benutzen",
@ -221,28 +221,28 @@
"This is a preview of this room. Room interactions have been disabled": "Dies ist eine Vorschau dieses Raumes. Raum-Interaktionen wurden deaktiviert", "This is a preview of this room. Room interactions have been disabled": "Dies ist eine Vorschau dieses Raumes. Raum-Interaktionen wurden deaktiviert",
"This room is not accessible by remote Matrix servers": "Andere Matrix-Server können auf diesen Raum nicht zugreifen", "This room is not accessible by remote Matrix servers": "Andere Matrix-Server können auf diesen Raum nicht zugreifen",
"This room's internal ID is": "Die interne ID dieses Raumes ist", "This room's internal ID is": "Die interne ID dieses Raumes ist",
"To ban users": "Zum Nutzer bannen", "To ban users": "Um Benutzer dauerhaft aus dem Raum auszuschließen",
"To configure the room": "Um den Raum zu konfigurieren", "To configure the room": "Um den Raum zu konfigurieren",
"To invite users into the room": "Um Nutzer in den Raum einzuladen", "To invite users into the room": "Um Nutzer in den Raum einzuladen",
"to join the discussion": "um an der Diskussion teilzunehmen", "to join the discussion": "um an der Diskussion teilzunehmen",
"To kick users": "Um Nutzer zu entfernen", "To kick users": "Um Benutzer aus dem Raum zu entfernen",
"Admin": "Administrator", "Admin": "Administrator",
"Server may be unavailable, overloaded, or you hit a bug": "Server könnte nicht verfügbar oder überlastet sein oder du bist auf einen Fehler gestoßen", "Server may be unavailable, overloaded, or you hit a bug.": "Server ist nicht verfügbar, überlastet oder du bist auf einen Fehler gestoßen.",
"Could not connect to the integration server": "Konnte keine Verbindung zum Integrations-Server herstellen", "Could not connect to the integration server": "Konnte keine Verbindung zum Integrations-Server herstellen",
"Disable inline URL previews by default": "URL-Vorschau im Chat standardmäßig deaktivieren", "Disable inline URL previews by default": "URL-Vorschau im Chat standardmäßig deaktivieren",
"Guests can't use labs features. Please register.": "Gäste können keine Labor-Funktionen nutzen. Bitte registrieren.", "Guests can't use labs features. Please register.": "Gäste können keine Labor-Funktionen nutzen. Bitte registrieren.",
"Labs": "Labor", "Labs": "Labor",
"Show panel": "Zeige Panel", "Show panel": "Panel anzeigen",
"To redact messages": "Zum Nachrichten verbergen", "To redact messages": "Zum Nachrichten verbergen",
"Can't connect to homeserver - please check your connectivity and ensure your": "Die Verbindung mit dem Homeserver ist fehlgeschlagen. Bitte überprüfe deine Verbindung und stelle sicher, dass dein(e) ", "Can't connect to homeserver - please check your connectivity and ensure your": "Die Verbindung mit dem Homeserver ist fehlgeschlagen. Bitte überprüfe deine Verbindung und stelle sicher, dass dein(e) ",
"tag as": "kennzeichne als", "tag as": "kennzeichne als",
"To reset your password, enter the email address linked to your account": "Um dein Passwort zurückzusetzen, gib bitte die mit deinem Account verknüpfte E-Mail-Adresse ein", "To reset your password, enter the email address linked to your account": "Um dein Passwort zurückzusetzen, gib bitte die mit deinem Account verknüpfte E-Mail-Adresse ein",
"To send messages": "Zum Nachrichten senden", "To send messages": "Um Nachrichten zu senden",
"turned on end-to-end encryption (algorithm": "aktivierte Ende-zu-Ende-Verschlüsselung (Algorithmus", "turned on end-to-end encryption (algorithm": "aktivierte Ende-zu-Ende-Verschlüsselung (Algorithmus",
"Unable to add email address": "E-Mail-Adresse konnte nicht hinzugefügt werden", "Unable to add email address": "E-Mail-Adresse konnte nicht hinzugefügt werden",
"Unable to remove contact information": "Unfähig die Kontakt-Informationen zu löschen", "Unable to remove contact information": "Die Kontakt-Informationen konnten nicht gelöscht werden",
"Unable to verify email address.": "Unfähig die E-Mail-Adresse zu verifizieren.", "Unable to verify email address.": "Unfähig die E-Mail-Adresse zu verifizieren.",
"Unban": "Entbannen", "Unban": "Dauerhaftes Ausschließen aus dem Raum aufheben",
"Unencrypted room": "Unverschlüsselter Raum", "Unencrypted room": "Unverschlüsselter Raum",
"unknown error code": "Unbekannter Fehlercode", "unknown error code": "Unbekannter Fehlercode",
"unknown": "unbekannt", "unknown": "unbekannt",
@ -260,18 +260,18 @@
"VoIP conference finished.": "VoIP-Konferenz wurde beendet.", "VoIP conference finished.": "VoIP-Konferenz wurde beendet.",
"VoIP conference started.": "VoIP-Konferenz gestartet.", "VoIP conference started.": "VoIP-Konferenz gestartet.",
"(warning: cannot be disabled again!)": "(Warnung: Kann nicht wieder deaktiviert werden!)", "(warning: cannot be disabled again!)": "(Warnung: Kann nicht wieder deaktiviert werden!)",
"was banned": "wurde aus dem Raum verbannt", "was banned": "wurde dauerhaft aus dem Raum ausgeschlossen",
"was invited": "wurde eingeladen", "was invited": "wurde eingeladen",
"was kicked": "wurde gekickt", "was kicked": "wurde aus dem Raum entfernt",
"was unbanned": "wurde entbannt", "was unbanned": "wurde vom dauerhaften Ausschluss aus dem Raum befreit",
"was": "wurde", "was": "wurde",
"Who can access this room?": "Wer hat Zugang zu diesem Raum?", "Who can access this room?": "Wer hat Zugang zu diesem Raum?",
"Who can read history?": "Wer kann die Chat-Historie lesen?", "Who can read history?": "Wer kann die Chat-Historie lesen?",
"Who would you like to add to this room?": "Wen möchtest du zu diesem Raum hinzufügen?", "Who would you like to add to this room?": "Wen möchtest du zu diesem Raum hinzufügen?",
"Who would you like to communicate with?": "Mit wem möchtest du kommunizieren?", "Who would you like to communicate with?": "Mit wem möchtest du kommunizieren?",
"Would you like to": "Möchtest du", "Would you like to": "Möchtest du",
"You do not have permission to post to this room": "Du hast keine Berechtigung an diesen Raum etwas zu senden", "You do not have permission to post to this room": "Du hast keine Berechtigung, in diesem Raum etwas zu senden",
"You have been invited to join this room by %(inviterName)s": "Du wurdest von %(inviterName)s in diesen Raum eingeladen", "You have been invited to join this room by %(inviterName)s": "%(inviterName)s hat dich in diesen Raum eingeladen",
"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": "Du wurdest auf allen Geräten abgemeldet und wirst keine Push-Benachrichtigungen mehr erhalten. Um die Benachrichtigungen zu reaktivieren, musst du dich auf jedem Gerät neu anmelden", "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": "Du wurdest auf allen Geräten abgemeldet und wirst keine Push-Benachrichtigungen mehr erhalten. Um die Benachrichtigungen zu reaktivieren, musst du dich auf jedem Gerät neu anmelden",
"you must be a": "nötige Rolle", "you must be a": "nötige Rolle",
"Your password has been reset": "Dein Passwort wurde zurückgesetzt", "Your password has been reset": "Dein Passwort wurde zurückgesetzt",
@ -280,17 +280,17 @@
"times": "mal", "times": "mal",
"Bulk Options": "Bulk-Optionen", "Bulk Options": "Bulk-Optionen",
"Call Timeout": "Anruf-Timeout", "Call Timeout": "Anruf-Timeout",
"Conference call failed": "Konferenzgespräch fehlgeschlagen", "Conference call failed.": "Konferenzgespräch fehlgeschlagen.",
"Conference calling is in development and may not be reliable": "Konferenzgespräche sind in Entwicklung und evtl. nicht zuverlässig", "Conference calling is in development and may not be reliable.": "Konferenzgespräche befinden sich noch in der Entwicklungsphase und sind möglicherweise nicht zuverlässig nutzbar.",
"Conference calls are not supported in encrypted rooms": "Konferenzgespräche werden in verschlüsselten Räumen nicht unterstützt", "Conference calls are not supported in encrypted rooms": "Konferenzgespräche werden in verschlüsselten Räumen nicht unterstützt",
"Conference calls are not supported in this client": "Konferenzgespräche werden von diesem Client nicht unterstützt", "Conference calls are not supported in this client": "Konferenzgespräche werden von diesem Client nicht unterstützt",
"Existing Call": "Bereits bestehender Anruf", "Existing Call": "Bereits bestehender Anruf",
"Failed to set up conference call": "Konferenzgespräch konnte nicht gestartet werden", "Failed to set up conference call": "Konferenzgespräch konnte nicht gestartet werden",
"Failed to verify email address: make sure you clicked the link in the email": "Verifizierung der E-Mail-Adresse fehlgeschlagen: Bitte stelle sicher, dass du den Link in der E-Mail angeklickt hast", "Failed to verify email address: make sure you clicked the link in the email": "Verifizierung der E-Mail-Adresse fehlgeschlagen: Bitte stelle sicher, dass du den Link in der E-Mail angeklickt hast",
"Failure to create room": "Raumerstellung fehlgeschlagen", "Failure to create room": "Raumerstellung fehlgeschlagen",
"Guest users can't create new rooms. Please register to create room and start a chat": "Gäste können keine neuen Räume erstellen. Bitte registrieren um einen Raum zu erstellen und einen Chat zu starten", "Guest users can't create new rooms. Please register to create room and start a chat.": "Gastnutzer können keine neuen Räume erstellen. Bitte registriere dich um Räume zu erstellen und Chats zu starten.",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot hat keine Berechtigung Benachrichtigungen zu senden - bitte prüfe deine Browser-Einstellungen", "Riot does not have permission to send you notifications - please check your browser settings": "Riot hat keine Berechtigung, um Benachrichtigungen zu senden - bitte Browser-Einstellungen überprüfen",
"Riot was not given permission to send notifications - please try again": "Riot hat das Recht nicht bekommen Benachrichtigungen zu senden. Bitte erneut probieren", "Riot was not given permission to send notifications - please try again": "Riot hat keine Berechtigung für das Senden von Benachrichtigungen erhalten - bitte erneut versuchen",
"This email address is already in use": "Diese E-Mail-Adresse wird bereits verwendet", "This email address is already in use": "Diese E-Mail-Adresse wird bereits verwendet",
"This email address was not found": "Diese E-Mail-Adresse konnte nicht gefunden werden", "This email address was not found": "Diese E-Mail-Adresse konnte nicht gefunden werden",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Die Datei '%(fileName)s' überschreitet das Größen-Limit für Uploads auf diesem Homeserver", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Die Datei '%(fileName)s' überschreitet das Größen-Limit für Uploads auf diesem Homeserver",
@ -302,11 +302,11 @@
"Unable to enable Notifications": "Benachrichtigungen konnten nicht aktiviert werden", "Unable to enable Notifications": "Benachrichtigungen konnten nicht aktiviert werden",
"Upload Failed": "Upload fehlgeschlagen", "Upload Failed": "Upload fehlgeschlagen",
"VoIP is unsupported": "VoIP wird nicht unterstützt", "VoIP is unsupported": "VoIP wird nicht unterstützt",
"You are already in a call": "Du bist bereits bei einem Anruf", "You are already in a call.": "Du bist bereits in einem Gespräch.",
"You cannot place a call with yourself": "Du kannst keinen Anruf mit dir selbst starten", "You cannot place a call with yourself.": "Du kannst keinen Anruf mit dir selbst starten.",
"You cannot place VoIP calls in this browser": "Du kannst kein VoIP-Gespräch in diesem Browser starten", "You cannot place VoIP calls in this browser.": "VoIP-Gespräche werden von diesem Browser nicht unterstützt.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Du musst dich erneut anmelden, um Ende-zu-Ende-Verschlüsselungs-Schlüssel für dieses Gerät zu generieren und um den öffentlichen Schlüssel auf deinem Homeserver zu hinterlegen. Dies muss nur einmal durchgeführt werden, bitte entschuldige die Unannehmlichkeiten.", "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Du musst dich erneut anmelden, um Ende-zu-Ende-Verschlüsselungs-Schlüssel für dieses Gerät zu generieren und um den öffentlichen Schlüssel auf deinem Homeserver zu hinterlegen. Dies muss nur einmal durchgeführt werden, bitte entschuldige die Unannehmlichkeiten.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Homeserver verknüpft zu sein", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Heimserver verbunden zu sein.",
"Sun": "So", "Sun": "So",
"Mon": "Mo", "Mon": "Mo",
"Tue": "Di", "Tue": "Di",
@ -316,7 +316,7 @@
"Sat": "Sa", "Sat": "Sa",
"Jan": "Jan", "Jan": "Jan",
"Feb": "Feb", "Feb": "Feb",
"Mar": "März", "Mar": "Mrz",
"Apr": "April", "Apr": "April",
"May": "Mai", "May": "Mai",
"Jun": "Juni", "Jun": "Juni",
@ -336,10 +336,10 @@
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Passwort zu kurz (min. %(MIN_PASSWORD_LENGTH)s).", "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Passwort zu kurz (min. %(MIN_PASSWORD_LENGTH)s).",
"This doesn't look like a valid email address.": "Dies scheint keine gültige E-Mail-Adresse zu sein.", "This doesn't look like a valid email address.": "Dies scheint keine gültige E-Mail-Adresse zu sein.",
"This doesn't look like a valid phone number.": "Dies scheint keine gültige Telefonnummer zu sein.", "This doesn't look like a valid phone number.": "Dies scheint keine gültige Telefonnummer zu sein.",
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Benutzernamen sollen nur Buchstaben, Nummern, Binde- und Unterstriche enthalten.", "User names may only contain letters, numbers, dots, hyphens and underscores.": "Benutzernamen dürfen nur Buchstaben, Nummern, Punkte, Binde- und Unterstriche enthalten.",
"An unknown error occurred.": "Ein unbekannter Fehler trat auf.", "An unknown error occurred.": "Ein unbekannter Fehler ist aufgetreten.",
"I already have an account": "Ich habe bereits einen Account", "I already have an account": "Ich habe bereits einen Account",
"An error occured: %(error_string)s": "Ein Fehler trat auf: %(error_string)s", "An error occurred: %(error_string)s": "Ein Fehler trat auf: %(error_string)s",
"Topic": "Thema", "Topic": "Thema",
"Make this room private": "Mache diesen Raum privat", "Make this room private": "Mache diesen Raum privat",
"Share message history with new users": "Bisherigen Chatverlauf mit neuen Nutzern teilen", "Share message history with new users": "Bisherigen Chatverlauf mit neuen Nutzern teilen",
@ -351,8 +351,8 @@
"%(names)s and one other are typing": "%(names)s und eine weitere Person tippen", "%(names)s and one other are typing": "%(names)s und eine weitere Person tippen",
"%(names)s and %(count)s others are typing": "%(names)s und %(count)s weitere Personen schreiben", "%(names)s and %(count)s others are typing": "%(names)s und %(count)s weitere Personen schreiben",
"%(senderName)s answered the call.": "%(senderName)s hat den Anruf angenommen.", "%(senderName)s answered the call.": "%(senderName)s hat den Anruf angenommen.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s hat %(targetName)s aus dem Raum verbannt.", "%(senderName)s banned %(targetName)s.": "%(senderName)s hat %(targetName)s dauerhaft aus dem Raum ausgeschlossen.",
"%(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 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 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.", "%(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 änderte den Raumnamen zu %(roomName)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s änderte den Raumnamen zu %(roomName)s.",
@ -364,8 +364,8 @@
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s",
"%(senderName)s invited %(targetName)s.": "%(senderName)s hat %(targetName)s eingeladen.", "%(senderName)s invited %(targetName)s.": "%(senderName)s hat %(targetName)s eingeladen.",
"%(displayName)s is typing": "%(displayName)s schreibt", "%(displayName)s is typing": "%(displayName)s schreibt",
"%(targetName)s joined the room.": "%(targetName)s trat dem Raum bei.", "%(targetName)s joined the room.": "%(targetName)s hat den Raum betreten.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s kickte %(targetName)s.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s hat %(targetName)s aus dem Raum entfernt.",
"%(targetName)s left the room.": "%(targetName)s hat den Raum verlassen.", "%(targetName)s left the room.": "%(targetName)s hat den Raum verlassen.",
"%(senderName)s made future room history visible to": "%(senderName)s machte die zukünftige Raumhistorie sichtbar für", "%(senderName)s made future room history visible to": "%(senderName)s machte die zukünftige Raumhistorie sichtbar für",
"Missing room_id in request": "Fehlende room_id in Anfrage", "Missing room_id in request": "Fehlende room_id in Anfrage",
@ -377,28 +377,28 @@
"Power level must be positive integer.": "Berechtigungslevel muss eine positive ganze Zahl sein.", "Power level must be positive integer.": "Berechtigungslevel muss eine positive ganze Zahl sein.",
"Reason": "Grund", "Reason": "Grund",
"%(targetName)s rejected the invitation.": "%(targetName)s hat die Einladung abgelehnt.", "%(targetName)s rejected the invitation.": "%(targetName)s hat die Einladung abgelehnt.",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s löschte den Anzeigenamen (%(oldDisplayName)s).", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s hat den Anzeigenamen entfernt (%(oldDisplayName)s).",
"%(senderName)s removed their profile picture.": "%(senderName)s löschte das Profilbild.", "%(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.", "%(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", "Room %(roomId)s not visible": "Raum %(roomId)s ist nicht sichtbar",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s hat ein Bild gesendet.", "%(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 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 setzte ein Profilbild.", "%(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.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s hat den Anzeigenamen geändert in %(displayName)s.",
"This room is not recognised.": "Dieser Raum wurde nicht erkannt.", "This room is not recognised.": "Dieser Raum wurde nicht erkannt.",
"These are experimental features that may break in unexpected ways": "Dies sind experimentelle Funktionen, die in unerwarteter Weise Fehler verursachen können", "These are experimental features that may break in unexpected ways": "Dies sind experimentelle Funktionen, die in unerwarteter Weise Fehler verursachen können",
"To use it, just wait for autocomplete results to load and tab through them.": "Um diese Funktion zu nutzen, warte einfach auf die Autovervollständigungsergebnisse und benutze dann die TAB-Taste zum durchblättern.", "To use it, just wait for autocomplete results to load and tab through them.": "Um diese Funktion zu nutzen, warte einfach auf die Autovervollständigungsergebnisse und benutze dann die TAB-Taste zum durchblättern.",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s hat die Ende-zu-Ende-Verschlüsselung aktiviert (Algorithmus: %(algorithm)s).", "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s hat die Ende-zu-Ende-Verschlüsselung aktiviert (Algorithmus: %(algorithm)s).",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s zog Bann für %(targetName)s zurück.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s hat das dauerhafte Ausschließen von %(targetName)s aus dem Raum aufgehoben.",
"Usage": "Verwendung", "Usage": "Verwendung",
"Use with caution": "Mit Vorsicht zu verwenden", "Use with caution": "Mit Vorsicht zu verwenden",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s zog die Einladung für %(targetName)s zurück.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s hat die Einladung für %(targetName)s zurückgezogen.",
"You need to be able to invite users to do that.": "Du musst die Berechtigung haben, Nutzer einzuladen, um diese Aktion ausführen zu können.", "You need to be able to invite users to do that.": "Du musst die Berechtigung haben, Nutzer einzuladen, um diese Aktion ausführen zu können.",
"You need to be logged in.": "Du musst angemeldet sein.", "You need to be logged in.": "Du musst angemeldet sein.",
"There are no visible files in this room": "Es gibt keine sichtbaren Dateien in diesem Raum", "There are no visible files in this room": "Es gibt keine sichtbaren Dateien in diesem Raum",
"Error changing language": "Fehler beim Ändern der Sprache", "Error changing language": "Fehler beim Ändern der Sprache",
"Riot was unable to find the correct Data for the selected Language.": "Riot war nicht in der Lage die korrekten Daten für die ausgewählte Sprache zu finden.", "Riot was unable to find the correct Data for the selected Language.": "Riot war nicht in der Lage die korrekten Daten für die ausgewählte Sprache zu finden.",
"Connectivity to the server has been lost.": "Verbindung zum Server untergebrochen.", "Connectivity to the server has been lost.": "Verbindung zum Server wurde unterbrochen.",
"Sent messages will be stored until your connection has returned.": "Gesendete Nachrichten werden gespeichert, bis die Internetverbindung wiederhergestellt wurde.", "Sent messages will be stored until your connection has returned.": "Gesendete Nachrichten werden gespeichert, bis die Internetverbindung wiederhergestellt wurde.",
"Auto-complete": "Autovervollständigung", "Auto-complete": "Autovervollständigung",
"Resend all": "Alle erneut senden", "Resend all": "Alle erneut senden",
@ -418,7 +418,7 @@
"Press": "Drücke", "Press": "Drücke",
"tag as %(tagName)s": "als %(tagName)s taggen", "tag as %(tagName)s": "als %(tagName)s taggen",
"to browse the directory": "um das Raum-Verzeichnis zu durchsuchen", "to browse the directory": "um das Raum-Verzeichnis zu durchsuchen",
"to demote": "um die Priorität herabzusetzen", "to demote": "um das Berechtigungslevel herabzusetzen",
"to favourite": "zum Favorisieren", "to favourite": "zum Favorisieren",
"to make a room or": "um einen Raum zu erstellen, oder", "to make a room or": "um einen Raum zu erstellen, oder",
"to restore": "zum wiederherstellen", "to restore": "zum wiederherstellen",
@ -427,7 +427,7 @@
"You're not in any rooms yet! Press": "Du bist noch keinem Raum beigetreten! Drücke", "You're not in any rooms yet! Press": "Du bist noch keinem Raum beigetreten! Drücke",
"click to reveal": "Klicke zum anzeigen", "click to reveal": "Klicke zum anzeigen",
"To remove other users' messages": "Um Nachrichten anderer Nutzer zu verbergen", "To remove other users' messages": "Um Nachrichten anderer Nutzer zu verbergen",
"You are trying to access %(roomName)s": "Du versuchst auf %(roomName)s zuzugreifen", "You are trying to access %(roomName)s.": "Du versuchst, auf den Raum \"%(roomName)s\" zuzugreifen.",
"af": "Afrikaans", "af": "Afrikaans",
"ar-ae": "Arabisch (VAE)", "ar-ae": "Arabisch (VAE)",
"ar-bh": "Arabisch (Bahrain)", "ar-bh": "Arabisch (Bahrain)",
@ -550,28 +550,28 @@
"Friday": "Freitag", "Friday": "Freitag",
"Saturday": "Samstag", "Saturday": "Samstag",
"Sunday": "Sonntag", "Sunday": "Sonntag",
"Failed to forget room %(errCode)s": "Das Entfernen des Raums %(errCode)s aus deiner Liste ist fehlgeschlagen", "Failed to forget room %(errCode)s": "Das Entfernen des Raums ist fehlgeschlagen %(errCode)s",
"Failed to join the room": "Fehler beim Betreten des Raumes", "Failed to join the room": "Fehler beim Betreten des Raumes",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Eine Textnachricht wurde an +%(msisdn)s gesendet. Bitte gebe den Verifikationscode ein, den er beinhaltet", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Eine Textnachricht wurde an +%(msisdn)s gesendet. Bitte gebe den Verifikationscode ein, den er beinhaltet",
"and %(overflowCount)s others...": "und %(overflowCount)s weitere...", "and %(overflowCount)s others...": "und %(overflowCount)s weitere...",
"and one other...": "und ein(e) weitere(r)...", "and one other...": "und ein(e) weitere(r)...",
"Are you sure?": "Bist du sicher?", "Are you sure?": "Bist du sicher?",
"Attachment": "Anhang", "Attachment": "Anhang",
"Ban": "Verbannen", "Ban": "Dauerhaft aus dem Raum ausschließen",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Kann nicht zum Heimserver verbinden - bitte checke eine Verbindung und stelle sicher, dass dem <a>SSL-Zertifikat deines Heimservers</a> vertraut wird.", "Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Verbindungsaufbau zum Heimserver nicht möglich - bitte Internetverbindung überprüfen und sicherstellen, ob das <a>SSL-Zertifikat des Heimservers</a> vertrauenswürdig ist.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Kann nicht zum Heimserver via HTTP verbinden, wenn eine HTTPS-Url in deiner Adresszeile steht. Nutzer HTTPS oder <a>aktiviere unsichere Skripte</a>.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Es kann keine Verbindung zum Heimserver via HTTP aufgebaut werden, wenn die Adresszeile des Browsers eine HTTPS-URL enthält. Entweder HTTPS verwenden oder alternativ <a>unsichere Skripte erlauben</a>.",
"changing room on a RoomView is not supported": "Das Ändern eines Raumes in einer RaumAnsicht wird nicht unterstützt", "changing room on a RoomView is not supported": "Das Ändern eines Raumes in einer RaumAnsicht wird nicht unterstützt",
"Click to mute audio": "Klicke um den Ton stumm zu stellen", "Click to mute audio": "Klicke um den Ton stumm zu stellen",
"Click to mute video": "Klicken, um das Video stummzuschalten", "Click to mute video": "Klicken, um das Video stummzuschalten",
"Command error": "Befehlsfehler", "Command error": "Befehlsfehler",
"Decrypt %(text)s": "Entschlüssele %(text)s", "Decrypt %(text)s": "%(text)s entschlüsseln",
"Delete": "Löschen", "Delete": "Löschen",
"Devices": "Geräte", "Devices": "Geräte",
"Direct chats": "Direkte Chats", "Direct chats": "Direkte Chats",
"Disinvite": "Einladung zurückziehen", "Disinvite": "Einladung zurückziehen",
"Download %(text)s": "%(text)s herunterladen", "Download %(text)s": "%(text)s herunterladen",
"Enter Code": "Code eingeben", "Enter Code": "Code eingeben",
"Failed to ban user": "Bannen des Nutzers fehlgeschlagen", "Failed to ban user": "Dauerhaftes Ausschließen des Benutzers aus dem Raum fehlgeschlagen",
"Failed to change power level": "Ändern des Berechtigungslevels fehlgeschlagen", "Failed to change power level": "Ändern des Berechtigungslevels fehlgeschlagen",
"Failed to delete device": "Löschen des Geräts fehlgeschlagen", "Failed to delete device": "Löschen des Geräts fehlgeschlagen",
"Failed to join room": "Betreten des Raumes ist fehlgeschlagen", "Failed to join room": "Betreten des Raumes ist fehlgeschlagen",
@ -581,16 +581,15 @@
"Failed to save settings": "Einstellungen konnten nicht gespeichert werden", "Failed to save settings": "Einstellungen konnten nicht gespeichert werden",
"Failed to set display name": "Anzeigename konnte nicht gesetzt werden", "Failed to set display name": "Anzeigename konnte nicht gesetzt werden",
"Fill screen": "Fülle Bildschirm", "Fill screen": "Fülle Bildschirm",
"Guest users can't upload files. Please register to upload": "Gäste können keine Dateien hochladen. Bitte zunächst registrieren", "Hide Text Formatting Toolbar": "Text-Formatierungs-Werkzeugleiste verbergen",
"Hide Text Formatting Toolbar": "Verberge Text-Formatierungs-Toolbar",
"Incorrect verification code": "Falscher Verifizierungscode", "Incorrect verification code": "Falscher Verifizierungscode",
"Invalid alias format": "Ungültiges Alias-Format", "Invalid alias format": "Ungültiges Alias-Format",
"Invalid address format": "Ungültiges Adressformat", "Invalid address format": "Ungültiges Adressformat",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' ist kein gültiges Adressformat", "'%(alias)s' is not a valid format for an address": "'%(alias)s' ist kein gültiges Adressformat",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' hat kein valides Aliasformat", "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ist kein gültiges Alias-Format",
"Join Room": "Dem Raum beitreten", "Join Room": "Dem Raum beitreten",
"Kick": "Kicke", "Kick": "Aus dem Raum entfernen",
"Level": "Level", "Level": "Berechtigungslevel",
"Local addresses for this room:": "Lokale Adressen dieses Raumes:", "Local addresses for this room:": "Lokale Adressen dieses Raumes:",
"Markdown is disabled": "Markdown ist deaktiviert", "Markdown is disabled": "Markdown ist deaktiviert",
"Markdown is enabled": "Markdown ist aktiviert", "Markdown is enabled": "Markdown ist aktiviert",
@ -602,23 +601,23 @@
"No more results": "Keine weiteren Ergebnisse", "No more results": "Keine weiteren Ergebnisse",
"No results": "Keine Ergebnisse", "No results": "Keine Ergebnisse",
"OK": "OK", "OK": "OK",
"Revoke Moderator": "Moderator zurückziehen", "Revoke Moderator": "Moderator-Status zurückziehen",
"Search": "Suchen", "Search": "Suchen",
"Search failed": "Suche ist fehlgeschlagen", "Search failed": "Suche ist fehlgeschlagen",
"Server error": "Server-Fehler", "Server error": "Server-Fehler",
"Server may be unavailable, overloaded, or search timed out :(": "Der Server ist entweder nicht verfügbar, überlastet oder die Suche wurde wegen Zeitüberschreitung abgebrochen :(", "Server may be unavailable, overloaded, or search timed out :(": "Der Server ist entweder nicht verfügbar, überlastet oder die Suche wurde wegen Zeitüberschreitung abgebrochen :(",
"Server may be unavailable, overloaded, or the file too big": "Server ist entweder nicht verfügbar, überlastet oder die Datei ist zu groß", "Server may be unavailable, overloaded, or the file too big": "Server ist entweder nicht verfügbar, überlastet oder die Datei ist zu groß",
"Server unavailable, overloaded, or something else went wrong": "Der Server ist entweder nicht verfügbar, überlastet oder es liegt ein anderweitiger Fehler vor", "Server unavailable, overloaded, or something else went wrong.": "Server ist nicht verfügbar, überlastet oder ein anderer Fehler ist aufgetreten.",
"Some of your messages have not been sent": "Einige deiner Nachrichten wurden noch nicht gesendet", "Some of your messages have not been sent.": "Einige deiner Nachrichten wurden nicht gesendet.",
"Submit": "Absenden", "Submit": "Absenden",
"The main address for this room is: %(canonical_alias_section)s": "Die Hauptadresse für diesen Raum ist: %(canonical_alias_section)s", "The main address for this room is: %(canonical_alias_section)s": "Die Hauptadresse für diesen Raum ist: %(canonical_alias_section)s",
"This action cannot be performed by a guest user. Please register to be able to do this": "Diese Aktion kann nicht von einem Gast ausgeführt werden. Bitte registriere dich um dies zu tun", "This action cannot be performed by a guest user. Please register to be able to do this.": "Diese Aktion kann nicht von einem Gast ausgeführt werden. Bitte registriere dich um dies zu tun.",
"%(actionVerb)s this person?": "Diese Person %(actionVerb)s?", "%(actionVerb)s this person?": "Diese Person %(actionVerb)s?",
"This room has no local addresses": "Dieser Raum hat keine lokale Adresse", "This room has no local addresses": "Dieser Raum hat keine lokale Adresse",
"This room is private or inaccessible to guests. You may be able to join if you register": "Dieser Raum ist privat oder für Gäste nicht zugänglich. Du kannst jedoch eventuell beitreten, wenn du dich registrierst", "This room is private or inaccessible to guests. You may be able to join if you register": "Dieser Raum ist privat oder für Gäste nicht zugänglich. Du kannst jedoch eventuell beitreten, wenn du dich registrierst",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question": "Versuchte einen spezifischen Punkt in der Raum-Chronik zu laden, aber du hast keine Berechtigung die angeforderte Nachricht anzuzeigen", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Es wurde versucht, einen bestimmten Punkt im Chatverlauf dieses Raumes zu laden. Dir fehlt jedoch die Berechtigung, die betreffende Nachricht zu sehen.",
"Tried to load a specific point in this room's timeline, but was unable to find it": "Der Versuch, einen spezifischen Punkt im Chatverlauf zu laden, ist fehlgeschlagen. Der Punkt konnte nicht gefunden werden", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Es wurde versucht, einen bestimmten Punkt im Chatverlauf dieses Raumes zu laden, der Punkt konnte jedoch nicht gefunden werden.",
"Turn Markdown off": "Markdown abschalten", "Turn Markdown off": "Markdown deaktiveren",
"Turn Markdown on": "Markdown einschalten", "Turn Markdown on": "Markdown einschalten",
"Unable to load device list": "Geräteliste konnte nicht geladen werden", "Unable to load device list": "Geräteliste konnte nicht geladen werden",
"Unknown command": "Unbekannter Befehl", "Unknown command": "Unbekannter Befehl",
@ -626,8 +625,8 @@
"Usage: /markdown on|off": "Verwendung: /markdown on|off", "Usage: /markdown on|off": "Verwendung: /markdown on|off",
"You seem to be in a call, are you sure you want to quit?": "Du scheinst in einem Anruf zu sein. Bist du sicher schließen zu wollen?", "You seem to be in a call, are you sure you want to quit?": "Du scheinst in einem Anruf zu sein. Bist du sicher schließen zu wollen?",
"You seem to be uploading files, are you sure you want to quit?": "Du scheinst Dateien hochzuladen. Bist du sicher schließen zu wollen?", "You seem to be uploading files, are you sure you want to quit?": "Du scheinst Dateien hochzuladen. Bist du sicher schließen zu wollen?",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself": "Du wirst diese Änderung nicht rückgängig machen können, da der Nutzer dasselbe Berechtigungslevel wie du selbst erhalten wird", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Du wirst diese Änderung nicht rückgängig machen können, da der Nutzer dasselbe Berechtigungslevel wie du selbst erhalten wird.",
"Make Moderator": "Zum Moderator machen", "Make Moderator": "Zum Moderator ernennen",
"Room": "Raum", "Room": "Raum",
"(~%(searchCount)s results)": "(~%(searchCount)s Ergebnisse)", "(~%(searchCount)s results)": "(~%(searchCount)s Ergebnisse)",
"Cancel": "Abbrechen", "Cancel": "Abbrechen",
@ -653,52 +652,51 @@
"%(items)s and one other": "%(items)s und ein(e) weitere(r)", "%(items)s and one other": "%(items)s und ein(e) weitere(r)",
"%(items)s and %(lastItem)s": "%(items)s und %(lastItem)s", "%(items)s and %(lastItem)s": "%(items)s und %(lastItem)s",
"%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)ssind dem Raum %(repeats)s mal beigetreten", "%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)ssind dem Raum %(repeats)s mal beigetreten",
"%(oneUser)sjoined %(repeats)s times": "%(oneUser)strat %(repeats)s mal bei", "%(oneUser)sjoined %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal betreten",
"%(severalUsers)sjoined": "%(severalUsers)straten bei", "%(severalUsers)sjoined": "%(severalUsers)shaben den Raum betreten",
"%(oneUser)sjoined": "%(oneUser)strat bei", "%(oneUser)sjoined": "%(oneUser)shat den Raum betreten",
"%(severalUsers)sleft %(repeats)s times": "%(severalUsers)sverließen %(repeats)s mal den Raum", "%(severalUsers)sleft %(repeats)s times": "%(severalUsers)shaben %(repeats)s mal den Raum verlassen",
"%(oneUser)sleft %(repeats)s times": "%(oneUser)sging %(repeats)s mal", "%(oneUser)sleft %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal verlassen",
"%(severalUsers)sleft": "%(severalUsers)shaben den Raum verlassen", "%(severalUsers)sleft": "%(severalUsers)shaben den Raum verlassen",
"%(oneUser)sleft": "%(oneUser)sging", "%(oneUser)sleft": "%(oneUser)shat den Raum verlassen",
"%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)straten bei und gingen %(repeats)s mal", "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)shaben den Raum %(repeats)s mal betreten und wieder verlassen",
"%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)strat bei und ging %(repeats)s mal", "%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal betreten und wieder verlassen",
"%(severalUsers)sjoined and left": "%(severalUsers)straten bei und gingen", "%(severalUsers)sjoined and left": "%(severalUsers)shaben den Raum betreten und wieder verlassen",
"%(oneUser)sjoined and left": "%(oneUser)strat bei und ging", "%(oneUser)sjoined and left": "%(oneUser)shat den Raum betreten und wieder verlassen",
"%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)shaben den Raum verlassen und %(repeats)s mal neu betreten", "%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)shaben den Raum verlassen und %(repeats)s mal neu betreten",
"%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)sging und trat %(repeats)s mal erneut bei", "%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal verlassen und wieder neu betreten",
"%(severalUsers)sleft and rejoined": "%(severalUsers)s gingen und traten erneut bei", "%(severalUsers)sleft and rejoined": "%(severalUsers)shaben den Raum verlassen und wieder neu betreten",
"%(oneUser)sleft left and rejoined": "%(oneUser)sging und trat erneut bei", "%(oneUser)sleft left and rejoined": "%(oneUser)sging und trat erneut bei",
"%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)s lehnten %(repeats)s mal ihre Einladung ab", "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)shaben ihre Einladung %(repeats)s mal abgelehnt",
"%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)shat die Einladung %(repeats)s mal abgelehnt", "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)shat die Einladung %(repeats)s mal abgelehnt",
"%(severalUsers)srejected their invitations": "%(severalUsers)slehnten ihre Einladung ab", "%(severalUsers)srejected their invitations": "%(severalUsers)shaben ihre Einladung abgelehnt",
"%(oneUser)srejected their invitation": "%(oneUser)slehnte seine/ihre Einladung ab", "%(oneUser)srejected their invitation": "%(oneUser)shat die Einladung abgelehnt",
"%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)szogen ihre Einladungen %(repeats)s mal zurück", "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)szogen ihre Einladungen %(repeats)s mal zurück",
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)szog seine/ihre Einladung %(repeats)s mal zurück", "%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)szog seine/ihre Einladung %(repeats)s mal zurück",
"%(severalUsers)shad their invitations withdrawn": "%(severalUsers)szogen ihre Einladungen zurück", "%(severalUsers)shad their invitations withdrawn": "%(severalUsers)szogen ihre Einladungen zurück",
"%(oneUser)shad their invitation withdrawn": "%(oneUser)szog seine/ihre Einladung zurück", "%(oneUser)shad their invitation withdrawn": "%(oneUser)swurde die ursprüngliche Einladung wieder entzogen",
"were invited %(repeats)s times": "wurden %(repeats)s mal eingeladen", "were invited %(repeats)s times": "wurden %(repeats)s mal eingeladen",
"was invited %(repeats)s times": "wurde %(repeats)s mal eingeladen", "was invited %(repeats)s times": "wurde %(repeats)s mal eingeladen",
"were invited": "wurden eingeladen", "were invited": "wurden eingeladen",
"were banned %(repeats)s times": "wurden %(repeats)s mal aus dem Raum ausgeschlossen", "were banned %(repeats)s times": "wurden %(repeats)s mal aus dem Raum ausgeschlossen",
"was banned %(repeats)s times": "wurde %(repeats)s mal aus dem Raum ausgeschlossen", "was banned %(repeats)s times": "wurde %(repeats)s mal aus dem Raum ausgeschlossen",
"were banned": "wurden aus dem Raum ausgeschlossen", "were banned": "wurden dauerhaft aus dem Raum ausgeschlossen",
"were unbanned %(repeats)s times": "wurden %(repeats)s mal entbannt", "were unbanned %(repeats)s times": "wurden %(repeats)s mal vom dauerhaften Ausschluss aus dem Raum befreit",
"was unbanned %(repeats)s times": "wurde %(repeats)s mal entbannt", "was unbanned %(repeats)s times": "wurde %(repeats)s mal vom dauerhaften Ausschluss aus dem Raum befreit",
"were unbanned": "wurden entbannt", "were unbanned": "wurden vom dauerhaften Ausschluss aus dem Raum befreit",
"were kicked %(repeats)s times": "wurden %(repeats)s mal gekickt", "were kicked %(repeats)s times": "wurden %(repeats)s mal aus dem Raum entfernt",
"was kicked %(repeats)s times": "wurde %(repeats)s mal gekickt", "was kicked %(repeats)s times": "wurde %(repeats)s mal aus dem Raum entfernt",
"were kicked": "wurden aus dem Raum entfernt", "were kicked": "wurden aus dem Raum entfernt",
"%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)sänderten %(repeats)s mal ihre Namen", "%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)shaben ihren Namen %(repeats)s mal geändert",
"%(oneUser)schanged their name %(repeats)s times": "%(oneUser)sänderte %(repeats)s mal seinen/ihren Namen", "%(oneUser)schanged their name %(repeats)s times": "%(oneUser)shat den Namen %(repeats)s mal geändert",
"%(severalUsers)schanged their name": "%(severalUsers)shaben ihre Namen geändert", "%(severalUsers)schanged their name": "%(severalUsers)shaben ihre Namen geändert",
"%(oneUser)schanged their name": "%(oneUser)sänderte seinen/ihren Namen", "%(oneUser)schanged their name": "%(oneUser)shat den Namen geändert",
"%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers)shaben %(repeats)s mal ihr Profilbild geändert", "%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers)shaben %(repeats)s mal ihr Profilbild geändert",
"%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)shat %(repeats)s mal das Profilbild geändert", "%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)shat %(repeats)s mal das Profilbild geändert",
"%(severalUsers)schanged their avatar": "%(severalUsers)shaben ihr Profilbild geändert", "%(severalUsers)schanged their avatar": "%(severalUsers)shaben ihr Profilbild geändert",
"%(oneUser)schanged their avatar": "%(oneUser)shat das Profilbild geändert", "%(oneUser)schanged their avatar": "%(oneUser)shat das Profilbild geändert",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s. %(monthName)s %(fullYear)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s. %(monthName)s %(fullYear)s %(time)s",
"%(oneUser)sleft and rejoined": "%(oneUser)sverließ den Raum und trat erneut bei", "%(oneUser)sleft and rejoined": "%(oneUser)shat den Raum verlassen und wieder neu betreten",
"A registered account is required for this action": "Für diese Aktion ist ein registrierter Account notwendig",
"Access Token:": "Zugangs-Token:", "Access Token:": "Zugangs-Token:",
"Always show message timestamps": "Nachrichten-Zeitstempel immer anzeigen", "Always show message timestamps": "Nachrichten-Zeitstempel immer anzeigen",
"Authentication": "Authentifizierung", "Authentication": "Authentifizierung",
@ -712,7 +710,6 @@
"New passwords don't match": "Die neuen Passwörter stimmen nicht überein", "New passwords don't match": "Die neuen Passwörter stimmen nicht überein",
"olm version:": "Version von olm:", "olm version:": "Version von olm:",
"Passwords can't be empty": "Passwortfelder dürfen nicht leer sein", "Passwords can't be empty": "Passwortfelder dürfen nicht leer sein",
"Registration required": "Registrierung erforderlich",
"Report it": "Melde ihn", "Report it": "Melde ihn",
"riot-web version:": "Version von riot-web:", "riot-web version:": "Version von riot-web:",
"Scroll to bottom of page": "Zum Ende der Seite springen", "Scroll to bottom of page": "Zum Ende der Seite springen",
@ -726,9 +723,9 @@
"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.": "Eine Änderung des Passworts setzt derzeit alle Schlüssel für die E2E-Verschlüsselung auf allen verwendeten Geräten zurück. Bereits verschlüsselte Chat-Inhalte sind somit nur noch lesbar, wenn du zunächst alle Schlüssel exportierst und später wieder importierst. Wir arbeiten an einer Verbesserung dieser momentan noch notwendigen Vorgehensweise.", "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.": "Eine Änderung des Passworts setzt derzeit alle Schlüssel für die E2E-Verschlüsselung auf allen verwendeten Geräten zurück. Bereits verschlüsselte Chat-Inhalte sind somit nur noch lesbar, wenn du zunächst alle Schlüssel exportierst und später wieder importierst. Wir arbeiten an einer Verbesserung dieser momentan noch notwendigen Vorgehensweise.",
"Unmute": "Stummschalten aufheben", "Unmute": "Stummschalten aufheben",
"Invalid file%(extra)s": "Ungültige Datei%(extra)s", "Invalid file%(extra)s": "Ungültige Datei%(extra)s",
"Remove %(threePid)s?": "Entferne %(threePid)s?", "Remove %(threePid)s?": "%(threePid)s entfernen?",
"Please select the destination room for this message": "Bitte den Raum auswählen, an den diese Nachricht gesendet werden soll", "Please select the destination room for this message": "Bitte den Raum auswählen, an den diese Nachricht gesendet werden soll",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s löschte den Raumnamen.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s hat den Raum-Namen gelöscht.",
"Passphrases must match": "Passphrase muss übereinstimmen", "Passphrases must match": "Passphrase muss übereinstimmen",
"Passphrase must not be empty": "Passphrase darf nicht leer sein", "Passphrase must not be empty": "Passphrase darf nicht leer sein",
"Export room keys": "Raum-Schlüssel exportieren", "Export room keys": "Raum-Schlüssel exportieren",
@ -736,7 +733,6 @@
"Confirm passphrase": "Bestätige Passphrase", "Confirm passphrase": "Bestätige Passphrase",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Die Export-Datei wird mit einer Passphrase geschützt sein. Du solltest die Passphrase hier eingeben um die Datei zu entschlüsseln.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Die Export-Datei wird mit einer Passphrase geschützt sein. Du solltest die Passphrase hier eingeben um die Datei zu entschlüsseln.",
"You must join the room to see its files": "Du musst dem Raum beitreten, um die Raum-Dateien sehen zu können", "You must join the room to see its files": "Du musst dem Raum beitreten, um die Raum-Dateien sehen zu können",
"Server may be unavailable, overloaded, or you hit a bug.": "Server ist nicht verfügbar, überlastet oder du bist auf einen Fehler gestoßen.",
"Reject all %(invitedRooms)s invites": "Alle %(invitedRooms)s Einladungen ablehnen", "Reject all %(invitedRooms)s invites": "Alle %(invitedRooms)s Einladungen ablehnen",
"Start new Chat": "Starte neuen Chat", "Start new Chat": "Starte neuen Chat",
"Guest users can't invite users. Please register.": "Gäste können keine Nutzer einladen. Bitte registrieren.", "Guest users can't invite users. Please register.": "Gäste können keine Nutzer einladen. Bitte registrieren.",
@ -753,9 +749,9 @@
"Verify device": "Gerät verifizieren", "Verify device": "Gerät verifizieren",
"I verify that the keys match": "Ich bestätige, dass die Schlüssel passen", "I verify that the keys match": "Ich bestätige, dass die Schlüssel passen",
"Unable to restore session": "Sitzungswiederherstellung fehlgeschlagen", "Unable to restore session": "Sitzungswiederherstellung fehlgeschlagen",
"Continue anyway": "Fahre trotzdem fort", "Continue anyway": "Trotzdem fortfahren",
"Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "Dein Anzeigename ist der Name, der anderen Nutzern angezeigt wird, wenn du in Räumen sprichst. Welchen Anzeigenamen möchtest du wählen?", "Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "Dein Anzeigename ist der Name, der anderen Nutzern angezeigt wird, wenn du in Räumen kommunizierst. Welchen Anzeigenamen möchtest du wählen?",
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Do blockst aktuell unverifizierte Geräte. Um Nachrichten an diese Geräte zu senden musst du sie verifizieren.", "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.", "\"%(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", "Unknown devices": "Unbekannte Geräte",
"Unknown Address": "Unbekannte Adresse", "Unknown Address": "Unbekannte Adresse",
@ -768,7 +764,7 @@
"This allows you to use this app with an existing Matrix account on a different home server.": "Dies erlaubt dir diese App mit einem existierenden Matrix-Konto auf einem anderen Heimserver zu verwenden.", "This allows you to use this app with an existing Matrix account on a different home server.": "Dies erlaubt dir diese App mit einem existierenden Matrix-Konto auf einem anderen Heimserver zu verwenden.",
"Dismiss": "Ablehnen", "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.", "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-Mail um mit der Registrierung fortzufahren.", "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 inkorrekt",
"A text message has been sent to": "Eine Textnachricht wurde gesendet an", "A text message has been sent to": "Eine Textnachricht wurde gesendet an",
"Please enter the code it contains:": "Bitte gebe den Code ein, den sie enthält:", "Please enter the code it contains:": "Bitte gebe den Code ein, den sie enthält:",
@ -786,7 +782,7 @@
"This image cannot be displayed.": "Dieses Bild kann nicht angezeigt werden.", "This image cannot be displayed.": "Dieses Bild kann nicht angezeigt werden.",
"Error decrypting video": "Video-Entschlüsselung fehlgeschlagen", "Error decrypting video": "Video-Entschlüsselung fehlgeschlagen",
"Import room keys": "Importiere Raum-Schlüssel", "Import room keys": "Importiere Raum-Schlüssel",
"File to import": "Datei zum Importieren", "File to import": "Zu importierende Datei",
"Failed to invite the following users to the %(roomName)s room:": "Das Einladen der folgenden Nutzer in den Raum \"%(roomName)s\" ist fehlgeschlagen:", "Failed to invite the following users to the %(roomName)s room:": "Das Einladen der folgenden Nutzer in den Raum \"%(roomName)s\" ist fehlgeschlagen:",
"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.": "Bist du sicher, dass du dieses Ereignis entfernen (löschen) möchtest? Wenn du die Änderung eines Raum-Namens oder eines Raum-Themas löscht, kann dies dazu führen, dass die ursprüngliche Änderung rückgängig gemacht wird.", "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.": "Bist du sicher, dass du dieses Ereignis entfernen (löschen) möchtest? Wenn du die Änderung eines Raum-Namens oder eines Raum-Themas löscht, kann dies dazu führen, dass die ursprüngliche Änderung rückgängig gemacht wird.",
"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 in verschlüsselten Räumen empfangene 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 ebenfalls diese Nachrichten entschlüsseln kann.", "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 in verschlüsselten Räumen empfangene 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 ebenfalls diese Nachrichten entschlüsseln kann.",
@ -799,7 +795,7 @@
"Disable URL previews by default for participants in this room": "URL-Vorschau für Teilnehmer dieses Raumes standardmäßig deaktivieren", "Disable URL previews by default for participants in this room": "URL-Vorschau für Teilnehmer dieses Raumes standardmäßig deaktivieren",
"URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "URL-Vorschau ist standardmäßig %(globalDisableUrlPreview)s für Teilnehmer dieses Raumes.", "URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "URL-Vorschau ist standardmäßig %(globalDisableUrlPreview)s für Teilnehmer dieses Raumes.",
"URL Previews": "URL-Vorschau", "URL Previews": "URL-Vorschau",
"Enable URL previews for this room (affects only you)": "Aktiviere die URL-Vorschau in diesem Raum (betrifft nur dich)", "Enable URL previews for this room (affects only you)": "URL-Vorschau in diesem Raum aktivieren (betrifft nur dich)",
"Offline": "Offline", "Offline": "Offline",
"Online": "Online", "Online": "Online",
" (unsupported)": " (nicht unterstützt)", " (unsupported)": " (nicht unterstützt)",
@ -811,12 +807,12 @@
"If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "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.", "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", "Blacklist": "Blockieren",
"Unblacklist": "Entblockieren", "Unblacklist": "Entblockieren",
"Unverify": "Entverifizieren", "Unverify": "Verifizierung widerrufen",
"This Home Server would like to make sure you are not a robot": "Dieser Heimserver möchte sicherstellen, dass du kein Roboter bist", "This Home Server would like to make sure you are not a robot": "Dieser Heimserver möchte sicherstellen, dass du kein Roboter bist",
"Drop file here to upload": "Datei hier loslassen zum hochladen", "Drop file here to upload": "Datei hier loslassen zum hochladen",
"Idle": "Untätig", "Idle": "Untätig",
"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.": "Wir empfehlen dir für jedes Gerät durch den Verifizierungsprozess zu gehen um zu bestätigen, dass sie ihrem legitimierten Besitzer gehören, aber du kannst die Nachrichten ohne Verifizierung erneut senden, wenn du es vorziehst.", "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.": "Wir empfehlen dir für jedes Gerät durch den Verifizierungsprozess zu gehen um zu bestätigen, dass sie ihrem legitimierten Besitzer gehören, aber du kannst die Nachrichten ohne Verifizierung erneut senden, wenn du es vorziehst.",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Laufendes Konferenzgespräch%(supportedText)s. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Laufendes Konferenzgespräch%(supportedText)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?": "Du wirst jetzt auf die Website eines Drittanbieters weitergeleitet, damit du dein Konto für die Verwendung von %(integrationsUrl)s authentifizieren kannst. Möchtest du fortfahren?", "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?": "Du wirst jetzt auf die Website eines Drittanbieters weitergeleitet, damit du dein Konto für die Verwendung von %(integrationsUrl)s authentifizieren kannst. Möchtest du fortfahren?",
"Disable URL previews for this room (affects only you)": "URL-Vorschau für diesen Raum deaktivieren (betrifft nur dich)", "Disable URL previews for this room (affects only you)": "URL-Vorschau für diesen Raum deaktivieren (betrifft nur dich)",
"Start automatically after system login": "Starte automatisch nach System-Login", "Start automatically after system login": "Starte automatisch nach System-Login",
@ -828,7 +824,7 @@
"Invited": "Eingeladen", "Invited": "Eingeladen",
"Set a Display Name": "Setze einen Anzeigenamen", "Set a Display Name": "Setze einen Anzeigenamen",
"for %(amount)ss": "für %(amount)ss", "for %(amount)ss": "für %(amount)ss",
"for %(amount)sm": "für %(amount)sm", "for %(amount)sm": "seit %(amount)smin",
"for %(amount)sh": "für %(amount)sh", "for %(amount)sh": "für %(amount)sh",
"for %(amount)sd": "für %(amount)sd", "for %(amount)sd": "für %(amount)sd",
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s hat das Raum-Bild entfernt.", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s hat das Raum-Bild entfernt.",
@ -841,34 +837,29 @@
"Default Device": "Standard-Gerät", "Default Device": "Standard-Gerät",
"Microphone": "Mikrofon", "Microphone": "Mikrofon",
"Camera": "Kamera", "Camera": "Kamera",
"Conference call failed.": "Konferenzgespräch fehlgeschlagen.",
"Conference calling is in development and may not be reliable.": "Konferenzgespräche befinden sich noch in der Entwicklungsphase und sind möglicherweise nicht zuverlässig nutzbar.",
"Device already verified!": "Gerät bereits verifiziert!", "Device already verified!": "Gerät bereits verifiziert!",
"Export": "Export", "Export": "Export",
"Failed to register as guest:": "Registrieren als Gast schlug fehl:", "Failed to register as guest:": "Die Registrierung als Gast ist fehlgeschlagen:",
"Guest access is disabled on this Home Server.": "Gastzugang ist auf diesem Heimserver deaktivert.", "Guest access is disabled on this Home Server.": "Gastzugang ist auf diesem Heimserver deaktivert.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Gastnutzer können keine neuen Räume erstellen. Bitte registriere dich um Räume zu erstellen und Chats zu starten.",
"Import": "Import", "Import": "Import",
"Incorrect username and/or password.": "Inkorrekter Nutzername und/oder Passwort.", "Incorrect username and/or password.": "Inkorrekter Nutzername und/oder Passwort.",
"Results from DuckDuckGo": "Ergebnisse von DuckDuckGo", "Results from DuckDuckGo": "Ergebnisse von DuckDuckGo",
"Server unavailable, overloaded, or something else went wrong.": "Server nicht verfügbar, überlastet oder etwas anderes lief falsch.",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Den Signaturschlüssel den du bereitstellst stimmt mit dem Schlüssel den du von %(userId)s's Gerät %(deviceId)s empfangen hast überein. Gerät als verifiziert markiert.", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Den Signaturschlüssel den du bereitstellst stimmt mit dem Schlüssel den du von %(userId)s's Gerät %(deviceId)s empfangen hast überein. Gerät als verifiziert markiert.",
"Add a topic": "Thema hinzufügen", "Add a topic": "Thema hinzufügen",
"Anyone": "Jeder", "Anyone": "Jeder",
"Are you sure you want to leave the room '%(roomName)s'?": "Bist du sicher, dass du den Raum '%(roomName)s' verlassen willst?", "Are you sure you want to leave the room '%(roomName)s'?": "Bist du sicher, dass du den Raum '%(roomName)s' verlassen willst?",
"Custom level": "Benutzerdefiniertes Berechtigungslevel", "Custom level": "Benutzerdefiniertes Berechtigungslevel",
"(default: %(userName)s)": "(Standard: %(userName)s)",
"Device ID:": "Geräte-ID:", "Device ID:": "Geräte-ID:",
"device id: ": "Geräte-ID: ", "device id: ": "Geräte-ID: ",
"Device key:": "Geräte-Schlüssel:", "Device key:": "Geräte-Schlüssel:",
"Email address (optional)": "E-Mail-Adresse (optional)", "Email address (optional)": "E-Mail-Adresse (optional)",
"List this room in %(domain)s's room directory?": "Liste diesen Raum in %(domain)s's Raumverzeichnis?", "List this room in %(domain)s's room directory?": "Diesen Raum zum Raum-Verzeichnis von %(domain)s hinzufügen?",
"Mobile phone number (optional)": "Handynummer (optional)", "Mobile phone number (optional)": "Mobilfunknummer (optional)",
"Password:": "Passwort:", "Password:": "Passwort:",
"Register": "Registrieren", "Register": "Registrieren",
"Save": "Speichern", "Save": "Speichern",
"Setting a user name will create a fresh account": "Die Eingabe eines Benutzernamens wird ein neues Konto erzeugen", "Setting a user name will create a fresh account": "Die Eingabe eines Benutzernamens wird ein neues Konto erzeugen",
"Tagged as: ": "Getaggt als: ", "Tagged as: ": "Markiert als: ",
"This Home Server does not support login using email address.": "Dieser Heimserver unterstützt den Login mittels E-Mail-Adresse nicht.", "This Home Server does not support login using email address.": "Dieser Heimserver unterstützt den Login mittels E-Mail-Adresse nicht.",
"There was a problem logging in.": "Es gab ein Problem beim anmelden.", "There was a problem logging in.": "Es gab ein Problem beim anmelden.",
"Unknown (user, device) pair:": "Unbekanntes (Nutzer-/Gerät-)Paar:", "Unknown (user, device) pair:": "Unbekanntes (Nutzer-/Gerät-)Paar:",
@ -879,15 +870,109 @@
"Verified key": "Verifizierter Schlüssel", "Verified key": "Verifizierter Schlüssel",
"WARNING: Device already verified, but keys do NOT MATCH!": "WARNUNG: Gerät bereits verifiziert, aber Schlüssel sind NICHT GLEICH!", "WARNING: Device already verified, but keys do NOT MATCH!": "WARNUNG: Gerät bereits verifiziert, aber Schlüssel sind NICHT GLEICH!",
"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!": "WARNUNG: SCHLÜSSEL-VERIFIZIERUNG FEHLGESCHLAGEN! Der Signatur-Schlüssel für %(userId)s und Gerät %(deviceId)s ist \"%(fprint)s\" welche nicht dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmen. Dies kann bedeuten, dass deine Kommunikation abgefangen wird!", "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!": "WARNUNG: SCHLÜSSEL-VERIFIZIERUNG FEHLGESCHLAGEN! Der Signatur-Schlüssel für %(userId)s und Gerät %(deviceId)s ist \"%(fprint)s\" welche nicht dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmen. Dies kann bedeuten, dass deine Kommunikation abgefangen wird!",
"You are already in a call.": "Du bist bereits in einem Gespräch.",
"You cannot place a call with yourself.": "Du kannst keinen Anruf mit dir selbst starten.",
"You cannot place VoIP calls in this browser.": "Du kannst keine VoIP-Gespräche in diesem Browser starten.",
"You have <a>disabled</a> URL previews by default.": "Du hast die URL-Vorschau standardmäßig <a>deaktiviert</a>.", "You have <a>disabled</a> URL previews by default.": "Du hast die URL-Vorschau standardmäßig <a>deaktiviert</a>.",
"You have <a>enabled</a> URL previews by default.": "Du hast die URL-Vorschau standardmäßig <a>aktiviert</a>.", "You have <a>enabled</a> URL previews by default.": "Du hast die URL-Vorschau standardmäßig <a>aktiviert</a>.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Du hast einen ungültigen Kontakt eingegeben. Versuche es mit der Matrix-ID oder der E-Mail-Adresse.", "You have entered an invalid contact. Try using their Matrix ID or email address.": "Du hast einen ungültigen Kontakt eingegeben. Versuche es mit der Matrix-ID oder der E-Mail-Adresse.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Heimserver verbunden zu sein.",
"$senderDisplayName changed the room avatar to <img/>": "$senderDisplayName hat das Raum-Bild geändert zu <img/>", "$senderDisplayName changed the room avatar to <img/>": "$senderDisplayName hat das Raum-Bild geändert zu <img/>",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s hat das Raum-Bild für %(roomName)s geändert", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s hat das Raum-Bild für %(roomName)s geändert",
"Hide removed messages": "Gelöschte Nachrichten verbergen", "Hide removed messages": "Gelöschte Nachrichten verbergen",
"Start new chat": "Neuen Chat starten" "Start new chat": "Neuen Chat starten",
"Disable markdown formatting": "Markdown-Formatierung deaktivieren",
"Add": "Hinzufügen",
"%(count)s new messages.one": "%(count)s neue Nachricht",
"%(count)s new messages.other": "%(count)s neue Nachrichten",
"Error: Problem communicating with the given homeserver.": "Fehler: Problem beim kommunizieren mit dem angegebenen Heimserver.",
"Failed to fetch avatar URL": "Abrufen der Avatar-URL fehlgeschlagen",
"The phone number entered looks invalid": "Die eingegebene Telefonnummer scheint ungültig zu sein",
"This room is private or inaccessible to guests. You may be able to join if you register.": "Dieser Raum ist privat oder für Gäste nicht betretbar. Du kannst evtl. beitreten wenn du dich registrierst.",
"Uploading %(filename)s and %(count)s others.zero": "%(filename)s wird hochgeladen",
"Uploading %(filename)s and %(count)s others.one": "%(filename)s und %(count)s weitere Dateien werden hochgeladen",
"Uploading %(filename)s and %(count)s others.other": "%(filename)s und %(count)s weitere Dateien werden hochgeladen",
"You must <a>register</a> to use this functionality": "Du musst dich <a>registrieren</a>, um diese Funktionalität nutzen zu können",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Alle erneut senden</a> oder <a>alle verwerfen</a>. Du kannst auch einzelne Nachrichten erneut senden oder verwerfen.",
"Create new room": "Neuen Raum erstellen",
"Welcome page": "Willkommensseite",
"Room directory": "Raum-Verzeichnis",
"Start chat": "Chat starten",
"New Password": "Neues Passwort",
"Start chatting": "Chat beginnen",
"Start Chatting": "Starte Gespräche",
"Click on the button below to start chatting!": "Unten auf den Button klicken, um einen Chat zu beginnen!",
"Create a new chat or reuse an existing one": "Neuen Chat erstellen oder einen vorhandenen Chat fortsetzen",
"You already have existing direct chats with this user:": "Du hast bereits direkte Chats mit diesem Nutzer:",
"Username available": "Benutzername ist verfügbar",
"Username not available": "Benutzername ist nicht verfügbar",
"Something went wrong!": "Etwas ging schief!",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Dies wird dein zukünftiger Benutzername auf dem <span></span> Heimserver. Alternativ kannst du auch einen <a>anderen Server</a> auswählen.",
"If you already have a Matrix account you can <a>log in</a> instead.": "Wenn du bereits ein Matrix-Benutzerkonto hast, kannst du dich stattdessen auch direkt <a>anmelden</a>.",
"Home": "Start",
"Username invalid: %(errMessage)s": "Ungültiger Benutzername: %(errMessage)s",
"a room": "einen Raum",
"Accept": "Akzeptieren",
"Active call (%(roomName)s)": "Aktiver Anruf (%(roomName)s)",
"Admin tools": "Admin-Werkzeuge",
"And %(count)s more...": "Und %(count)s weitere...",
"Alias (optional)": "Alias (optional)",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Verbindung zum Heimserver fehlgeschlagen - bitte prüfe deine Verbindung, stelle sicher, dass dem <a>SSL-Zertifikat deines Heimservers</a> vertraut wird und keine Browser-Erweiterung Anfragen blockiert.",
"<a>Click here</a> to join the discussion!": "<a>Klicke hier</a> um der Diskussion beizuwohnen!",
"Close": "Schließen",
"Custom": "Erweitert",
"Decline": "Ablehnen",
"Disable Notifications": "Benachrichtigungen deaktivieren",
"Drop File Here": "Lasse Datei hier los",
"Enable Notifications": "Benachrichtigungen aktivieren",
"Encrypted by a verified device": "Von einem vertrauten Gerät verschlüsselt",
"Encrypted by an unverified device": "Von einem nicht vertrauten Gerät verschlüsselt",
"Failed to upload profile picture!": "Hochladen des Profilbild's fehlgeschlagen!",
"Incoming call from %(name)s": "Eingehender Anruf von %(name)s",
"Incoming video call from %(name)s": "Eingehender Video-Anruf von %(name)s",
"Incoming voice call from %(name)s": "Eingehender Sprach-Anruf von %(name)s",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Mit <voiceText>Sprache</voiceText> oder <videoText>Video</videoText> beitreten.",
"Last seen": "Zuletzt gesehen",
"Level:": "Level:",
"No display name": "Kein Anzeigename",
"Otherwise, <a>click here</a> to send a bug report.": "Alternativ <a>hier klicken</a>, um einen Fehlerbericht zu senden.",
"Private Chat": "Privater Chat",
"Public Chat": "Öffentlicher Chat",
"Reason: %(reasonText)s": "Grund: %(reasonText)s",
"Rejoin": "Erneut beitreten",
"Room contains unknown devices": "Raum enthält unbekannte Geräte",
"%(roomName)s does not exist.": "%(roomName)s existert nicht.",
"%(roomName)s is not accessible at this time.": "%(roomName)s ist aktuell nicht zugreifbar.",
"Searching known users": "Suche nach bekannten Nutzern",
"Seen by %(userName)s at %(dateTime)s": "Gesehen von %(userName)s um %(dateTime)s",
"Send anyway": "Trotzdem senden",
"Set": "Setze",
"Start authentication": "Authentifizierung beginnen",
"Show Text Formatting Toolbar": "Text-Formatierungs-Werkzeugleiste anzeigen",
"This invitation was sent to an email address which is not associated with this account:": "Diese Einledung wurde an eine E-Mail-Adresse gesendet, die nicht mit diesem Konto verknüpft ist:",
"This room": "Dieser Raum",
"To link to a room it must have <a>an address</a>.": "Um einen Raum zu verlinken, muss er <a>eine Adresse</a> haben.",
"Undecryptable": "Nicht entschlüsselbar",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Kann nicht feststellen, ob die Adresse an die diese Einladung gesendet wurde mit einer übereinstimmt, die zu deinem Konto gehört.",
"Unencrypted message": "Nicht verschlüsselbare Nachricht",
"unknown caller": "Unbekannter Anrufer",
"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 <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Möchtest du diese Einladung <acceptText>akzeptieren</acceptText> oder <declineText>ablehnen</declineText>?",
"You have been banned from %(roomName)s by %(userName)s.": "Du wurdest von %(userName)s dauerhaft aus dem Raum %(roomName)s ausgeschlossen.",
"You have been kicked from %(roomName)s by %(userName)s.": "Du wurdest von %(userName)s aus dem Raum %(roomName)s entfernt.",
"You may wish to login with a different account, or add this email to this account.": "Du möchtest dich evtl. mit einem anderen Konto anmelden oder diese E-Mail-Adresse diesem Konto hinzufügen.",
"Your home server does not support device management.": "Dein Heimserver unterstützt kein Geräte-Management.",
"(~%(count)s results).one": "(~%(count)s Ergebnis)",
"(~%(count)s results).other": "(~%(count)s Ergebnis)",
"Device Name": "Geräte-Name",
"(could not connect media)": "(Medienverbindung nicht herstellbar)",
"(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",
"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",
"Do you want to set an email address?": "Möchtest du eine E-Mail-Adresse setzen?",
"This will allow you to reset your password and receive notifications.": "Dies erlaubt dir dein Passwort zurückzusetzen und Benachrichtigungen zu empfangen."
} }

View file

@ -1,13 +1,13 @@
{ {
"af": "Αφρικάνικα", "af": "Αφρικάνικα",
"Error": "Σφάλμα", "Error": "Σφάλμα",
"Failed to forget room %(errCode)s": "Δεν ήταν δυνατή η διαγραφή του δωματίου", "Failed to forget room %(errCode)s": "Δεν ήταν δυνατή η διαγραφή του δωματίου (%(errCode)s)",
"Failed to join the room": "Δεν ήταν δυνατή η σύνδεση στο δωμάτιο", "Failed to join the room": "Δεν ήταν δυνατή η σύνδεση στο δωμάτιο",
"Mute": "Σίγαση", "Mute": "Σίγαση",
"Notifications": "Ειδοποιήσεις", "Notifications": "Ειδοποιήσεις",
"Operation failed": "Η λειτουργία απέτυχε", "Operation failed": "Η λειτουργία απέτυχε",
"Please Register": "Παρακαλώ εγγραφείτε", "Please Register": "Παρακαλούμε εγγραφείτε",
"Remove": "Αφαίρεσε", "Remove": "Αφαίρεση",
"Search": "Αναζήτηση", "Search": "Αναζήτηση",
"Settings": "Ρυθμίσεις", "Settings": "Ρυθμίσεις",
"unknown error code": "άγνωστος κωδικός σφάλματος", "unknown error code": "άγνωστος κωδικός σφάλματος",
@ -32,37 +32,37 @@
"%(targetName)s accepted an invitation.": "%(targetName)s δέχτηκε την πρόσκληση.", "%(targetName)s accepted an invitation.": "%(targetName)s δέχτηκε την πρόσκληση.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s δέχτηκες την πρόσκληση για %(displayName)s.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s δέχτηκες την πρόσκληση για %(displayName)s.",
"Account": "Λογαριασμός", "Account": "Λογαριασμός",
"Add a topic": "Πρόσθεσε μια περιγραφή", "Add a topic": "Προσθήκη θέματος",
"Add email address": "Πρόσθεσε ένα email", "Add email address": "Προσθήκη διεύθυνσης ηλ. αλληλογραφίας",
"Add phone number": "Πρόσθεσε έναν αριθμό τηλεφώνου", "Add phone number": "Προσθήκη αριθμού",
"Admin": "Διαχειριστής", "Admin": "Διαχειριστής",
"VoIP": "VoIP", "VoIP": "VoIP",
"No Microphones detected": "Δεν εντοπίστηκε μικρόφωνο", "No Microphones detected": "Δεν εντοπίστηκε μικρόφωνο",
"No Webcams detected": "Δεν εντοπίστηκε κάμερα", "No Webcams detected": "Δεν εντοπίστηκε κάμερα",
"Default Device": "Προεπιλεγμένη Συσκευή", "Default Device": "Προεπιλεγμένη συσκευή",
"Microphone": "Μικρόφωνο", "Microphone": "Μικρόφωνο",
"Camera": "Κάμερα", "Camera": "Κάμερα",
"Advanced": "Προχωρημένα", "Advanced": "Προχωρημένα",
"Algorithm": "Αλγόριθμος", "Algorithm": "Αλγόριθμος",
"Hide removed messages": "Κρύψε διαγραμμένα μηνύματα", "Hide removed messages": "Απόκρυψη διαγραμμένων μηνυμάτων",
"Authentication": "Πιστοποίηση", "Authentication": "Πιστοποίηση",
"and": "και", "and": "και",
"An email has been sent to": "Ένα email στάλθηκε σε", "An email has been sent to": "Ένα email στάλθηκε σε",
"A new password must be entered.": "Ο νέος κωδικός πρέπει να εισαχθεί", "A new password must be entered.": "Ο νέος κωδικός πρόσβασης πρέπει να εισαχθεί.",
"%(senderName)s answered the call.": "Ο χρήστης %(senderName)s απάντησε.", "%(senderName)s answered the call.": "Ο χρήστης %(senderName)s απάντησε την κλήση.",
"An error has occurred.": "Ένα σφάλμα προέκυψε", "An error has occurred.": "Παρουσιάστηκε ένα σφάλμα.",
"Anyone": "Oποιοσδήποτε", "Anyone": "Oποιοσδήποτε",
"Are you sure?": "Είσαι σίγουρος;", "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 reject the invitation?": "Είστε σίγουροι ότι θέλετε να απορρίψετε την πρόσκληση;",
"Are you sure you want to upload the following files?": "Είσαι σίγουρος οτι θές να ανεβάσεις τα ακόλουθα αρχεία;", "Are you sure you want to upload the following files?": "Είστε σίγουροι ότι θέλετε να αποστείλετε τα ακόλουθα αρχεία;",
"Attachment": "Επισύναψη", "Attachment": "Επισύναψη",
"%(senderName)s banned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "%(senderName)s banned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.",
"Autoplay GIFs and videos": "Αυτόματη αναπαραγωγή GIFs και βίντεο", "Autoplay GIFs and videos": "Αυτόματη αναπαραγωγή GIFs και βίντεο",
"Bug Report": "Αναφορά Σφάλματος", "Bug Report": "Αναφορά σφάλματος",
"anyone": "οποιοσδήποτε", "anyone": "οποιοσδήποτε",
"Anyone who knows the room's link, apart from guests": "Oποιοσδήποτε", "Anyone who knows the room's link, apart from guests": "Oποιοσδήποτε",
"all room members, from the point they joined": "όλα τα μέλη του δωματίου, από τη στιγμή που συνδέθηκαν", "all room members, from the point they joined": "όλα τα μέλη, από τη στιγμή που συνδέθηκαν",
"%(items)s and %(lastItem)s": "%(items)s %(lastItem)s", "%(items)s and %(lastItem)s": "%(items)s %(lastItem)s",
"be": "Λευκορώσικα", "be": "Λευκορώσικα",
"bg": "Βουλγάρικα", "bg": "Βουλγάρικα",
@ -106,7 +106,7 @@
"es-uy": "Ισπανικά (Ουρουγουάη)", "es-uy": "Ισπανικά (Ουρουγουάη)",
"es-ve": "Ισπανικά (Βενεζουέλα)", "es-ve": "Ισπανικά (Βενεζουέλα)",
"et": "Εσθονικά", "et": "Εσθονικά",
"eu": "Βασκική (βασκική)", "eu": "Βασκική (Βασκική)",
"fa": "Φάρσι", "fa": "Φάρσι",
"fi": "Φινλανδικά", "fi": "Φινλανδικά",
"fo": "Φαρόε", "fo": "Φαρόε",
@ -159,7 +159,7 @@
"ur": "Ουρντού", "ur": "Ουρντού",
"ve": "Venda", "ve": "Venda",
"vi": "Βιετναμέζικα", "vi": "Βιετναμέζικα",
"xh": "Xhosa", "xh": "Ξόσα",
"zh-cn": "Κινέζικα (ΛΔΚ)", "zh-cn": "Κινέζικα (ΛΔΚ)",
"zh-hk": "Κινέζικα (ΕΔΠ Χονγκ Κονγκ)", "zh-hk": "Κινέζικα (ΕΔΠ Χονγκ Κονγκ)",
"zh-sg": "Κινέζικα (Σιγκαπούρη)", "zh-sg": "Κινέζικα (Σιγκαπούρη)",
@ -167,12 +167,11 @@
"zu": "Ζουλού", "zu": "Ζουλού",
"id": "Ινδονησιακά", "id": "Ινδονησιακά",
"lv": "Λετονικά", "lv": "Λετονικά",
"A registered account is required for this action": "Ένας εγγεγραμμένος λογαριασμός απαιτείται για αυτή την ενέργεια",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ένα μήνυμα στάλθηκε στο +%(msisdn)s. Παρακαλώ γράψε τον κωδικό επαλήθευσης που περιέχει", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ένα μήνυμα στάλθηκε στο +%(msisdn)s. Παρακαλώ γράψε τον κωδικό επαλήθευσης που περιέχει",
"Access Token:": "Κωδικός Πρόσβασης:", "Access Token:": "Κωδικός πρόσβασης:",
"Always show message timestamps": "Δείχνε πάντα ένδειξη ώρας στα μηνύματα", "Always show message timestamps": "Εμφάνιση πάντα της ένδειξης ώρας στα μηνύματα",
"all room members": "όλα τα μέλη του δωματίου", "all room members": "όλα τα μέλη",
"all room members, from the point they are invited": "όλα τα μέλη του δωματίου, από τη στιγμή που προσκλήθηκαν", "all room members, from the point they are invited": "όλα τα μέλη, από τη στιγμή που προσκλήθηκαν",
"an address": "μία διεύθηνση", "an address": "μία διεύθηνση",
"%(items)s and %(remaining)s others": "%(items)s και %(remaining)s ακόμα", "%(items)s and %(remaining)s others": "%(items)s και %(remaining)s ακόμα",
"%(items)s and one other": "%(items)s και ένας ακόμα", "%(items)s and one other": "%(items)s και ένας ακόμα",
@ -181,70 +180,69 @@
"%(names)s and %(lastPerson)s are typing": "%(names)s και %(lastPerson)s γράφουν", "%(names)s and %(lastPerson)s are typing": "%(names)s και %(lastPerson)s γράφουν",
"%(names)s and one other are typing": "%(names)s και ένας ακόμα γράφουν", "%(names)s and one other are typing": "%(names)s και ένας ακόμα γράφουν",
"%(names)s and %(count)s others are typing": "%(names)s και %(count)s άλλοι γράφουν", "%(names)s and %(count)s others are typing": "%(names)s και %(count)s άλλοι γράφουν",
"Anyone who knows the room's link, including guests": "Οποιοσδήποτε γνωρίζει τον σύνδεδμο του δωματίου, συμπεριλαμβάνωντας τους επισκέπτες", "Anyone who knows the room's link, including guests": "Οποιοσδήποτε γνωρίζει τον σύνδεσμο του δωματίου, συμπεριλαμβανομένων των επισκεπτών",
"Blacklisted": "Στη μαύρη λίστα", "Blacklisted": "Στη μαύρη λίστα",
"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 άλλαξε το όνομά του από %(oldDisplayName)s σε %(displayName)s.", "%(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 their profile picture.": "Ο %(senderName)s άλλαξε τη φωτογραφία του προφίλ του.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "Ο χρήστης %(senderDisplayName)s άλλαξε το όνομα του δωματίου σε %(roomName)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\".", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "Ο %(senderDisplayName)s άλλαξε το θέμα σε \"%(topic)s\".",
"Clear Cache and Reload": "Καθάρισε την μνήμη και Ανανέωσε", "Clear Cache and Reload": "Εκκαθάριση μνήμης και ανανέωση",
"Clear Cache": "Καθάρισε την μνήμη", "Clear Cache": "Εκκαθάριση μνήμης",
"Bans user with given id": "Διώχνει τον χρήστη με το συγκεκριμένο id", "Bans user with given id": "Αποκλεισμός χρήστη με το συγκεκριμένο αναγνωριστικό",
"%(senderDisplayName)s removed the room name.": "Ο χρήστης %(senderDisplayName)s διέγραψε το όνομα του δωματίου.", "%(senderDisplayName)s removed the room name.": "Ο %(senderDisplayName)s διέγραψε το όνομα του δωματίου.",
"Changes your display nickname": "Αλλάζει το όνομα χρήστη", "Changes your display nickname": "Αλλάζει το ψευδώνυμο χρήστη",
"Click here": "Κάνε κλικ εδώ", "Click here": "Κάνε κλικ εδώ",
"Drop here %(toAction)s": "Σύρε εδώ %(toAction)s", "Drop here %(toAction)s": "Αποθέστε εδώ %(toAction)s",
"Conference call failed.": "Η κλήση συνδιάσκεψης απέτυχε.", "Conference call failed.": "Η κλήση συνδιάσκεψης απέτυχε.",
"powered by Matrix": "βασισμένο στο πρωτόκολλο Matrix", "powered by Matrix": "βασισμένο στο πρωτόκολλο Matrix",
"Confirm password": "Επιβεβαίωση κωδικού", "Confirm password": "Επιβεβαίωση κωδικού πρόσβασης",
"Confirm your new password": "Επιβεβαίωση του νέου κωδικού", "Confirm your new password": "Επιβεβαίωση του νέου κωδικού πρόσβασης",
"Continue": "Συνέχεια", "Continue": "Συνέχεια",
"Create an account": "Δημιουργία λογαριασμού", "Create an account": "Δημιουργία λογαριασμού",
"Create Room": "Δημιουργία Δωματίου", "Create Room": "Δημιουργία δωματίου",
"Cryptography": "Κρυπτογραφία", "Cryptography": "Κρυπτογραφία",
"Current password": "Τωρινός κωδικός", "Current password": "Τωρινός κωδικός πρόσβασης",
"Curve25519 identity key": "Κλειδί ταυτότητας Curve25519", "Curve25519 identity key": "Κλειδί ταυτότητας Curve25519",
"Custom level": "Προσαρμοσμένο επίπεδο", "Custom level": "Προσαρμοσμένο επίπεδο",
"/ddg is not a command": "/ddg δεν αναγνωρίζεται ως εντολή", "/ddg is not a command": "/ddg δεν αναγνωρίζεται ως εντολή",
"Deactivate Account": "Απενεργοποίηση Λογαριασμού", "Deactivate Account": "Απενεργοποίηση λογαριασμού",
"Deactivate my account": "Απενεργοποίηση του λογαριασμού μου", "Deactivate my account": "Απενεργοποίηση του λογαριασμού μου",
"decline": "απόρριψη", "decline": "απόρριψη",
"Decrypt %(text)s": "Αποκρυπτογράφησε %(text)s", "Decrypt %(text)s": "Αποκρυπτογράφηση %(text)s",
"Decryption error": "Σφάλμα αποκρυπτογράφησης", "Decryption error": "Σφάλμα αποκρυπτογράφησης",
"(default: %(userName)s)": "(προεπιλογή: %(userName)s)",
"Delete": "Διαγραφή", "Delete": "Διαγραφή",
"Default": "Προεπιλογή", "Default": "Προεπιλογή",
"Device already verified!": "Η συσκευή έχει ήδη επαληθευτεί!", "Device already verified!": "Η συσκευή έχει ήδη επαληθευτεί!",
"Device ID": "ID Συσκευής", "Device ID": "Αναγνωριστικό συσκευής",
"Device ID:": "ID Συσκευής:", "Device ID:": "Αναγνωριστικό συσκευής:",
"device id: ": "id συσκευής: ", "device id: ": "αναγνωριστικό συσκευής: ",
"Device key:": "Κλειδί Συσκευής:", "Device key:": "Κλειδί συσκευής:",
"Devices": "Συσκευές", "Devices": "Συσκευές",
"Direct Chat": "Απευθείας Συνομιλία", "Direct Chat": "Απευθείας συνομιλία",
"Direct chats": "Απευθείας συνομιλίες", "Direct chats": "Απευθείας συνομιλίες",
"disabled": "ανενεργό", "disabled": "ανενεργό",
"Disinvite": "Ανακάλεσε πρόσκληση", "Disinvite": "Ανάκληση πρόσκλησης",
"Display name": "Όνομα χρήστη", "Display name": "Όνομα χρήστη",
"Download %(text)s": "Κατέβασε %(text)s", "Download %(text)s": "Λήψη %(text)s",
"Ed25519 fingerprint": "Αποτύπωμα Ed25519", "Ed25519 fingerprint": "Αποτύπωμα Ed25519",
"Email": "Ηλ. Αλληλογραφία", "Email": "Ηλεκτρονική διεύθυνση",
"Email address": "Διεύθυνση email", "Email address": "Ηλεκτρονική διεύθυνση",
"Email address (optional)": "Διεύθυνση email (προαιρετικό)", "Email address (optional)": "Ηλεκτρονική διεύθυνση (προαιρετικό)",
"Email, name or matrix ID": "Email, όνομα ή matrix ID", "Email, name or matrix ID": "Ηλεκτρονική διεύθυνση, όνομα ή matrix ID",
"Emoji": "Εικονίδια", "Emoji": "Εικονίδια",
"enabled": "ενεργό", "enabled": "ενεργή",
"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": "Κρυπτογραφημένο δωμάτιο", "Encrypted room": "Κρυπτογραφημένο δωμάτιο",
"%(senderName)s ended the call.": "%(senderName)s τερμάτισε την κλήση.", "%(senderName)s ended the call.": "%(senderName)s τερμάτισε την κλήση.",
"End-to-end encryption information": "Πληροφορίες σχετικά με τη κρυπτογράφηση από άκρο σε άκρο (End-to-end encryption)", "End-to-end encryption information": "Πληροφορίες σχετικά με τη κρυπτογράφηση από άκρο σε άκρο (End-to-end encryption)",
"Error decrypting attachment": "Σφάλμα κατά την αποκρυπτογράφηση της επισύναψης", "Error decrypting attachment": "Σφάλμα κατά την αποκρυπτογράφηση της επισύναψης",
"Event information": "Πληροφορίες μηνύματος", "Event information": "Πληροφορίες συμβάντος",
"Existing Call": "Υπάρχουσα Κλήση", "Existing Call": "Υπάρχουσα κλήση",
"Export": "Εξαγωγή", "Export": "Εξαγωγή",
"Export E2E room keys": "Εξαγωγή κλειδιών κρυπτογραφίας για το δωμάτιο", "Export E2E room keys": "Εξαγωγή κλειδιών κρυπτογράφησης για το δωμάτιο",
"Failed to change password. Is your password correct?": "Δεν ήταν δυνατή η αλλαγή του κωδικού. Είναι ο κωδικός σωστός;", "Failed to change password. Is your password correct?": "Δεν ήταν δυνατή η αλλαγή του κωδικού πρόσβασης. Είναι σωστός ο κωδικός πρόσβασης;",
"Failed to delete device": "Δεν ήταν δυνατή η διαγραφή της συσκευής", "Failed to delete device": "Δεν ήταν δυνατή η διαγραφή της συσκευής",
"Failed to join room": "Δεν ήταν δυνατή η σύνδεση στο δωμάτιο", "Failed to join room": "Δεν ήταν δυνατή η σύνδεση στο δωμάτιο",
"Failed to leave room": "Δεν ήταν δυνατή η αποχώρηση από το δωμάτιο", "Failed to leave room": "Δεν ήταν δυνατή η αποχώρηση από το δωμάτιο",
@ -253,58 +251,58 @@
"Failed to reject invite": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης", "Failed to reject invite": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης",
"Failed to reject invitation": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης", "Failed to reject invitation": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης",
"Failed to save settings": "Δεν ήταν δυνατή η αποθήκευση των ρυθμίσεων", "Failed to save settings": "Δεν ήταν δυνατή η αποθήκευση των ρυθμίσεων",
"Failed to send email": "Δεν ήταν δυνατή η απστολή email", "Failed to send email": "Δεν ήταν δυνατή η αποστολή ηλ. αλληλογραφίας",
"Failed to verify email address: make sure you clicked the link in the email": "Δεν ήταν δυνατή η επαλήθευση του email: βεβαιωθείτε οτι κάνατε κλικ στον σύνδεσμο που σας στάλθηκε", "Failed to verify email address: make sure you clicked the link in the email": "Δεν ήταν δυνατή η επιβεβαίωση του μηνύματος ηλεκτρονικής αλληλογραφίας βεβαιωθείτε οτι κάνατε κλικ στον σύνδεσμο που σας στάλθηκε",
"Favourite": "Αγαπημένο", "Favourite": "Αγαπημένο",
"favourite": "αγαπημένο", "favourite": "αγαπημένο",
"Favourites": "Αγαπημένα", "Favourites": "Αγαπημένα",
"Fill screen": "Γέμισε την οθόνη", "Fill screen": "Γέμισε την οθόνη",
"Filter room members": ίλτραρε τα μέλη", "Filter room members": ιλτράρισμα μελών",
"Forget room": "Διέγραψε το δωμάτιο", "Forget room": "Αγνόηση δωματίου",
"Forgot your password?": έχασες τον κωδικό σου;", "Forgot your password?": εχάσατε τoν κωδικό πρόσβασης σας;",
"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?": "Βρήκατε κάποιο πρόβλημα;",
"Guest users can't upload files. Please register to upload": "Οι επισκέπτες δεν μπορούν να ανεβάσουν αρχεία. Παρακαλώ εγγραφείτε πρώτα", "Guest users can't upload files. Please register to upload.": "Οι επισκέπτες δεν μπορούν να ανεβάσουν αρχεία. Παρακαλώ εγγραφείτε πρώτα.",
"had": "είχε", "had": "είχε",
"Hangup": "Κλείσε", "Hangup": "Κλείσιμο",
"Historical": "Ιστορικό", "Historical": "Ιστορικό",
"Homeserver is": "Ο διακομιστής είναι", "Homeserver is": "Ο διακομιστής είναι",
"Identity Server is": "Διακομιστής Ταυτοποίησης", "Identity Server is": "Ο διακομιστής ταυτοποίησης είναι",
"I have verified my email address": "Έχω επαληθεύσει το email μου", "I have verified my email address": "Έχω επαληθεύσει την διεύθυνση ηλ. αλληλογραφίας",
"Import": "Εισαγωγή", "Import": "Εισαγωγή",
"Import E2E room keys": "Εισαγωγή κλειδιών κρυπτογράφησης", "Import E2E room keys": "Εισαγωγή κλειδιών E2E",
"Incorrect username and/or password.": "Λανθασμένο όνομα χρήστη και/ή κωδικός.", "Incorrect username and/or password.": "Λανθασμένο όνομα χρήστη και/ή κωδικός.",
"Incorrect verification code": "Λανθασμένος κωδικός επαλήθευσης", "Incorrect verification code": "Λανθασμένος κωδικός επαλήθευσης",
"Interface Language": "Γλώσσα Διεπαφής", "Interface Language": "Γλώσσα διεπαφής",
"Invalid Email Address": "Μη έγκυρο email", "Invalid Email Address": "Μη έγκυρη διεύθυνση ηλεκτρονικής αλληλογραφίας",
"Invite new room members": "Προσκάλεσε νέα μέλη", "Invite new room members": "Προσκαλέστε νέα μέλη",
"Invited": "Προσκλήθηκε", "Invited": "Προσκλήθηκε",
"Invites": "Προσκλήσεις", "Invites": "Προσκλήσεις",
"is a": "είναι ένα", "is a": "είναι ένα",
"%(displayName)s is typing": "ο χρήστης %(displayName)s γράφει", "%(displayName)s is typing": "Ο χρήστης %(displayName)s γράφει",
"Sign in with": "Συνδέσου με", "Sign in with": "Συνδεθείτε με",
"joined and left": "μπήκε και βγήκε", "joined and left": "συνδέθηκε και έφυγε",
"joined": "μπήκε", "joined": "συνδέθηκε",
"%(targetName)s joined the room.": "ο χρήστης %(targetName)s συνδέθηκε στο δωμάτιο.", "%(targetName)s joined the room.": "ο %(targetName)s συνδέθηκε στο δωμάτιο.",
"Jump to first unread message.": ήγαινε στο πρώτο μη αναγνωσμένο μήνυμα.", "Jump to first unread message.": ηγαίνετε στο πρώτο μη αναγνωσμένο μήνυμα.",
"%(senderName)s kicked %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "%(senderName)s kicked %(targetName)s.": "Ο %(senderName)s έδιωξε τον χρήστη %(targetName)s.",
"Kick": "Διώξε", "Kick": "Απομάκρυνση",
"Kicks user with given id": "Διώχνει χρήστες με το συγκεκριμένο id", "Kicks user with given id": "Διώχνει χρήστες με το συγκεκριμένο id",
"Labs": "Πειραματικά", "Labs": "Πειραματικά",
"Leave room": "Φύγε από το δωμάτιο", "Leave room": "Αποχώρηση από το δωμάτιο",
"left and rejoined": "έφυγε και ξανασυνδέθηκε", "left and rejoined": "έφυγε και ξανασυνδέθηκε",
"left": "έφυγε", "left": "έφυγε",
"%(targetName)s left the room.": "Ο χρήστης %(targetName)s έφυγε από το δωμάτιο.", "%(targetName)s left the room.": "Ο χρήστης %(targetName)s έφυγε από το δωμάτιο.",
"Level": "Επίπεδο", "Level": "Επίπεδο",
"List this room in %(domain)s's room directory?": "Να εμφανίζεται το δωμάτιο στο γενικό ευρετήριο του διακομιστή %(domain)s;", "List this room in %(domain)s's room directory?": "Να εμφανίζεται το δωμάτιο στο γενικό ευρετήριο του διακομιστή %(domain)s;",
"Local addresses for this room:": "Τοπική διεύθυνση για το δωμάτιο:", "Local addresses for this room:": "Τοπική διεύθυνση για το δωμάτιο:",
"Logged in as:": "Συνδέθηκες ως:", "Logged in as:": "Συνδεθήκατε ως:",
"Login as guest": υνδέσου ως επισκέπτης", "Login as guest": ύνδεση ως επισκέπτης",
"Logout": "Αποσύνδεση", "Logout": "Αποσύνδεση",
"Low priority": "Χαμηλής προτεραιότητας", "Low priority": "Χαμηλής προτεραιότητας",
"matrix-react-sdk version:": "έκδοση matrix-react-sdk:", "matrix-react-sdk version:": "Έκδοση matrix-react-sdk:",
"Members only": "Μέλη μόνο", "Members only": "Μόνο μέλη",
"Message not sent due to unknown devices being present": "Το μήνυμα δεν στάλθηκε γιατί υπάρχουν άγνωστες συσκευές", "Message not sent due to unknown devices being present": "Το μήνυμα δεν στάλθηκε γιατί υπάρχουν άγνωστες συσκευές",
"Mobile phone number": "Αριθμός κινητού τηλεφώνου", "Mobile phone number": "Αριθμός κινητού τηλεφώνου",
"Click here to fix": "Κάνε κλικ εδώ για διόρθωση", "Click here to fix": "Κάνε κλικ εδώ για διόρθωση",
@ -313,58 +311,58 @@
"Conference calls are not supported in encrypted rooms": "Οι κλήσεις συνδιάσκεψης δεν είναι υποστηρίζονται σε κρυπτογραφημένα δωμάτια", "Conference calls are not supported in encrypted rooms": "Οι κλήσεις συνδιάσκεψης δεν είναι υποστηρίζονται σε κρυπτογραφημένα δωμάτια",
"Conference calls are not supported in this client": "Οι κλήσεις συνδιάσκεψης δεν είναι υποστηρίζονται από την εφαρμογή", "Conference calls are not supported in this client": "Οι κλήσεις συνδιάσκεψης δεν είναι υποστηρίζονται από την εφαρμογή",
"Enable encryption": "Ενεργοποίηση κρυπτογραφίας", "Enable encryption": "Ενεργοποίηση κρυπτογραφίας",
"Enter Code": "Κωδικός", "Enter Code": "Εισαγωγή κωδικού πρόσβασης",
"Failed to send request.": "Δεν ήταν δυνατή η αποστολή αιτήματος.", "Failed to send request.": "Δεν ήταν δυνατή η αποστολή αιτήματος.",
"Failed to upload file": "Δεν ήταν δυνατό το ανέβασμα αρχείου", "Failed to upload file": "Δεν ήταν δυνατή η αποστολή του αρχείου",
"Failure to create room": "Δεν ήταν δυνατή η δημιουργία δωματίου", "Failure to create room": "Δεν ήταν δυνατή η δημιουργία δωματίου",
"Join Room": "Συνδέσου", "Join Room": "Είσοδος σε δωμάτιο",
"Moderator": "Συντονιστής", "Moderator": "Συντονιστής",
"my Matrix ID": "το Matrix ID μου", "my Matrix ID": "το Matrix ID μου",
"Name": "Όνομα", "Name": "Όνομα",
"New address (e.g. #foo:%(localDomain)s)": "Νέα διεύθυνση (e.g. #όνομα:%(localDomain)s)", "New address (e.g. #foo:%(localDomain)s)": "Νέα διεύθυνση (e.g. #όνομα:%(localDomain)s)",
"New password": "Νέος κωδικός", "New password": "Νέος κωδικός πρόσβασης",
"New passwords don't match": "Οι νέοι κωδικοί είναι διαφορετικοί", "New passwords don't match": "Οι νέοι κωδικοί πρόσβασης είναι διαφορετικοί",
"New passwords must match each other.": "Οι νέοι κωδικόι πρέπει να ταιριάζουν.", "New passwords must match each other.": "Οι νέοι κωδικοί πρόσβασης πρέπει να ταιριάζουν.",
"none": "κανένα", "none": "κανένα",
"(not supported by this browser)": "(δεν υποστηρίζεται από τον browser)", "(not supported by this browser)": "(δεν υποστηρίζεται από τον περιηγητή)",
"<not supported>": "<δεν υποστηρίζεται>", "<not supported>": "<δεν υποστηρίζεται>",
"No more results": "Δεν υπάρχουν άλλα αποτελέσματα", "No more results": "Δεν υπάρχουν αποτελέσματα",
"No results": "Κανένα αποτέλεσμα", "No results": "Κανένα αποτέλεσμα",
"OK": "ΟΚ", "OK": "Εντάξει",
"olm version:": "έκδοση olm:", "olm version:": "Έκδοση olm:",
"Password": "Κωδικός", "Password": "Κωδικός πρόσβασης",
"Password:": "Κωδικός:", "Password:": "Κωδικός πρόσβασης:",
"Passwords can't be empty": "", "Passwords can't be empty": "Οι κωδικοί πρόσβασης δεν γίνετε να είναι κενοί",
"People": "Άτομα", "People": "Άτομα",
"Phone": "Τηλέφωνο", "Phone": "Τηλέφωνο",
"Register": "Εγγραφή", "Register": "Εγγραφή",
"riot-web version:": "έκδοση riot-web:", "riot-web version:": "Έκδοση riot-web:",
"Room Colour": "Χρώμα Δωματίου", "Room Colour": "Χρώμα δωματίου",
"Room name (optional)": "Όνομα Δωματίου (προαιρετικό)", "Room name (optional)": "Όνομα δωματίου (προαιρετικό)",
"Rooms": "Δωμάτια", "Rooms": "Δωμάτια",
"Save": "Αποθήκευση", "Save": "Αποθήκευση",
"Search failed": "Η αναζήτηση απέτυχε", "Search failed": "Η αναζήτηση απέτυχε",
"Send an encrypted message": "Στείλε ένα κρυπτογραφημένο μήνυμα", "Send an encrypted message": "Στείλτε ένα κρυπτογραφημένο μήνυμα",
"Send a message (unencrypted)": "Στείλε ένα μήνυμα (απλό)", "Send a message (unencrypted)": "Στείλτε ένα μήνυμα (μη κρυπτογραφημένο)",
"sent an image": "έστειλε μια εικόνα", "sent an image": "έστειλε μια εικόνα",
"sent a video": "έστειλε ένα βίντεο", "sent a video": "έστειλε ένα βίντεο",
"Server error": "Σφάλμα διακομιστή", "Server error": "Σφάλμα διακομιστή",
"Signed Out": "Αποσυνδέθηκες", "Signed Out": "Αποσυνδέθηκε",
"Sign in": "Συνδέση", "Sign in": "Συνδέση",
"Sign out": "Αποσύνδεση", "Sign out": "Αποσύνδεση",
"since they joined": "από τη στιγμή που συνδέθηκαν", "since they joined": "από τη στιγμή που συνδέθηκαν",
"since they were invited": "από τη στιγμή που προσκλήθηκαν", "since they were invited": "από τη στιγμή που προσκλήθηκαν",
"Someone": "Κάποιος", "Someone": "Κάποιος",
"Start a chat": "Ξεκίνα μια συνομιλία", "Start a chat": "Έναρξη συνομιλίας",
"This email address is already in use": "Το email χρησιμοποιείται", "This email address is already in use": "Η διεύθυνση ηλ. αλληλογραφίας χρησιμοποιείται ήδη",
"This email address was not found": "Η διεύθηνση email δεν βρέθηκε", "This email address was not found": "Δεν βρέθηκε η διεύθυνση ηλ. αλληλογραφίας",
"Success": "Επιτυχία", "Success": "Επιτυχία",
"Start Chat": "Συνομιλία", "Start Chat": "Συνομιλία",
"Cancel": "Ακύρωση", "Cancel": "Ακύρωση",
"cancel all": "ακύρωση όλων", "cancel all": "ακύρωση όλων",
"or": "ή", "or": "ή",
"Custom Server Options": "Προσαρμοσμένες ρυθμίσεις διακομιστή", "Custom Server Options": "Προσαρμοσμένες ρυθμίσεις διακομιστή",
"Dismiss": "Αγνόησε", "Dismiss": "Απόρριψη",
"Monday": "Δευτέρα", "Monday": "Δευτέρα",
"Tuesday": "Τρίτη", "Tuesday": "Τρίτη",
"Wednesday": "Τετάρτη", "Wednesday": "Τετάρτη",
@ -375,12 +373,546 @@
"italic": "πλάγια", "italic": "πλάγια",
"underline": "υπογράμμιση", "underline": "υπογράμμιση",
"code": "κώδικας", "code": "κώδικας",
"quote": "αναφορά", "quote": "παράθεση",
"%(oneUser)sleft %(repeats)s times": "%(oneUser)s έφυγε %(repeats)s φορές", "%(oneUser)sleft %(repeats)s times": "%(oneUser)s έφυγε %(repeats)s φορές",
"%(severalUsers)sleft": "%(severalUsers)s έφυγαν", "%(severalUsers)sleft": "%(severalUsers)s έφυγαν",
"%(oneUser)sleft": "%(oneUser)s έφυγε", "%(oneUser)sleft": "%(oneUser)s έφυγε",
"%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)s συνδέθηκαν και έφυγαν %(repeats)s φορές", "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)s συνδέθηκαν και έφυγαν %(repeats)s φορές",
"%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)s συνδέθηκε και έφυγε %(repeats)s φορές", "%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)s συνδέθηκε και έφυγε %(repeats)s φορές",
"%(severalUsers)sjoined and left": "%(severalUsers)s συνδέθηκαν και έφυγαν", "%(severalUsers)sjoined and left": "%(severalUsers)s συνδέθηκαν και έφυγαν",
"%(oneUser)sjoined and left": "%(oneUser)s συνδέθηκε και έφυγε" "%(oneUser)sjoined and left": "%(oneUser)s συνδέθηκε και έφυγε",
"Close": "Κλείσιμο",
"Create new room": "Δημιουργία νέου δωματίου",
"Room directory": "Ευρετήριο",
"Start chat": "Έναρξη συνομιλίας",
"Welcome page": "Αρχική σελίδα",
"a room": "ένα δωμάτιο",
"Accept": "Αποδοχή",
"Active call (%(roomName)s)": "Ενεργή κλήση (%(roomName)s)",
"Add": "Προσθήκη",
"Admin tools": "Εργαλεία διαχειριστή",
"And %(count)s more...": "Και %(count)s περισσότερα...",
"No media permissions": "Χωρίς δικαιώματα πολυμέσων",
"Alias (optional)": "Ψευδώνυμο (προαιρετικό)",
"Ban": "Αποκλεισμός",
"Banned users": "Αποκλεισμένοι χρήστες",
"Bulk Options": "Μαζικές επιλογές",
"Call Timeout": "Λήξη χρόνου κλήσης",
"<a>Click here</a> to join the discussion!": "<a>Κλικ εδώ</a> για να συμμετάσχετε στην συζήτηση!",
"Click to mute audio": "Κάντε κλικ για σίγαση του ήχου",
"Click to mute video": "Κάντε κλικ για σίγαση του βίντεο",
"click to reveal": "κάντε κλικ για εμφάνιση",
"Click to unmute video": "Κάντε κλικ για άρση σίγασης του βίντεο",
"Click to unmute audio": "Κάντε κλικ για άρση σίγασης του ήχου",
"%(count)s new messages.one": "%(count)s νέο μήνυμα",
"%(count)s new messages.other": "%(count)s νέα μηνύματα",
"Custom": "Προσαρμοσμένο",
"Decline": "Απόρριψη",
"Disable Notifications": "Απενεργοποίηση ειδοποιήσεων",
"Disable markdown formatting": "Απενεργοποίηση μορφοποίησης markdown",
"Drop File Here": "Αποθέστε εδώ το αρχείο",
"Enable Notifications": "Ενεργοποίηση ειδοποιήσεων",
"Encryption is enabled in this room": "Η κρυπτογράφηση είναι ενεργοποιημένη σε αυτό το δωμάτιο",
"Encryption is not enabled in this room": "Η κρυπτογράφηση είναι απενεργοποιημένη σε αυτό το δωμάτιο",
"Enter passphrase": "Εισαγωγή συνθηματικού",
"Failed to set avatar.": "Δεν ήταν δυνατό ο ορισμός της προσωπικής εικόνας.",
"Failed to set display name": "Δεν ήταν δυνατό ο ορισμός του ονόματος εμφάνισης",
"Failed to set up conference call": "Δεν ήταν δυνατή η ρύθμιση κλήσης συνδιάσκεψης",
"Failed to toggle moderator status": "Δεν ήταν δυνατή η εναλλαγή κατάστασης του συντονιστή",
"Failed to upload profile picture!": "Δεν ήταν δυνατή η αποστολή της εικόνας προφίλ!",
"Hide read receipts": "Απόκρυψη αποδείξεων ανάγνωσης",
"Home": "Αρχική",
"Last seen": "Τελευταία εμφάνιση",
"Level:": "Επίπεδο:",
"Manage Integrations": "Διαχείριση ενσωματώσεων",
"Markdown is disabled": "Το Markdown είναι απενεργοποιημένο",
"Markdown is enabled": "Το Markdown είναι ενεργοποιημένο",
"Missing room_id in request": "Λείπει το room_id στο αίτημα",
"Permissions": "Δικαιώματα",
"Power level must be positive integer.": "Το επίπεδο δύναμης πρέπει να είναι ένας θετικός ακέραιος.",
"Privacy warning": "Προειδοποίηση ιδιωτικότητας",
"Private Chat": "Προσωπική συνομιλία",
"Privileged Users": "Προνομιούχοι χρήστες",
"Profile": "Προφίλ",
"Public Chat": "Δημόσια συνομιλία",
"Reason": "Αιτία",
"Reason: %(reasonText)s": "Αιτία: %(reasonText)s",
"Revoke Moderator": "Ανάκληση συντονιστή",
"Registration required": "Απαιτείται εγγραφή",
"rejected": "απορρίφθηκε",
"%(targetName)s rejected the invitation.": "Ο %(targetName)s απέρριψε την πρόσκληση.",
"Reject invitation": "Απόρριψη πρόσκλησης",
"Remote addresses for this room:": "Απομακρυσμένες διευθύνσεις για το δωμάτιο:",
"Remove Contact Information?": "Αφαίρεση πληροφοριών επαφής;",
"Remove %(threePid)s?": "Αφαίρεση %(threePid)s;",
"Report it": "Αναφορά",
"restore": "επαναφορά",
"Results from DuckDuckGo": "Αποτελέσματα από DuckDuckGo",
"Return to app": "Επιστροφή στην εφαρμογή",
"Return to login screen": "Επιστροφή στην οθόνη σύνδεσης",
"Room %(roomId)s not visible": "Το δωμάτιο %(roomId)s δεν είναι ορατό",
"%(roomName)s does not exist.": "Το %(roomName)s δεν υπάρχει.",
"Searches DuckDuckGo for results": "Γίνεται αναζήτηση στο DuckDuckGo για αποτελέσματα",
"Searching known users": "Αναζήτηση γνωστών χρηστών",
"Seen by %(userName)s at %(dateTime)s": "Διαβάστηκε από %(userName)s στις %(dateTime)s",
"Send anyway": "Αποστολή ούτως ή άλλως",
"Send Invites": "Αποστολή προσκλήσεων",
"Send Reset Email": "Αποστολή μηνύματος επαναφοράς",
"%(senderDisplayName)s sent an image.": "Ο %(senderDisplayName)s έστειλε μια φωτογραφία.",
"Server may be unavailable or overloaded": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος ή υπερφορτωμένος",
"Session ID": "Αναγνωριστικό συνεδρίας",
"%(senderName)s set a profile picture.": "Ο %(senderName)s όρισε τη φωτογραφία του προφίλ του.",
"Set": "Ορισμός",
"Start authentication": "Έναρξη πιστοποίησης",
"Submit": "Υποβολή",
"Tagged as: ": "Με ετικέτα: ",
"The default role for new room members is": "Ο προεπιλεγμένος ρόλος για νέα μέλη είναι",
"The main address for this room is": "Η κύρια διεύθυνση για το δωμάτιο είναι",
"%(actionVerb)s this person?": "%(actionVerb)s αυτού του ατόμου;",
"The file '%(fileName)s' failed to upload": "Απέτυχε η αποστολή του αρχείου '%(fileName)s'",
"There was a problem logging in.": "Υπήρξε ένα πρόβλημα κατά την σύνδεση.",
"This room has no local addresses": "Αυτό το δωμάτιο δεν έχει τοπικές διευθύνσεις",
"This doesn't appear to be a valid email address": "Δεν μοιάζει με μια έγκυρη διεύθυνση ηλεκτρονικής αλληλογραφίας",
"This phone number is already in use": "Αυτός ο αριθμός τηλεφώνου είναι ήδη σε χρήση",
"This room": "Αυτό το δωμάτιο",
"This room's internal ID is": "Το εσωτερικό αναγνωριστικό του δωματίου είναι",
"times": "φορές",
"To ban users": "Για αποκλεισμό χρηστών",
"to browse the directory": "για περιήγηση στο ευρετήριο",
"To configure the room": "Για ρύθμιση του δωματίου",
"To invite users into the room": "Για πρόσκληση χρηστών στο δωμάτιο",
"To remove other users' messages": "Για αφαίρεση μηνυμάτων άλλων χρηστών",
"to restore": "για επαναφορά",
"To send events of type": "Για αποστολή συμβάντων τύπου",
"To send messages": "Για αποστολή μηνυμάτων",
"Turn Markdown off": "Απενεργοποίηση Markdown",
"Turn Markdown on": "Ενεργοποίηση Markdown",
"Unable to add email address": "Αδυναμία προσθήκης διεύθυνσης ηλ. αλληλογραφίας",
"Unable to remove contact information": "Αδυναμία αφαίρεσης πληροφοριών επαφής",
"Unable to restore previous session": "Αδυναμία επαναφοράς της προηγούμενης συνεδρίας",
"Unable to verify email address.": "Αδυναμία επιβεβαίωσης διεύθυνσης ηλεκτρονικής αλληλογραφίας.",
"Unban": "Άρση αποκλεισμού",
"%(senderName)s unbanned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.",
"Unable to enable Notifications": "Αδυναμία ενεργοποίησης των ειδοποιήσεων",
"Unable to load device list": "Αδυναμία φόρτωσης της λίστας συσκευών",
"Unencrypted room": "Μη κρυπτογραφημένο δωμάτιο",
"unencrypted": "μη κρυπτογραφημένο",
"Unencrypted message": "Μη κρυπτογραφημένο μήνυμα",
"unknown caller": "άγνωστος καλών",
"Unknown command": "Άγνωστη εντολή",
"unknown device": "άγνωστη συσκευή",
"Unknown room %(roomId)s": "Άγνωστο δωμάτιο %(roomId)s",
"unknown": "άγνωστο",
"Unmute": "Άρση σίγασης",
"Unnamed Room": "Ανώνυμο δωμάτιο",
"Unrecognised command:": "Μη αναγνωρίσιμη εντολή:",
"Unrecognised room alias:": "Μη αναγνωρίσιμο ψευδώνυμο:",
"Unverified": "Ανεπιβεβαίωτο",
"Upload avatar": "Αποστολή προσωπικής εικόνας",
"Upload Failed": "Απέτυχε η αποστολή",
"Upload Files": "Αποστολή αρχείων",
"Upload file": "Αποστολή αρχείου",
"Upload new:": "Αποστολή νέου:",
"Usage": "Χρήση",
"Use with caution": "Χρησιμοποιήστε τα με προσοχή",
"User ID": "Αναγνωριστικό χρήστη",
"User Interface": "Διεπαφή χρήστη",
"%(user)s is a": "Ο %(user)s είναι",
"User name": "Όνομα χρήστη",
"Username invalid: %(errMessage)s": "Μη έγκυρο όνομα χρήστη: %(errMessage)s",
"Users": "Χρήστες",
"User": "Χρήστης",
"Video call": "Βιντεοκλήση",
"Voice call": "Φωνητική κλήση",
"Warning!": "Προειδοποίηση!",
"Who would you like to communicate with?": "Με ποιον θα θέλατε να επικοινωνήσετε;",
"You are already in a call.": "Είστε ήδη σε μια κλήση.",
"You have no visible notifications": "Δεν έχετε ορατές ειδοποιήσεις",
"you must be a": "πρέπει να είστε",
"You must <a>register</a> to use this functionality": "Πρέπει να <a>εγγραφείτε</a> για να χρησιμοποιήσετε αυτή την λειτουργία",
"You need to be logged in.": "Πρέπει να είστε συνδεδεμένος.",
"You need to enter a user name.": "Πρέπει να εισάγετε ένα όνομα χρήστη.",
"Your password has been reset": "Ο κωδικός πρόσβασης σας έχει επαναφερθεί",
"Sun": "Κυρ",
"Mon": "Δευ",
"Tue": "Τρί",
"Wed": "Τετ",
"Thu": "Πέμ",
"Fri": "Παρ",
"Sat": "Σάβ",
"Jan": "Ιαν",
"Feb": "Φεβ",
"Mar": "Μαρ",
"Apr": "Απρ",
"May": "Μαϊ",
"Jun": "Ιουν",
"Jul": "Ιουλ",
"Aug": "Αυγ",
"Sep": "Σεπ",
"Oct": "Οκτ",
"Nov": "Νοε",
"Dec": "Δεκ",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"Set a display name:": "Ορισμός ονόματος εμφάνισης:",
"Set a Display Name": "Ορισμός ονόματος εμφάνισης",
"Upload an avatar:": "Αποστολή προσωπικής εικόνας:",
"This server does not support authentication with a phone number.": "Αυτός ο διακομιστής δεν υποστηρίζει πιστοποίηση με αριθμό τηλεφώνου.",
"Missing password.": "Λείπει ο κωδικός πρόσβασης.",
"Passwords don't match.": "Δεν ταιριάζουν οι κωδικοί πρόσβασης.",
"This doesn't look like a valid email address.": "Δεν μοιάζει με μια έγκυρη διεύθυνση ηλ. αλληλογραφίας.",
"An unknown error occurred.": "Προέκυψε ένα άγνωστο σφάλμα.",
"I already have an account": "Έχω ήδη λογαριασμό",
"An error occurred: %(error_string)s": "Προέκυψε ένα σφάλμα: %(error_string)s",
"Topic": "Θέμα",
"Make Moderator": "Ορισμός συντονιστή",
"Encrypt room": "Κρυπτογράφηση δωματίου",
"Room": "Δωμάτιο",
"Auto-complete": "Αυτόματη συμπλήρωση",
"(~%(count)s results).one": "(~%(count)s αποτέλεσμα)",
"(~%(count)s results).other": "(~%(count)s αποτελέσματα)",
"Active call": "Ενεργή κλήση",
"strike": "επιγράμμιση",
"bullet": "κουκκίδα",
"%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)s συνδέθηκαν %(repeats)s φορές",
"%(oneUser)sjoined %(repeats)s times": "%(oneUser)s συνδέθηκε %(repeats)s φορές",
"%(severalUsers)sjoined": "%(severalUsers)s συνδέθηκαν",
"%(oneUser)sjoined": "%(oneUser)s συνδέθηκε",
"were invited": "προσκλήθηκαν",
"was invited": "προσκλήθηκε",
"were banned": "αποκλείστηκαν",
"was banned": "αποκλείστηκε",
"were kicked": "διώχτηκαν",
"was kicked": "διώχτηκε",
"New Password": "Νέος κωδικός πρόσβασης",
"Start automatically after system login": "Αυτόματη έναρξη μετά τη σύνδεση",
"Options": "Επιλογές",
"Passphrases must match": "Δεν ταιριάζουν τα συνθηματικά",
"Passphrase must not be empty": "Το συνθηματικό δεν πρέπει να είναι κενό",
"Export room keys": "Εξαγωγή κλειδιών δωματίου",
"Confirm passphrase": "Επιβεβαίωση συνθηματικού",
"Import room keys": "Εισαγωγή κλειδιών δωματίου",
"File to import": "Αρχείο για εισαγωγή",
"Start new chat": "Έναρξη νέας συνομιλίας",
"Guest users can't invite users. Please register.": "Οι επισκέπτες δεν έχουν τη δυνατότητα να προσκαλέσουν άλλους χρήστες. Παρακαλούμε εγγραφείτε πρώτα.",
"Confirm Removal": "Επιβεβαίωση αφαίρεσης",
"Unknown error": "Άγνωστο σφάλμα",
"Incorrect password": "Λανθασμένος κωδικός πρόσβασης",
"To continue, please enter your password.": "Για να συνεχίσετε, παρακαλούμε πληκτρολογήστε τον κωδικό πρόσβασής σας.",
"Device name": "Όνομα συσκευής",
"Device Name": "Όνομα συσκευής",
"Device key": "Κλειδί συσκευής",
"Verify device": "Επιβεβαίωση συσκευής",
"Unable to restore session": "Αδυναμία επαναφοράς συνεδρίας",
"Continue anyway": "Συνέχεια οπωσδήποτε",
"Unknown devices": "Άγνωστες συσκευές",
"Unknown Address": "Άγνωστη διεύθυνση",
"Blacklist": "Μαύρη λίστα",
"Verify...": "Επιβεβαίωση...",
"ex. @bob:example.com": "π.χ @bob:example.com",
"Add User": "Προσθήκη χρήστη",
"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 επιλέγοντας μια διαφορετική διεύθυνση για το διακομιστή.",
"Token incorrect": "Εσφαλμένο διακριτικό",
"A text message has been sent to": "Ένα μήνυμα στάλθηκε στο",
"Please enter the code it contains:": "Παρακαλούμε εισάγετε τον κωδικό που περιέχει:",
"Default server": "Προεπιλεγμένος διακομιστής",
"Custom server": "Προσαρμοσμένος διακομιστής",
"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": "Προσθήκη ενσωμάτωσης",
"URL Previews": "Προεπισκόπηση συνδέσμων",
"Enable URL previews for this room (affects only you)": "Ενεργοποίηση της προεπισκόπησης συνδέσμων για αυτό το δωμάτιο (επηρεάζει μόνο εσάς)",
"Drop file here to upload": "Αποθέστε εδώ για αποστολή",
"for %(amount)ss": "για %(amount)ss",
"for %(amount)sm": "για %(amount)sm",
"for %(amount)sh": "για %(amount)sh",
"for %(amount)sd": "για %(amount)sd",
"Online": "Σε σύνδεση",
"Idle": "Αδρανής",
"Offline": "Εκτός σύνδεσης",
"Start chatting": "Έναρξη συνομιλίας",
"Start Chatting": "Έναρξη συνομιλίας",
"Click on the button below to start chatting!": "Κάντε κλικ στο κουμπί παρακάτω για να ξεκινήσετε μια συνομιλία!",
"%(senderDisplayName)s removed the room avatar.": "Ο %(senderDisplayName)s διέγραψε την προσωπική εικόνα του δωματίου.",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "Ο %(senderDisplayName)s άλλαξε την προσωπική εικόνα του %(roomName)s",
"Username available": "Διαθέσιμο όνομα χρήστη",
"Username not available": "Μη διαθέσιμο όνομα χρήστη",
"Something went wrong!": "Κάτι πήγε στραβά!",
"Could not connect to the integration server": "Αδυναμία σύνδεσης στον διακομιστή ενσωμάτωσης",
"Create a new chat or reuse an existing one": "Δημιουργία νέας συνομιλίας ή επαναχρησιμοποίηση μιας υπάρχουσας",
"Don't send typing notifications": "Να μη γίνετε αποστολή ειδοποιήσεων πληκτρολόγησης",
"Encrypted by a verified device": "Κρυπτογραφημένο από μια επιβεβαιωμένη συσκευή",
"Encrypted by an unverified device": "Κρυπτογραφημένο από μια ανεπιβεβαίωτη συσκευή",
"Error: Problem communicating with the given homeserver.": "Σφάλμα: πρόβλημα κατά την επικοινωνία με τον ορισμένο διακομιστή.",
"Failed to ban user": "Δεν ήταν δυνατό ο αποκλεισμός του χρήστη",
"Failed to change power level": "Δεν ήταν δυνατή η αλλαγή του επιπέδου δύναμης",
"Failed to fetch avatar URL": "Δεν ήταν δυνατή η ανάκτηση της διεύθυνσης εικόνας",
"Failed to lookup current room": "Δεν ήταν δυνατή η εύρεση του τρέχοντος δωματίου",
"Failed to unban": "Δεν ήταν δυνατή η άρση του αποκλεισμού",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s από %(fromPowerLevel)s σε %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Έχει απενεργοποιηθεί η πρόσβαση στους επισκέπτες σε αυτόν τον διακομιστή.",
"Guests can't set avatars. Please register.": "Οι επισκέπτες δεν μπορούν να ορίσουν προσωπικές εικόνες. Παρακαλούμε εγγραφείτε.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Οι επισκέπτες δεν μπορούν να δημιουργήσουν νέα δωμάτια. Παρακαλούμε εγγραφείτε για να δημιουργήσετε ένα δωμάτιο και να ξεκινήσετε μια συνομιλία.",
"Guests can't use labs features. Please register.": "Οι επισκέπτες δεν μπορούν να χρησιμοποιήσουν τα πειραματικά χαρακτηριστικά. Παρακαλούμε εγγραφείτε.",
"Guests cannot join this room even if explicitly invited.": "Οι επισκέπτες δεν μπορούν να συνδεθούν στο δωμάτιο ακόμη και αν έχουν καλεστεί.",
"Hide Text Formatting Toolbar": "Απόκρυψη εργαλειοθήκης μορφοποίησης κειμένου",
"Incoming call from %(name)s": "Εισερχόμενη κλήση από %(name)s",
"Incoming video call from %(name)s": "Εισερχόμενη βιντεοκλήση από %(name)s",
"Incoming voice call from %(name)s": "Εισερχόμενη φωνητική κλήση από %(name)s",
"Invalid alias format": "Μη έγκυρη μορφή ψευδώνυμου",
"Invalid address format": "Μη έγκυρη μορφή διεύθυνσης",
"Invalid file%(extra)s": "Μη έγκυρο αρχείο %(extra)s",
"%(senderName)s invited %(targetName)s.": "Ο %(senderName)s προσκάλεσε τον %(targetName)s.",
"Invites user with given id to current room": "Προσκαλεί τον χρήστη με το δοσμένο αναγνωριστικό στο τρέχον δωμάτιο",
"'%(alias)s' is not a valid format for an address": "Το '%(alias)s' δεν είναι μια έγκυρη μορφή διεύθυνσης",
"'%(alias)s' is not a valid format for an alias": "Το '%(alias)s' δεν είναι μια έγκυρη μορφή ψευδώνυμου",
"%(senderName)s made future room history visible to": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο",
"Missing user_id in request": "Λείπει το user_id στο αίτημα",
"Mobile phone number (optional)": "Αριθμός κινητού τηλεφώνου (προαιρετικό)",
"Must be viewing a room": "Πρέπει να βλέπετε ένα δωμάτιο",
"Never send encrypted messages to unverified devices from this device": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές από αυτή τη συσκευή",
"Never send encrypted messages to unverified devices in this room": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές σε αυτό το δωμάτιο",
"Never send encrypted messages to unverified devices in this room from this device": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές, σε αυτό το δωμάτιο, από αυτή τη συσκευή",
"New Composer & Autocomplete": "Νέος επεξεργαστής κειμένου και αυτόματη συμπλήρωση",
"not set": "δεν έχει οριστεί",
"not specified": "μη καθορισμένο",
"NOT verified": "ΧΩΡΙΣ επαλήθευση",
"No devices with registered encryption keys": "Καθόλου συσκευές με εγγεγραμένα κλειδιά κρυπτογράφησης",
"No display name": "Χωρίς όνομα",
"No users have specific privileges in this room": "Κανένας χρήστης δεν έχει συγκεκριμένα δικαιώματα σε αυτό το δωμάτιο",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Μόλις ενεργοποιηθεί η κρυπτογράφηση για ένα δωμάτιο, δεν μπορεί να απενεργοποιηθεί ξανά (για τώρα)",
"Once you&#39;ve followed the link it contains, click below": "Μόλις ακολουθήσετε τον σύνδεσμο που περιέχει, κάντε κλικ παρακάτω",
"Only people who have been invited": "Μόνο άτομα που έχουν προσκληθεί",
"Otherwise, <a>click here</a> to send a bug report.": "Διαφορετικά, κάντε <a>κλικ εδώ</a> για να αποστείλετε μια αναφορά σφάλματος.",
"%(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.": "Παρακαλούμε ελέγξτε την ηλεκτρονική σας αλληλογραφία και κάντε κλικ στον σύνδεσμο που περιέχει. Μόλις γίνει αυτό, κάντε κλίκ στο κουμπί συνέχεια.",
"Press": "Πατήστε",
"Refer a friend to Riot:": "Πείτε για το Riot σε έναν φίλο σας:",
"Rejoin": "Επανασύνδεση",
"%(senderName)s removed their profile picture.": "Ο %(senderName)s αφαίρεσε τη φωτογραφία του προφίλ του.",
"%(senderName)s requested a VoIP conference.": "Ο %(senderName)s αιτήθηκε μια συνδιάσκεψη VoIP.",
"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 να αποστείλει ειδοποιήσεις - παρακαλούμε προσπαθήστε ξανά",
"Room contains unknown devices": "Το δωμάτιο περιέχει άγνωστες συσκευές",
"%(roomName)s is not accessible at this time.": "Το %(roomName)s δεν είναι προσβάσιμο αυτή τη στιγμή.",
"Scroll to bottom of page": "Μετάβαση στο τέλος της σελίδας",
"Scroll to unread messages": "Μεταβείτε στα μη αναγνωσμένα μηνύματα",
"Sender device information": "Πληροφορίες συσκευής αποστολέα",
"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.": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος, υπερφορτωμένος, ή κάτι άλλο να πήγε στραβά.",
"Show panel": "Εμφάνιση καρτέλας",
"Show Text Formatting Toolbar": "Εμφάνιση της εργαλειοθήκης μορφοποίησης κειμένου",
"Some of your messages have not been sent.": "Μερικά από τα μηνύματα σας δεν έχουν αποσταλεί.",
"This room is not recognised.": "Αυτό το δωμάτιο δεν αναγνωρίζεται.",
"to favourite": "στα αγαπημένα",
"To kick users": "Για να διώξετε χρήστες",
"to make a room or": "για δημιουργία ενός δωματίου ή",
"to start a chat with someone": "για να ξεκινήσετε μια συνομιλία με κάποιον",
"Unable to capture screen": "Αδυναμία σύλληψης οθόνης",
"Unknown (user, device) pair:": "Άγνωστο ζεύγος (χρήστη, συσκευής):",
"Uploading %(filename)s and %(count)s others.zero": "Γίνεται αποστολή του %(filename)s",
"Uploading %(filename)s and %(count)s others.other": "Γίνεται αποστολή του %(filename)s και %(count)s υπολοίπων",
"uploaded a file": "ανέβασε ένα αρχείο",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (δύναμη %(powerLevelNumber)s)",
"Verification Pending": "Εκκρεμεί επιβεβαίωση",
"Verification": "Επιβεβαίωση",
"verified": "επαληθεύτηκε",
"Verified": "Επαληθεύτηκε",
"Verified key": "Επιβεβαιωμένο κλειδί",
"VoIP conference finished.": "Ολοκληρώθηκε η συνδιάσκεψη VoIP.",
"VoIP conference started.": "Ξεκίνησησε η συνδιάσκεψη VoIP.",
"VoIP is unsupported": "Δεν υποστηρίζεται το VoIP",
"(warning: cannot be disabled again!)": "(προειδοποίηση: δεν μπορεί να απενεργοποιηθεί ξανά)",
"WARNING: Device already verified, but keys do NOT MATCH!": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η συσκευή έχει επαληθευτεί, αλλά τα κλειδιά ΔΕΝ ΤΑΙΡΙΑΖΟΥΝ!",
"Who can access this room?": "Ποιος μπορεί να προσπελάσει αυτό το δωμάτιο;",
"Who can read history?": "Ποιος μπορεί να διαβάσει το ιστορικό;",
"Who would you like to add to this room?": "Ποιον θέλετε να προσθέσετε σε αυτό το δωμάτιο;",
"%(senderName)s withdrew %(targetName)s's invitation.": "Ο %(senderName)s ανακάλεσε την πρόσκληση του %(targetName)s.",
"You're not in any rooms yet! Press": "Δεν είστε ακόμη σε κάνενα δωμάτιο! Πατήστε",
"You cannot place a call with yourself.": "Δεν μπορείτε να καλέσετε τον ευατό σας.",
"You cannot place VoIP calls in this browser.": "Δεν μπορείτε να πραγματοποιήσετε κλήσεις VoIP με αυτόν τον περιηγητή.",
"You do not have permission to post to this room": "Δεν έχετε δικαιώματα για να δημοσιεύσετε σε αυτό το δωμάτιο",
"You have been banned from %(roomName)s by %(userName)s.": "Έχετε αποκλειστεί από το δωμάτιο %(roomName)s από τον %(userName)s.",
"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?": "Φαίνεται ότι είστε σε μια κλήση, είστε βέβαιοι ότι θέλετε να αποχωρήσετε;",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s",
"This doesn't look like a valid phone number.": "Δεν μοιάζει με έναν έγκυρο αριθμό τηλεφώνου.",
"Make this room private": "Κάντε το δωμάτιο ιδιωτικό",
"There are no visible files in this room": "Δεν υπάρχουν ορατά αρχεία σε αυτό το δωμάτιο",
"Connectivity to the server has been lost.": "Χάθηκε η συνδεσιμότητα στον διακομιστή.",
"%(severalUsers)sleft %(repeats)s times": "%(severalUsers)s έφυγαν %(repeats)s φορές",
"%(severalUsers)srejected their invitations %(repeats)s times": "Οι %(severalUsers)s απέρριψαν τις προσκλήσεις τους %(repeats)s φορές",
"%(oneUser)srejected their invitation %(repeats)s times": "Ο %(oneUser)s απέρριψε την πρόσκληση του %(repeats)s φορές",
"%(severalUsers)srejected their invitations": "Οι %(severalUsers)s απέρριψαν τις προσκλήσεις τους",
"%(oneUser)srejected their invitation": "Ο %(oneUser)s απέρριψε την πρόσκληση",
"were invited %(repeats)s times": "προσκλήθηκαν %(repeats)s φορές",
"was invited %(repeats)s times": "προσκλήθηκε %(repeats)s φορές",
"were banned %(repeats)s times": "αποκλείστηκαν %(repeats)s φορές",
"was banned %(repeats)s times": "αποκλείστηκε %(repeats)s φορές",
"were kicked %(repeats)s times": "διώχθηκαν %(repeats)s φορές",
"was kicked %(repeats)s times": "διώχθηκε %(repeats)s φορές",
"%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)s άλλαξαν το όνομα τους %(repeats)s φορές",
"%(oneUser)schanged their name %(repeats)s times": "Ο %(oneUser)s άλλαξε το όνομα του %(repeats)s φορές",
"%(severalUsers)schanged their name": "Οι %(severalUsers)s άλλαξαν το όνομα τους",
"%(oneUser)schanged their name": "Ο %(oneUser)s άλλαξε το όνομα του",
"%(severalUsers)schanged their avatar %(repeats)s times": "Οι %(severalUsers)s άλλαξαν την προσωπική τους φωτογραφία %(repeats)s φορές",
"%(oneUser)schanged their avatar %(repeats)s times": "Ο %(oneUser)s άλλαξε την προσωπική του εικόνα %(repeats)s φορές",
"%(severalUsers)schanged their avatar": "Οι %(severalUsers)s άλλαξαν την προσωπική τους εικόνα",
"%(oneUser)schanged their avatar": "Ο %(oneUser)s άλλαξε την προσωπική του εικόνα",
"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\" περιέχει συσκευές που δεν έχετε ξαναδεί.",
"This Home Server would like to make sure you are not a robot": "Ο διακομιστής θέλει να σιγουρευτεί ότι δεν είσαστε ρομπότ",
"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?": "Αν δεν ορίσετε μια διεύθυνση ηλεκτρονικής αλληλογραφίας, δεν θα θα μπορείτε να επαναφέρετε τον κωδικό πρόσβασης σας. Είστε σίγουροι;",
"You are registering with %(SelectedTeamName)s": "Εγγραφείτε με %(SelectedTeamName)s",
"Removed or unknown message type": "Αφαιρέθηκε ή άγνωστος τύπος μηνύματος",
"Disable URL previews by default for participants in this room": "Απενεργοποίηση της προεπισκόπησης συνδέσμων για όλους τους συμμετέχοντες στο δωμάτιο",
"Disable URL previews for this room (affects only you)": "Απενεργοποίηση της προεπισκόπησης συνδέσμων για αυτό το δωμάτιο (επηρεάζει μόνο εσάς)",
" (unsupported)": " (μη υποστηριζόμενο)",
"$senderDisplayName changed the room avatar to <img/>": "Ο $senderDisplayName άλλαξε την εικόνα του δωματίου σε <img/>",
"Missing Media Permissions, click here to request.": "Λείπουν τα δικαιώματα πολύμεσων, κάντε κλικ για να ζητήσετε.",
"You may need to manually permit Riot to access your microphone/webcam": "Μπορεί να χρειαστεί να ορίσετε χειροκίνητα την πρόσβαση του Riot στο μικρόφωνο/κάμερα",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Δεν είναι δυνατή η σύνδεση στον διακομιστή - παρακαλούμε ελέγξτε την συνδεσιμότητα, βεβαιωθείτε ότι το <a>πιστοποιητικό SSL</a> του διακομιστή είναι έμπιστο και ότι κάποιο πρόσθετο περιηγητή δεν αποτρέπει τα αιτήματα.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Δεν είναι δυνατή η σύνδεση στον διακομιστή μέσω HTTP όταν μια διεύθυνση HTTPS βρίσκεται στην μπάρα του περιηγητή. Είτε χρησιμοποιήστε HTTPS ή <a>ενεργοποιήστε τα μη ασφαλή σενάρια εντολών</a>.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "Ο %(senderName)s άλλαξε το επίπεδο δύναμης του %(powerLevelDiffText)s.",
"Changes to who can read history will only apply to future messages in this room": "Οι αλλαγές που αφορούν την ορατότητα του ιστορικού θα εφαρμοστούν μόνο στα μελλοντικά μηνύματα του δωματίου",
"Conference calling is in development and may not be reliable.": "Η κλήση συνδιάσκεψης είναι υπό ανάπτυξη και μπορεί να μην είναι αξιόπιστη.",
"Devices will not yet be able to decrypt history from before they joined the room": "Οι συσκευές δεν θα είναι σε θέση να αποκρυπτογραφήσουν το ιστορικό πριν από την είσοδο τους στο δωμάτιο",
"End-to-end encryption is in beta and may not be reliable": "Η κρυπτογράφηση από άκρο σε άκρο είναι σε δοκιμαστικό στάδιο και μπορεί να μην είναι αξιόπιστη",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "Ο %(senderName)s αφαίρεσε το όνομα εμφάνισης του (%(oldDisplayName)s).",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "Ο %(senderName)s έστειλε μια πρόσκληση στον %(targetDisplayName)s για να συνδεθεί στο δωμάτιο.",
"%(senderName)s set their display name to %(displayName)s.": "Ο %(senderName)s όρισε το όνομα του σε %(displayName)s.",
"Sorry, this homeserver is using a login which is not recognised ": "Συγγνώμη, ο διακομιστής χρησιμοποιεί έναν τρόπο σύνδεσης που δεν αναγνωρίζεται ",
"tag as %(tagName)s": "ετικέτα ως %(tagName)s",
"tag direct chat": "προσθήκη ετικέτας στην απευθείας συνομιλία",
"The phone number entered looks invalid": "Ο αριθμός που καταχωρίσατε δεν είναι έγκυρος",
"This action cannot be performed by a guest user. Please register to be able to do this.": "Αυτή η ενέργεια δεν μπορεί να εκτελεστεί από έναν επισκέπτη. Παρακαλούμε εγγραφείτε για να μπορέσετε να το κάνετε.",
"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 remote side failed to pick up": "Η απομακρυσμένη πλευρά απέτυχε να συλλέξει",
"This Home Server does not support login using email address.": "Ο διακομιστής δεν υποστηρίζει σύνδεση με διευθύνσεις ηλ. αλληλογραφίας.",
"This invitation was sent to an email address which is not associated with this account:": "Η πρόσκληση στάλθηκε σε μια διεύθυνση που δεν έχει συσχετιστεί με αυτόν τον λογαριασμό:",
"These are experimental features that may break in unexpected ways": "Αυτά είναι πειραματικά χαρακτηριστικά και μπορεί να καταρρεύσουν με απροσδόκητους τρόπους",
"The visibility of existing history will be unchanged": "Η ορατότητα του υπάρχοντος ιστορικού θα παραμείνει αμετάβλητη",
"This is a preview of this room. Room interactions have been disabled": "Αυτή είναι μια προεπισκόπηση του δωματίου. Οι αλληλεπιδράσεις δωματίου έχουν απενεργοποιηθεί",
"This room is not accessible by remote Matrix servers": "Αυτό το δωμάτιο δεν είναι προσβάσιμο από απομακρυσμένους διακομιστές Matrix",
"to demote": "για υποβίβαση",
"To reset your password, enter the email address linked to your account": "Για να επαναφέρετε τον κωδικό πρόσβασης σας, πληκτρολογήστε τη διεύθυνση ηλ. αλληλογραφίας όπου είναι συνδεδεμένη με τον λογαριασμό σας",
"to tag as %(tagName)s": "για να οριστεί ετικέτα ως %(tagName)s",
"to tag direct chat": "για να οριστεί ετικέτα σε απευθείας συνομιλία",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "Ο %(senderName)s ενεργοποίησε την από άκρο σε άκρο κρυπτογράφηση (algorithm %(algorithm)s).",
"Undecryptable": "Μη αποκρυπτογραφημένο",
"Uploading %(filename)s and %(count)s others.one": "Γίνεται αποστολή του %(filename)s και %(count)s υπολοίπα",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Θα θέλατε να <acceptText>δεχθείτε</acceptText> ή να <declineText>απορρίψετε</declineText> την πρόσκληση;",
"You already have existing direct chats with this user:": "Έχετε ήδη απευθείας συνομιλίες με τον χρήστη:",
"You are trying to access %(roomName)s.": "Προσπαθείτε να έχετε πρόσβαση στο %(roomName)s.",
"You have been kicked from %(roomName)s by %(userName)s.": "Έχετε διωχθεί από το δωμάτιο %(roomName)s από τον %(userName)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": "Έχετε αποσυνδεθεί από όλες τις συσκευές και δεν θα λαμβάνετε πλέον ειδοποιήσεις push. Για να ενεργοποιήσετε τις ειδοποιήσεις, συνδεθείτε ξανά σε κάθε συσκευή",
"You have <a>disabled</a> URL previews by default.": "Έχετε <a>απενεργοποιημένη</a> από προεπιλογή την προεπισκόπηση συνδέσμων.",
"You have <a>enabled</a> URL previews by default.": "Έχετε <a>ενεργοποιημένη</a> από προεπιλογή την προεπισκόπηση συνδέσμων.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Έχετε πληκτρολογήσει μια άκυρη επαφή. Χρησιμοποιήστε το Matrix ID ή την ηλεκτρονική διεύθυνση αλληλογραφίας τους.",
"You may wish to login with a different account, or add this email to this account.": "Μπορεί να θέλετε να συνδεθείτε με διαφορετικό λογαριασμό, ή να προσθέσετε αυτή τη διεύθυνση ηλεκτρονικής αλληλογραφίας σε αυτόν τον λογαριασμό.",
"You need to be able to invite users to do that.": "Για να το κάνετε αυτό πρέπει να έχετε τη δυνατότητα να προσκαλέσετε χρήστες.",
"You seem to be uploading files, are you sure you want to quit?": "Φαίνεται ότι αποστέλετε αρχεία, είστε βέβαιοι ότι θέλετε να αποχωρήσετε;",
"You should not yet trust it to secure data": "Δεν πρέπει να το εμπιστεύεστε για να ασφαλίσετε δεδομένα",
"Your home server does not support device management.": "Ο διακομιστής δεν υποστηρίζει διαχείριση συσκευών.",
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Ο κωδικός πρόσβασης είναι πολύ μικρός (ελ. %(MIN_PASSWORD_LENGTH)s).",
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Τα ονόματα μπορεί να περιέχουν μόνο γράμματα, αριθμούς, τελείες, πάνω και κάτω παύλα.",
"Share message history with new users": "Διαμοιρασμός ιστορικού μηνυμάτων με τους νέους χρήστες",
"numbullet": "απαρίθμηση",
"%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)s έφυγαν και ξανασυνδέθηκαν %(repeats)s φορές",
"%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)s έφυγε και ξανασυνδέθηκε %(repeats)s φορές",
"%(severalUsers)sleft and rejoined": "%(severalUsers)s έφυγαν και ξανασυνδέθηκαν",
"%(oneUser)sleft and rejoined": "%(oneUser)s έφυγε και ξανασυνδέθηκε",
"%(severalUsers)shad their invitations withdrawn %(repeats)s times": "Οι %(severalUsers)s απέσυραν τις προσκλήσεις τους %(repeats)s φορές",
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "Ο %(oneUser)s απέσυρε την πρόσκληση του %(repeats)s φορές",
"%(severalUsers)shad their invitations withdrawn": "Οι %(severalUsers)s απέσυραν τις προσκλήσεις τους",
"%(oneUser)shad their invitation withdrawn": "Ο %(oneUser)s απέσυρε την πρόσκληση του",
"You must join the room to see its files": "Πρέπει να συνδεθείτε στο δωμάτιο για να δείτε τα αρχεία του",
"Reject all %(invitedRooms)s invites": "Απόρριψη όλων των προσκλήσεων %(invitedRooms)s",
"Failed to invite the following users to the %(roomName)s room:": "Δεν ήταν δυνατή η πρόσκληση των χρηστών στο δωμάτιο %(roomName)s:",
"changing room on a RoomView is not supported": "Δεν υποστηρίζεται η αλλαγή δωματίου σε RoomView",
"demote": "υποβίβαση",
"Deops user with given id": "Deop χρήστη με το συγκεκριμένο αναγνωριστικό",
"Disable inline URL previews by default": "Απενεργοποίηση προεπισκόπησης συνδέσμων από προεπιλογή",
"Drop here to tag %(section)s": "Απόθεση εδώ για ορισμό ετικέτας στο %(section)s",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Συμμετάσχετε με <voiceText>φωνή</voiceText> ή <videoText>βίντεο</videoText>.",
"Joins room with given alias": "Συνδέεστε στο δωμάτιο με δοσμένο ψευδώνυμο",
"Setting a user name will create a fresh account": "Ορίζοντας ένα όνομα χρήστη θα δημιουργήσει ένα νέο λογαριασμό",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Εμφάνιση χρονικών σημάνσεων σε 12ωρη μορφή ώρας (π.χ. 2:30 μ.μ.)",
"since the point in time of selecting this option": "από το χρονικό σημείο επιλογής αυτής της ρύθμισης",
"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. Η συσκευή έχει επισημανθεί ως επιβεβαιωμένη.",
"To link to a room it must have <a>an address</a>.": "Για να συνδεθείτε σε ένα δωμάτιο πρέπει να έχετε <a>μια διεύθυνση</a>.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Πρέπει να συνδεθείτε ξανά για να δημιουργήσετε τα κλειδιά κρυπτογράφησης από άκρο σε άκρο για αυτήν τη συσκευή και να υποβάλετε το δημόσιο κλειδί στον διακομιστή σας. Αυτό θα χρειαστεί να γίνει μόνο μια φορά.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Η διεύθυνση ηλεκτρονικής αλληλογραφίας σας δεν φαίνεται να συσχετίζεται με Matrix ID σε αυτόν τον διακομιστή.",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ο κωδικός πρόσβασής σας άλλαξε επιτυχώς. Δεν θα λάβετε ειδοποιήσεις push σε άλλες συσκευές μέχρι να συνδεθείτε ξανά σε αυτές",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Δεν θα μπορέσετε να αναιρέσετε αυτήν την αλλαγή καθώς προωθείτε τον χρήστη να έχει το ίδιο επίπεδο δύναμης με τον εαυτό σας.",
"Sent messages will be stored until your connection has returned.": "Τα απεσταλμένα μηνύματα θα αποθηκευτούν μέχρι να αακτηθεί η σύνδεσή σας.",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Αποστολή ξανά όλων</a> ή <a>ακύρωση όλων</a> τώρα. Μπορείτε επίσης να επιλέξετε μεμονωμένα μηνύματα για να τα στείλετε ξανά ή να ακυρώσετε.",
"Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Είστε βέβαιοι ότι θέλετε να καταργήσετε (διαγράψετε) αυτό το συμβάν; Σημειώστε ότι αν διαγράψετε το όνομα δωματίου ή αλλάξετε το θέμα, θα μπορούσε να αναιρέσει την αλλαγή.",
"This 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.": "Μπορείτε επίσης να ορίσετε έναν προσαρμοσμένο διακομιστή ταυτοποίησης, αλλά αυτό συνήθως θα αποτρέψει την αλληλεπίδραση με τους χρήστες που βασίζονται στην ηλεκτρονική διεύθυνση αλληλογραφίας.",
"URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "Η προεπισκόπηση συνδέσμων είναι %(globalDisableUrlPreview)s από προεπιλογή για τους συμμετέχοντες του δωματίου.",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Κλήση συνδιάσκεψης σε εξέλιξη %(supportedText)s. %(joinText)s",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Αυτό θα είναι το όνομα του λογαριασμού σας στον διακομιστή <span></span>, ή μπορείτε να επιλέξετε <a>διαφορετικό διακομιστή</a>.",
"If you already have a Matrix account you can <a>log in</a> instead.": "Αν έχετε ήδη λογαριασμό Matrix μπορείτε να <a>συνδεθείτε</a>.",
"Failed to load timeline position": "Δεν ήταν δυνατή η φόρτωση της θέσης του χρονολόγιου",
"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 kick": "Δεν ήταν δυνατή η απομάκρυνση",
"(no answer)": "(χωρίς απάντηση)",
"(unknown failure: %(reason)s)": "(άγνωστο σφάλμα: %(reason)s)",
"Unblacklist": "Άρση αποκλεισμού",
"Unverify": "Άρση επιβεβαίωσης",
"Ongoing conference call%(supportedText)s.": "Κλήση συνδιάσκεψης σε εξέλιξη %(supportedText)s.",
"Your browser does not support the required cryptography extensions": "Ο περιηγητής σας δεν υποστηρίζει τα απαιτούμενα πρόσθετα κρυπτογράφησης",
"Not a valid Riot keyfile": "Μη έγκυρο αρχείο κλειδιού Riot",
"Authentication check failed: incorrect password?": "Αποτυχία ελέγχου πιστοποίησης: λανθασμένος κωδικός πρόσβασης;",
"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.": "Η αλλαγή του κωδικού πρόσβασης θα επαναφέρει τα κλειδιά κρυπτογράφησης από άκρο σε άκρο σε όλες τις συσκευές, καθιστώντας το κρυπτογραφημένο ιστορικό συζητήσεων μη αναγνώσιμο, εκτός και αν εξάγετε πρώτα τα κλειδιά και τα εισαγάγετε ξανά στο δωμάτιο. Στο μέλλον αυτή η διαδικασία θα βελτιωθεί.",
"Claimed Ed25519 fingerprint key": "Απαιτήθηκε κλειδί αποτυπώματος Ed25519",
"Displays action": "Εμφανίζει την ενέργεια",
"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.": "Η επαναφορά του κωδικού πρόσβασης θα επαναφέρει τα κλειδιά κρυπτογράφησης από άκρο σε άκρο σε όλες τις συσκευές, καθιστώντας το κρυπτογραφημένο ιστορικό συζητήσεων μη αναγνώσιμο, εκτός και αν εξάγετε πρώτα τα κλειδιά και τα εισαγάγετε ξανά στο δωμάτιο. Στο μέλλον αυτή η διαδικασία θα βελτιωθεί.",
"To use it, just wait for autocomplete results to load and tab through them.": "Για να το χρησιμοποιήσετε, απλά περιμένετε μέχρι να φορτωθούν τα αποτέλεσμα αυτόματης συμπλήρωσης. Έπειτα επιλέξτε ένα από αυτά χρησιμοποιώντας τον στηλοθέτη.",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Δεν είναι δυνατό να εξακριβωθεί ότι η διεύθυνση αυτής της πρόσκλησης στάλθηκε σε αντιστοιχία με εκείνη που σχετίζεται με το λογαριασμό σας.",
"Use compact timeline layout": "Χρήση συμπαγούς διάταξης χρονολογίου",
"(could not connect media)": "(αδυναμία σύνδεσης με το πολυμέσο)",
"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\". Αυτό σημαίνει ότι η επικοινωνία σας μπορεί να έχει υποκλαπεί!",
"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.": "Το αρχείο εξαγωγής θα είναι προστατευμένο με συνθηματικό. Θα χρειαστεί να πληκτρολογήσετε το συνθηματικό εδώ για να αποκρυπτογραφήσετε το αρχείο.",
"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, η συνεδρία σας ίσως είναι μη συμβατή με αυτήν την έκδοση. Κλείστε αυτό το παράθυρο και επιστρέψτε στην πιο πρόσφατη έκδοση.",
"Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "Το εμφανιζόμενο όνομα είναι το πως θα εμφανιστείτε σε άλλους όταν μιλάτε σε δωμάτια. Τι θα θέλατε να είναι;",
"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.": "Σας συνιστούμε να ολοκληρώσετε τη διαδικασία επαλήθευσης για κάθε συσκευή και να επιβεβαιώσετε ότι ανήκουν στον νόμιμο κάτοχό της, αλλά εάν προτιμάτε μπορείτε να στείλετε ξανά το μήνυμα χωρίς επαλήθευση.",
"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. Θα θέλατε να συνεχίσετε;",
"Disable Peer-to-Peer for 1:1 calls": "Απενεργοποίηση του ομότιμου (Peer-to-Peer) για κλήσεις έναν προς έναν",
"Do you want to set an email address?": "Θέλετε να ορίσετε μια διεύθυνση ηλεκτρονικής αλληλογραφίας;",
"This will allow you to reset your password and receive notifications.": "Αυτό θα σας επιτρέψει να επαναφέρετε τον κωδικό πρόσβαση σας και θα μπορείτε να λαμβάνετε ειδοποιήσεις.",
"were unbanned %(repeats)s times": "ξεμπλοκαρίστηκαν %(repeats)s φορές",
"was unbanned %(repeats)s times": "ξεμπλοκαρίστηκε %(repeats)s φορές",
"were unbanned": "ξεμπλοκαρίστηκαν",
"was unbanned": "ξεμπλοκαρίστηκε"
} }

View file

@ -119,18 +119,21 @@
"zh-sg":"Chinese (Singapore)", "zh-sg":"Chinese (Singapore)",
"zh-tw":"Chinese (Taiwan)", "zh-tw":"Chinese (Taiwan)",
"zu":"Zulu", "zu":"Zulu",
"A registered account is required for this action": "A registered account is required for this action", "a room": "a room",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains",
"accept": "accept", "Accept": "Accept",
"%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.", "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.",
"Account": "Account", "Account": "Account",
"Access Token:": "Access Token:", "Access Token:": "Access Token:",
"Active call (%(roomName)s)": "Active call (%(roomName)s)",
"Add": "Add", "Add": "Add",
"Add a topic": "Add a topic", "Add a topic": "Add a topic",
"Add email address": "Add email address", "Add email address": "Add email address",
"Add phone number": "Add phone number", "Add phone number": "Add phone number",
"Admin": "Admin", "Admin": "Admin",
"Admin tools": "Admin tools",
"And %(count)s more...": "And %(count)s more...",
"VoIP": "VoIP", "VoIP": "VoIP",
"Missing Media Permissions, click here to request.": "Missing Media Permissions, click here to request.", "Missing Media Permissions, click here to request.": "Missing Media Permissions, click here to request.",
"No Microphones detected": "No Microphones detected", "No Microphones detected": "No Microphones detected",
@ -145,10 +148,10 @@
"Hide removed messages": "Hide removed messages", "Hide removed messages": "Hide removed messages",
"Always show message timestamps": "Always show message timestamps", "Always show message timestamps": "Always show message timestamps",
"Authentication": "Authentication", "Authentication": "Authentication",
"Alias (optional)": "Alias (optional)",
"all room members": "all room members", "all room members": "all room members",
"all room members, from the point they are invited": "all room members, from the point they are invited", "all room members, from the point they are invited": "all room members, from the point they are invited",
"all room members, from the point they joined": "all room members, from the point they joined", "all room members, from the point they joined": "all room members, from the point they joined",
"an address": "an address",
"and": "and", "and": "and",
"%(items)s and %(remaining)s others": "%(items)s and %(remaining)s others", "%(items)s and %(remaining)s others": "%(items)s and %(remaining)s others",
"%(items)s and one other": "%(items)s and one other", "%(items)s and one other": "%(items)s and one other",
@ -180,7 +183,7 @@
"Bug Report": "Bug Report", "Bug Report": "Bug Report",
"Bulk Options": "Bulk Options", "Bulk Options": "Bulk Options",
"Call Timeout": "Call Timeout", "Call Timeout": "Call Timeout",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.",
"Can't load user settings": "Can't load user settings", "Can't load user settings": "Can't load user settings",
"Change Password": "Change Password", "Change Password": "Change Password",
@ -197,13 +200,14 @@
"Claimed Ed25519 fingerprint key": "Claimed Ed25519 fingerprint key", "Claimed Ed25519 fingerprint key": "Claimed Ed25519 fingerprint key",
"Clear Cache and Reload": "Clear Cache and Reload", "Clear Cache and Reload": "Clear Cache and Reload",
"Clear Cache": "Clear Cache", "Clear Cache": "Clear Cache",
"Click here": "Click here", "<a>Click here</a> to join the discussion!": "<a>Click here</a> to join the discussion!",
"Click here to fix": "Click here to fix", "Click here to fix": "Click here to fix",
"Click to mute audio": "Click to mute audio", "Click to mute audio": "Click to mute audio",
"Click to mute video": "Click to mute video", "Click to mute video": "Click to mute video",
"click to reveal": "click to reveal", "click to reveal": "click to reveal",
"Click to unmute video": "Click to unmute video", "Click to unmute video": "Click to unmute video",
"Click to unmute audio": "Click to unmute audio", "Click to unmute audio": "Click to unmute audio",
"Close": "Close",
"Command error": "Command error", "Command error": "Command error",
"Commands": "Commands", "Commands": "Commands",
"Conference call failed.": "Conference call failed.", "Conference call failed.": "Conference call failed.",
@ -218,19 +222,20 @@
"one": "%(count)s new message", "one": "%(count)s new message",
"other": "%(count)s new messages" "other": "%(count)s new messages"
}, },
"Create a new chat or reuse an existing one": "Create a new chat or reuse an existing one",
"Create an account": "Create an account", "Create an account": "Create an account",
"Create Room": "Create Room", "Create Room": "Create Room",
"Cryptography": "Cryptography", "Cryptography": "Cryptography",
"Current password": "Current password", "Current password": "Current password",
"Curve25519 identity key": "Curve25519 identity key", "Curve25519 identity key": "Curve25519 identity key",
"Custom": "Custom",
"Custom level": "Custom level", "Custom level": "Custom level",
"/ddg is not a command": "/ddg is not a command", "/ddg is not a command": "/ddg is not a command",
"Deactivate Account": "Deactivate Account", "Deactivate Account": "Deactivate Account",
"Deactivate my account": "Deactivate my account", "Deactivate my account": "Deactivate my account",
"decline": "decline", "Decline": "Decline",
"Decrypt %(text)s": "Decrypt %(text)s", "Decrypt %(text)s": "Decrypt %(text)s",
"Decryption error": "Decryption error", "Decryption error": "Decryption error",
"(default: %(userName)s)": "(default: %(userName)s)",
"Delete": "Delete", "Delete": "Delete",
"demote": "demote", "demote": "demote",
"Deops user with given id": "Deops user with given id", "Deops user with given id": "Deops user with given id",
@ -244,6 +249,7 @@
"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", "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",
"Direct Chat": "Direct Chat", "Direct Chat": "Direct Chat",
"Direct chats": "Direct chats", "Direct chats": "Direct chats",
"Disable Notifications": "Disable Notifications",
"disabled": "disabled", "disabled": "disabled",
"Disable inline URL previews by default": "Disable inline URL previews by default", "Disable inline URL previews by default": "Disable inline URL previews by default",
"Disable markdown formatting": "Disable markdown formatting", "Disable markdown formatting": "Disable markdown formatting",
@ -252,6 +258,7 @@
"Displays action": "Displays action", "Displays action": "Displays action",
"Don't send typing notifications": "Don't send typing notifications", "Don't send typing notifications": "Don't send typing notifications",
"Download %(text)s": "Download %(text)s", "Download %(text)s": "Download %(text)s",
"Drop File Here": "Drop File Here",
"Drop here %(toAction)s": "Drop here %(toAction)s", "Drop here %(toAction)s": "Drop here %(toAction)s",
"Drop here to tag %(section)s": "Drop here to tag %(section)s", "Drop here to tag %(section)s": "Drop here to tag %(section)s",
"Ed25519 fingerprint": "Ed25519 fingerprint", "Ed25519 fingerprint": "Ed25519 fingerprint",
@ -261,13 +268,19 @@
"Email, name or matrix ID": "Email, name or matrix ID", "Email, name or matrix ID": "Email, name or matrix ID",
"Emoji": "Emoji", "Emoji": "Emoji",
"Enable encryption": "Enable encryption", "Enable encryption": "Enable encryption",
"Enable Notifications": "Enable Notifications",
"enabled": "enabled", "enabled": "enabled",
"Encrypted by a verified device": "Encrypted by a verified device",
"Encrypted by an unverified device": "Encrypted by an unverified device",
"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 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": "Encrypted room", "Encrypted room": "Encrypted room",
"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",
"%(senderName)s ended the call.": "%(senderName)s ended the call.", "%(senderName)s ended the call.": "%(senderName)s ended the call.",
"End-to-end encryption information": "End-to-end encryption information", "End-to-end encryption information": "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", "End-to-end encryption is in beta and may not be reliable": "End-to-end encryption is in beta and may not be reliable",
"Enter Code": "Enter Code", "Enter Code": "Enter Code",
"Enter passphrase": "Enter passphrase",
"Error": "Error", "Error": "Error",
"Error decrypting attachment": "Error decrypting attachment", "Error decrypting attachment": "Error decrypting attachment",
"Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.", "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.",
@ -300,6 +313,7 @@
"Failed to toggle moderator status": "Failed to toggle moderator status", "Failed to toggle moderator status": "Failed to toggle moderator status",
"Failed to unban": "Failed to unban", "Failed to unban": "Failed to unban",
"Failed to upload file": "Failed to upload file", "Failed to upload file": "Failed to upload file",
"Failed to upload profile picture!": "Failed to upload profile picture!",
"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", "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",
"Failure to create room": "Failure to create room", "Failure to create room": "Failure to create room",
"Favourite": "Favourite", "Favourite": "Favourite",
@ -324,11 +338,15 @@
"Hide read receipts": "Hide read receipts", "Hide read receipts": "Hide read receipts",
"Hide Text Formatting Toolbar": "Hide Text Formatting Toolbar", "Hide Text Formatting Toolbar": "Hide Text Formatting Toolbar",
"Historical": "Historical", "Historical": "Historical",
"Home": "Home",
"Homeserver is": "Homeserver is", "Homeserver is": "Homeserver is",
"Identity Server is": "Identity Server is", "Identity Server is": "Identity Server is",
"I have verified my email address": "I have verified my email address", "I have verified my email address": "I have verified my email address",
"Import": "Import", "Import": "Import",
"Import E2E room keys": "Import E2E room keys", "Import E2E room keys": "Import E2E room keys",
"Incoming call from %(name)s": "Incoming call from %(name)s",
"Incoming video call from %(name)s": "Incoming video call from %(name)s",
"Incoming voice call from %(name)s": "Incoming voice call from %(name)s",
"Incorrect username and/or password.": "Incorrect username and/or password.", "Incorrect username and/or password.": "Incorrect username and/or password.",
"Incorrect verification code": "Incorrect verification code", "Incorrect verification code": "Incorrect verification code",
"Interface Language": "Interface Language", "Interface Language": "Interface Language",
@ -341,11 +359,11 @@
"Invited": "Invited", "Invited": "Invited",
"Invites": "Invites", "Invites": "Invites",
"Invites user with given id to current room": "Invites user with given id to current room", "Invites user with given id to current room": "Invites user with given id to current room",
"is a": "is a",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias",
"%(displayName)s is typing": "%(displayName)s is typing", "%(displayName)s is typing": "%(displayName)s is typing",
"Sign in with": "Sign in with", "Sign in with": "Sign in with",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.",
"Join Room": "Join Room", "Join Room": "Join Room",
"joined and left": "joined and left", "joined and left": "joined and left",
"joined": "joined", "joined": "joined",
@ -356,11 +374,12 @@
"Kick": "Kick", "Kick": "Kick",
"Kicks user with given id": "Kicks user with given id", "Kicks user with given id": "Kicks user with given id",
"Labs": "Labs", "Labs": "Labs",
"Last seen": "Last seen",
"Leave room": "Leave room", "Leave room": "Leave room",
"left and rejoined": "left and rejoined", "left and rejoined": "left and rejoined",
"left": "left", "left": "left",
"%(targetName)s left the room.": "%(targetName)s left the room.", "%(targetName)s left the room.": "%(targetName)s left the room.",
"Level": "Level", "Level:": "Level:",
"List this room in %(domain)s's room directory?": "List this room in %(domain)s's room directory?", "List this room in %(domain)s's room directory?": "List this room in %(domain)s's room directory?",
"Local addresses for this room:": "Local addresses for this room:", "Local addresses for this room:": "Local addresses for this room:",
"Logged in as:": "Logged in as:", "Logged in as:": "Logged in as:",
@ -399,6 +418,7 @@
"<not supported>": "<not supported>", "<not supported>": "<not supported>",
"NOT verified": "NOT verified", "NOT verified": "NOT verified",
"No devices with registered encryption keys": "No devices with registered encryption keys", "No devices with registered encryption keys": "No devices with registered encryption keys",
"No display name": "No display name",
"No more results": "No more results", "No more results": "No more results",
"No results": "No results", "No results": "No results",
"No users have specific privileges in this room": "No users have specific privileges in this room", "No users have specific privileges in this room": "No users have specific privileges in this room",
@ -408,6 +428,7 @@
"Once you&#39;ve followed the link it contains, click below": "Once you&#39;ve followed the link it contains, click below", "Once you&#39;ve followed the link it contains, click below": "Once you&#39;ve followed the link it contains, click below",
"Only people who have been invited": "Only people who have been invited", "Only people who have been invited": "Only people who have been invited",
"Operation failed": "Operation failed", "Operation failed": "Operation failed",
"Otherwise, <a>click here</a> to send a bug report.": "Otherwise, <a>click here</a> to send a bug report.",
"Password": "Password", "Password": "Password",
"Password:": "Password:", "Password:": "Password:",
"Passwords can't be empty": "Passwords can't be empty", "Passwords can't be empty": "Passwords can't be empty",
@ -420,16 +441,19 @@
"Power level must be positive integer.": "Power level must be positive integer.", "Power level must be positive integer.": "Power level must be positive integer.",
"Press": "Press", "Press": "Press",
"Privacy warning": "Privacy warning", "Privacy warning": "Privacy warning",
"Private Chat": "Private Chat",
"Privileged Users": "Privileged Users", "Privileged Users": "Privileged Users",
"Profile": "Profile", "Profile": "Profile",
"Public Chat": "Public Chat",
"Reason": "Reason", "Reason": "Reason",
"Reason: %(reasonText)s": "Reason: %(reasonText)s",
"Revoke Moderator": "Revoke Moderator", "Revoke Moderator": "Revoke Moderator",
"Refer a friend to Riot:": "Refer a friend to Riot:", "Refer a friend to Riot:": "Refer a friend to Riot:",
"Register": "Register", "Register": "Register",
"Registration required": "Registration required",
"rejected": "rejected", "rejected": "rejected",
"%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.", "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.",
"Reject invitation": "Reject invitation", "Reject invitation": "Reject invitation",
"Rejoin": "Rejoin",
"Remote addresses for this room:": "Remote addresses for this room:", "Remote addresses for this room:": "Remote addresses for this room:",
"Remove Contact Information?": "Remove Contact Information?", "Remove Contact Information?": "Remove Contact Information?",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).",
@ -448,7 +472,10 @@
"riot-web version:": "riot-web version:", "riot-web version:": "riot-web version:",
"Room %(roomId)s not visible": "Room %(roomId)s not visible", "Room %(roomId)s not visible": "Room %(roomId)s not visible",
"Room Colour": "Room Colour", "Room Colour": "Room Colour",
"Room contains unknown devices": "Room contains unknown devices",
"Room name (optional)": "Room name (optional)", "Room name (optional)": "Room name (optional)",
"%(roomName)s does not exist.": "%(roomName)s does not exist.",
"%(roomName)s is not accessible at this time.": "%(roomName)s is not accessible at this time.",
"Rooms": "Rooms", "Rooms": "Rooms",
"Save": "Save", "Save": "Save",
"Scroll to bottom of page": "Scroll to bottom of page", "Scroll to bottom of page": "Scroll to bottom of page",
@ -456,8 +483,11 @@
"Search": "Search", "Search": "Search",
"Search failed": "Search failed", "Search failed": "Search failed",
"Searches DuckDuckGo for results": "Searches DuckDuckGo for results", "Searches DuckDuckGo for results": "Searches DuckDuckGo for results",
"Searching known users": "Searching known users",
"Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s",
"Send a message (unencrypted)": "Send a message (unencrypted)", "Send a message (unencrypted)": "Send a message (unencrypted)",
"Send an encrypted message": "Send an encrypted message", "Send an encrypted message": "Send an encrypted message",
"Send anyway": "Send anyway",
"Sender device information": "Sender device information", "Sender device information": "Sender device information",
"Send Invites": "Send Invites", "Send Invites": "Send Invites",
"Send Reset Email": "Send Reset Email", "Send Reset Email": "Send Reset Email",
@ -474,9 +504,10 @@
"Session ID": "Session ID", "Session ID": "Session ID",
"%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.", "%(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.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.",
"Setting a user name will create a fresh account": "Setting a user name will create a fresh account", "Set": "Set",
"Settings": "Settings", "Settings": "Settings",
"Show panel": "Show panel", "Show panel": "Show panel",
"Show Text Formatting Toolbar": "Show Text Formatting Toolbar",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)",
"Signed Out": "Signed Out", "Signed Out": "Signed Out",
"Sign in": "Sign in", "Sign in": "Sign in",
@ -488,6 +519,7 @@
"Someone": "Someone", "Someone": "Someone",
"Sorry, this homeserver is using a login which is not recognised ": "Sorry, this homeserver is using a login which is not recognised ", "Sorry, this homeserver is using a login which is not recognised ": "Sorry, this homeserver is using a login which is not recognised ",
"Start a chat": "Start a chat", "Start a chat": "Start a chat",
"Start authentication": "Start authentication",
"Start Chat": "Start Chat", "Start Chat": "Start Chat",
"Submit": "Submit", "Submit": "Submit",
"Success": "Success", "Success": "Success",
@ -498,7 +530,7 @@
"The main address for this room is": "The main address for this room is", "The main address for this room is": "The main address for this room is",
"The phone number entered looks invalid": "The phone number entered looks invalid", "The phone number entered looks invalid": "The phone number entered looks invalid",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.",
"This action cannot be performed by a guest user. Please register to be able to do this": "This action cannot be performed by a guest user. Please register to be able to do this", "This action cannot be performed by a guest user. Please register to be able to do this.": "This action cannot be performed by a guest user. Please register to be able to do this.",
"This email address is already in use": "This email address is already in use", "This email address is already in use": "This email address is already in use",
"This email address was not found": "This email address was not found", "This email address was not found": "This email address was not found",
"%(actionVerb)s this person?": "%(actionVerb)s this person?", "%(actionVerb)s this person?": "%(actionVerb)s this person?",
@ -507,16 +539,16 @@
"The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload",
"The remote side failed to pick up": "The remote side failed to pick up", "The remote side failed to pick up": "The remote side failed to pick up",
"This Home Server does not support login using email address.": "This Home Server does not support login using email address.", "This Home Server does not support login using email address.": "This Home Server does not support login using email address.",
"This invitation was sent to an email address which is not associated with this account:": "This invitation was sent to an email address which is not associated with this account:",
"There was a problem logging in.": "There was a problem logging in.", "There was a problem logging in.": "There was a problem logging in.",
"This room has no local addresses": "This room has no local addresses", "This room has no local addresses": "This room has no local addresses",
"This room is not recognised.": "This room is not recognised.", "This room is not recognised.": "This room is not recognised.",
"This room is private or inaccessible to guests. You may be able to join if you register.": "This room is private or inaccessible to guests. You may be able to join if you register.",
"These are experimental features that may break in unexpected ways": "These are experimental features that may break in unexpected ways", "These are experimental features that may break in unexpected ways": "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", "The visibility of existing history will be unchanged": "The visibility of existing history will be unchanged",
"This doesn't appear to be a valid email address": "This doesn't appear to be a valid email address", "This doesn't appear to be a valid email address": "This doesn't appear to be a valid email address",
"this invitation?": "this invitation?",
"This is a preview of this room. Room interactions have been disabled": "This is a preview of this room. Room interactions have been disabled", "This is a preview of this room. Room interactions have been disabled": "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 phone number is already in use": "This phone number is already in use",
"This room": "This room",
"This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers", "This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers",
"This room's internal ID is": "This room's internal ID is", "This room's internal ID is": "This room's internal ID is",
"times": "times", "times": "times",
@ -526,9 +558,8 @@
"to demote": "to demote", "to demote": "to demote",
"to favourite": "to favourite", "to favourite": "to favourite",
"To invite users into the room": "To invite users into the room", "To invite users into the room": "To invite users into the room",
"to join the discussion": "to join the discussion",
"To kick users": "To kick users", "To kick users": "To kick users",
"To link to a room it must have": "To link to a room it must have", "To link to a room it must have <a>an address</a>.": "To link to a room it must have <a>an address</a>.",
"to make a room or": "to make a room or", "to make a room or": "to make a room or",
"To remove other users' messages": "To remove other users' messages", "To remove other users' messages": "To remove other users' messages",
"To reset your password, enter the email address linked to your account": "To reset your password, enter the email address linked to your account", "To reset your password, enter the email address linked to your account": "To reset your password, enter the email address linked to your account",
@ -550,11 +581,15 @@
"Unable to verify email address.": "Unable to verify email address.", "Unable to verify email address.": "Unable to verify email address.",
"Unban": "Unban", "Unban": "Unban",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Unable to ascertain that the address this invite was sent to matches one associated with your account.",
"Unable to capture screen": "Unable to capture screen", "Unable to capture screen": "Unable to capture screen",
"Unable to enable Notifications": "Unable to enable Notifications", "Unable to enable Notifications": "Unable to enable Notifications",
"Unable to load device list": "Unable to load device list", "Unable to load device list": "Unable to load device list",
"Undecryptable": "Undecryptable",
"Unencrypted room": "Unencrypted room", "Unencrypted room": "Unencrypted room",
"unencrypted": "unencrypted", "unencrypted": "unencrypted",
"Unencrypted message": "Unencrypted message",
"unknown caller": "unknown caller",
"Unknown command": "Unknown command", "Unknown command": "Unknown command",
"unknown device": "unknown device", "unknown device": "unknown device",
"unknown error code": "unknown error code", "unknown error code": "unknown error code",
@ -562,8 +597,10 @@
"Unknown (user, device) pair:": "Unknown (user, device) pair:", "Unknown (user, device) pair:": "Unknown (user, device) pair:",
"unknown": "unknown", "unknown": "unknown",
"Unmute": "Unmute", "Unmute": "Unmute",
"Unnamed Room": "Unnamed Room",
"Unrecognised command:": "Unrecognised command:", "Unrecognised command:": "Unrecognised command:",
"Unrecognised room alias:": "Unrecognised room alias:", "Unrecognised room alias:": "Unrecognised room alias:",
"Unverified": "Unverified",
"Uploading %(filename)s and %(count)s others": { "Uploading %(filename)s and %(count)s others": {
"zero": "Uploading %(filename)s", "zero": "Uploading %(filename)s",
"one": "Uploading %(filename)s and %(count)s other", "one": "Uploading %(filename)s and %(count)s other",
@ -574,23 +611,31 @@
"Upload Failed": "Upload Failed", "Upload Failed": "Upload Failed",
"Upload Files": "Upload Files", "Upload Files": "Upload Files",
"Upload file": "Upload file", "Upload file": "Upload file",
"Upload new:": "Upload new:",
"Usage": "Usage", "Usage": "Usage",
"Use compact timeline layout": "Use compact timeline layout", "Use compact timeline layout": "Use compact timeline layout",
"Use with caution": "Use with caution", "Use with caution": "Use with caution",
"User ID": "User ID", "User ID": "User ID",
"User Interface": "User Interface", "User Interface": "User Interface",
"%(user)s is a": "%(user)s is a",
"User name": "User name", "User name": "User name",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)",
"Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s",
"Users": "Users", "Users": "Users",
"User": "User", "User": "User",
"Verification Pending": "Verification Pending", "Verification Pending": "Verification Pending",
"Verification": "Verification", "Verification": "Verification",
"verified": "verified", "verified": "verified",
"Verified": "Verified",
"Verified key": "Verified key", "Verified key": "Verified key",
"Video call": "Video call", "Video call": "Video call",
"Voice call": "Voice call", "Voice call": "Voice call",
"VoIP conference finished.": "VoIP conference finished.", "VoIP conference finished.": "VoIP conference finished.",
"VoIP conference started.": "VoIP conference started.", "VoIP conference started.": "VoIP conference started.",
"VoIP is unsupported": "VoIP is unsupported", "VoIP is unsupported": "VoIP is unsupported",
"(could not connect media)": "(could not connect media)",
"(no answer)": "(no answer)",
"(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)",
"(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)", "(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)",
"Warning!": "Warning!", "Warning!": "Warning!",
"WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!", "WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!",
@ -600,19 +645,23 @@
"Who would you like to add to this room?": "Who would you like to add to this room?", "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?": "Who would you like to communicate with?", "Who would you like to communicate with?": "Who would you like to communicate with?",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.",
"Would you like to": "Would you like to", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?",
"You already have existing direct chats with this user:": "You already have existing direct chats with this user:",
"You are already in a call.": "You are already in a call.", "You are already in a call.": "You are already in a call.",
"You're not in any rooms yet! Press": "You're not in any rooms yet! Press", "You're not in any rooms yet! Press": "You're not in any rooms yet! Press",
"You are trying to access %(roomName)s": "You are trying to access %(roomName)s", "You are trying to access %(roomName)s.": "You are trying to access %(roomName)s.",
"You cannot place a call with yourself.": "You cannot place a call with yourself.", "You cannot place a call with yourself.": "You cannot place a call with yourself.",
"You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.", "You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.",
"You do not have permission to post to this room": "You do not have permission to post to this room", "You do not have permission to post to this room": "You do not have permission to post to this room",
"You have been banned from %(roomName)s by %(userName)s.": "You have been banned from %(roomName)s by %(userName)s.",
"You have been invited to join this room by %(inviterName)s": "You have been invited to join this room by %(inviterName)s", "You have been invited to join this room by %(inviterName)s": "You have been invited to join this room by %(inviterName)s",
"You have been kicked from %(roomName)s by %(userName)s.": "You have been kicked from %(roomName)s by %(userName)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 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 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 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 <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.",
"You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "You have entered an invalid contact. Try using their Matrix ID or email address.", "You have entered an invalid contact. Try using their Matrix ID or email address.": "You have entered an invalid contact. Try using their Matrix ID or email address.",
"You have no visible notifications": "You have no visible notifications", "You have no visible notifications": "You have no visible notifications",
"You may wish to login with a different account, or add this email to this account.": "You may wish to login with a different account, or add this email to this account.",
"you must be a": "you must be a", "you must be a": "you must be a",
"You must <a>register</a> to use this functionality": "You must <a>register</a> to use this functionality", "You must <a>register</a> to use this functionality": "You must <a>register</a> to use this functionality",
"You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "You need to be able to invite users to do that.": "You need to be able to invite users to do that.",
@ -625,7 +674,8 @@
"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?", "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?",
"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 uploading files, 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": "You should not yet trust it to secure data", "You should not yet trust it to secure data": "You should not yet trust it to secure data",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.",
"Your home server does not support device management.": "Your home server does not support device management.",
"Sun": "Sun", "Sun": "Sun",
"Mon": "Mon", "Mon": "Mon",
"Tue": "Tue", "Tue": "Tue",
@ -660,7 +710,7 @@
"User names may only contain letters, numbers, dots, hyphens and underscores.": "User names may only contain letters, numbers, dots, hyphens and underscores.", "User names may only contain letters, numbers, dots, hyphens and underscores.": "User names may only contain letters, numbers, dots, hyphens and underscores.",
"An unknown error occurred.": "An unknown error occurred.", "An unknown error occurred.": "An unknown error occurred.",
"I already have an account": "I already have an account", "I already have an account": "I already have an account",
"An error occured: %(error_string)s": "An error occured: %(error_string)s", "An error occurred: %(error_string)s": "An error occurred: %(error_string)s",
"Topic": "Topic", "Topic": "Topic",
"Make Moderator": "Make Moderator", "Make Moderator": "Make Moderator",
"Make this room private": "Make this room private", "Make this room private": "Make this room private",
@ -672,7 +722,10 @@
"Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.", "Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.",
"Auto-complete": "Auto-complete", "Auto-complete": "Auto-complete",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.", "<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.",
"(~%(searchCount)s results)": "(~%(searchCount)s results)", "(~%(count)s results)": {
"one": "(~%(count)s result)",
"other": "(~%(count)s results)"
},
"Cancel": "Cancel", "Cancel": "Cancel",
"or": "or", "or": "or",
"Active call": "Active call", "Active call": "Active call",
@ -762,7 +815,6 @@
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.", "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.",
"You must join the room to see its files": "You must join the room to see its files", "You must join the room to see its files": "You must join the room to see its files",
"Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
"Reject all %(invitedRooms)s invites": "Reject all %(invitedRooms)s invites", "Reject all %(invitedRooms)s invites": "Reject all %(invitedRooms)s invites",
"Start new chat": "Start new chat", "Start new chat": "Start new chat",
"Guest users can't invite users. Please register.": "Guest users can't invite users. Please register.", "Guest users can't invite users. Please register.": "Guest users can't invite users. Please register.",
@ -778,6 +830,7 @@
"To continue, please enter your password.": "To continue, please enter your password.", "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:", "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 name": "Device name",
"Device Name": "Device Name",
"Device key": "Device key", "Device key": "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.": "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 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 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.": "In future this verification process will be more sophisticated.", "In future this verification process will be more sophisticated.": "In future this verification process will be more sophisticated.",
@ -833,7 +886,7 @@
"Enable URL previews for this room (affects only you)": "Enable URL previews for this room (affects only you)", "Enable URL previews for this room (affects only you)": "Enable URL previews for this room (affects only you)",
"Drop file here to upload": "Drop file here to upload", "Drop file here to upload": "Drop file here to upload",
" (unsupported)": " (unsupported)", " (unsupported)": " (unsupported)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Ongoing conference call%(supportedText)s. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Ongoing conference call%(supportedText)s.",
"for %(amount)ss": "for %(amount)ss", "for %(amount)ss": "for %(amount)ss",
"for %(amount)sm": "for %(amount)sm", "for %(amount)sm": "for %(amount)sm",
"for %(amount)sh": "for %(amount)sh", "for %(amount)sh": "for %(amount)sh",
@ -841,15 +894,9 @@
"Online": "Online", "Online": "Online",
"Idle": "Idle", "Idle": "Idle",
"Offline": "Offline", "Offline": "Offline",
"disabled": "disabled",
"enabled": "enabled",
"Start chatting": "Start chatting", "Start chatting": "Start chatting",
"Start Chatting": "Start Chatting", "Start Chatting": "Start Chatting",
"Click on the button below to start chatting!": "Click on the button below to start chatting!", "Click on the button below to start chatting!": "Click on the button below to start chatting!",
"Create a new chat or reuse an existing one": "Create a new chat or reuse an existing one",
"You already have existing direct chats with this user:": "You already have existing direct chats with this user:",
"Start new chat": "Start new chat",
"Disable URL previews for this room (affects only you)": "Disable URL previews for this room (affects only you)",
"$senderDisplayName changed the room avatar to <img/>": "$senderDisplayName changed the room avatar to <img/>", "$senderDisplayName changed the room avatar to <img/>": "$senderDisplayName changed the room avatar to <img/>",
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s",
@ -858,6 +905,12 @@
"Something went wrong!": "Something went wrong!", "Something went wrong!": "Something went wrong!",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.", "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.",
"If you already have a Matrix account you can <a>log in</a> instead.": "If you already have a Matrix account you can <a>log in</a> instead.", "If you already have a Matrix account you can <a>log in</a> instead.": "If you already have a Matrix account you can <a>log in</a> instead.",
"Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions",
"Not a valid Riot keyfile": "Not a valid Riot keyfile",
"Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?",
"Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls",
"Do you want to set an email address?": "Do you want to set an email address?",
"This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications.",
"Start verification": "Start verification", "Start verification": "Start verification",
"Share without verifying": "Share without verifying", "Share without verifying": "Share without verifying",
"Ignore request": "Ignore request", "Ignore request": "Ignore request",

View file

@ -119,7 +119,6 @@
"zh-sg": "Chinese (Singapore)", "zh-sg": "Chinese (Singapore)",
"zh-tw": "Chinese (Taiwan)", "zh-tw": "Chinese (Taiwan)",
"zu": "Zulu", "zu": "Zulu",
"A registered account is required for this action": "A registered account is required for this action",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains",
"accept": "accept", "accept": "accept",
"%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.", "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.",
@ -225,7 +224,6 @@
"decline": "decline", "decline": "decline",
"Decrypt %(text)s": "Decrypt %(text)s", "Decrypt %(text)s": "Decrypt %(text)s",
"Decryption error": "Decryption error", "Decryption error": "Decryption error",
"(default: %(userName)s)": "(default: %(userName)s)",
"Delete": "Delete", "Delete": "Delete",
"demote": "demote", "demote": "demote",
"Deops user with given id": "Deops user with given id", "Deops user with given id": "Deops user with given id",
@ -308,7 +306,7 @@
"Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.", "Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.",
"Guests can't set avatars. Please register.": "Guests can't set avatars. Please register.", "Guests can't set avatars. Please register.": "Guests can't set avatars. Please register.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Guest users can't create new rooms. Please register to create room and start a chat.", "Guest users can't create new rooms. Please register to create room and start a chat.": "Guest users can't create new rooms. Please register to create room and start a chat.",
"Guest users can't upload files. Please register to upload": "Guest users can't upload files. Please register to upload", "Guest users can't upload files. Please register to upload.": "Guest users can't upload files. Please register to upload.",
"Guests can't use labs features. Please register.": "Guests can't use labs features. Please register.", "Guests can't use labs features. Please register.": "Guests can't use labs features. Please register.",
"Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.", "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.",
"had": "had", "had": "had",
@ -418,7 +416,6 @@
"Revoke Moderator": "Revoke Moderator", "Revoke Moderator": "Revoke Moderator",
"Refer a friend to Riot:": "Refer a friend to Riot:", "Refer a friend to Riot:": "Refer a friend to Riot:",
"Register": "Register", "Register": "Register",
"Registration required": "Registration required",
"rejected": "rejected", "rejected": "rejected",
"%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.", "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.",
"Reject invitation": "Reject invitation", "Reject invitation": "Reject invitation",
@ -466,7 +463,6 @@
"Session ID": "Session ID", "Session ID": "Session ID",
"%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.", "%(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.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.",
"Setting a user name will create a fresh account": "Setting a user name will create a fresh account",
"Settings": "Settings", "Settings": "Settings",
"Show panel": "Show panel", "Show panel": "Show panel",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)",
@ -476,7 +472,7 @@
"since the point in time of selecting this option": "since the point in time of selecting this option", "since the point in time of selecting this option": "since the point in time of selecting this option",
"since they joined": "since they joined", "since they joined": "since they joined",
"since they were invited": "since they were invited", "since they were invited": "since they were invited",
"Some of your messages have not been sent": "Some of your messages have not been sent", "Some of your messages have not been sent.": "Some of your messages have not been sent.",
"Someone": "Someone", "Someone": "Someone",
"Sorry, this homeserver is using a login which is not recognised ": "Sorry, this homeserver is using a login which is not recognized ", "Sorry, this homeserver is using a login which is not recognised ": "Sorry, this homeserver is using a login which is not recognized ",
"Start a chat": "Start a chat", "Start a chat": "Start a chat",
@ -489,7 +485,7 @@
"The default role for new room members is": "The default role for new room members is", "The default role for new room members is": "The default role for new room members is",
"The main address for this room is": "The main address for this room is", "The main address for this room is": "The main address for this room is",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.",
"This action cannot be performed by a guest user. Please register to be able to do this": "This action cannot be performed by a guest user. Please register to be able to do this", "This action cannot be performed by a guest user. Please register to be able to do this.": "This action cannot be performed by a guest user. Please register to be able to do this.",
"This email address is already in use": "This email address is already in use", "This email address is already in use": "This email address is already in use",
"This email address was not found": "This email address was not found", "This email address was not found": "This email address was not found",
"%(actionVerb)s this person?": "%(actionVerb)s this person?", "%(actionVerb)s this person?": "%(actionVerb)s this person?",
@ -501,7 +497,6 @@
"There was a problem logging in.": "There was a problem logging in.", "There was a problem logging in.": "There was a problem logging in.",
"This room has no local addresses": "This room has no local addresses", "This room has no local addresses": "This room has no local addresses",
"This room is not recognised.": "This room is not recognized.", "This room is not recognised.": "This room is not recognized.",
"This room is private or inaccessible to guests. You may be able to join if you register": "This room is private or inaccessible to guests. You may be able to join if you register",
"These are experimental features that may break in unexpected ways": "These are experimental features that may break in unexpected ways", "These are experimental features that may break in unexpected ways": "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", "The visibility of existing history will be unchanged": "The visibility of existing history will be unchanged",
"This doesn't appear to be a valid email address": "This doesn't appear to be a valid email address", "This doesn't appear to be a valid email address": "This doesn't appear to be a valid email address",
@ -530,8 +525,8 @@
"to tag as %(tagName)s": "to tag as %(tagName)s", "to tag as %(tagName)s": "to tag as %(tagName)s",
"to tag direct chat": "to tag direct chat", "to tag direct chat": "to tag direct chat",
"To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.", "To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.",
"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 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", "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.",
"Turn Markdown off": "Turn Markdown off", "Turn Markdown off": "Turn Markdown off",
"Turn Markdown on": "Turn Markdown on", "Turn Markdown on": "Turn Markdown on",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).", "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).",
@ -577,6 +572,9 @@
"VoIP conference finished.": "VoIP conference finished.", "VoIP conference finished.": "VoIP conference finished.",
"VoIP conference started.": "VoIP conference started.", "VoIP conference started.": "VoIP conference started.",
"VoIP is unsupported": "VoIP is unsupported", "VoIP is unsupported": "VoIP is unsupported",
"(could not connect media)": "(could not connect media)",
"(no answer)": "(no answer)",
"(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)",
"(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)", "(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)",
"Warning!": "Warning!", "Warning!": "Warning!",
"WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!", "WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!",
@ -589,7 +587,7 @@
"Would you like to": "Would you like to", "Would you like to": "Would you like to",
"You are already in a call.": "You are already in a call.", "You are already in a call.": "You are already in a call.",
"You're not in any rooms yet! Press": "You're not in any rooms yet! Press", "You're not in any rooms yet! Press": "You're not in any rooms yet! Press",
"You are trying to access %(roomName)s": "You are trying to access %(roomName)s", "You are trying to access %(roomName)s.": "You are trying to access %(roomName)s.",
"You cannot place a call with yourself.": "You cannot place a call with yourself.", "You cannot place a call with yourself.": "You cannot place a call with yourself.",
"You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.", "You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.",
"You do not have permission to post to this room": "You do not have permission to post to this room", "You do not have permission to post to this room": "You do not have permission to post to this room",
@ -610,7 +608,7 @@
"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?", "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?",
"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 uploading files, 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": "You should not yet trust it to secure data", "You should not yet trust it to secure data": "You should not yet trust it to secure data",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.",
"Sun": "Sun", "Sun": "Sun",
"Mon": "Mon", "Mon": "Mon",
"Tue": "Tue", "Tue": "Tue",
@ -645,7 +643,7 @@
"User names may only contain letters, numbers, dots, hyphens and underscores.": "User names may only contain letters, numbers, dots, hyphens and underscores.", "User names may only contain letters, numbers, dots, hyphens and underscores.": "User names may only contain letters, numbers, dots, hyphens and underscores.",
"An unknown error occurred.": "An unknown error occurred.", "An unknown error occurred.": "An unknown error occurred.",
"I already have an account": "I already have an account", "I already have an account": "I already have an account",
"An error occured: %(error_string)s": "An error occured: %(error_string)s", "An error occurred: %(error_string)s": "An error occurred: %(error_string)s",
"Topic": "Topic", "Topic": "Topic",
"Make Moderator": "Make Moderator", "Make Moderator": "Make Moderator",
"Make this room private": "Make this room private", "Make this room private": "Make this room private",
@ -814,7 +812,7 @@
"Enable URL previews for this room (affects only you)": "Enable URL previews for this room (affects only you)", "Enable URL previews for this room (affects only you)": "Enable URL previews for this room (affects only you)",
"Drop file here to upload": "Drop file here to upload", "Drop file here to upload": "Drop file here to upload",
" (unsupported)": " (unsupported)", " (unsupported)": " (unsupported)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Ongoing conference call%(supportedText)s. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Ongoing conference call%(supportedText)s.",
"for %(amount)ss": "for %(amount)ss", "for %(amount)ss": "for %(amount)ss",
"for %(amount)sm": "for %(amount)sm", "for %(amount)sm": "for %(amount)sm",
"for %(amount)sh": "for %(amount)sh", "for %(amount)sh": "for %(amount)sh",
@ -825,5 +823,101 @@
"Disable URL previews for this room (affects only you)": "Disable URL previews for this room (affects only you)", "Disable URL previews for this room (affects only you)": "Disable URL previews for this room (affects only you)",
"$senderDisplayName changed the room avatar to <img/>": "$senderDisplayName changed the room avatar to <img/>", "$senderDisplayName changed the room avatar to <img/>": "$senderDisplayName changed the room avatar to <img/>",
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s" "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s",
"Active call (%(roomName)s)": "Active call (%(roomName)s)",
"Accept": "Accept",
"a room": "a room",
"Add": "Add",
"Admin tools": "Admin tools",
"And %(count)s more...": "And %(count)s more...",
"Alias (optional)": "Alias (optional)",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.",
"<a>Click here</a> to join the discussion!": "<a>Click here</a> to join the discussion!",
"Close": "Close",
"%(count)s new messages.one": "%(count)s new message",
"%(count)s new messages.other": "%(count)s new messages",
"Custom": "Custom",
"Decline": "Decline",
"Disable markdown formatting": "Disable markdown formatting",
"Disable Notifications": "Disable Notifications",
"Enable Notifications": "Enable Notifications",
"Create new room": "Create new room",
"Room directory": "Room directory",
"Start chat": "Start chat",
"Welcome page": "Welcome page",
"Create a new chat or reuse an existing one": "Create a new chat or reuse an existing one",
"Drop File Here": "Drop File Here",
"Encrypted by a verified device": "Encrypted by a verified device",
"Encrypted by an unverified device": "Encrypted by an unverified device",
"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",
"Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.",
"Failed to fetch avatar URL": "Failed to fetch avatar URL",
"Failed to upload profile picture!": "Failed to upload profile picture!",
"Home": "Home",
"Incoming call from %(name)s": "Incoming call from %(name)s",
"Incoming video call from %(name)s": "Incoming video call from %(name)s",
"Incoming voice call from %(name)s": "Incoming voice call from %(name)s",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.",
"Last seen": "Last seen",
"Level:": "Level:",
"No display name": "No display name",
"Otherwise, <a>click here</a> to send a bug report.": "Otherwise, <a>click here</a> to send a bug report.",
"Private Chat": "Private Chat",
"Public Chat": "Public Chat",
"Reason: %(reasonText)s": "Reason: %(reasonText)s",
"Rejoin": "Rejoin",
"Room contains unknown devices": "Room contains unknown devices",
"%(roomName)s does not exist.": "%(roomName)s does not exist.",
"%(roomName)s is not accessible at this time.": "%(roomName)s is not accessible at this time.",
"Searching known users": "Searching known users",
"Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s",
"Send anyway": "Send anyway",
"Set": "Set",
"Show Text Formatting Toolbar": "Show Text Formatting Toolbar",
"Start authentication": "Start authentication",
"The phone number entered looks invalid": "The phone number entered looks invalid",
"This invitation was sent to an email address which is not associated with this account:": "This invitation was sent to an email address which is not associated with this account:",
"This room": "This room",
"To link to a room it must have <a>an address</a>.": "To link to a room it must have <a>an address</a>.",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Unable to ascertain that the address this invite was sent to matches one associated with your account.",
"Undecryptable": "Undecryptable",
"Unencrypted message": "Unencrypted message",
"unknown caller": "unknown caller",
"Unnamed Room": "Unnamed Room",
"Unverified": "Unverified",
"Uploading %(filename)s and %(count)s others.zero": "Uploading %(filename)s",
"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",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?",
"You already have existing direct chats with this user:": "You already have existing direct chats with this user:",
"You have been banned from %(roomName)s by %(userName)s.": "You have been banned from %(roomName)s by %(userName)s.",
"You have been kicked from %(roomName)s by %(userName)s.": "You have been kicked from %(roomName)s by %(userName)s.",
"You may wish to login with a different account, or add this email to this account.": "You may wish to login with a different account, or add this email to this account.",
"You must <a>register</a> to use this functionality": "You must <a>register</a> to use this functionality",
"Your home server does not support device management.": "Your home server does not support device management.",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.",
"(~%(count)s results).one": "(~%(count)s result)",
"(~%(count)s results).other": "(~%(count)s results)",
"New Password": "New Password",
"Device Name": "Device Name",
"Start chatting": "Start chatting",
"Start Chatting": "Start Chatting",
"Click on the button below to start chatting!": "Click on the button below to start chatting!",
"Username available": "Username available",
"Username not available": "Username not available",
"Something went wrong!": "Something went wrong!",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.",
"If you already have a Matrix account you can <a>log in</a> instead.": "If you already have a Matrix account you can <a>log in</a> instead.",
"Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions",
"Not a valid Riot keyfile": "Not a valid Riot keyfile",
"Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?",
"Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls",
"Do you want to set an email address?": "Do you want to set an email address?",
"This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications."
} }

View file

@ -1,5 +1,5 @@
{ {
"af": "Africano", "af": "Afrikáans",
"ar-ae": "Árabe (Emiratos Árabes Unidos)", "ar-ae": "Árabe (Emiratos Árabes Unidos)",
"ar-bh": "Árabe (Baréin)", "ar-bh": "Árabe (Baréin)",
"ar-dz": "Árabe (Argelia)", "ar-dz": "Árabe (Argelia)",
@ -119,7 +119,6 @@
"zh-sg": "Chino (Singapur)", "zh-sg": "Chino (Singapur)",
"zh-tw": "Chino (Taiwanés)", "zh-tw": "Chino (Taiwanés)",
"zu": "Zulú", "zu": "Zulú",
"A registered account is required for this action": "Una cuenta registrada es necesaria para esta acción",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un mensaje de texto ha sido enviado a +%(msisdn)s. Por favor ingrese el código de verificación que lo contiene", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un mensaje de texto ha sido enviado a +%(msisdn)s. Por favor ingrese el código de verificación que lo contiene",
"accept": "Aceptar", "accept": "Aceptar",
"%(targetName)s accepted an invitation.": "%(targetName)s ha aceptado una invitación.", "%(targetName)s accepted an invitation.": "%(targetName)s ha aceptado una invitación.",
@ -219,7 +218,7 @@
"Devices will not yet be able to decrypt history from before they joined the room": "Los dispositivos aun no serán capaces de descifrar el historial antes de haberse unido a la sala", "Devices will not yet be able to decrypt history from before they joined the room": "Los dispositivos aun no serán capaces de descifrar el historial antes de haberse unido a la sala",
"Direct Chat": "Conversación directa", "Direct Chat": "Conversación directa",
"Direct chats": "Conversaciones directas", "Direct chats": "Conversaciones directas",
"Disable inline URL previews by default": "Deshabilitar previsualizacón de enlaces por defecto", "Disable inline URL previews by default": "Desactivar previsualización de enlaces por defecto",
"Disinvite": "Deshacer invitación", "Disinvite": "Deshacer invitación",
"Display name": "Nombre para mostrar", "Display name": "Nombre para mostrar",
"Displays action": "Mostrar acción", "Displays action": "Mostrar acción",
@ -237,7 +236,7 @@
"Encrypted room": "Sala encriptada", "Encrypted room": "Sala encriptada",
"%(senderName)s ended the call.": "%(senderName)s terminó la llamada.", "%(senderName)s ended the call.": "%(senderName)s terminó la llamada.",
"End-to-end encryption information": "Información de encriptación de extremo a extremo", "End-to-end encryption information": "Información de encriptación de extremo a extremo",
"End-to-end encryption is in beta and may not be reliable": "Encriptación de extremo a extremo, esta en version beta y no podría ser confiable", "End-to-end encryption is in beta and may not be reliable": "El cifrado de extremo a extremo está en pruebas, podría no ser fiable",
"Enter Code": "Ingresar Código", "Enter Code": "Ingresar Código",
"Error": "Error", "Error": "Error",
"Error decrypting attachment": "Error al descifrar adjunto", "Error decrypting attachment": "Error al descifrar adjunto",
@ -266,9 +265,9 @@
"Failed to set up conference call": "Falló al configurar la llamada en conferencia", "Failed to set up conference call": "Falló al configurar la llamada en conferencia",
"Failed to toggle moderator status": "Falló al cambiar estatus de moderador", "Failed to toggle moderator status": "Falló al cambiar estatus de moderador",
"Failed to unban": "Falló al desbloquear", "Failed to unban": "Falló al desbloquear",
"Failed to upload file": "Falló al subir archivo", "Failed to upload file": "Error en el envío del fichero",
"Failed to verify email address: make sure you clicked the link in the email": "Falló al verificar el correo electrónico: Asegúrese hacer clic en el enlace del correo", "Failed to verify email address: make sure you clicked the link in the email": "Falló al verificar el correo electrónico: Asegúrese hacer clic en el enlace del correo",
"Failure to create room": "Falló al crear sala", "Failure to create room": "Fallo al crear la sala",
"Favourite": "Favorito", "Favourite": "Favorito",
"favourite": "favorito", "favourite": "favorito",
"Favourites": "Favoritos", "Favourites": "Favoritos",
@ -282,7 +281,7 @@
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s a %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s a %(toPowerLevel)s",
"Guests can't set avatars. Please register.": "Invitados no puedes establecer avatares. Por favor regístrate.", "Guests can't set avatars. Please register.": "Invitados no puedes establecer avatares. Por favor regístrate.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Usuarios invitados no pueden crear nuevas salas. Por favor regístrate para crear la sala y iniciar la conversación.", "Guest users can't create new rooms. Please register to create room and start a chat.": "Usuarios invitados no pueden crear nuevas salas. Por favor regístrate para crear la sala y iniciar la conversación.",
"Guest users can't upload files. Please register to upload": "Usuarios invitados no puedes subir archivos. Por favor regístrate para subir tus archivos", "Guest users can't upload files. Please register to upload.": "Usuarios invitados no puedes subir archivos. Por favor regístrate para subir tus archivos.",
"Guests can't use labs features. Please register.": "Invitados no puedes usar las características en desarrollo. Por favor regístrate.", "Guests can't use labs features. Please register.": "Invitados no puedes usar las características en desarrollo. Por favor regístrate.",
"Guests cannot join this room even if explicitly invited.": "Invitados no pueden unirse a esta sala aun cuando han sido invitados explícitamente.", "Guests cannot join this room even if explicitly invited.": "Invitados no pueden unirse a esta sala aun cuando han sido invitados explícitamente.",
"had": "tuvo", "had": "tuvo",
@ -327,5 +326,301 @@
"Logged in as:": "Sesión iniciada como:", "Logged in as:": "Sesión iniciada como:",
"Login as guest": "Iniciar sesión como invitado", "Login as guest": "Iniciar sesión como invitado",
"Logout": "Cerrar Sesión", "Logout": "Cerrar Sesión",
"Low priority": "Baja prioridad" "Low priority": "Baja prioridad",
"Accept": "Aceptar",
"Add": "Añadir",
"Admin tools": "Herramientas de administración",
"VoIP": "Voz IP",
"No Microphones detected": "No se ha detectado micrófono",
"No Webcams detected": "No se ha detectado cámara",
"Default Device": "Dispositivo por defecto",
"Microphone": "Micrófono",
"Camera": "Cámara",
"Hide removed messages": "Ocultar mensajes borrados",
"Alias (optional)": "Alias (opcional)",
"Anyone": "Cualquiera",
"<a>Click here</a> to join the discussion!": "¡<a>Pulse aquí</a> para unirse a la conversación!",
"Close": "Cerrar",
"%(count)s new messages.one": "%(count)s mensaje nuevo",
"%(count)s new messages.other": "%(count)s mensajes nuevos",
"Create a new chat or reuse an existing one": "Cree una nueva conversación o reutilice una existente",
"Custom": "Personalizado",
"Custom level": "Nivel personalizado",
"Decline": "Rechazar",
"Device already verified!": "¡El dispositivo ya ha sido verificado!",
"Device ID:": "ID del dispositivo:",
"device id: ": "id del dispositvo: ",
"Disable Notifications": "Desactivar notificaciones",
"disabled": "desactivado",
"Email address (optional)": "Dirección e-mail (opcional)",
"Enable Notifications": "Activar notificaciones",
"enabled": "activado",
"Encrypted by a verified device": "Cifrado por un dispositivo verificado",
"Encrypted by an unverified device": "Cifrado por un dispositivo sin verificar",
"Encryption is enabled in this room": "Cifrado activo en esta sala",
"Encryption is not enabled in this room": "Cifrado desactivado en esta sala",
"Enter passphrase": "Introduzca contraseña",
"Error: Problem communicating with the given homeserver.": "Error: No es posible comunicar con el servidor indicado.",
"Export": "Exportar",
"Failed to fetch avatar URL": "Fallo al obtener la URL del avatar",
"Failed to register as guest:": "Fallo al registrarse como invitado:",
"Failed to upload profile picture!": "¡Fallo al enviar la foto de perfil!",
"Home": "Inicio",
"Import": "Importar",
"Incoming call from %(name)s": "Llamada de %(name)s",
"Incoming video call from %(name)s": "Video-llamada de %(name)s",
"Incoming voice call from %(name)s": "Llamada telefónica de %(name)s",
"Incorrect username and/or password.": "Usuario o contraseña incorrectos.",
"Invited": "Invitado",
"Jump to first unread message.": "Ir al primer mensaje sin leer.",
"Last seen": "Visto por última vez",
"Level:": "Nivel:",
"%(senderName)s made future room history visible to": "%(senderName)s ha configurado el historial de la sala visible para",
"a room": "una sala",
"Something went wrong!": "¡Algo ha fallado!",
"were banned": "fueron expulsados",
"was banned": "fue expulsado",
"were unbanned %(repeats)s times": "fueron readmitidos %(repeats)s veces",
"was unbanned %(repeats)s times": "fue readmitido %(repeats)s veces",
"were unbanned": "fueron readmitidos",
"was unbanned": "fue readmitido",
"were kicked %(repeats)s times": "fueron pateados %(repeats)s veces",
"was kicked %(repeats)s times": "fue pateado %(repeats)s veces",
"were kicked": "fueron pateados",
"was kicked": "fue pateado",
"%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)s cambiaron su nombre %(repeats)s veces",
"%(oneUser)schanged their name %(repeats)s times": "%(oneUser)s cambió su nombre %(repeats)s veces",
"%(severalUsers)schanged their name": "%(severalUsers)s cambiaron su nombre",
"%(oneUser)schanged their name": "%(oneUser)s cambió su nombre",
"%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers)s cambiaron su avatar %(repeats)s veces",
"%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)s cambió su avatar %(repeats)s veces",
"%(severalUsers)schanged their avatar": "%(severalUsers)s cambiaron su avatar",
"%(oneUser)schanged their avatar": "%(oneUser)s cambió su avatar",
"Please select the destination room for this message": "Por favor, seleccione la sala destino para este mensaje",
"Create new room": "Crear nueva sala",
"Welcome page": "Página de bienvenida",
"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",
"Export room keys": "Exportar las claves de la sala",
"Confirm passphrase": "Confirmar contraseña",
"Import room keys": "Importar las claves de la sala",
"File to import": "Fichero a importar",
"You must join the room to see its files": "Debe unirse a la sala para ver los ficheros",
"Reject all %(invitedRooms)s invites": "Rechazar todas las invitaciones a %(invitedRooms)s",
"Start new chat": "Iniciar una nueva conversación",
"Guest users can't invite users. Please register.": "Los invitados no pueden invitar a otros usuarios. Por favor, regístrese.",
"Failed to invite": "Fallo en la invitación",
"Failed to invite user": "No se pudo invitar al usuario",
"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",
"Device key": "Clave del dispositivo",
"In future this verification process will be more sophisticated.": "En el futuro este proceso de verificación será mejorado.",
"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)",
"%(roomName)s does not exist.": "%(roomName)s no existe.",
"%(roomName)s is not accessible at this time.": "%(roomName)s no es accesible en este momento.",
"Rooms": "Salas",
"Save": "Guardar",
"Scroll to bottom of page": "Bajar al final de la página",
"Scroll to unread messages": "Ir al primer mensaje sin leer",
"Search": "Búsqueda",
"Search failed": "Falló la búsqueda",
"Searching known users": "Buscando usuarios conocidos",
"Seen by %(userName)s at %(dateTime)s": "Visto por %(userName)s el %(dateTime)s",
"Send a message (unencrypted)": "Enviar un mensaje (sin cifrar)",
"Send an encrypted message": "Enviar un mensaje cifrado",
"Send anyway": "Enviar igualmente",
"Sender device information": "Información del dispositivo del remitente",
"Send Invites": "Enviar invitaciones",
"Send Reset Email": "Enviar e-mail de reinicio",
"sent an image": "envió una imagen",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s envió una imagen.",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s invitó a %(targetDisplayName)s a unirse a la sala.",
"sent a video": "envió un vídeo",
"Server error": "Error del servidor",
"Server may be unavailable, overloaded, or search timed out :(": "El servidor podría estar saturado o desconectado, o la búsqueda caducó :(",
"Server may be unavailable, overloaded, or the file too big": "El servidor podría estar saturado o desconectado, o el fichero ser demasiado grande",
"Server may be unavailable, overloaded, or you hit a bug.": "El servidor podría estar saturado o desconectado, o encontraste un fallo.",
"Server unavailable, overloaded, or something else went wrong.": "Servidor saturado, desconectado, o alguien ha roto algo.",
"Session ID": "ID de sesión",
"%(senderName)s set a profile picture.": "%(senderName)s puso una foto de perfil.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s cambió su nombre a %(displayName)s.",
"Set": "Configurar",
"Settings": "Configuración",
"Show panel": "Mostrar panel",
"Show Text Formatting Toolbar": "Mostrar la barra de formato de texto",
"Signed Out": "Desconectado",
"Sign in": "Conectar",
"Sign out": "Desconectar",
"since the point in time of selecting this option": "a partir del momento en que seleccione esta opción",
"since they joined": "desde que se conectaron",
"since they were invited": "desde que fueron invitados",
"Some of your messages have not been sent.": "Algunos de sus mensajes no han sido enviados.",
"Someone": "Alguien",
"Sorry, this homeserver is using a login which is not recognised ": "Lo siento, este servidor está usando un usuario no reconocido. ",
"Start a chat": "Iniciar una conversación",
"Start authentication": "Comenzar la identificación",
"Start Chat": "Comenzar la conversación",
"Submit": "Enviar",
"Success": "Éxito",
"tag as %(tagName)s": "etiquetar como %(tagName)s",
"tag direct chat": "etiquetar la conversación directa",
"Tagged as: ": "Etiquetado como: ",
"The default role for new room members is": "El nivel por defecto para los nuevos miembros de esta sala es",
"The main address for this room is": "La dirección principal de esta sala es",
"The phone number entered looks invalid": "El número de teléfono indicado parece erróneo",
"Active call (%(roomName)s)": "Llamada activa (%(roomName)s)",
"Add a topic": "Añadir un tema",
"Missing Media Permissions, click here to request.": "Faltan permisos para el medio, pulse aquí para solicitarlos.",
"No media permissions": "Sin permisos para el medio",
"You may need to manually permit Riot to access your microphone/webcam": "Probablemente necesite dar permisos manualmente a Riot para su micrófono/cámara",
"Are you sure you want to leave the room '%(roomName)s'?": "¿Está seguro de que desea abandonar la sala '%(roomName)s'?",
"Are you sure you want to upload the following files?": "¿Está seguro que desea enviar los siguientes archivos?",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "No se puede conectar al servidor - compruebe su conexión, asegúrese de que el <a>certificado SSL del servidor</a> es de confiaza, y compruebe que no hay extensiones del navegador bloqueando las peticiones.",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha quitado el nombre de la sala.",
"Device key:": "Clave del dispositivo:",
"Disable markdown formatting": "Desactivar el formato Markdown",
"Drop File Here": "Deje el fichero aquí",
"Guest access is disabled on this Home Server.": "El acceso de invitados está desactivado en este servidor.",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Conecte con <voiceText>voz</voiceText> o <videoText>vídeo</videoText>.",
"List this room in %(domain)s's room directory?": "¿Mostrar esta sala en el directorio de %(domain)s?",
"Manage Integrations": "Gestionar integraciones",
"Markdown is disabled": "Markdown está desactivado",
"Markdown is enabled": "Markdown está activado",
"matrix-react-sdk version:": "Versión de matrix-react-sdk:",
"Members only": "Sólo para miembros",
"Message not sent due to unknown devices being present": "Mensaje no enviado debido a la presencia de dispositivos desconocidos",
"Missing room_id in request": "Falta el ID de sala en la petición",
"Missing user_id in request": "Falta el ID de usuario en la petición",
"Mobile phone number": "Número de teléfono móvil",
"Mobile phone number (optional)": "Número de teléfono móvil (opcional)",
"Moderator": "Moderador",
"Must be viewing a room": "Debe estar viendo una sala",
"Mute": "Silenciar",
"my Matrix ID": "Mi ID de Matrix",
"Name": "Nombre",
"Never send encrypted messages to unverified devices from this device": "No enviar nunca mensajes cifrados, desde este dispositivo, a dispositivos sin verificar",
"Never send encrypted messages to unverified devices in this room": "No enviar nunca mensajes cifrados a dispositivos no verificados, en esta sala",
"Never send encrypted messages to unverified devices in this room from this device": "No enviar nunca mensajes cifrados a dispositivos no verificados, en esta sala, desde este dispositivo",
"New address (e.g. #foo:%(localDomain)s)": "Nueva dirección (ej: #foo:%(localDomain)s)",
"New password": "Nueva contraseña",
"New passwords don't match": "Las nuevas contraseñas no coinciden",
"New passwords must match each other.": "Las nuevas contraseñas deben coincidir.",
"none": "ninguno",
"not set": "sin configurar",
"not specified": "sin especificar",
"Notifications": "Notificaciones",
"(not supported by this browser)": "(no soportado por este navegador)",
"<not supported>": "<no soportado>",
"NOT verified": "NO verificado",
"No devices with registered encryption keys": "No hay dispositivos con claves de cifrado registradas",
"No display name": "Sin nombre para mostrar",
"No more results": "No hay más resultados",
"No results": "Sin resultados",
"No users have specific privileges in this room": "Ningún usuario tiene permisos específicos en esta sala",
"OK": "Correcto",
"olm version:": "versión de olm:",
"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, <a>click here</a> to send a bug report.": "También puede <a>pulsar aquí</a> 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",
"People": "Gente",
"Permissions": "Permisos",
"Phone": "Teléfono",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s ha hecho una llamada de tipo %(callType)s.",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor, compruebe su e-mail y pulse el enlace que contiene. Una vez esté hecho, pulse continuar.",
"Please Register": "Por favor, regístrese",
"Power level must be positive integer.": "El nivel debe ser un entero positivo.",
"Press": "Pulse",
"Privacy warning": "Alerta de privacidad",
"Private Chat": "Conversación privada",
"Privileged Users": "Usuarios con privilegios",
"Profile": "Perfil",
"Public Chat": "Sala pública",
"Reason": "Razón",
"Reason: %(reasonText)s": "Razón: %(reasonText)s",
"Revoke Moderator": "Eliminar Moderador",
"Refer a friend to Riot:": "Informar a un amigo sobre Riot:",
"Register": "Registrarse",
"rejected": "rechazado",
"%(targetName)s rejected the invitation.": "%(targetName)s ha rechazado la invitación.",
"Reject invitation": "Rechazar invitación",
"Rejoin": "Volver a unirse",
"Remote addresses for this room:": "Dirección remota de esta sala:",
"Remove Contact Information?": "¿Eliminar información del contacto?",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha suprimido su nombre para mostar (%(oldDisplayName)s).",
"%(senderName)s removed their profile picture.": "%(senderName)s ha eliminado su foto de perfil.",
"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.",
"restore": "restaurar",
"Results from DuckDuckGo": "Resultados desde DuckDuckGo",
"Return to app": "Volver a la aplicación",
"Return to login screen": "Volver a la pantalla de inicio de sesión",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot no tiene permisos para enviarle notificaciones - por favor, revise la configuración del navegador",
"Riot was not given permission to send notifications - please try again": "Riot no pudo obtener permisos para enviar notificaciones - por favor, inténtelo de nuevo",
"riot-web version:": "versión riot-web:",
"Room %(roomId)s not visible": "La sala %(roomId)s no es visible",
"Searches DuckDuckGo for results": "Busca en DuckDuckGo",
"Server may be unavailable or overloaded": "El servidor podría estar saturado o desconectado",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Mostrar el tiempo en formato 12h (am/pm)",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La clave de firma que usted ha proporcionado coincide con la recibida del dispositivo %(deviceId)s de %(userId)s. Dispositivo verificado.",
"This action cannot be performed by a guest user. Please register to be able to do this.": "Esto no puede ser hecho por un invitado. Por favor, regístrese para poder hacerlo.",
"This email address is already in use": "Dirección e-mail en uso",
"This email address was not found": "Dirección e-mail no encontrada",
"%(actionVerb)s this person?": "¿%(actionVerb)s a esta persona?",
"The email address linked to your account must be entered.": "Debe introducir el e-mail asociado a su cuenta.",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "El fichero '%(fileName)s' excede el tamaño máximo permitido en este servidor",
"The file '%(fileName)s' failed to upload": "Se produjo un fallo al enviar '%(fileName)s'",
"The remote side failed to pick up": "El sitio remoto falló al sincronizar",
"This Home Server does not support login using email address.": "Este servidor no permite identificarse con direcciones e-mail.",
"This invitation was sent to an email address which is not associated with this account:": "Se envió la invitación a un e-mail no asociado con esta cuenta:",
"There was a problem logging in.": "Hubo un problema identificándose.",
"This room has no local addresses": "Esta sala no tiene direcciones locales",
"This room is not recognised.": "Esta sala no se reconoce.",
"These are experimental features that may break in unexpected ways": "Estas son funcionalidades experimentales, podrían fallar de formas imprevistas",
"The visibility of existing history will be unchanged": "La visibilidad del historial previo no se verá afectada",
"This doesn't appear to be a valid email address": "Esto no parece un e-mail váido",
"This is a preview of this room. Room interactions have been disabled": "Esto es una vista previa de la sala. Las interacciones con la sala están desactivadas",
"This phone number is already in use": "Este número de teléfono ya se está usando",
"This room": "Esta sala",
"This room is not accessible by remote Matrix servers": "Esta sala no es accesible por otros servidores Matrix",
"This room's internal ID is": "El ID interno de la sala es",
"times": "veces",
"To ban users": "Expulsar usuarios",
"to browse the directory": "navegar el directorio",
"To configure the room": "Configurar la sala",
"to demote": "degradar",
"to favourite": "marcar como favorito",
"To invite users into the room": "Invitar usuarios a la sala",
"To kick users": "Patear usuarios",
"To link to a room it must have <a>an address</a>.": "Para enlazar una sala, debe tener <a>una dirección</a>.",
"to make a room or": "hacer una sala o",
"To remove other users' messages": "Eliminar los mensajes de otros usuarios",
"To reset your password, enter the email address linked to your account": "Para reiniciar su contraseña, introduzca el e-mail asociado a su cuenta",
"to restore": "restaurar",
"Cancel": "Cancelar",
"Dismiss": "Omitir",
"powered by Matrix": "con el poder de Matrix",
"Room directory": "Directorio de salas"
} }

View file

@ -129,7 +129,7 @@
"Don't send typing notifications": "Ne pas envoyer les notifications de saisie", "Don't send typing notifications": "Ne pas envoyer les notifications de saisie",
"Download %(text)s": "Télécharger %(text)s", "Download %(text)s": "Télécharger %(text)s",
"Drop here %(toAction)s": "Déposer ici %(toAction)s", "Drop here %(toAction)s": "Déposer ici %(toAction)s",
"Drop here to tag %(section)s": "Déposer ici pour marque comme %(section)s", "Drop here to tag %(section)s": "Déposer ici pour marquer comme %(section)s",
"Ed25519 fingerprint": "Empreinte Ed25519", "Ed25519 fingerprint": "Empreinte Ed25519",
"Email Address": "Adresse e-mail", "Email Address": "Adresse e-mail",
"Email, name or matrix ID": "E-mail, nom ou identifiant Matrix", "Email, name or matrix ID": "E-mail, nom ou identifiant Matrix",
@ -272,7 +272,6 @@
"Failed to set display name": "Échec lors de l'enregistrement du nom d'affichage", "Failed to set display name": "Échec lors de l'enregistrement du nom d'affichage",
"Failed to set up conference call": "Échec lors de létablissement de lappel", "Failed to set up conference call": "Échec lors de létablissement de lappel",
"Failed to toggle moderator status": "Échec lors de létablissement du statut de modérateur", "Failed to toggle moderator status": "Échec lors de létablissement du statut de modérateur",
"A registered account is required for this action": "Il est nécessaire davoir un compte enregistré pour effectuer cette action",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s a accepté linvitation de %(displayName)s.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s a accepté linvitation de %(displayName)s.",
"Access Token:": "Jeton daccès :", "Access Token:": "Jeton daccès :",
"Always show message timestamps": "Toujours afficher l'heure des messages", "Always show message timestamps": "Toujours afficher l'heure des messages",
@ -282,7 +281,7 @@
"Email": "E-mail", "Email": "E-mail",
"Failed to unban": "Échec de l'amnistie", "Failed to unban": "Échec de l'amnistie",
"Failed to upload file": "Échec du téléchargement", "Failed to upload file": "Échec du téléchargement",
"Failed to verify email address: make sure you clicked the link in the email": "Échec de la vérification de ladresse e-mail: vérifiez que vous avez bien cliqué sur le lien dans le-mail", "Failed to verify email address: make sure you clicked the link in the email": "Échec de la vérification de ladresse e-mail : vérifiez que vous avez bien cliqué sur le lien dans le-mail",
"Failure to create room": "Échec de la création du salon", "Failure to create room": "Échec de la création du salon",
"favourite": "favoris", "favourite": "favoris",
"Favourites": "Favoris", "Favourites": "Favoris",
@ -290,15 +289,15 @@
"Filter room members": "Filtrer les membres par nom", "Filter room members": "Filtrer les membres par nom",
"Forget room": "Oublier le salon", "Forget room": "Oublier le salon",
"Forgot your password?": "Mot de passe perdu ?", "Forgot your password?": "Mot de passe perdu ?",
"For security, this session has been signed out. Please sign in again.": "Par sécurité, la session a expiré. Merci de vous authentifer à nouveau.", "For security, this session has been signed out. Please sign in again.": "Par sécurité, la session a expiré. Merci de vous authentifier à nouveau.",
"Found a bug?": "Trouvé un problème ?", "Found a bug?": "Trouvé un problème ?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Les visiteurs ne peuvent créer de nouveaux salons. Merci de vous enregistrer pour commencer une discussion.", "Guest users can't create new rooms. Please register to create room and start a chat.": "Les visiteurs ne peuvent créer de nouveaux salons. Merci de vous enregistrer pour commencer une discussion.",
"Guest users can't upload files. Please register to upload": "Les visiteurs ne peuvent telécharger de fichiers. Merci de vous enregistrer pour télécharger", "Guest users can't upload files. Please register to upload.": "Les visiteurs ne peuvent pas télécharger de fichier. Veuillez vous enregistrer pour télécharger.",
"had": "avait", "had": "avait",
"Hangup": "Raccrocher", "Hangup": "Raccrocher",
"Hide read receipts": "Cacher les accusés de réception", "Hide read receipts": "Cacher les accusés de réception",
"Hide Text Formatting Toolbar": "Cacher la barre de formattage de texte", "Hide Text Formatting Toolbar": "Cacher la barre de formatage de texte",
"Historical": "Historique", "Historical": "Historique",
"Homeserver is": "Le homeserver est", "Homeserver is": "Le homeserver est",
"Identity Server is": "Le serveur d'identité est", "Identity Server is": "Le serveur d'identité est",
@ -325,8 +324,8 @@
"%(targetName)s joined the room.": "%(targetName)s a joint le salon.", "%(targetName)s joined the room.": "%(targetName)s a joint le salon.",
"Joins room with given alias": "Joint le salon avec l'alias défini", "Joins room with given alias": "Joint le salon avec l'alias défini",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s a expulsé %(targetName)s.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s a expulsé %(targetName)s.",
"Kick": "Expluser", "Kick": "Expulser",
"Kicks user with given id": "Expulse l'utilisateur and l'ID donné", "Kicks user with given id": "Expulse l'utilisateur avec l'ID donné",
"Labs": "Laboratoire", "Labs": "Laboratoire",
"Leave room": "Quitter le salon", "Leave room": "Quitter le salon",
"left and rejoined": "a quitté et rejoint", "left and rejoined": "a quitté et rejoint",
@ -386,7 +385,7 @@
"Email address": "Adresse e-mail", "Email address": "Adresse e-mail",
"Error decrypting attachment": "Erreur lors du déchiffrement de la pièce jointe", "Error decrypting attachment": "Erreur lors du déchiffrement de la pièce jointe",
"Failed to set avatar.": "Erreur lors de la définition de la photo de profil.", "Failed to set avatar.": "Erreur lors de la définition de la photo de profil.",
"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.": "Par sécurité une deconnexion supprimera toutes les clés dencryption de cet explorateur. Si vous voulez être capable de décrypter lhistorique de votre conversation lors de sessions futures de Riot, merci dexporter les clés pour le salon.", "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.": "Par sécurité une déconnexion supprimera toutes les clés dencryption de ce navigateur. Si vous voulez être capable de décrypter lhistorique de votre conversation lors de sessions futures de Riot, merci dexporter les clés pour le salon.",
"Guests can't set avatars. Please register.": "Les visiteurs ne peuvent définir de photo de profil. Merci de vous enregistrer.", "Guests can't set avatars. Please register.": "Les visiteurs ne peuvent définir de photo de profil. Merci de vous enregistrer.",
"Guests can't use labs features. Please register.": "Les visiteurs ne peuvent utiliser les fonctionalités du laboratoire. Merci de vous enregistrer.", "Guests can't use labs features. Please register.": "Les visiteurs ne peuvent utiliser les fonctionalités du laboratoire. Merci de vous enregistrer.",
"Guests cannot join this room even if explicitly invited.": "Les visiteurs ne peuvent rejoindre ce salon, même si explicitement invités.", "Guests cannot join this room even if explicitly invited.": "Les visiteurs ne peuvent rejoindre ce salon, même si explicitement invités.",
@ -405,7 +404,6 @@
"Reason": "Raison", "Reason": "Raison",
"Revoke Moderator": "Révoquer le Modérateur", "Revoke Moderator": "Révoquer le Modérateur",
"Refer a friend to Riot:": "Recommander Riot à un ami :", "Refer a friend to Riot:": "Recommander Riot à un ami :",
"Registration required": "Inscription requise",
"rejected": "rejeté", "rejected": "rejeté",
"%(targetName)s rejected the invitation.": "%(targetName)s a rejeté linvitation.", "%(targetName)s rejected the invitation.": "%(targetName)s a rejeté linvitation.",
"Reject invitation": "Rejeter l'invitation", "Reject invitation": "Rejeter l'invitation",
@ -453,11 +451,11 @@
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Afficher lheure au format am/pm (par ex. 2:30pm)", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Afficher lheure au format am/pm (par ex. 2:30pm)",
"Signed Out": "Déconnecté", "Signed Out": "Déconnecté",
"Sign in": "S'identifier", "Sign in": "S'identifier",
"Sign out": "Se Déconnecter", "Sign out": "Se déconnecter",
"since the point in time of selecting this option": "depuis le moment où cette option a été sélectionnée", "since the point in time of selecting this option": "depuis le moment où cette option a été sélectionnée",
"since they joined": "depuis quils ont rejoint le salon", "since they joined": "depuis quils ont rejoint le salon",
"since they were invited": "depuis quils ont été invités", "since they were invited": "depuis quils ont été invités",
"Some of your messages have not been sent": "Certains de vos messages nont pas été envoyés", "Some of your messages have not been sent.": "Certains de vos messages nont pas été envoyés.",
"Someone": "Quelqu'un", "Someone": "Quelqu'un",
"Sorry, this homeserver is using a login which is not recognised ": "Désolé, ce homeserver utilise un identifiant qui nest pas reconnu ", "Sorry, this homeserver is using a login which is not recognised ": "Désolé, ce homeserver utilise un identifiant qui nest pas reconnu ",
"Start a chat": "Démarrer une conversation", "Start a chat": "Démarrer une conversation",
@ -468,7 +466,7 @@
"tag direct chat": "marquer comme conversation directe", "tag direct chat": "marquer comme conversation directe",
"The default role for new room members is": "Le rôle par défaut des nouveaux membres est", "The default role for new room members is": "Le rôle par défaut des nouveaux membres est",
"The main address for this room is": "L'adresse principale pour ce salon est", "The main address for this room is": "L'adresse principale pour ce salon est",
"This action cannot be performed by a guest user. Please register to be able to do this": "Cette action ne peut être effectuée par un visiteur. Merci de vous enregistrer afin de pouvoir effectuer cette action", "This action cannot be performed by a guest user. Please register to be able to do this.": "Cette action ne peut être effectuée par un visiteur. Merci de vous enregistrer afin de pouvoir effectuer cette action.",
"This email address is already in use": "Cette adresse e-mail est déjà utilisée", "This email address is already in use": "Cette adresse e-mail est déjà utilisée",
"This email address was not found": "Cette adresse e-mail na pas été trouvée", "This email address was not found": "Cette adresse e-mail na pas été trouvée",
"%(actionVerb)s this person?": "%(actionVerb)s cette personne ?", "%(actionVerb)s this person?": "%(actionVerb)s cette personne ?",
@ -478,7 +476,6 @@
"The remote side failed to pick up": "Le correspondant na pas décroché", "The remote side failed to pick up": "Le correspondant na pas décroché",
"This room has no local addresses": "Ce salon n'a pas d'adresse locale", "This room has no local addresses": "Ce salon n'a pas d'adresse locale",
"This room is not recognised.": "Ce salon n'a pas été reconnu.", "This room is not recognised.": "Ce salon n'a pas été reconnu.",
"This room is private or inaccessible to guests. You may be able to join if you register": "Ce salon est privé ou non autorisé aux visiteurs. Vous devriez pouvoir le rejoindre si vous vous enregistrez",
"These are experimental features that may break in unexpected ways": "Ces fonctionnalités sont expérimentales et risquent de mal fonctionner", "These are experimental features that may break in unexpected ways": "Ces fonctionnalités sont expérimentales et risquent de mal fonctionner",
"The visibility of existing history will be unchanged": "La visibilité de lhistorique existant sera inchangée", "The visibility of existing history will be unchanged": "La visibilité de lhistorique existant sera inchangée",
"This doesn't appear to be a valid email address": "Cette adresse na pas lair dêtre valide", "This doesn't appear to be a valid email address": "Cette adresse na pas lair dêtre valide",
@ -499,16 +496,16 @@
"To link to a room it must have": "Pour avoir un lien vers un salon, il doit avoir", "To link to a room it must have": "Pour avoir un lien vers un salon, il doit avoir",
"to make a room or": "pour créer un salon ou", "to make a room or": "pour créer un salon ou",
"To remove other users' messages": "Pour supprimer les messages des autres utilisateurs", "To remove other users' messages": "Pour supprimer les messages des autres utilisateurs",
"To reset your password, enter the email address linked to your account": "Pour réinitialiser votre mot de passe, merci dentrer ladresse email liée à votre compte", "To reset your password, enter the email address linked to your account": "Pour réinitialiser votre mot de passe, merci dentrer ladresse e-mail liée à votre compte",
"to restore": "restaurer", "to restore": "pour restaurer",
"To send events of type": "Pour envoyer des évènements du type", "To send events of type": "Pour envoyer des évènements du type",
"To send messages": "Pour envoyer des messages", "To send messages": "Pour envoyer des messages",
"to start a chat with someone": "pour démarrer une conversation avec quelquun", "to start a chat with someone": "pour démarrer une conversation avec quelquun",
"to tag as %(tagName)s": "pour marquer comme %(tagName)s", "to tag as %(tagName)s": "pour marquer comme %(tagName)s",
"to tag direct chat": "pour marquer comme conversation directe", "to tag direct chat": "pour marquer comme conversation directe",
"To use it, just wait for autocomplete results to load and tab through them.": "Pour lutiliser, attendez simplement que les résultats de lauto-complétion saffichent et défilez avec la touche Tab.", "To use it, just wait for autocomplete results to load and tab through them.": "Pour lutiliser, attendez simplement que les résultats de lauto-complétion saffichent et défilez avec la touche Tab.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question": "Une tentative de chargement dun point donné dans la chronologie de ce salon a été effectuée, mais vous navez pas la permission de voir le message en question", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Un instant donné de la chronologie na pu être chargé car vous navez pas la permission de le visualiser.",
"Tried to load a specific point in this room's timeline, but was unable to find it": "Une tentative de chargement dun point donné dans la chronologie de ce salon a été effectuée, mais il na pas été trouvé", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Un instant donné de la chronologie na pu être chargé car il na pas pu être trouvé.",
"Turn Markdown off": "Désactiver le formatage Markdown", "Turn Markdown off": "Désactiver le formatage Markdown",
"Turn Markdown on": "Activer le formatage Markdown", "Turn Markdown on": "Activer le formatage Markdown",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s a activé lencryption bout-en-bout (algorithme %(algorithm)s).", "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s a activé lencryption bout-en-bout (algorithme %(algorithm)s).",
@ -528,7 +525,7 @@
"Unknown room %(roomId)s": "Salon inconnu %(roomId)s", "Unknown room %(roomId)s": "Salon inconnu %(roomId)s",
"unknown": "inconnu", "unknown": "inconnu",
"Unmute": "Activer le son", "Unmute": "Activer le son",
"uploaded a file": "télécharger un fichier", "uploaded a file": "téléchargé un fichier",
"Upload avatar": "Télécharger une photo de profil", "Upload avatar": "Télécharger une photo de profil",
"Upload Failed": "Erreur lors du téléchargement", "Upload Failed": "Erreur lors du téléchargement",
"Upload Files": "Télécharger les fichiers", "Upload Files": "Télécharger les fichiers",
@ -548,7 +545,7 @@
"VoIP conference finished.": "Conférence audio terminée.", "VoIP conference finished.": "Conférence audio terminée.",
"VoIP conference started.": "Conférence audio démarrée.", "VoIP conference started.": "Conférence audio démarrée.",
"VoIP is unsupported": "Appels voix non supportés", "VoIP is unsupported": "Appels voix non supportés",
"(warning: cannot be disabled again!)": "(attention: ne peut être désactivé !)", "(warning: cannot be disabled again!)": "(attention : ne peut être désactivé !)",
"Warning!": "Attention !", "Warning!": "Attention !",
"Who can access this room?": "Qui peut accéder au salon ?", "Who can access this room?": "Qui peut accéder au salon ?",
"Who can read history?": "Qui peut lire l'historique ?", "Who can read history?": "Qui peut lire l'historique ?",
@ -558,18 +555,18 @@
"Would you like to": "Voulez-vous", "Would you like to": "Voulez-vous",
"You are already in a call.": "Vous êtes déjà dans un appel.", "You are already in a call.": "Vous êtes déjà dans un appel.",
"You're not in any rooms yet! Press": "Vous nêtes dans aucun salon ! Cliquez", "You're not in any rooms yet! Press": "Vous nêtes dans aucun salon ! Cliquez",
"You are trying to access %(roomName)s": "Vous essayez d'accéder à %(roomName)s", "You are trying to access %(roomName)s.": "Vous essayez d'accéder à %(roomName)s.",
"You cannot place a call with yourself.": "Vous ne pouvez pas passer d'appel avec vous-même.", "You cannot place a call with yourself.": "Vous ne pouvez pas passer d'appel avec vous-même.",
"You cannot place VoIP calls in this browser.": "Vous ne pouvez pas passer d'appel voix dans cet explorateur.", "You cannot place VoIP calls in this browser.": "Vous ne pouvez pas passer d'appel voix dans cet explorateur.",
"You do not have permission to post to this room": "Vous navez pas la permission de poster dans ce salon", "You do not have permission to post to this room": "Vous navez pas la permission de poster dans ce salon",
"You have been invited to join this room by %(inviterName)s": "Vous avez été invité à joindre ce salon par %(inviterName)s", "You have been invited to join this room by %(inviterName)s": "Vous avez été invité à joindre ce salon par %(inviterName)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": "Vous avez été déconnecté de tous vos appareils et ne recevrez plus de notifications. Pour réactiver les notificationsm identifiez vous à nouveau sur tous les appareils", "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": "Vous avez été déconnecté de tous vos appareils et ne recevrez plus de notifications. Pour réactiver les notifications, identifiez vous à nouveau sur tous les appareils",
"You have no visible notifications": "Vous n'avez pas de notifications visibles", "You have no visible notifications": "Vous n'avez pas de notifications visibles",
"you must be a": "vous devez être un", "you must be a": "vous devez être un",
"You need to be able to invite users to do that.": "Vous devez être capable dinviter des utilisateurs pour faire ça.", "You need to be able to invite users to do that.": "Vous devez être capable dinviter des utilisateurs pour faire ça.",
"You need to be logged in.": "Vous devez être connecté.", "You need to be logged in.": "Vous devez être connecté.",
"You need to enter a user name.": "Vous devez entrer un nom dutilisateur.", "You need to enter a user name.": "Vous devez entrer un nom dutilisateur.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Vous devez vous connecter à nouveau pour générer les clés dencryption pour cet appareil, et soumettre la clé publique à votre homeserver. Cette action ne se reproduira pas; veuillez nous excuser pour la gêne occasionnée.", "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Vous devez vous connecter à nouveau pour générer les clés dencryption pour cet appareil, et soumettre la clé publique à votre homeserver. Cette action ne se reproduira pas ; veuillez nous excuser pour la gêne occasionnée.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Votre adresse e-mail ne semble pas associée à un identifiant Matrix sur ce homeserver.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Votre adresse e-mail ne semble pas associée à un identifiant Matrix sur ce homeserver.",
"Your password has been reset": "Votre mot de passe a été réinitialisé", "Your password has been reset": "Votre mot de passe a été réinitialisé",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Votre mot de passe a été mis à jour avec succès. Vous ne recevrez plus de notification sur vos appareils jusquà ce que vous vous identifiez à nouveau", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Votre mot de passe a été mis à jour avec succès. Vous ne recevrez plus de notification sur vos appareils jusquà ce que vous vous identifiez à nouveau",
@ -577,7 +574,7 @@
"You seem to be uploading files, are you sure you want to quit?": "Vous semblez être en train de télécharger des fichiers, êtes-vous sûr(e) de vouloir quitter ?", "You seem to be uploading files, are you sure you want to quit?": "Vous semblez être en train de télécharger des fichiers, êtes-vous sûr(e) de vouloir quitter ?",
"You should not yet trust it to secure data": "Vous ne pouvez pas encore lui faire confiance pour sécuriser vos données", "You should not yet trust it to secure data": "Vous ne pouvez pas encore lui faire confiance pour sécuriser vos données",
"changing room on a RoomView is not supported": "changer de salon sur un RoomView n'est pas supporté", "changing room on a RoomView is not supported": "changer de salon sur un RoomView n'est pas supporté",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself": "Vous ne pourrez pas défaire ce changement car vous promouvez lutilisateur aux mêmes pouvoirs que vous", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Vous ne pourrez pas défaire ce changement car vous promouvez lutilisateur aux mêmes pouvoirs que vous.",
"Sun": "Dim", "Sun": "Dim",
"Mon": "Lun", "Mon": "Lun",
"Tue": "Mar", "Tue": "Mar",
@ -611,7 +608,7 @@
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Les noms dutilisateurs ne peuvent contenir que des lettres, chiffres, points et tirets hauts ou bas.", "User names may only contain letters, numbers, dots, hyphens and underscores.": "Les noms dutilisateurs ne peuvent contenir que des lettres, chiffres, points et tirets hauts ou bas.",
"An unknown error occurred.": "Une erreur inconnue est survenue.", "An unknown error occurred.": "Une erreur inconnue est survenue.",
"I already have an account": "Jai déjà un compte", "I already have an account": "Jai déjà un compte",
"An error occured: %(error_string)s": "Une erreur est survenue : %(error_string)s", "An error occurred: %(error_string)s": "Une erreur est survenue : %(error_string)s",
"Topic": "Sujet", "Topic": "Sujet",
"Make Moderator": "Nommer modérateur", "Make Moderator": "Nommer modérateur",
"Make this room private": "Rendre ce salon privé", "Make this room private": "Rendre ce salon privé",
@ -620,7 +617,7 @@
"There are no visible files in this room": "Il n'y a pas de fichier visible dans ce salon", "There are no visible files in this room": "Il n'y a pas de fichier visible dans ce salon",
"Room": "Salon", "Room": "Salon",
"Connectivity to the server has been lost.": "La connectivité au serveur a été perdue.", "Connectivity to the server has been lost.": "La connectivité au serveur a été perdue.",
"Sent messages will be stored until your connection has returned.": "Les messages envoyé seront stockés jusquà ce que votre connection revienne.", "Sent messages will be stored until your connection has returned.": "Les messages envoyés seront stockés jusquà ce que votre connection revienne.",
"Auto-complete": "Auto-complétion", "Auto-complete": "Auto-complétion",
"Resend all": "Tout renvoyer", "Resend all": "Tout renvoyer",
"(~%(searchCount)s results)": "(~%(searchCount)s résultats)", "(~%(searchCount)s results)": "(~%(searchCount)s résultats)",
@ -648,7 +645,7 @@
"%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)sa quitté et à nouveau joint le salon %(repeats)s fois", "%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)sa quitté et à nouveau joint le salon %(repeats)s fois",
"%(severalUsers)sleft and rejoined": "%(severalUsers)sont quitté et à nouveau joint le salon", "%(severalUsers)sleft and rejoined": "%(severalUsers)sont quitté et à nouveau joint le salon",
"%(oneUser)sleft and rejoined": "%(oneUser)sa quitté et à nouveau joint le salon", "%(oneUser)sleft and rejoined": "%(oneUser)sa quitté et à nouveau joint le salon",
"%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)sotn rejeté leurs invitations %(repeats)s fois", "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)sont rejeté leurs invitations %(repeats)s fois",
"%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)sa rejeté son invitation %(repeats)s fois", "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)sa rejeté son invitation %(repeats)s fois",
"%(severalUsers)srejected their invitations": "%(severalUsers)sont rejeté leurs invitations", "%(severalUsers)srejected their invitations": "%(severalUsers)sont rejeté leurs invitations",
"%(oneUser)srejected their invitation": "%(oneUser)sa rejeté son invitation", "%(oneUser)srejected their invitation": "%(oneUser)sa rejeté son invitation",
@ -700,7 +697,7 @@
"Failed to invite user": "Echec lors de l'invitation de l'utilisateur", "Failed to invite user": "Echec lors de l'invitation de l'utilisateur",
"Failed to invite the following users to the %(roomName)s room:": "Echec lors de linvitation des utilisateurs suivants dans le salon %(roomName)s :", "Failed to invite the following users to the %(roomName)s room:": "Echec lors de linvitation des utilisateurs suivants dans le salon %(roomName)s :",
"Confirm Removal": "Confirmer la suppression", "Confirm Removal": "Confirmer la suppression",
"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.": "Êtes vous sûr de vouloir supprimer cet événement ? Notez que si vous supprimez le changement de nom dun salon ou la mise a jour du sujet dun salon, il est possible que le changement soit annulé.", "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.": "Êtes vous sûr de vouloir supprimer cet événement ? Notez que si vous supprimez le changement de nom dun salon ou la mise à jour du sujet dun salon, il est possible que le changement soit annulé.",
"Unknown error": "Erreur inconnue", "Unknown error": "Erreur inconnue",
"Incorrect password": "Mot de passe incorrect", "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 enregistrer à nouveau le même identifiant utilisateur.", "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 enregistrer à nouveau le même identifiant utilisateur.",
@ -760,7 +757,7 @@
"Enable URL previews for this room (affects only you)": "Activer les aperçus d'URL pour ce salon (n'affecte que vous)", "Enable URL previews for this room (affects only you)": "Activer les aperçus d'URL pour ce salon (n'affecte que vous)",
"Drop file here to upload": "Déposer le fichier ici pour le télécharger", "Drop file here to upload": "Déposer le fichier ici pour le télécharger",
" (unsupported)": " (non supporté)", " (unsupported)": " (non supporté)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Appel conférence en cours%(supportedText)s. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Appel conférence en cours%(supportedText)s.",
"Online": "En ligne", "Online": "En ligne",
"Offline": "Déconnecté", "Offline": "Déconnecté",
"Disable URL previews for this room (affects only you)": "Désactiver les aperçus d'URL pour ce salon (n'affecte que vous)", "Disable URL previews for this room (affects only you)": "Désactiver les aperçus d'URL pour ce salon (n'affecte que vous)",
@ -811,7 +808,6 @@
"Anyone": "N'importe qui", "Anyone": "N'importe qui",
"Are you sure you want to leave the room '%(roomName)s'?": "Êtes-vous sûr de vouloir quitter le salon '%(roomName)s' ?", "Are you sure you want to leave the room '%(roomName)s'?": "Êtes-vous sûr de vouloir quitter le salon '%(roomName)s' ?",
"Custom level": "Niveau personnalisé", "Custom level": "Niveau personnalisé",
"(default: %(userName)s)": "(défaut : %(userName)s)",
"Device ID:": "Identifiant de l'appareil :", "Device ID:": "Identifiant de l'appareil :",
"device id: ": "Identifiant appareil : ", "device id: ": "Identifiant appareil : ",
"Device key:": "Clé de lappareil :", "Device key:": "Clé de lappareil :",
@ -822,10 +818,109 @@
"Register": "S'inscrire", "Register": "S'inscrire",
"Remote addresses for this room:": "Supprimer l'adresse pour ce salon :", "Remote addresses for this room:": "Supprimer l'adresse pour ce salon :",
"Save": "Enregistrer", "Save": "Enregistrer",
"Setting a user name will create a fresh account": "Définir un nouveau nom dutilisateur va créer un nouveau compte",
"Tagged as: ": "Étiquetter comme : ", "Tagged as: ": "Étiquetter comme : ",
"You have <a>disabled</a> URL previews by default.": "Vous avez <a>désactivé</a> les aperçus dURL par défaut.", "You have <a>disabled</a> URL previews by default.": "Vous avez <a>désactivé</a> les aperçus dURL par défaut.",
"You have <a>enabled</a> URL previews by default.": "Vous avez <a>activé</a> les aperçus dURL par défaut.", "You have <a>enabled</a> URL previews by default.": "Vous avez <a>activé</a> les aperçus dURL par défaut.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Vous avez entré un contact invalide. Essayez dutiliser leur identifiant Matrix ou leur adresse email.", "You have entered an invalid contact. Try using their Matrix ID or email address.": "Vous avez entré un contact invalide. Essayez dutiliser leur identifiant Matrix ou leur adresse email.",
"Hide removed messages": "Cacher les messages supprimés" "Hide removed messages": "Cacher les messages supprimés",
"Add": "Ajouter",
"%(count)s new messages.one": "%(count)s nouveau message",
"%(count)s new messages.other": "%(count)s nouveaux messages",
"Disable markdown formatting": "Désactiver le formattage markdown",
"Error: Problem communicating with the given homeserver.": "Erreur : Problème de communication avec le homeserveur.",
"Failed to fetch avatar URL": "Échec lors de la récupération de lURL de lavatar",
"The phone number entered looks invalid": "Le numéro de téléphone entré semble être invalide",
"This room is private or inaccessible to guests. You may be able to join if you register.": "Ce salon est privé ou interdits aux visiteurs. Vous pourrez peut-être le joindre si vous vous enregistrez.",
"Uploading %(filename)s and %(count)s others.zero": "Téléchargement de %(filename)s",
"Uploading %(filename)s and %(count)s others.one": "Téléchargement de %(filename)s et %(count)s autre",
"Uploading %(filename)s and %(count)s others.other": "Téléchargement de %(filename)s et %(count)s autres",
"You must <a>register</a> to use this functionality": "Vous devez vous <a>inscrire</a> pour utiliser cette fonctionnalité",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Tout renvoyer</a> or <a>tout annuler</a> maintenant. Vous pouvez aussi sélectionner des messages individuels à envoyer ou annuler.",
"Create new room": "Créer un nouveau salon",
"Welcome page": "Page d'accueil",
"Room directory": "Répertoire des salons",
"Start chat": "Démarrer une discussion",
"New Password": "Nouveau mot de passe",
"Start chatting": "Démarrer une discussion",
"Start Chatting": "Démarrer une discussion",
"Click on the button below to start chatting!": "Cliquer sur le bouton ci-dessous pour commencer une discussion !",
"Create a new chat or reuse an existing one": "Démarrer une nouvelle discussion ou en réutiliser une existante",
"You already have existing direct chats with this user:": "Vous avez déjà des discussions en cours avec cet utilisateur :",
"Username available": "Nom d'utilisateur disponible",
"Username not available": "Nom d'utilisateur indisponible",
"Something went wrong!": "Quelque chose sest mal passé !",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Cela sera le nom de votre compte sur le serveur <span></span>, ou vous pouvez sélectionner un <a>autre serveur</a>.",
"If you already have a Matrix account you can <a>log in</a> instead.": "Si vous avez déjà un compte Matrix vous pouvez vous <a>identifier</a> à la place.",
"a room": "un salon",
"Accept": "Accepter",
"Active call (%(roomName)s)": "Appel en cours (%(roomName)s)",
"Admin tools": "Outils d'administration",
"Alias (optional)": "Alias (optionnel)",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Impossible de se connecter au homeserver - veuillez vérifier votre connexion, assurez vous que vous faites confiance au <a>certificat SSL de votre homeserver</a>, et qu'aucune extension de navigateur ne bloque les requêtes.",
"<a>Click here</a> to join the discussion!": "<a>Cliquer ici</a> pour joindre la discussion !",
"Close": "Fermer",
"Custom": "Personnaliser",
"Decline": "Décliner",
"Disable Notifications": "Désactiver les Notifications",
"Drop File Here": "Déposer le Fichier Ici",
"Enable Notifications": "Activer les Notifications",
"Failed to upload profile picture!": "Échec du téléchargement de la photo de profil !",
"Incoming call from %(name)s": "Appel entrant de %(name)s",
"Incoming video call from %(name)s": "Appel vidéo entrant de %(name)s",
"Incoming voice call from %(name)s": "Appel audio entrant de %(name)s",
"No display name": "Pas de nom d'affichage",
"Otherwise, <a>click here</a> to send a bug report.": "Sinon, <a>cliquer ici</a> pour envoyer un rapport d'erreur.",
"Private Chat": "Conversation Privée",
"Public Chat": "Conversation Publique",
"Reason: %(reasonText)s": "Raison: %(reasonText)s",
"Rejoin": "Rejoindre",
"Room contains unknown devices": "Le salon contient des appareils inconnus",
"%(roomName)s does not exist.": "%(roomName)s n'existe pas.",
"%(roomName)s is not accessible at this time.": "%(roomName)s n'est pas accessible pour le moment.",
"Seen by %(userName)s at %(dateTime)s": "Vu par %(userName)s à %(dateTime)s",
"Send anyway": "Envoyer quand même",
"Show Text Formatting Toolbar": "Afficher la barre de formatage de texte",
"Start authentication": "Démarrer une authentification",
"This invitation was sent to an email address which is not associated with this account:": "Cette invitation a été envoyée à une adresse e-mail qui n'est pas associée avec ce compte :",
"This room": "Ce salon",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Impossible de vérifier que l'adresse à qui cette invitation a été envoyée correspond à celle associée à votre compte.",
"Undecryptable": "Indécryptable",
"Unencrypted message": "Message non-encrypté",
"unknown caller": "appelant inconnu",
"Unnamed Room": "Salon sans nom",
"Unverified": "Non verifié",
"%(user)s is a": "%(user)s est un(e)",
"Username invalid: %(errMessage)s": "Nom d'utilisateur invalide : %(errMessage)s",
"Verified": "Verifié",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Souhaitez-vous <acceptText>accepter</acceptText> ou <declineText>refuser</declineText> cette invitation ?",
"You have been banned from %(roomName)s by %(userName)s.": "Vous avez été bannis de %(roomName)s par %(userName)s.",
"You have been kicked from %(roomName)s by %(userName)s.": "Vous avez été expulsé de %(roomName)s by %(userName)s.",
"You may wish to login with a different account, or add this email to this account.": "Vous souhaiteriez peut-être vous identifier avec un autre compte, ou ajouter cette e-mail à votre compte.",
"Your home server does not support device management.": "Votre home server ne supporte pas la gestion d'appareils.",
"(~%(count)s results).one": "(~%(count)s résultat)",
"(~%(count)s results).other": "(~%(count)s résultats)",
"Device Name": "Nom de l'appareil",
"Encrypted by a verified device": "Encrypté par un appareil verifié",
"Encrypted by an unverified device": "Encrypté par un appareil non verifié",
"Encryption is enabled in this room": "L'encryption est activée sur ce salon",
"Encryption is not enabled in this room": "L'encryption n'est pas activée sur ce salon",
"Home": "Accueil",
"To link to a room it must have <a>an address</a>.": "Pour récupérer le lien vers un salon celui-ci doit avoir <a>une adresse</a>.",
"Upload new:": "Télécharger un nouveau :",
"And %(count)s more...": "Et %(count)s autres...",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Joindre avec <voiceText>audio</voiceText> ou <videoText>vidéo</videoText>.",
"Last seen": "Vu pour la dernière fois",
"Level:": "Niveau :",
"Searching known users": "Recherche d'utilisateurs connus",
"Set": "Défini",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (pouvoir %(powerLevelNumber)s)",
"(could not connect media)": "(impossible de se connecter au média)",
"(no answer)": "(pas de réponse)",
"(unknown failure: %(reason)s)": "(erreur inconnue: %(reason)s)",
"Your browser does not support the required cryptography extensions": "Votre navigateur ne supporte pas les extensions cryptographiques nécessaires",
"Not a valid Riot keyfile": "Fichier de clé Riot non valide",
"Authentication check failed: incorrect password?": "Erreur didentification: mot de passe incorrect ?",
"Disable Peer-to-Peer for 1:1 calls": "Désactiver les appels 1:1 pair-à-pair",
"Do you want to set an email address?": "Souhaitez-vous configurer une adresse e-mail ?",
"This will allow you to reset your password and receive notifications.": "Ceci va vous permettre de réinitialiser votre mot de passe et de recevoir des notifications."
} }

21
src/i18n/strings/he.json Normal file
View file

@ -0,0 +1,21 @@
{
"ar-ae": "ערבית (U.A.E)",
"ar-bh": "ערבית (בחריין)",
"ar-dz": "ערבית (אלג'יריה)",
"ar-eg": "ערבית (מצריים)",
"ar-iq": "ערבית (עיראק)",
"ar-jo": "ערבית (ירדן)",
"af": "אפריקאית",
"ar-kw": "ערבית (כווית)",
"ar-lb": "ערבית (לבנון)",
"ar-ly": "ערבית (לוב)",
"ar-ma": "ערבית (מרוקו)",
"ar-om": "ערבית (אומן)",
"ar-qa": "ערבית (קטאר)",
"ar-sa": "ערבית (ערב הסעודית)",
"ar-sy": "ערבית (סוריה)",
"ar-tn": "ערבית (תוניסיה)",
"ar-ye": "ערבית (תימן)",
"be": "בלארוסית",
"bg": "בולגרית"
}

View file

@ -1,3 +1,512 @@
{ {
"Cancel": "Mégse" "Cancel": "Mégse",
"Search": "Keresés",
"OK": "Rendben",
"Custom Server Options": "Egyedi szerver beállítások",
"Direct Chat": "Közvetlen csevegés",
"Dismiss": "Eltűntet",
"Drop here %(toAction)s": "%(toAction)s -t húzd ide",
"Error": "Hiba",
"Failed to forget room %(errCode)s": "Nem lehet eltávolítani a szobát: %(errCode)s",
"Failed to join the room": "Nem lehet csatlakozni a szobához",
"Favourite": "Kedvenc",
"Mute": "Elnémít",
"Notifications": "Értesítések",
"Operation failed": "Művelet sikertelen",
"Please Register": "Regisztrálj",
"powered by Matrix": "Matrixon alapul",
"Remove": "Töröl",
"Settings": "Beállítások",
"unknown error code": "ismeretlen hiba kód",
"Sunday": "Vasárnap",
"Monday": "Hétfő",
"Tuesday": "Kedd",
"Wednesday": "Szerda",
"Thursday": "Csütörtök",
"Friday": "Péntek",
"Saturday": "Szombat",
"af": "Afrikaans",
"ar-ae": "Arabic (U.A.E.)",
"ar-bh": "Arab (Bahrain)",
"ar-dz": "Arab (Algeria)",
"ar-eg": "Arab (Egypt)",
"ar-iq": "Arab (Iraq)",
"ar-jo": "Arab (Jordan)",
"ar-kw": "Arab (Kuwait)",
"ar-lb": "Arab (Lebanon)",
"ar-ly": "Arab (Libya)",
"ar-ma": "Arab (Morocco)",
"ar-om": "Arab (Oman)",
"ar-qa": "Arab (Qatar)",
"ar-sa": "Arab (Saudi Arabia)",
"ar-sy": "Arab (Syria)",
"ar-tn": "Arab (Tunisia)",
"ar-ye": "Arab (Yemen)",
"be": "Belorusz",
"bg": "Bolgár",
"ca": "Katalán",
"cs": "Cseh",
"da": "Dán",
"de-at": "Német (Osztrák)",
"de-ch": "Német (Svájci)",
"de": "Német",
"de-li": "Német (Lichtenstein)",
"de-lu": "Német (Luxemburg)",
"el": "Görög",
"en-au": "Angol (Ausztrál)",
"en-bz": "Angol (Belize)",
"en-ca": "Angol (Kanada)",
"en": "Angol",
"en-gb": "Angol (Egyesült Királyság)",
"en-ie": "Angol (Ír)",
"en-jm": "Angol (Jamaika)",
"en-nz": "Angol (Új-Zéland)",
"en-tt": "Angol (Trinidad)",
"en-us": "Angol (Egyesült Államok)",
"en-za": "Angol (Dél-Afrika)",
"es-ar": "Spanyol (Argentína)",
"es-bo": "Spanyol (Bolívia)",
"es-cl": "Spanyol (Chile)",
"es-co": "Spanyol (Kolumbia)",
"es-cr": "Spanyol (Costa Rica)",
"es-do": "Spanyol (Dominikai Köztársaság)",
"es-ec": "Spanyol (Ecuador)",
"es-gt": "Spanyol (Guatemala)",
"es-hn": "Spanyol (Honduras)",
"es-mx": "Spanyol (Mexikó)",
"es-ni": "Spanyol (Nicaragua)",
"es-pa": "Spanyol (Panama)",
"es-pe": "Spanyol (Peru)",
"es-pr": "Spanyol (Puerto Rico)",
"es-py": "Spanyol (Paraguay)",
"es": "Spanyol (Spanyol)",
"es-sv": "Spanyol (El Salvador)",
"es-uy": "Spanyol (Uruguay)",
"es-ve": "Spanyol (Venezuela)",
"et": "Észt",
"eu": "Baszk (Baszk)",
"fa": "Perzsa",
"fi": "Finn",
"fo": "Feröer",
"fr-be": "Francia (Belgium)",
"fr-ca": "Francia (Kanada)",
"fr-ch": "Francia (Svájc)",
"fr": "Francia",
"fr-lu": "Francia (Luxemburg)",
"ga": "Ír",
"gd": "Gall (Skót)",
"he": "Héber",
"hi": "Hindu",
"hr": "Horvát",
"hu": "Magyar",
"id": "Indonéz",
"is": "Izland",
"it-ch": "Olasz (Svájc)",
"it": "Olasz",
"ja": "Japán",
"ji": "Jiddis",
"ko": "Korea",
"lt": "Litván",
"lv": "Lett",
"mk": "Macedónia (FYROM)",
"ms": "Maláj",
"mt": "Málta",
"nl-be": "Holland (Belgium)",
"nl": "Holland",
"no": "Norvég",
"pl": "Lengyel",
"pt-br": "Portugál (Brazil)",
"pt": "Portugál",
"ro-mo": "Román (Moldova)",
"ro": "Román",
"ru-mo": "Orosz (Moldova)",
"ru": "Orosz",
"sk": "Szlovák",
"sl": "Szlovén",
"sq": "Albán",
"sr": "Szerb",
"sv-fi": "Svéd (Finn)",
"sv": "Svéd",
"sx": "Sutu",
"sz": "Sami (Lapp)",
"th": "Thai",
"tr": "Török",
"ts": "Tsonga",
"uk": "Ukrán",
"ur": "Urdu",
"ve": "Venda",
"vi": "Vietnám",
"xh": "Xhosa",
"zh-cn": "Kína (PRC)",
"zh-hk": "Kína (Hong Kong SAR)",
"zh-sg": "Kína (Szingapúr)",
"zh-tw": "Kína (Tajvan)",
"zu": "Zulu",
"A registered account is required for this action": "Regisztrált fiókra van szükség ehhez a művelethez",
"a room": "egy szoba",
"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.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s elfogadta a meghívást ide: %(displayName)s.",
"Account": "Fiók",
"Access Token:": "Elérési kulcs:",
"Active call (%(roomName)s)": "Hívás folyamatban (%(roomName)s)",
"Add": "Hozzáad",
"Add a topic": "Téma megadása",
"Add email address": "E-mail cím megadása",
"Add phone number": "Telefonszám megadása",
"Admin": "Adminisztrátor",
"Admin tools": "Admin. eszközök",
"And %(count)s more...": "És még %(count)s...",
"VoIP": "VoIP",
"Missing Media Permissions, click here to request.": "Hiányzó Média jogosultság, kattintson ide az igényléshez.",
"No Microphones detected": "Nem található mikrofon",
"No Webcams detected": "Nem található webkamera",
"No media permissions": "Nincs media jogosultság",
"You may need to manually permit Riot to access your microphone/webcam": "Lehet hogy manuálisan kell engedélyeznie a Riot-nak a hozzáférést a mikrofonhoz ás webkamerához",
"Default Device": "Alapértelmezett eszköz",
"Microphone": "Mikrofon",
"Camera": "Kamera",
"Advanced": "Haladó",
"Algorithm": "Algoritmus",
"Hide removed messages": "Törölt üzenetek elrejtése",
"Always show message timestamps": "Üzenet időbélyeg folyamatos megjelenítése",
"Authentication": "Azonosítás",
"Alias (optional)": "Becenév (opcionális)",
"all room members": "minden szoba tagság",
"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",
"sb": "Szorb",
"rm": "Rétoromán",
"tn": "Tswana",
"Close": "Bezár",
"Room directory": "Szobák listája",
"Start chat": "Csevegés indítása",
"Welcome page": "Üdvözlő oldal",
"all room members, from the point they are invited": "minden résztvevő a szobában, amióta meg van hívva",
"all room members, from the point they joined": "minden résztvevő a szobában, amióta csatlakozott",
"and": "és",
"%(items)s and %(remaining)s others": "%(items)s és még: %(remaining)s",
"%(items)s and one other": "%(items)s és még egy",
"%(items)s and %(lastItem)s": "%(items)s és %(lastItem)s",
"and %(overflowCount)s others...": "és még: %(overflowCount)s ...",
"and one other...": "és még egy...",
"%(names)s and %(lastPerson)s are typing": "%(names)s és %(lastPerson)s írnak",
"%(names)s and one other are typing": "%(names)s és még valaki ír",
"%(names)s and %(count)s others are typing": "%(names)s és %(count)s ember ír",
"An email has been sent to": "Az e-mail ide lett küldve:",
"A new password must be entered.": "Új jelszót kell megadni.",
"%(senderName)s answered the call.": "%(senderName)s felvette a telefont.",
"anyone": "bárki",
"An error has occurred.": "Hiba történt.",
"Anyone": "Bárki",
"Anyone who knows the room's link, apart from guests": "A vendégeken kívül bárki aki ismeri a szoba link-jét",
"Anyone who knows the room's link, including guests": "Bárki aki tudja a szoba link-jét, még a vendégek is",
"Are you sure?": "Biztos?",
"Are you sure you want to leave the room '%(roomName)s'?": "Biztos elhagyod a szobát '%(roomName)s'?",
"Are you sure you want to reject the invitation?": "Biztos elutasítod a meghívást?",
"Are you sure you want to upload the following files?": "Biztos feltöltöd ezeket a fájlokat?",
"Attachment": "Csatolmány",
"Autoplay GIFs and videos": "GIF-ek és videók automatikus lejátszása",
"%(senderName)s banned %(targetName)s.": "%(senderName)s kitiltotta őt: %(targetName)s.",
"Ban": "Kitilt",
"Banned users": "Kitiltott felhasználók",
"Bans user with given id": "Kitiltja a felhasználót a megadott ID-vel",
"Blacklisted": "Fekete listára téve",
"Bug Report": "Hiba jelentés",
"Bulk Options": "Tömeges beállítások",
"Call Timeout": "Hívás időtúllépés",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Nem lehet kapcsolódni a saját szerverhez - ellenőrizd a kapcsolatot, biztosítsd, hogy a <a>saját szerver tanúsítványa</a> hiteles legyen, és a böngésző kiterjesztések ne blokkolják a kéréseket.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Nem lehet csatlakozni a saját szerverhez HTTP-n keresztül ha HTTPS van a böngésző címsorában. Vagy használj HTTPS-t vagy <a>engedélyezd a nem biztonságos script-et</a>.",
"Can't 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.",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s törölte a szoba nevét.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s megváltoztatta a témát erre \"%(topic)s\".",
"Changes to who can read history will only apply to future messages in this room": "Változtatások a napló olvasási jogosultságon csak a szoba új üzeneteire fog vonatkozni",
"Changes your display nickname": "Becenév megváltoztatása",
"changing room on a RoomView is not supported": "Szoba nézetben nem lehet szobát váltani",
"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.": "Jelszó megváltoztatása jelenleg alaphelyzetbe állítja a titkosításnál használt kulcsokat minden készüléken, ezzel a régi titkosított üzenetek olvashatatlanok lesznek hacsak először nem mented ki a kulcsokat és újra betöltöd. A jövőben ezen javítunk.",
"Claimed Ed25519 fingerprint key": "Igényelt Ed25519 ujjlenyomat kulcs",
"Clear Cache and Reload": "Gyorsítótár törlése és újratöltés",
"Clear Cache": "Gyorsítótár törlése",
"<a>Click here</a> to join the discussion!": "A beszélgetéshez való csatlakozáshoz <a>kattints ide</a>!",
"Click here to fix": "A javításhoz kattints ide",
"Click to mute audio": "Hang némításhoz kattints ide",
"Click to mute video": "A videó kikapcsoláshoz kattints ide",
"click to reveal": "Megjelenítéshez kattints ide",
"Click to unmute video": "Videó bekapcsoláshoz kattints ide",
"Click to unmute audio": "Hang visszakapcsoláshoz kattints ide",
"Command error": "Parancs hiba",
"Commands": "Parancsok",
"Conference call failed.": "Sikertelen konferencia hívás.",
"Conference calling is in development and may not be reliable.": "Konferencia hívás meg fejlesztés alatt és lehet, hogy nem elég stabil.",
"Conference calls are not supported in encrypted rooms": "Titkosított szobákban a konferencia hívás nem támogatott",
"Conference calls are not supported in this client": "Ez a kliens nem támogatja a konferencia hívást",
"Confirm password": "Jelszó megerősítése",
"Confirm your new password": "Új jelszó megerősítése",
"Could not connect to the integration server": "Az integrációs szerverhez nem lehet kapcsolódni",
"%(count)s new messages.one": "%(count)s új üzenet",
"%(count)s new messages.other": "%(count)s új üzenet",
"Create a new chat or reuse an existing one": "Új csevegés indítása vagy egy meglévő használata",
"Create an account": "Fiók készítése",
"Create Room": "Szoba készítése",
"Cryptography": "Titkosítás",
"Current password": "Jelenlegi jelszó",
"Curve25519 identity key": "Curve25519 azonosítási kulcs",
"Custom": "Egyedi",
"Custom level": "Egyedi szint",
"/ddg is not a command": "/ddg nem egy parancs",
"Deactivate Account": "Fiók zárolása",
"Deactivate my account": "Fiókom felfüggesztése",
"Decline": "Elutasít",
"Decrypt %(text)s": "%(text)s visszafejtése",
"Decryption error": "Visszafejtési hiba",
"Delete": "Töröl",
"demote": "hozzáférési szint csökkentése",
"Default": "Alapértelmezett",
"Device already verified!": "Készülék már ellenőrizve!",
"Device ID": "Készülék azonosító",
"Device ID:": "Készülék azonosító:",
"device id: ": "készülék azonosító: ",
"Device key:": "Készülék kulcs:",
"Devices": "Készülékek",
"Devices will not yet be able to decrypt history from before they joined the room": "A készülékek nem tudják egyenlőre visszafejteni a régebbi üzeneteket mint mikor csatlakoztak a szobához",
"Direct chats": "Közvetlen csevegés",
"Disable Notifications": "Értesítések tiltása",
"disabled": "letiltva",
"Disable inline URL previews by default": "Beágyazott URL előnézet alapértelmezetten tiltva",
"Disable markdown formatting": "Markdown formázás tiltva",
"Disinvite": "Meghívás visszavonása",
"Display name": "Megjelenített név",
"Displays action": "Tevékenységek megjelenítése",
"Don't send typing notifications": "Ne küldjön írás értesítést",
"Download %(text)s": "%(text)s letöltése",
"Drop File Here": "Ide húzd a fájlt",
"Drop here to tag %(section)s": "Húzd ide a címkézéshez: %(section)s",
"Ed25519 fingerprint": "Ed25519 ujjlenyomat",
"Email": "E-mail",
"Email address": "E-mail cím",
"Email address (optional)": "E-mail cím (opcionális)",
"Email, name or matrix ID": "E-mail, név vagy matrix azonosító",
"Emoji": "Emoji",
"Enable encryption": "Titkosítás bekapcsolása",
"Enable Notifications": "Értesítések bekapcsolása",
"enabled": "bekapcsolva",
"Encrypted by a verified device": "Ellenőrzött eszköz által titkosítva",
"Encrypted by an unverified device": "Nem ellenőrzött eszköz által titkosítva",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "A titkosított üzenetek nem láthatók azokon a klienseken amik még nem támogatják a titkosítást",
"Encrypted room": "Titkosított szoba",
"Encryption is enabled in this room": "Ebben a szobában a titkosítás be van kapcsolva",
"Encryption is not enabled in this room": "Ebben a szobában a titkosítás nincs bekapcsolva",
"%(senderName)s ended the call.": "%(senderName)s befejezte a hívást.",
"End-to-end encryption information": "Végponttól végpontig való titkosítási információk",
"End-to-end encryption is in beta and may not be reliable": "Végponttól végpontig tartó titkosítás béta állapotú és lehet, hogy nem megbízható",
"Enter Code": "Kód megadása",
"Enter passphrase": "Jelmondat megadása",
"Error decrypting attachment": "Csatolmány visszafejtése sikertelen",
"Error: Problem communicating with the given homeserver.": "Hiba: Probléma van a saját szerverrel való kommunikációval.",
"Event information": "Esemény információ",
"Existing Call": "Hívás folyamatban",
"Export": "Mentés",
"Export E2E room keys": "E2E szoba kulcsok mentése",
"Failed to ban user": "A felhasználót nem sikerült kizárni",
"Failed to change power level": "A hozzáférési szintet nem sikerült megváltoztatni",
"Failed to delete device": "Eszközt nem sikerült törölni",
"Failed to fetch avatar URL": "Avatar képet nem sikerült letölteni",
"Failed to join room": "A szobába nem sikerült belépni",
"Failed to kick": "Kirúgás nem sikerült",
"Failed to leave room": "A szobát nem sikerült elhagyni",
"Failed to load timeline position": "Az idővonal pozíciót nem sikerült betölteni",
"Failed to lookup current room": "Az aktuális szoba felkeresése sikertelen",
"Failed to mute user": "A felhasználót nem sikerült hallgatásra bírni",
"Failed to register as guest:": "Nem sikerült vendégként regisztrálni:",
"Failed to reject invite": "A meghívót nem sikerült elutasítani",
"Failed to reject invitation": "A meghívót nem sikerült elutasítani",
"Failed to save settings": "A beállításokat nem sikerült elmenteni",
"Failed to send email": "E-mail nem sikerült elküldeni",
"Failed to send request.": "A kérést nem sikerült elküldeni.",
"Failed to set avatar.": "Avatar képet nem sikerült beállítani.",
"Failed to set display name": "Megjelenítési nevet nem sikerült beállítani",
"Failed to set up conference call": "Konferencia hívást nem sikerült elindítani",
"Failed to toggle moderator status": "Moderátor státuszt nem sikerült átállítani",
"Failed to unban": "Kizárás visszavonása sikertelen",
"Failed to upload file": "Fájl feltöltés sikertelen",
"Failed to upload profile picture!": "Profil kép feltöltése sikertelen!",
"Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizd, hogy az e-mailnél lévő linkre rákattintottál",
"Failure to create room": "Szoba létrehozása sikertelen",
"favourite": "kedvenc",
"Favourites": "Kedvencek",
"Fill screen": "Képernyő kitöltése",
"Filter room members": "Szoba tagság szűrése",
"Forget room": "Szoba elfelejtése",
"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 végponttól végpontig 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 can't set avatars. Please register.": "A vendégek nem tudnak avatar képet beállítani. Kérlek regisztrálj.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Vendégek nem készíthetnek szobákat. Kérlek regisztrálj, hogy szobát tudják nyitni és el tudj kezdeni csevegni.",
"Guest users can't upload files. Please register to upload.": "Vendégek nem tölthetnek fel fájlokat. A feltöltéshez kérlek regisztrálj.",
"Guests can't use labs features. Please register.": "Vendégek nem használhatnak labor funkciókat. Kérlek regisztrálj.",
"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.",
"had": "van",
"Hangup": "Megszakít",
"Hide read receipts": "Olvasási visszajelzés elrejtése",
"Hide Text Formatting Toolbar": "Szövegformázási menü elrejtése",
"Historical": "Archív",
"Home": "Kezdőlap",
"Homeserver is": "Saját szerver:",
"Identity Server is": "Azonosítási szerver:",
"I have verified my email address": "Ellenőriztem az e-mail címemet",
"Import": "Betöltés",
"Import E2E room keys": "E2E szoba kulcsok betöltése",
"Incoming call from %(name)s": "Beérkező hivás: %(name)s",
"Incoming video call from %(name)s": "Bejövő videóhívás: %(name)s",
"Incoming voice call from %(name)s": "Bejövő hívás: %(name)s",
"Incorrect username and/or password.": "Helytelen felhasználó és/vagy jelszó.",
"Incorrect verification code": "Hibás azonosítási kód",
"Interface Language": "Felhasználói felület nyelve",
"Invalid alias format": "Hibás alternatív név formátum",
"Invalid address format": "Hibás cím formátum",
"Invalid Email Address": "Hibás e-mail cím",
"Invalid file%(extra)s": "Hibás fájl%(extra)s",
"%(senderName)s invited %(targetName)s.": "%(senderName)s meghívta: %(targetName)s.",
"Invite new room members": "Új tagok meghívása",
"Invited": "Meghívva",
"Invites": "Meghívók",
"Invites user with given id to current room": "Felhasználó meghívása ebbe a szobába megadott azonosítóval",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' nem megfelelő formátum egy címhez",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' nem megfelelő formátum egy alternatív névhez",
"%(displayName)s is typing": "%(displayName)s ír",
"Sign in with": "Belépés ezzel:",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Csatlakozás <voiceText>hang</voiceText>gal vagy <videoText>videó</videoText>val.",
"Join Room": "Belépés a szobába",
"joined and left": "be-, és kilépett",
"joined": "belépett",
"%(targetName)s joined the room.": "%(targetName)s belépett a szobába.",
"Joins room with given alias": "A megadott becenévvel belépett a szobába",
"Jump to first unread message.": "Ugrás az első olvasatlan üzenetre.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s kizárta: %(targetName)s.",
"Kick": "Kizár",
"Kicks user with given id": "Az adott azonosítójú felhasználó kizárása",
"Labs": "Labor",
"Last seen": "Utoljára láttuk",
"Leave room": "Szoba elhagyása",
"left and rejoined": "ki-, és belépett",
"left": "kilépett",
"%(targetName)s left the room.": "%(targetName)s elhagyta a szobát.",
"Level:": "Szint:",
"List this room in %(domain)s's room directory?": "%(domain)s szobát feltüntessük a szobák listájában?",
"Local addresses for this room:": "A szoba helyi címe:",
"Logged in as:": "Bejelentkezve mint:",
"Login as guest": "Belépés vendégként",
"Logout": "Kilép",
"Low priority": "Alacsony prioritás",
"%(senderName)s made future room history visible to": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik:",
"Manage Integrations": "Integrációk kezelése",
"Markdown is disabled": "Markdown kikapcsolva",
"Markdown is enabled": "Markdown engedélyezett",
"matrix-react-sdk version:": "matrix-react-sdk verzió:",
"Members only": "Csak tagoknak",
"Message not sent due to unknown devices being present": "Ismeretlen eszköz miatt az üzenet nem küldhető el",
"Missing room_id in request": "Hiányzó room_id a kérésben",
"Missing user_id in request": "Hiányzó user_id a kérésben",
"Mobile phone number": "Mobil telefonszám",
"Mobile phone number (optional)": "Mobill telefonszám (opcionális)",
"Moderator": "Moderátor",
"Must be viewing a room": "Meg kell nézni a szobát",
"my Matrix ID": "Matrix azonosítóm",
"Name": "Név",
"Never send encrypted messages to unverified devices from this device": "Soha ne küldj titkosított üzenetet ellenőrizetlen eszközre erről az eszközről",
"Never send encrypted messages to unverified devices in this room": "Soha ne küldj titkosított üzenetet ebből a szobából ellenőrizetlen eszközre",
"Never send encrypted messages to unverified devices in this room from this device": "Soha ne küldj titkosított üzenetet ebből a szobából ellenőrizetlen eszközre erről az eszközről",
"New address (e.g. #foo:%(localDomain)s)": "Új cím (e.g. #foo:%(localDomain)s)",
"New Composer & Autocomplete": "Új szerkesztő és automatikus kiegészítés",
"New password": "Új jelszó",
"New passwords don't match": "Az új jelszavak nem egyeznek",
"New passwords must match each other.": "Az új jelszavaknak meg kell egyezniük egymással.",
"none": "semmi",
"not set": "nincs beállítva",
"not specified": "nincs meghatározva",
"(not supported by this browser)": "(ebben a böngészőben nem támogatott)",
"<not supported>": "<nem támogatott>",
"NOT verified": "NEM ellenőrzött",
"No devices with registered encryption keys": "Nincs eszköz a regisztrált titkosítási kulcsokhoz",
"No display name": "Nincs megjelenítési név",
"No more results": "Nincs több találat",
"No results": "Nincs találat",
"No users have specific privileges in this room": "Egy felhasználónak sincsenek specifikus jogosultságai ebben a szobában",
"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)",
"Once you&#39;ve followed the link it contains, click below": "Miután a linket követted, kattints alulra",
"Only people who have been invited": "Csak akiket meghívtak",
"Otherwise, <a>click here</a> to send a bug report.": "Különben hiba jelentés küldéséhez <a>kattints ide</a>.",
"Password": "Jelszó",
"Password:": "Jelszó:",
"Passwords can't be empty": "A jelszó nem lehet üres",
"People": "Emberek",
"Permissions": "Jogosultságok",
"Phone": "Telefon",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s %(callType)s hívást kezdeményezett.",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Ellenőrizd az e-mail-edet és kattints a benne lévő linkre. Ha ez megvan, kattints a folytatásra.",
"Power level must be positive integer.": "A szintnek pozitív egésznek kell lennie.",
"Press": "Nyomd meg",
"Private Chat": "Privát csevegés",
"Privileged Users": "Privilegizált felhasználók",
"Profile": "Profil",
"Public Chat": "Nyilvános csevegés",
"Reason": "Ok",
"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áció",
"rejected": "elutasítva",
"%(targetName)s rejected the invitation.": "%(targetName)s elutasította a meghívót.",
"Reject invitation": "Meghívó elutasítása",
"Rejoin": "Újracsatlakozás",
"Remote addresses for this room:": "A szoba távoli címei:",
"Remove Contact Information?": "Kapcsolat információk törlése?",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s törölte a megjelenítési nevet (%(oldDisplayName)s).",
"%(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",
"restore": "visszaállít",
"Results from DuckDuckGo": "Eredmények a DuckDuckGo-ból",
"Return to app": "Vissza az alkalmazáshoz",
"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",
"Riot was not given permission to send notifications - please try again": "Riotnak nincs jogosultsága értesítést küldeni neked - próbáld újra",
"riot-web version:": "riot-web verzió:",
"Room %(roomId)s not visible": "%(roomId)s szoba nem látható",
"Room Colour": "Szoba színe",
"Room contains unknown devices": "A szobában ellenőrizetlen eszközök vannak",
"Room name (optional)": "Szoba neve (opcionális)",
"%(roomName)s does not exist.": "%(roomName)s nem létezik.",
"%(roomName)s is not accessible at this time.": "%(roomName)s jelenleg nem érhető el.",
"Rooms": "Szobák",
"Save": "Mentés",
"Scroll to bottom of page": "Az oldal aljára görget",
"Scroll to unread messages": "Olvasatlan üzenetekhez görget",
"Search failed": "Keresés sikertelen",
"Searches DuckDuckGo for results": "Keresés DuckDuckGo-val",
"Searching known users": "Ismert felhasználók keresése",
"Seen by %(userName)s at %(dateTime)s": "%(userName)s %(dateTime)s időpontban látta",
"Send a message (unencrypted)": "Üzenet küldése (titkosítás nélkül)",
"Send an encrypted message": "Titkosított üzenet küldése",
"Send anyway": "Küld mindenképpen",
"Sender device information": "Küldő eszközének információja",
"Send Invites": "Meghívók elküldése",
"Send Reset Email": "Visszaállítási e-mail küldése",
"sent an image": "kép küldése",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s képet küldött.",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s meghívót küldött %(targetDisplayName)s felhasználónak, hogy lépjen be a szobába.",
"sent a video": "videó küldve",
"Server error": "Szerver hiba"
} }

655
src/i18n/strings/ko.json Normal file
View file

@ -0,0 +1,655 @@
{
"af": "아프리칸스어",
"ar-ae": "아랍어 (아랍 에미리트 연방)",
"ar-bh": "아랍어 (바레인)",
"ar-dz": "아랍어 (알제리)",
"ar-eg": "아랍어 (이집트)",
"ar-iq": "아랍어 (이라크)",
"ar-jo": "아랍어 (요르단)",
"ar-kw": "아랍어 (쿠웨이트)",
"ar-lb": "아랍어 (레바논)",
"ar-ly": "아랍어 (리비아)",
"ar-ma": "아랍어 (모로코)",
"ar-om": "아랍어 (오만)",
"ar-qa": "아랍어 (카타르)",
"ar-sa": "아랍어 (사우디아라비아)",
"ar-sy": "아랍어 (시리아)",
"ar-tn": "아랍어 (튀니지)",
"ar-ye": "아랍어 (예멘)",
"be": "벨라루스어",
"bg": "불가리아어",
"ca": "카탈로니아어",
"cs": "체코어",
"da": "덴마크어",
"de-at": "독일어 (오스트리아)",
"de-ch": "독일어 (스위스)",
"de": "독일어",
"de-li": "독일어 (리히텐슈타인)",
"de-lu": "독일어 (룩셈부르크)",
"el": "그리스어",
"Cancel": "취소",
"Close": "닫기",
"Create new room": "새 방 만들기",
"Custom Server Options": "사용자 지정 서버 설정",
"Direct Chat": "직접 이야기하기",
"Dismiss": "없애기",
"Error": "오류",
"Mute": "알림 끄기",
"Notifications": "알림",
"Please Register": "계정을 등록해주세요",
"powered by Matrix": "매트릭스의 지원을 받고 있어요",
"Remove": "지우기",
"Room directory": "방 목록",
"Search": "찾기",
"Settings": "설정",
"Start chat": "이야기하기",
"unknown error code": "알 수 없는 오류 코드",
"Sunday": "일요일",
"Monday": "월요일",
"Tuesday": "화요일",
"Wednesday": "수요일",
"Thursday": "목요일",
"Friday": "금요일",
"Saturday": "토요일",
"OK": "알았어요",
"Welcome page": "환영 화면",
"Continue": "게속하기",
"en-au": "영어 (호주)",
"en-bz": "영어 (벨리즈)",
"en-ca": "영어 (캐나다)",
"en": "영어",
"en-gb": "영어 (영국)",
"en-ie": "영어 (아일랜드)",
"en-jm": "영어 (자메이카)",
"en-nz": "영어 (뉴질랜드)",
"en-tt": "영어 (트리니다드토바고)",
"en-us": "영어 (미국)",
"en-za": "영어 (남아프리카)",
"es-ar": "스페인어 (아르헨티나)",
"es-bo": "스페인어 (볼리비아)",
"es-cl": "스페인어 (칠레)",
"es-co": "스페인어 (콜롬비아)",
"es-cr": "스페인어 (코스타리카)",
"es-do": "스페인어 (도미니카 공화국)",
"es-ec": "스페인어 (에콰도르)",
"es-gt": "스페인어 (과테말라)",
"es-hn": "스페인어 (온두라스)",
"es-mx": "스페인어 (멕시코)",
"es-ni": "스페인어 (니카라과)",
"es-pa": "스페인어 (파나마)",
"es-pe": "스페인어 (페루)",
"es-pr": "스페인어 (푸에르토리코)",
"es-py": "스페인어 (파라과이)",
"es": "스페인어 (스페인)",
"es-sv": "스페인어 (엘살바도르)",
"es-uy": "스페인어 (우루과이)",
"es-ve": "스페인어 (베네수엘라)",
"et": "에스토니아어",
"eu": "바스크어 (바스크)",
"fa": "페르시아어",
"fi": "핀란드어",
"fo": "페로스어",
"fr-be": "프랑스어 (벨기에)",
"fr-ca": "프랑스어 (캐나다)",
"fr-ch": "프랑스어 (스위스)",
"fr": "프랑스어",
"fr-lu": "프랑스어 (룩셈부르크)",
"ga": "아일랜드어",
"gd": "게일어 (스코틀랜드)",
"he": "히브리어",
"hi": "힌디어",
"hr": "크로아티아어",
"hu": "헝가리어",
"id": "인도네시아어",
"is": "아이슬란드어",
"it-ch": "이탈리아어 (스위스)",
"it": "이탈리아어",
"ja": "일본어",
"ji": "이디시어",
"ko": "한국어",
"lt": "리투아니아어",
"lv": "라트비아어",
"mk": "마케도니아어 (마케도니아 공화국)",
"ms": "말레이시아어",
"mt": "몰타어",
"nl-be": "네덜란드어 (벨기에)",
"nl": "네덜란드어",
"no": "노르웨이어",
"pl": "폴란드어",
"pt-br": "브라질 포르투갈어",
"pt": "포르투갈어",
"rm": "레토로만어",
"ro-mo": "루마니아어 (몰도바 공화국)",
"ro": "루마니아어",
"ru-mo": "러시아어 (몰도바 공확국)",
"ru": "러시아어",
"sb": "소르비아어",
"sk": "슬로바키아어",
"sr": "세르비아어",
"sv-fi": "스웨덴어 (핀란드)",
"sv": "스웨덴어",
"sx": "수투어",
"sz": "라플란드어 (라플란드)",
"th": "태국",
"tn": "츠와나어",
"tr": "터키어",
"ts": "총가어",
"uk": "우크라이나어",
"ur": "우르두어",
"ve": "벤다어",
"vi": "베트남어",
"xh": "코사어",
"zh-cn": "중국어 (중국)",
"zh-hk": "중국어 (홍콩)",
"zh-sg": "중국어 (싱가포르)",
"zh-tw": "중국어 (대만)",
"zu": "줄루어",
"a room": "방",
"Accept": "수락",
"Account": "계정",
"Add": "추가하기",
"Add email address": "이메일 주소 추가하기",
"Add phone number": "전화번호 추가하기",
"Admin": "관리자",
"Admin tools": "관리 도구",
"VoIP": "인터넷전화",
"No Microphones detected": "마이크를 찾지 못했어요",
"No Webcams detected": "카메라를 찾지 못했어요",
"No media permissions": "저장소 권한이 없어요",
"Default Device": "기본 장치",
"Microphone": "마이크",
"Camera": "카메라",
"Advanced": "고급",
"Algorithm": "알고리즘",
"Hide removed messages": "지운 메시지 숨기기",
"Always show message timestamps": "항상 메시지에 시간을 보이기",
"Authentication": "인증",
"Alias (optional)": "별명 (선택)",
"and": "그리고",
"A new password must be entered.": "새 비밀번호를 입력해주세요.",
"An error has occurred.": "오류가 일어났어요.",
"Anyone": "누구나",
"anyone": "누구나",
"Are you sure?": "정말이세요?",
"Are you sure you want to leave the room '%(roomName)s'?": "정말로 '%(roomName)s'를 떠나시겠어요?",
"Attachment": "붙이기",
"Are you sure you want to upload the following files?": "다음 파일들을 올리시겠어요?",
"Autoplay GIFs and videos": "GIF와 동영상을 자동으로 재생하기",
"Ban": "차단",
"Banned users": "차단한 사용자",
"Blacklisted": "요주인물들",
"Bug Report": "오류 보고",
"Can't load user settings": "사용사 설정을 불러올 수 없어요",
"Change Password": "비밀번호 바꾸기",
"Changes your display nickname": "보여줄 별명을 바꾸기",
"Clear Cache and Reload": "캐시를 지우고 다시 불러오기",
"Clear Cache": "캐시 지우기",
"Confirm password": "비밀번호 확인",
"Confirm your new password": "새 비밀번호 확인",
"Create Room": "방 만들기",
"Create an account": "게정 만들기",
"Custom": "사용자 지정",
"Device ID": "장치 ID",
"Default": "기본",
"Device already verified!": "장치를 이미 확인했어요!",
"device id: ": "장치 id: ",
"Devices": "장치",
"Direct chats": "직접 여러 명에게 이야기하기",
"Disable Notifications": "알림 끄기",
"disabled": "끄기",
"Display name": "별명",
"Don't send typing notifications": "입력 중이라는 알림 보내지 않기",
"Email": "이메일",
"Email address": "이메일 주소",
"Email, name or matrix ID": "이메일, 이름 혹은 매트릭스 ID",
"Drop here %(toAction)s": "여기에 놓아주세요 %(toAction)s",
"Failed to forget room %(errCode)s": "방 %(errCode)s를 잊지 못했어요",
"Failed to join the room": "방에 들어가지 못했어요",
"Favourite": "즐겨찾기",
"Operation failed": "작업 실패",
"Failed to change password. Is your password correct?": "비밀번호를 바꾸지 못했어요. 이 비밀번호가 정말 맞으세요?",
"sl": "슬로베니아어",
"sq": "알바니아어",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "+%(msisdn)s로 문자 메시지를 보냈어요. 인증 번호를 입력해주세요",
"%(targetName)s accepted an invitation.": "%(targetName)s님이 초대를 수락했어요.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s님이 %(displayName)s님에게서 초대를 수락했어요.",
"Access Token:": "접근 토큰:",
"Active call (%(roomName)s)": "(%(roomName)s)에서 전화를 걸고 받을 수 있어요",
"Add a topic": "주제 추가",
"And %(count)s more...": "그리고 %(count)s 더 보기...",
"Missing Media Permissions, click here to request.": "저장소 권한을 잃었어요, 여기를 눌러 다시 요청해주세요.",
"You may need to manually permit Riot to access your microphone/webcam": "수동으로 라이엇에 마이크와 카메라를 허용해야 할 수도 있어요",
"all room members": "방 구성원 모두",
"all room members, from the point they are invited": "방 구성원 모두, 초대받은 시점부터",
"all room members, from the point they joined": "방 구성원 모두, 방에 들어온 시점부터",
"%(items)s and %(remaining)s others": "%(items)s과 %(remaining)s",
"%(items)s and one other": "%(items)s과 다른 하나",
"%(items)s and %(lastItem)s": "%(items)s과 %(lastItem)s",
"and %(overflowCount)s others...": "그리고 %(overflowCount)s...",
"and one other...": "그리고 다른 하나...",
"%(names)s and %(lastPerson)s are typing": "%(names)s님과 %(lastPerson)s님이 입력중",
"%(names)s and one other are typing": "%(names)s님과 다른 분이 입력중",
"%(names)s and %(count)s others are typing": "%(names)s님과 %(count)s 분들이 입력중",
"An email has been sent to": "이메일을 보냈어요",
"%(senderName)s answered the call.": "%(senderName)s님이 전화를 받았어요.",
"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?": "초대를 거절하시겠어요?",
"%(senderName)s banned %(targetName)s.": "%(senderName)s님이 %(targetName)s님을 차단하셨어요.",
"Bans user with given id": "받은 ID로 사용자 차단하기",
"Bulk Options": "대규모 설정",
"Call Timeout": "전화 대기 시간 초과",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "홈 서버에 연결할 수 없어요 - 연결을 확인해주시고, <a>홈 서버의 SSL 인증서</a>가 믿을 수 있는지 확인하시고, 브라우저 확장기능이 요청을 차단하고 있는지 확인해주세요.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "주소창에 HTTPS 주소가 있을 때는 HTTP로 홈 서버를 연결할 수 없어요. HTTPS를 쓰거나 <a>안전하지 않은 스크립트를 허용해주세요</a>.",
"%(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\"로 바꾸셨어요.",
"Changes to who can read history will only apply to future messages in this room": "방의 이후 메시지부터 기록을 읽을 수 있는 조건의 변화가 적용되어요",
"changing room on a RoomView is not supported": "룸뷰에서 방을 바꾸는 건 지원하지 않아요",
"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.": "비밀번호를 바꾸면 현재 모든 장치의 종단간 암호화 키가 다시 설정되고, 먼저 방의 키를 내보내고 나중에 다시 불러오지 않는 한, 암호화한 이야기 기록을 읽을 수 없게 되어요. 앞으로는 이 기능을 더 좋게 만들 거에요.",
"Claimed Ed25519 fingerprint key": "Ed25519 지문 키가 필요",
"<a>Click here</a> to join the discussion!": "<a>여기</a>를 눌러서 같이 논의해요!",
"Click here to fix": "해결하려면 여기를 누르세요",
"Click to mute audio": "소리를 끄려면 누르세요",
"Click to mute video": "동영상 소리를 끄려면 누르세요",
"click to reveal": "누르면 나타나요",
"Click to unmute video": "동영상 소리를 켜려면 누르세요",
"Click to unmute audio": "소리를 켜려면 누르세요",
"Command error": "명령 오류",
"Commands": "명령",
"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": "이 클라이언트에서는 전화 회의를 할 수 없어요",
"Could not connect to the integration server": "통합 서버에 연결할 수 없어요",
"%(count)s new messages.one": "%(count)s 새 메시지",
"%(count)s new messages.other": "%(count)s 새 메시지",
"Create a new chat or reuse an existing one": "새 이야기를 시작하거나 기존에 하던 이야기를 이어하세요",
"Cryptography": "암호화",
"Current password": "현재 비밀번호",
"Curve25519 identity key": "Curve25519 신원 키",
"Custom level": "사용자 지정 단계",
"/ddg is not a command": "/ddg 는 없는 명령이에요",
"Deactivate Account": "계정 정지",
"Deactivate my account": "내 계정 정지하기",
"Decline": "거절",
"Decrypt %(text)s": "해독 %(text)s",
"Decryption error": "해독 오류",
"Delete": "지우기",
"demote": "등급 낮추기",
"Deops user with given id": "받은 ID로 사용자의 등급을 낮추기",
"Device ID:": "장치 ID:",
"Device key:": "장치 키:",
"Devices will not yet be able to decrypt history from before they joined the room": "방에 들어가기 전에는 장치에서 기록을 해독할 수 없어요",
"Disable inline URL previews by default": "기본적으로 인라인 주소 미리보기를 끄기",
"Disable markdown formatting": "마크다운 형식 끄기",
"Disinvite": "초대 취소",
"Displays action": "활동 보이기",
"Download %(text)s": "%(text)s 받기",
"Drop File Here": "여기에 파일을 놓아주세요",
"Drop here to tag %(section)s": "%(section)s 지정하려면 여기에 놓아주세요",
"Ed25519 fingerprint": "Ed25519 지문",
"Email address (optional)": "이메일 주소 (선택)",
"Emoji": "이모지",
"Enable encryption": "암호화 켜기",
"Enable Notifications": "알림 켜기",
"enabled": "사용",
"Encrypted by a verified device": "인증한 장치로 암호화했어요",
"Encrypted by an unverified device": "인증하지 않은 장치로 암호화했어요",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "암호화한 메시지는 아직 암호화를 구현하지 않은 클라이언트에서는 볼 수 없어요",
"Encrypted room": "암호화한 방",
"Encryption is enabled in this room": "이 방은 암호화중이에요",
"Encryption is not enabled in this room": "이 방은 암호화하고 있지 않아요",
"%(senderName)s ended the call.": "%(senderName)s님이 전화를 끊었어요.",
"End-to-end encryption information": "종단간 암호화 정보",
"End-to-end encryption is in beta and may not be reliable": "종단간 암호화는 시험중이며 믿을 수 없어요",
"Enter Code": "코드를 입력하세요",
"Enter passphrase": "암호를 입력하세요",
"Error decrypting attachment": "첨부 파일 해독중 문제가 일어났어요",
"Error: Problem communicating with the given homeserver.": "오류: 지정한 홈 서버와 통신에 문제가 있어요.",
"Event information": "사건 정보",
"Existing Call": "기존 전화",
"Export": "내보내기",
"Export E2E room keys": "종단간 암호화 방 키 내보내기",
"Failed to ban user": "사용자를 차단하지 못했어요",
"Failed to change power level": "권한 등급을 바꾸지 못했어요",
"Failed to delete device": "장치를 지우지 못했어요",
"Failed to fetch avatar URL": "아바타 주소를 불러오지 못했어요",
"Failed to join room": "방에 들어가지 못했어요",
"Failed to kick": "내쫓지 못했어요",
"Failed to leave room": "방을 떠나지 못했어요",
"Failed to load timeline position": "타임라인 위치를 불러오지 못했어요",
"Failed to lookup current room": "현재 방을 찾지 못했어요",
"Failed to mute user": "사용자의 알림을 끄지 못했어요",
"Failed to register as guest:": "손님으로 등록하지 못했어요:",
"Failed to reject invite": "초대를 거절하지 못했어요",
"Failed to reject invitation": "초대를 거절하지 못했어요",
"Failed to save settings": "설정을 저장하지 못했어요",
"Failed to send email": "이메일을 보내지 못했어요",
"Failed to send request.": "요청을 보내지 못했어요.",
"Failed to set avatar.": "아바타를 설정하지 못했어요.",
"Failed to set display name": "별명을 설정하지 못했어요",
"Failed to set up conference call": "전화 회의를 시작하지 못했어요",
"Failed to toggle moderator status": "조정자 상태를 설정하지 못했어요",
"Failed to unban": "차단을 풀지 못했어요",
"Failed to upload file": "파일을 올리지 못했어요",
"Failed to upload profile picture!": "자기 소개에 사진을 올리지 못했어요!",
"Failed to verify email address: make sure you clicked the link in the email": "이메일 주소를 확인하지 못했어요: 메일의 주소를 눌렀는지 확인해보세요",
"Failure to create room": "방을 만들지 못했어요",
"favourite": "즐겨찾기",
"Favourites": "즐겨찾기",
"Fill screen": "화면 채우기",
"Filter room members": "방 구성원 거르기",
"Forget room": "방 잊기",
"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 can't set avatars. Please register.": "손님은 아바타를 설정하실 수 없어요. 계정을 등록해주세요.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "손님은 새 방을 만드실 수 없어요. 계정을 등록하셔서 방을 만드시고 이야기를 시작하세요.",
"Guest users can't upload files. Please register to upload.": "손님은 파일을 올릴 수 없어요. 파일을 올리시려면 계정을 등록해주세요.",
"Guests can't use labs features. Please register.": "손님은 실험실 기능을 쓸 수 없어요. 계정을 등록해주세요.",
"Guests cannot join this room even if explicitly invited.": "손님은 분명하게 초대받았어도 이 방에 들어가실 수 없어요.",
"had": "했어요",
"Hangup": "전화 끊기",
"Hide read receipts": "읽음 확인 표시 숨기기",
"Hide Text Formatting Toolbar": "문자 서식 도구 숨기기",
"Historical": "보관",
"Home": "중심",
"Homeserver is": "홈 서버는",
"Identity Server is": "ID 서버는",
"I have verified my email address": "제 이메일 주소를 확인했어요",
"Import": "불러오기",
"Import E2E room keys": "종단간 암호화 방 키 불러오기",
"Import room keys": "방 키 불러오기",
"Incoming call from %(name)s": "%(name)s님이 전화를 걸어왔어요",
"Incoming video call from %(name)s": "%(name)s님이 영상 통화를 걸어왔어요",
"Incoming voice call from %(name)s": "%(name)s님이 음성 통화를 걸어왔어요",
"Incorrect username and/or password.": "사용자 이름 혹은 비밀번호가 맞지 않아요.",
"Incorrect verification code": "인증 번호가 맞지 않아요",
"Interface Language": "인터페이스 언어",
"Invalid alias format": "가명 형식이 맞지 않아요",
"Invalid address format": "주소 형식이 맞지 않아요",
"Invalid Email Address": "이메일 주소가 맞지 않아요",
"Invalid file%(extra)s": "파일%(extra)s이 맞지 않아요",
"%(senderName)s invited %(targetName)s.": "%(senderName)s님이 %(targetName)s님을 초대하셨어요.",
"Invite new room members": "새 구성원 초대하기",
"Invited": "초대받기",
"Invites": "초대하기",
"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님이 입력중",
"Sign in with": "로그인",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "<voiceText>음성</voiceText> 또는 <videoText>영상</videoText>으로 참여하세요.",
"Join Room": "방에 들어가기",
"joined and left": "들어왔다가 떠남",
"joined": "들어옴",
"%(targetName)s joined the room.": "%(targetName)s님이 방에 들어오셨어요.",
"Joins room with given alias": "받은 가명으로 방에 들어가기",
"Jump to first unread message.": "읽지 않은 첫 메시지로 이동할래요.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s님이 %(targetName)s을 내쫓았어요.",
"Kick": "내쫓기",
"Kicks user with given id": "받은 ID로 사용자 내쫓기",
"Labs": "실험실",
"Last seen": "마지막으로 본 곳",
"Leave room": "방 떠나기",
"left and rejoined": "떠났다가 다시 들어옴",
"left": "떠났음",
"%(targetName)s left the room.": "%(targetName)s님이 방을 떠나셨어요.",
"Level:": "등급:",
"List this room in %(domain)s's room directory?": "%(domain)s's 방 목록에 이 방을 놓으시겠어요?",
"Local addresses for this room:": "이 방의 로컬 주소:",
"Logged in as:": "로그인:",
"Login as guest": "손님으로 로그인",
"Logout": "로그아웃",
"Low priority": "낮은 우선순위",
"%(senderName)s made future room history visible to": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요",
"Manage Integrations": "통합 관리",
"Markdown is disabled": "마크다운이 꺼져있어요",
"Markdown is enabled": "마크다운이 켜져있어요",
"matrix-react-sdk version:": "matrix-react-sdk 버전:",
"Members only": "구성원만",
"Message not sent due to unknown devices being present": "알 수 없는 장치가 있어 메시지를 보내지 못했어요",
"Missing room_id in request": "요청에서 방_id가 빠졌어요",
"Missing user_id in request": "요청에서 사용자_id가 빠졌어요",
"Mobile phone number": "휴대 전화번호",
"Mobile phone number (optional)": "휴대 전화번호 (선택)",
"Moderator": "조정자",
"Must be viewing a room": "방을 둘러봐야만 해요",
"my Matrix ID": "내 매트릭스 ID",
"Name": "이름",
"Never send encrypted messages to unverified devices from this device": "이 장치에서 인증받지 않은 장치로 암호화한 메시지를 보내지 마세요",
"Never send encrypted messages to unverified devices in this room": "이 방에서 인증받지 않은 장치로 암호화한 메시지를 보내지 마세요",
"Never send encrypted messages to unverified devices in this room from this device": "이 장치에서 이 방의 인증받지 않은 장치로 암호화한 메시지를 보내지 마세요",
"New address (e.g. #foo:%(localDomain)s)": "새 주소 (예. #foo:%(localDomain)s)",
"New Composer & Autocomplete": "새 구성 & 자동 완성",
"New password": "새 비밀번호",
"New passwords don't match": "새 비밀번호가 맞지 않아요",
"New passwords must match each other.": "새 비밀번호는 서로 같아야 해요.",
"none": "없음",
"not set": "설정하지 않았어요",
"not specified": "지정하지 않았어요",
"(not supported by this browser)": "(이 브라우저에서는 지원하지 않아요)",
"<not supported>": "<지원하지 않아요>",
"NOT verified": "확인하지 않음",
"No devices with registered encryption keys": "등록한 암호화 키가 있는 장치가 없어요",
"No display name": "별명이 없어요",
"No more results": "더 이상 결과가 없어요",
"No results": "결과 없음",
"No users have specific privileges in this room": "이 방에 지정한 권한의 사용자가 없어요",
"olm version:": "olm 버전:",
"Password": "비밀번호",
"Password:": "비밀번호:",
"Passwords can't be empty": "비밀번호는 비울 수 없어요",
"Permissions": "권한",
"People": "사람들",
"Phone": "전화",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "방을 암호화하면 암호화를 도중에 끌 수 없어요. (현재로서는)",
"Once you&#39;ve followed the link it contains, click below": "포함된 주소를 따라가서, 아래를 누르세요",
"Only people who have been invited": "초대받은 사람만",
"Otherwise, <a>click here</a> to send a bug report.": "그 밖에는, <a>여기를 눌러</a> 오류 보고서를 보내주세요.",
"%(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.": "권한 등급은 양의 정수여야만 해요.",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (권한 %(powerLevelNumber)s)",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "사용자를 자신과 같은 권한 등급으로 승급시키면 되돌릴 수 없어요.",
"Press": "누르세요",
"Privacy warning": "개인정보 경고",
"Private Chat": "은밀한 이야기",
"Privileged Users": "권한 있는 사용자",
"Profile": "자기 소개",
"%(senderName)s removed their profile picture.": "%(senderName)s님이 자기 소개 사진을 지우셨어요.",
"%(senderName)s set a profile picture.": "%(senderName)s님이 자기 소개 사진을 설정하셨어요.",
"Public Chat": "공개 이야기",
"Reason": "이유",
"Reason: %(reasonText)s": "이유: %(reasonText)s",
"Revoke Moderator": "조정자 철회",
"Refer a friend to Riot:": "라이엇을 친구에게 추천해주세요:",
"Register": "등록하기",
"rejected": "거절함",
"%(targetName)s rejected the invitation.": "%(targetName)s님이 초대를 거절하셨어요.",
"Reject invitation": "초대 거절",
"Rejoin": "다시 들어가기",
"Remote addresses for this room:": "이 방의 원격 주소:",
"Remove Contact Information?": "연락처를 지우시겠어요?",
"%(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.": "비밀번호를 다시 설정하면 현재 모든 장치의 종단간 암호화 키가 다시 설정되고, 먼저 방의 키를 내보내고 나중에 다시 불러오지 않는 한, 암호화한 이야기 기록을 읽을 수 없게 되어요. 앞으로는 이 기능을 더 좋게 만들 거에요.",
"restore": "복구하기",
"Results from DuckDuckGo": "덕덕고에서 검색한 결과",
"Return to app": "앱으로 돌아가기",
"Return to login screen": "로그인 화면으로 돌아가기",
"Riot does not have permission to send you notifications - please check your browser settings": "라이엇에게 알릴 권한이 없어요 - 브라우저 설정을 확인해주세요",
"Riot was not given permission to send notifications - please try again": "라이엇이 알릴 권한을 받지 못했어요 - 다시 해주세요",
"riot-web version:": "라이엇 웹 버전:",
"Room %(roomId)s not visible": "방 %(roomId)s은 보이지 않아요",
"Room Colour": "방 색상",
"Room contains unknown devices": "방에 알 수 없는 장치가 있어요",
"Room name (optional)": "방 이름 (선택)",
"%(roomName)s does not exist.": "%(roomName)s은 없는 방이에요.",
"%(roomName)s is not accessible at this time.": "현재는 %(roomName)s에 들어갈 수 없어요.",
"Rooms": "방",
"Save": "저장",
"Scroll to bottom of page": "화면 맨 아래로 이동",
"Scroll to unread messages": "읽지 않은 메시지로 이동",
"Search failed": "찾지 못함",
"Searches DuckDuckGo for results": "덕덕고에서 검색",
"Searching known users": "아는 사용자 검색중",
"Seen by %(userName)s at %(dateTime)s": "%(userName)s님이 %(dateTime)s에 확인",
"Send a message (unencrypted)": "메시지 보내기 (비암호화)",
"Send an encrypted message": "암호화한 메시지 보내기",
"Send anyway": "그래도 보내기",
"Sender device information": "보낸 장치의 정보",
"Send Invites": "초대 보내기",
"Send Reset Email": "재설정 이메일 보내기",
"sent an image": "사진을 보냈어요",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s님이 사진을 보냈어요.",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s님이 %(targetDisplayName)s님에게 들어오라는 초대를 보냈어요.",
"sent a video": "동영상을 보냈어요",
"Server error": "서버 오류",
"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.": "서버를 쓸 수 없거나 과부하거나, 다른 문제가 있어요.",
"Session ID": "세션 ID",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s님이 별명을 %(displayName)s로 바꾸셨어요.",
"Set": "설정하기",
"Show panel": "패널 보이기",
"Show Text Formatting Toolbar": "문자 서식 도구 보이기",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "시간을 12시간제로 보이기 (예. 오후 2:30)",
"Signed Out": "로그아웃함",
"Sign in": "로그인",
"Sign out": "로그아웃",
"since the point in time of selecting this option": "이 선택을 하는 시점부터",
"since they joined": "들어온 이후",
"since they were invited": "초대받은 이후",
"Some of your messages have not been sent.": "일부 메시지는 보내지 못했어요.",
"Someone": "다른 사람",
"Sorry, this homeserver is using a login which is not recognised ": "죄송해요, 이 홈 서버는 인식할 수 없는 로그인을 쓰고 있네요 ",
"Start a chat": "이야기하기",
"Start authentication": "인증하기",
"Start Chat": "이야기하기",
"Submit": "보내기",
"Success": "성공",
"tag as %(tagName)s": "%(tagName)s로 지정하기",
"tag direct chat": "직접 이야기 지정하기",
"Tagged as: ": "지정함: ",
"The default role for new room members is": "방 새 구성원의 기본 역할",
"The main address for this room is": "이 방의 주요 주소",
"The phone number entered looks invalid": "입력한 전화번호가 잘못된 거 같아요",
"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에서 받은 서명 키와 일치하네요. 인증한 장치로 표시할게요.",
"This action cannot be performed by a guest user. Please register to be able to do this.": "손님은 이 작업을 할 수 없어요. 하려면 계정을 등록해주세요.",
"This email address is already in use": "이 이메일 주소는 사용중이에요",
"This email address was not found": "이 이메일 주소를 찾지 못했어요",
"%(actionVerb)s this person?": "이 사용자에게 %(actionVerb)s?",
"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' 파일을 올리지 못했어요",
"The remote side failed to pick up": "원격 측에서 찾지 못했어요",
"This Home Server does not support login using email address.": "이 홈 서버는 이메일 주소 로그인을 지원하지 않아요.",
"This invitation was sent to an email address which is not associated with this account:": "이 초대는 이 계정과 연결되지 않은 이메일 주소로 보냈어요:",
"There was a problem logging in.": "로그인하는 데 문제가 있어요.",
"This room has no local addresses": "이 방은 로컬 주소가 없어요",
"This room is not recognised.": "이 방은 드러나지 않아요.",
"These are experimental features that may break in unexpected ways": "에상치 못한 방법으로 망가질 지도 모르는 실험 기능이에요",
"The visibility of existing history will be unchanged": "기존 기록은 볼 수 있는 대상이 바뀌지 않아요",
"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 room": "이 방",
"This room is not accessible by remote Matrix servers": "이 방은 원격 매트릭스 서버에 접근할 수 없어요",
"This room's internal ID is": "방의 내부 ID",
"times": "번",
"To ban users": "사용자를 차단하기",
"to browse the directory": "목록에서 찾으려면",
"To configure the room": "방을 구성하기",
"to demote": "등급을 낮추려면",
"to favourite": "즐겨찾기하려면",
"To invite users into the room": "방으로 사용자를 초대하기",
"To kick users": "사용자를 내쫓기",
"To link to a room it must have <a>an address</a>.": "방에 연결하려면 <a>주소</a>가 있어야 해요.",
"to make a room or": "방을 만들거나 혹은",
"To remove other users' messages": "다른 사용자의 메시지를 지우기",
"To reset your password, enter the email address linked to your account": "비밀번호을 다시 설정하려면, 계정과 연결한 이메일 주소를 입력해주세요",
"to restore": "복구하려면",
"To send events of type": "유형 이벤트 보내기",
"To send messages": "메시지 보내기",
"to start a chat with someone": "다른 사람과 이야기하기",
"to tag as %(tagName)s": "%(tagName)s로 지정하려면",
"to tag direct chat": "직접 이야기를 지정하려면",
"To use it, just wait for autocomplete results to load and tab through them.": "이 기능을 사용하시려면, 자동완성 결과가 나오길 기다리신 뒤에 탭으로 움직여주세요.",
"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.": "이 방의 타임라인에서 특정 시점을 불러오려고 했지만, 찾을 수 없었어요.",
"Turn Markdown off": "마크다운 끄기",
"Turn Markdown on": "마크다운 켜기",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s님이 종단간 암호화를 켜셨어요 (알고리즘 %(algorithm)s).",
"Unable to add email address": "이메일 주소를 추가할 수 없어요",
"Unable to remove contact information": "연락처를 지울 수 없어요",
"Unable to restore previous session": "이전 세션을 복구할 수 없어요",
"Unable to verify email address.": "이메일 주소를 인증할 수 없어요.",
"Unban": "차단풀기",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s님이 %(targetName)s님의 차단을 푸셨어요.",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "이 이매알 주소가 초대를 받은 계정과 연결된 주소가 맞는지 확인할 수 없어요.",
"Unable to capture screen": "화면을 찍을 수 없어요",
"Unable to enable Notifications": "알림을 켤 수 없어요",
"Unable to load device list": "장치 목록을 불러올 수 없어요",
"Undecryptable": "해독할 수 없는",
"Unencrypted room": "암호화하지 않은 방",
"unencrypted": "암호화하지 않음",
"Unencrypted message": "암호화하지 않은 메시지",
"unknown caller": "알 수 없는 발신자",
"Unknown command": "알 수 없는 명령",
"unknown device": "알 수 없는 장치",
"Unknown room %(roomId)s": "알 수 없는 방 %(roomId)s",
"Unknown (user, device) pair:": "알 수 없는 (사용자, 장치) 연결:",
"unknown": "알 수 없음",
"Unmute": "소리 켜기",
"Unnamed Room": "이름 없는 방",
"Unrecognised command:": "인식 할 수 없는 명령:",
"Unrecognised room alias:": "인식할 수 없는 방 가명:",
"Unverified": "인증하지 않음",
"Uploading %(filename)s and %(count)s others.zero": "%(filename)s 올리는 중",
"Uploading %(filename)s and %(count)s others.one": "%(filename)s 외 %(count)s 올리는 중",
"Uploading %(filename)s and %(count)s others.other": "%(filename)s 외 %(count)s 올리는 중",
"uploaded a file": "파일을 올렸어요",
"Upload avatar": "아바타 올리기",
"Upload Failed": "파일을 올리지 못했어요",
"Upload Files": "파일 올리기",
"Upload file": "파일 올리기",
"Upload new:": "새로 올리기:",
"Usage": "사용",
"Use compact timeline layout": "간단한 타임라인 구성 사용",
"Use with caution": "조심해서 사용",
"User ID": "사용자 ID",
"User Interface": "사용자 인터페이스",
"%(user)s is a": "%(user)s는",
"User name": "사용자 이름",
"Username invalid: %(errMessage)s": "사용자 이름을 인식할 수 없어요: %(errMessage)s",
"Users": "사용자들",
"User": "사용자",
"Verification Pending": "인증을 기다리는 중",
"Verification": "인증",
"verified": "인증함",
"Verified": "인증함",
"Verified key": "인증한 키",
"Video call": "영상통화",
"Voice call": "음성통화",
"VoIP conference finished.": "인터넷전화 회의를 마쳤어요.",
"VoIP conference started.": "인터넷전화 회의를 시작했어요.",
"VoIP is unsupported": "인터넷전화를 지원하지 않아요",
"(could not connect media)": "(미디어에 연결할 수 없어요)",
"(no answer)": "(응답 없음)",
"(unknown failure: %(reason)s)": "(알 수 없는 오류: %(reason)s)",
"(warning: cannot be disabled again!)": "(주의: 다시 끌 수 없어요!)",
"Warning!": "주의!",
"WARNING: Device already verified, but keys do NOT MATCH!": "주의: 장치는 이미 인증했지만, 키가 맞지 않아요!"
}

View file

@ -1,7 +1,7 @@
{ {
"af": "Afrikaans", "af": "Afrikaans",
"ar-ae": "Arabisch (U.A.E.)", "ar-ae": "Arabisch (U.A.E.)",
"Direct Chat": "Privé gesprek", "Direct Chat": "Privégesprek",
"ar-bh": "Arabisch (Bahrain)", "ar-bh": "Arabisch (Bahrain)",
"ar-dz": "Arabisch (Algerije)", "ar-dz": "Arabisch (Algerije)",
"ar-eg": "Arabisch (Egypte)", "ar-eg": "Arabisch (Egypte)",
@ -60,7 +60,7 @@
"es-ve": "Spaans (Venezuela)", "es-ve": "Spaans (Venezuela)",
"et": "Estlands", "et": "Estlands",
"eu": "Baskisch (Bask)", "eu": "Baskisch (Bask)",
"fa": "Farsi", "fa": "Perzisch (Farsi)",
"fi": "Fins", "fi": "Fins",
"fo": "Faeroesisch", "fo": "Faeroesisch",
"fr-be": "Frans (België)", "fr-be": "Frans (België)",
@ -120,7 +120,6 @@
"zh-sg": "Chinees (Singapore)", "zh-sg": "Chinees (Singapore)",
"zh-tw": "Chinees (Taiwan)", "zh-tw": "Chinees (Taiwan)",
"zu": "Zulu", "zu": "Zulu",
"A registered account is required for this action": "Voor deze actie is een geregistreerd account nodig",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Voer alsjeblieft de verificatiecode in die is verstuurd naar +%(msisdn)s", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Voer alsjeblieft de verificatiecode in die is verstuurd naar +%(msisdn)s",
"accept": "accepteer", "accept": "accepteer",
"%(targetName)s accepted an invitation.": "%(targetName)s heeft een uitnodiging geaccepteerd.", "%(targetName)s accepted an invitation.": "%(targetName)s heeft een uitnodiging geaccepteerd.",
@ -199,5 +198,170 @@
"Confirm your new password": "Bevestig je nieuwe wachtwoord", "Confirm your new password": "Bevestig je nieuwe wachtwoord",
"Continue": "Doorgaan", "Continue": "Doorgaan",
"Could not connect to the integration server": "Mislukt om te verbinden met de integratie server", "Could not connect to the integration server": "Mislukt om te verbinden met de integratie server",
"Cancel": "Annuleer" "Cancel": "Annuleren",
"a room": "een ruimte",
"Accept": "Accepteren",
"Active call (%(roomName)s)": "Actief gesprek (%(roomName)s)",
"Add": "Toevoegen",
"Add a topic": "Een onderwerp toevoegen",
"Admin tools": "Beheerhulpmiddelen",
"And %(count)s more...": "Nog %(count)s andere...",
"VoIP": "VoiP",
"Missing Media Permissions, click here to request.": "Ontbrekende mediatoestemmingen, klik hier om aan te vragen.",
"No Microphones detected": "Geen microfoons gevonden",
"No Webcams detected": "Geen webcams gevonden",
"No media permissions": "Geen mediatoestemmingen",
"You may need to manually permit Riot to access your microphone/webcam": "U moet Riot wellicht handmatig toestemming geven om uw microfoon/webcam te gebruiken",
"Default Device": "Standaardapparaat",
"Microphone": "Microfoon",
"Camera": "Camera",
"Hide removed messages": "Verwijderde berichten verbergen",
"Alias (optional)": "Alias (optioneel)",
"Anyone": "Iedereen",
"Are you sure you want to leave the room '%(roomName)s'?": "Weet u zeker dat u de ruimte '%(roomName)s' wil verlaten?",
"Are you sure you want to upload the following files?": "Weet u zeker dat u de volgende bestanden wil uploaden?",
"<a>Click here</a> to join the discussion!": "<a>Klik hier</a> om mee te doen aan de discussie!",
"Close": "Sluiten",
"%(count)s new messages.one": "%(count)s nieuw bericht",
"Create new room": "Een nieuwe kamer maken",
"Custom Server Options": "Aangepaste serverinstellingen",
"Dismiss": "Afwijzen",
"Drop here %(toAction)s": "%(toAction)s hier naartoe verplaatsen",
"Error": "Fout",
"Failed to forget room %(errCode)s": "Kamer vergeten mislukt %(errCode)s",
"Failed to join the room": "Kamer binnengaan mislukt",
"Favourite": "Favoriet",
"Mute": "Dempen",
"Notifications": "Meldingen",
"Operation failed": "Actie mislukt",
"Please Register": "Registreer alstublieft",
"powered by Matrix": "mogelijk gemaakt door Matrix",
"Remove": "Verwijderen",
"Room directory": "Kamerlijst",
"Settings": "Instellingen",
"Start chat": "Gesprek starten",
"unknown error code": "onbekende foutcode",
"Sunday": "Zondag",
"Monday": "Maandag",
"Tuesday": "Dinsdag",
"Wednesday": "Woensdag",
"Thursday": "Donderdag",
"Friday": "Vrijdag",
"Saturday": "Zaterdag",
"Welcome page": "Welkomstpagina",
"Search": "Zoeken",
"OK": "OK",
"Failed to change password. Is your password correct?": "Wachtwoord wijzigen mislukt. Is uw wachtwoord juist?",
"disabled": "uitgeschakeld",
"Moderator": "Moderator",
"Must be viewing a room": "Moet een ruimte weergeven",
"my Matrix ID": "mijn Matrix-ID",
"Name": "Naam",
"New password": "Nieuw wachtwoord",
"none": "geen",
"not set": "niet ingesteld",
"not specified": "niet opgegeven",
"(not supported by this browser)": "(niet ondersteund door deze browser)",
"<not supported>": "<niet ondersteund>",
"NOT verified": "NIET geverifieerd",
"No devices with registered encryption keys": "Geen apparaten met geregistreerde sleutels",
"No display name": "Geen weergavenaam",
"No more results": "Geen resultaten meer",
"No results": "Geen resultaten",
"No users have specific privileges in this room": "Geen gebruikers me specifieke privileges in deze kamer",
"olm version:": "olm-versie:",
"Password": "Wachtwoord",
"Password:": "Wachtwoord:",
"Passwords can't be empty": "Wachtwoorden kunnen niet leeg zijn",
"People": "Mensen",
"Permissions": "Toestemmingen",
"Phone": "Telefoonnummer",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s heeft een %(callType)s-gesprek gestart.",
"Press": "Druk",
"Privacy warning": "Privacywaarschuwing",
"Private Chat": "Direct chatten",
"Privileged Users": "Gebruikers met rechten",
"Profile": "Profiel",
"Public Chat": "Publiek gesprek",
"Reason": "Reden",
"Reason: %(reasonText)s": "Reden: %(reasonText)s",
"Revoke Moderator": "Beheerder terugtrekken",
"Refer a friend to Riot:": "Laat een vriend weten over Riot:",
"Register": "Registreren",
"rejected": "verworpen",
"%(targetName)s rejected the invitation.": "%(targetName)s heeft de uitnodiging geweigerd.",
"Reject invitation": "Uitnodiging weigeren",
"Rejoin": "Opnieuw lid wordne",
"Remote addresses for this room:": "Adres op afstand voor deze ruimte:",
"Remove Contact Information?": "Contactinformatie verwijderen?",
"Send Invites": "Uitnodigingen versturen",
"Start a chat": "Gesprek starten",
"Start authentication": "Authenticatie starten",
"Start Chat": "Gesprek starten",
"Submit": "Bevestigen",
"Success": "Gereed",
"tag as %(tagName)s": "Met %(tagName)s labelen",
"tag direct chat": "Privéchat labelen",
"Tagged as: ": "Gelabeld als: ",
"Sun": "Zon",
"Mon": "Maa",
"Tue": "Din",
"Wed": "Woe",
"Thu": "Don",
"Fri": "Vrij",
"Sat": "Zat",
"Jan": "Jan",
"Feb": "Feb",
"Mar": "Maa",
"Apr": "Apr",
"May": "Mei",
"Jun": "Juni",
"Jul": "Juli",
"Aug": "Aug",
"Sep": "Sep",
"Oct": "Okt",
"Nov": "Nov",
"Dec": "Dec",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"Set a display name:": "Weergavenaam instellen:",
"Set a Display Name": "Weergavenaam instellen",
"Upload an avatar:": "Een avatar uploaden:",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Geen verbinding met de thuisserver - controleer je verbinding. Controleer het <a>SSL-certificaat van de thuisserver</a> en browser-extensies die verzoeken kunnen blokkeren.",
"%(count)s new messages.other": "%(count)s nieuwe berichten",
"Create an account": "Open een account",
"Cryptography": "Cryptografie",
"Current password": "Huidig wachtwoord",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s heeft de naam van de kamer verwijderd.",
"Create a new chat or reuse an existing one": "Maak een nieuwe chat aan of gebruik een reeds bestaande",
"Create Room": "Maak een kamer",
"Curve25519 identity key": "Curve25519 identiteits sleutel",
"/ddg is not a command": "/ddg is geen commando",
"Deactivate Account": "Account Deactiveren",
"Deactivate my account": "Mijn account deactiveren",
"Decline": "Weigeren",
"Decrypt %(text)s": "Ontcijfer %(text)s",
"Decryption error": "Fout bij het ontcijferen",
"Delete": "Verwijderen",
"demote": "degraderen",
"Device already verified!": "Apparaat reeds geverifieerd!",
"Device ID": "Apparaat ID",
"Device ID:": "Apparaat ID:",
"device id: ": "apparaat id: ",
"Device key:": "Apparaat sleutel:",
"Devices": "Apparaten",
"Devices will not yet be able to decrypt history from before they joined the room": "Het apparaat zal nog niet in staat zijn om de geschiedenis van voor het in de kamer is gekomen te ontcijferen",
"Direct chats": "Direct gesprek",
"Disable Notifications": "Notificaties uitschakelen",
"Disable markdown formatting": "Markdown formatering uitschakelen",
"Disinvite": "Uitnodiging terugtrekken",
"Display name": "Weergave naam",
"Don't send typing notifications": "Geen notificatie sturen bij het typen",
"Download %(text)s": "%(text)s Downloaden",
"Drop File Here": "Plaats Bestand Hier",
"Ed25519 fingerprint": "Ed25519 vingerafdruk",
"Email": "E-Post",
"Email address": "E-Post Adress",
"Email address (optional)": "E-Post adress (optioneel)"
} }

View file

@ -101,7 +101,7 @@
"Guests cannot join this room even if explicitly invited.": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os.", "Guests cannot join this room even if explicitly invited.": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os.",
"Guests can't set avatars. Please register.": "Convidados não podem definir uma foto do perfil. Por favor, registre-se.", "Guests can't set avatars. Please register.": "Convidados não podem definir uma foto do perfil. Por favor, registre-se.",
"Guests can't use labs features. Please register.": "Convidados não podem usar as funcionalidades de laboratório (lab), por gentileza se registre.", "Guests can't use labs features. Please register.": "Convidados não podem usar as funcionalidades de laboratório (lab), por gentileza se registre.",
"Guest users can't upload files. Please register to upload": "Usuários não podem fazer envio de arquivos. Por favor se cadastre para enviar arquivos", "Guest users can't upload files. Please register to upload.": "Usuários não podem fazer envio de arquivos. Por favor se cadastre para enviar arquivos.",
"had": "teve", "had": "teve",
"Hangup": "Desligar", "Hangup": "Desligar",
"Historical": "Histórico", "Historical": "Histórico",
@ -399,7 +399,7 @@
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.",
"You are already in a call.": "Você já está em uma chamada.", "You are already in a call.": "Você já está em uma chamada.",
"You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione", "You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione",
"You are trying to access %(roomName)s": "Você está tentando acessar a sala %(roomName)s", "You are trying to access %(roomName)s.": "Você está tentando acessar a sala %(roomName)s.",
"You cannot place a call with yourself.": "Você não pode iniciar uma chamada.", "You cannot place a call with yourself.": "Você não pode iniciar uma chamada.",
"You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.", "You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.",
"You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.", "You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.",
@ -417,7 +417,7 @@
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Nomes de usuária/o podem conter apenas letras, números, pontos, hífens e linha inferior (_).", "User names may only contain letters, numbers, dots, hyphens and underscores.": "Nomes de usuária/o podem conter apenas letras, números, pontos, hífens e linha inferior (_).",
"An unknown error occurred.": "Um erro desconhecido ocorreu.", "An unknown error occurred.": "Um erro desconhecido ocorreu.",
"I already have an account": "Eu já tenho uma conta", "I already have an account": "Eu já tenho uma conta",
"An error occured: %(error_string)s": "Um erro ocorreu: %(error_string)s", "An error occurred: %(error_string)s": "Um erro ocorreu: %(error_string)s",
"Topic": "Tópico", "Topic": "Tópico",
"Make this room private": "Tornar esta sala privada", "Make this room private": "Tornar esta sala privada",
"Share message history with new users": "Compartilhar histórico de mensagens com novas/os usuárias/os", "Share message history with new users": "Compartilhar histórico de mensagens com novas/os usuárias/os",
@ -627,15 +627,14 @@
"Server may be unavailable, overloaded, or search timed out :(": "O servidor pode estar indisponível, sobrecarregado, ou a busca ultrapassou o tempo limite :(", "Server may be unavailable, overloaded, or search timed out :(": "O servidor pode estar indisponível, sobrecarregado, ou a busca ultrapassou o tempo limite :(",
"Server may be unavailable, overloaded, or the file too big": "O servidor pode estar indisponível, sobrecarregado, ou o arquivo é muito grande", "Server may be unavailable, overloaded, or the file too big": "O servidor pode estar indisponível, sobrecarregado, ou o arquivo é muito grande",
"Server unavailable, overloaded, or something else went wrong.": "O servidor pode estar indisponível, sobrecarregado, ou alguma outra coisa não funcionou.", "Server unavailable, overloaded, or something else went wrong.": "O servidor pode estar indisponível, sobrecarregado, ou alguma outra coisa não funcionou.",
"Some of your messages have not been sent": "Algumas das suas mensagens não foram enviadas", "Some of your messages have not been sent.": "Algumas das suas mensagens não foram enviadas.",
"Submit": "Enviar", "Submit": "Enviar",
"The main address for this room is": "O endereço principal desta sala é", "The main address for this room is": "O endereço principal desta sala é",
"This action cannot be performed by a guest user. Please register to be able to do this": "Esta ação não pode ser realizada por um/a usuário/a visitante. Por favor, registre-se para poder fazer isso", "This action cannot be performed by a guest user. Please register to be able to do this.": "Esta ação não pode ser realizada por um/a usuário/a visitante. Por favor, registre-se para poder fazer isso.",
"%(actionVerb)s this person?": "%(actionVerb)s esta pessoa?", "%(actionVerb)s this person?": "%(actionVerb)s esta pessoa?",
"This room has no local addresses": "Esta sala não tem endereços locais", "This room has no local addresses": "Esta sala não tem endereços locais",
"This room is private or inaccessible to guests. You may be able to join if you register": "Esta sala é privada ou inacessível para visitantes. Você poderá ingressar nela se registrar-se", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tentei carregar um ponto específico na linha do tempo desta sala, mas parece que você não tem permissões para ver a mensagem em questão.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question": "Tentei carregar um ponto específico na linha do tempo desta sala, mas parece que você não tem permissões para ver a mensagem em questão", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tentei carregar um ponto específico na linha do tempo desta sala, mas não o encontrei.",
"Tried to load a specific point in this room's timeline, but was unable to find it": "Tentei carregar um ponto específico na linha do tempo desta sala, mas não o encontrei",
"Turn Markdown off": "Desabilitar a formatação 'Markdown'", "Turn Markdown off": "Desabilitar a formatação 'Markdown'",
"Turn Markdown on": "Habilitar a marcação 'Markdown'", "Turn Markdown on": "Habilitar a marcação 'Markdown'",
"Unable to load device list": "Não foi possível carregar a lista de dispositivos", "Unable to load device list": "Não foi possível carregar a lista de dispositivos",
@ -644,7 +643,7 @@
"You have been invited to join this room by %(inviterName)s": "Você foi convidada/o por %(inviterName)s a ingressar nesta sala", "You have been invited to join this room by %(inviterName)s": "Você foi convidada/o por %(inviterName)s a ingressar nesta sala",
"You seem to be in a call, are you sure you want to quit?": "Parece que você está em uma chamada. Tem certeza que quer sair?", "You seem to be in a call, are you sure you want to quit?": "Parece que você está em uma chamada. Tem certeza que quer sair?",
"You seem to be uploading files, are you sure you want to quit?": "Parece que você está enviando arquivos. Tem certeza que quer sair?", "You seem to be uploading files, are you sure you want to quit?": "Parece que você está enviando arquivos. Tem certeza que quer sair?",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself": "Você não poderá desfazer esta mudança, pois estará dando a este(a) usuário(a) o mesmo nível de permissões que você", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Você não poderá desfazer esta mudança, pois estará dando a este(a) usuário(a) o mesmo nível de permissões que você.",
"Make Moderator": "Tornar moderador(a)", "Make Moderator": "Tornar moderador(a)",
"Room": "Sala", "Room": "Sala",
"(~%(searchCount)s results)": "(±%(searchCount)s resultados)", "(~%(searchCount)s results)": "(±%(searchCount)s resultados)",
@ -701,7 +700,6 @@
"%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)salterou sua imagem pública %(repeats)s vezes", "%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)salterou sua imagem pública %(repeats)s vezes",
"%(severalUsers)schanged their avatar": "%(severalUsers)salteraram sua imagem pública", "%(severalUsers)schanged their avatar": "%(severalUsers)salteraram sua imagem pública",
"Ban": "Banir", "Ban": "Banir",
"A registered account is required for this action": "Uma conta registrada é necessária para esta ação",
"Access Token:": "Token de acesso:", "Access Token:": "Token de acesso:",
"Always show message timestamps": "Sempre mostrar as datas das mensagens", "Always show message timestamps": "Sempre mostrar as datas das mensagens",
"Authentication": "Autenticação", "Authentication": "Autenticação",
@ -717,7 +715,6 @@
"Mute": "Silenciar", "Mute": "Silenciar",
"olm version:": "versão do olm:", "olm version:": "versão do olm:",
"Operation failed": "A operação falhou", "Operation failed": "A operação falhou",
"Registration required": "Registro obrigatório",
"Remove %(threePid)s?": "Remover %(threePid)s?", "Remove %(threePid)s?": "Remover %(threePid)s?",
"Report it": "Reportar", "Report it": "Reportar",
"riot-web version:": "versão do riot-web:", "riot-web version:": "versão do riot-web:",
@ -809,7 +806,7 @@
"Enable URL previews for this room (affects only you)": "Habilitar pré-visualizações de links para esta sala (afeta somente a você)", "Enable URL previews for this room (affects only you)": "Habilitar pré-visualizações de links para esta sala (afeta somente a você)",
"Drop file here to upload": "Arraste um arquivo aqui para enviar", "Drop file here to upload": "Arraste um arquivo aqui para enviar",
" (unsupported)": " (não suportado)", " (unsupported)": " (não suportado)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Conferência%(supportedText)s em andamento. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Conferência%(supportedText)s em andamento.",
"Online": "Online", "Online": "Online",
"Idle": "Ocioso", "Idle": "Ocioso",
"Offline": "Offline", "Offline": "Offline",
@ -861,7 +858,6 @@
"Anyone": "Qualquer pessoa", "Anyone": "Qualquer pessoa",
"Are you sure you want to leave the room '%(roomName)s'?": "Você tem certeza que deseja sair da sala '%(roomName)s'?", "Are you sure you want to leave the room '%(roomName)s'?": "Você tem certeza que deseja sair da sala '%(roomName)s'?",
"Custom level": "Nível personalizado", "Custom level": "Nível personalizado",
"(default: %(userName)s)": "(padrão: %(userName)s)",
"Device ID:": "ID do dispositivo:", "Device ID:": "ID do dispositivo:",
"device id: ": "id do dispositivo: ", "device id: ": "id do dispositivo: ",
"Device key:": "Chave do dispositivo:", "Device key:": "Chave do dispositivo:",
@ -872,9 +868,97 @@
"Register": "Registre-se", "Register": "Registre-se",
"Remote addresses for this room:": "Endereços remotos para esta sala:", "Remote addresses for this room:": "Endereços remotos para esta sala:",
"Save": "Salvar", "Save": "Salvar",
"Setting a user name will create a fresh account": "Definir um nome de usuária(o) vai criar uma conta nova",
"Tagged as: ": "Marcado como: ", "Tagged as: ": "Marcado como: ",
"You have <a>disabled</a> URL previews by default.": "Você <a>desabilitou</a> pré-visualizações de links por padrão.", "You have <a>disabled</a> URL previews by default.": "Você <a>desabilitou</a> pré-visualizações de links por padrão.",
"You have <a>enabled</a> URL previews by default.": "Você <a>habilitou</a> pré-visualizações de links por padrão.", "You have <a>enabled</a> URL previews by default.": "Você <a>habilitou</a> pré-visualizações de links por padrão.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Você inseriu um contato inválido. Tente usar o ID Matrix ou endereço de e-mail da pessoa que está buscando." "You have entered an invalid contact. Try using their Matrix ID or email address.": "Você inseriu um contato inválido. Tente usar o ID Matrix ou endereço de e-mail da pessoa que está buscando.",
"You have been banned from %(roomName)s by %(userName)s.": "Você foi expulso(a) da sala %(roomName)s por %(userName)s.",
"Send anyway": "Enviar de qualquer maneira",
"This room": "Esta sala",
"Create new room": "Criar nova sala",
"Click on the button below to start chatting!": "Clique no botão abaixo para começar a conversar!",
"Disable markdown formatting": "Desabilitar formatação MarkDown",
"No display name": "Sem nome público de usuária(o)",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Este será seu nome de conta no Servidor de Base <span></span>, ou então você pode escolher um <a>servidor diferente</a>.",
"Uploading %(filename)s and %(count)s others.one": "Enviando o arquivo %(filename)s e %(count)s outros arquivos",
"Hide removed messages": "Ocultar mensagens removidas",
"You may wish to login with a different account, or add this email to this account.": "Você pode querer fazer login com uma conta diferente, ou adicionar este e-mail a esta conta.",
"Welcome page": "Página de boas vindas",
"Upload new:": "Enviar novo:",
"Private Chat": "Conversa privada",
"You must <a>register</a> to use this functionality": "Você deve <a>se registrar</a> para poder usar esta funcionalidade",
"And %(count)s more...": "E mais %(count)s...",
"Start chatting": "Iniciar a conversa",
"Public Chat": "Conversa pública",
"Uploading %(filename)s and %(count)s others.zero": "Enviando o arquivo %(filename)s",
"Room contains unknown devices": "Esta sala contém dispositivos desconhecidos",
"Admin tools": "Ferramentas de administração",
"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, <a>click here</a> to send a bug report.": "Caso contrário, <a>clique aqui</a> para enviar um relatório de erros.",
"To link to a room it must have <a>an address</a>.": "Para produzir um link para uma sala, ela necessita ter <a>um endereço</a>.",
"a room": "uma sala",
"Your home server does not support device management.": "O seu Servidor de Base não suporta o gerenciamento de dispositivos.",
"Searching known users": "Buscando pessoas conhecidas",
"Alias (optional)": "Apelido (opcional)",
"Active call (%(roomName)s)": "Chamada ativa (%(roomName)s)",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Não foi possível garantir que o endereço para o qual este convite foi enviado bate com alqum que está associado com sua conta.",
"Error: Problem communicating with the given homeserver.": "Erro: problema de comunicação com o Servidor de Base fornecido.",
"Failed to upload profile picture!": "Falha ao enviar a imagem de perfil!",
"This invitation was sent to an email address which is not associated with this account:": "Este convite foi enviado para um endereço de e-mail que não é associado a esta conta:",
"Show Text Formatting Toolbar": "Exibir barra de formatação de texto",
"Room directory": "Lista pública de salas",
"Failed to fetch avatar URL": "Falha ao obter a URL da imagem de perfil",
"Incoming call from %(name)s": "Chamada de %(name)s recebida",
"Last seen": "Último uso",
"Drop File Here": "Arraste o arquivo aqui",
"Start Chatting": "Iniciar a conversa",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Você gostaria de <acceptText>aceitar</acceptText> ou <declineText>recusar</declineText> este convite?",
"Seen by %(userName)s at %(dateTime)s": "Visto por %(userName)s em %(dateTime)s",
"Verified": "Verificado",
"%(roomName)s does not exist.": "%(roomName)s não existe.",
"Enable Notifications": "Habilitar notificações",
"Username not available": "Nome de usuária(o) indisponível",
"Encrypted by a verified device": "Criptografado por um dispositivo verificado",
"(~%(count)s results).other": "(~%(count)s resultados)",
"unknown caller": "a pessoa que está chamando é desconhecida",
"Start authentication": "Iniciar autenticação",
"(~%(count)s results).one": "(~%(count)s resultado)",
"New Password": "Nova senha",
"Username invalid: %(errMessage)s": "Nome de usuária(o) inválido: %(errMessage)s",
"Disable Notifications": "Desabilitar notificações",
"%(count)s new messages.one": "%(count)s nova mensagem",
"Device Name": "Nome do dispositivo",
"Incoming voice call from %(name)s": "Chamada de voz de %(name)s recebida",
"If you already have a Matrix account you can <a>log in</a> instead.": "Se você já tem uma conta Matrix, pode também fazer <a>login</a>.",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Não foi possível conectar ao Servidor de Base. Por favor, confira sua conectividade à internet, garanta que o <a>certificado SSL do Servidor de Base</a> é confiável, e que uma extensão do navegador não esteja bloqueando as requisições de rede.",
"Encrypted by an unverified device": "Criptografado por um dispositivo não verificado",
"Set": "Definir",
"Unencrypted message": "Mensagem não criptografada",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Participar por <voiceText>voz</voiceText> ou por <videoText>vídeo</videoText>.",
"Uploading %(filename)s and %(count)s others.other": "Enviando o arquivo %(filename)s e %(count)s outros arquivos",
"Username available": "Nome de usuária(o) disponível",
"Close": "Fechar",
"Level:": "Nível:",
"%(count)s new messages.other": "%(count)s novas mensagens",
"Unverified": "Não verificado",
"<a>Click here</a> to join the discussion!": "<a>Clique aqui</a> para participar da conversa!",
"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",
"Create a new chat or reuse an existing one": "Criar uma nova conversa ou reutilizar alguma já existente",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Reenviar todas</a> ou <a>cancelar todas</a> agora. Você também pode selecionar mensagens individuais que queira reenviar ou cancelar.",
"Reason: %(reasonText)s": "Justificativa: %(reasonText)s",
"Home": "Início",
"Something went wrong!": "Algo deu errado!",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nível de permissão %(powerLevelNumber)s)",
"Start chat": "Iniciar conversa pessoal",
"You already have existing direct chats with this user:": "Você já tem conversas pessoais com esta pessoa:",
"Accept": "Aceitar",
"%(roomName)s is not accessible at this time.": "%(roomName)s não está acessível neste momento."
} }

View file

@ -81,7 +81,7 @@
"Error": "Erro", "Error": "Erro",
"Event information": "Informação do evento", "Event information": "Informação do evento",
"Export E2E room keys": "Exportar chaves ponta-a-ponta da sala", "Export E2E room keys": "Exportar chaves ponta-a-ponta da sala",
"Failed to change password. Is your password correct?": "Não foi possível modificar a senha. A senha informada está correta?", "Failed to change password. Is your password correct?": "Não foi possível mudar a senha. A sua senha está correta?",
"Failed to forget room": "Não foi possível esquecer a sala", "Failed to forget room": "Não foi possível esquecer a sala",
"Failed to leave room": "Falha ao tentar deixar a sala", "Failed to leave room": "Falha ao tentar deixar a sala",
"Failed to reject invitation": "Falha ao tentar rejeitar convite", "Failed to reject invitation": "Falha ao tentar rejeitar convite",
@ -101,7 +101,7 @@
"Guests cannot join this room even if explicitly invited.": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os.", "Guests cannot join this room even if explicitly invited.": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os.",
"Guests can't set avatars. Please register.": "Convidados não podem definir uma foto do perfil. Por favor, registre-se.", "Guests can't set avatars. Please register.": "Convidados não podem definir uma foto do perfil. Por favor, registre-se.",
"Guests can't use labs features. Please register.": "Convidados não podem usar as funcionalidades de laboratório (lab), por gentileza se registre.", "Guests can't use labs features. Please register.": "Convidados não podem usar as funcionalidades de laboratório (lab), por gentileza se registre.",
"Guest users can't upload files. Please register to upload": "Usuários não podem fazer envio de arquivos. Por favor se cadastre para enviar arquivos", "Guest users can't upload files. Please register to upload.": "Usuários não podem fazer envio de arquivos. Por favor se cadastre para enviar arquivos.",
"had": "teve", "had": "teve",
"Hangup": "Desligar", "Hangup": "Desligar",
"Historical": "Histórico", "Historical": "Histórico",
@ -399,7 +399,7 @@
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.",
"You are already in a call.": "Você já está em uma chamada.", "You are already in a call.": "Você já está em uma chamada.",
"You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione", "You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione",
"You are trying to access %(roomName)s": "Você está tentando acessar a sala %(roomName)s", "You are trying to access %(roomName)s.": "Você está tentando acessar a sala %(roomName)s.",
"You cannot place a call with yourself.": "Você não pode iniciar uma chamada.", "You cannot place a call with yourself.": "Você não pode iniciar uma chamada.",
"You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.", "You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.",
"You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.", "You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.",
@ -417,7 +417,7 @@
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Nomes de usuária/o podem conter apenas letras, números, pontos, hífens e linha inferior (_).", "User names may only contain letters, numbers, dots, hyphens and underscores.": "Nomes de usuária/o podem conter apenas letras, números, pontos, hífens e linha inferior (_).",
"An unknown error occurred.": "Um erro desconhecido ocorreu.", "An unknown error occurred.": "Um erro desconhecido ocorreu.",
"I already have an account": "Eu já tenho uma conta", "I already have an account": "Eu já tenho uma conta",
"An error occured: %(error_string)s": "Um erro ocorreu: %(error_string)s", "An error occurred: %(error_string)s": "Um erro ocorreu: %(error_string)s",
"Topic": "Tópico", "Topic": "Tópico",
"Make this room private": "Tornar esta sala privada", "Make this room private": "Tornar esta sala privada",
"Share message history with new users": "Compartilhar histórico de mensagens com novas/os usuárias/os", "Share message history with new users": "Compartilhar histórico de mensagens com novas/os usuárias/os",
@ -627,15 +627,14 @@
"Server may be unavailable, overloaded, or search timed out :(": "O servidor pode estar indisponível, sobrecarregado, ou a busca ultrapassou o tempo limite :(", "Server may be unavailable, overloaded, or search timed out :(": "O servidor pode estar indisponível, sobrecarregado, ou a busca ultrapassou o tempo limite :(",
"Server may be unavailable, overloaded, or the file too big": "O servidor pode estar indisponível, sobrecarregado, ou o arquivo é muito grande", "Server may be unavailable, overloaded, or the file too big": "O servidor pode estar indisponível, sobrecarregado, ou o arquivo é muito grande",
"Server unavailable, overloaded, or something else went wrong.": "O servidor pode estar indisponível, sobrecarregado, ou alguma outra coisa não funcionou.", "Server unavailable, overloaded, or something else went wrong.": "O servidor pode estar indisponível, sobrecarregado, ou alguma outra coisa não funcionou.",
"Some of your messages have not been sent": "Algumas das suas mensagens não foram enviadas", "Some of your messages have not been sent.": "Algumas das suas mensagens não foram enviadas.",
"Submit": "Enviar", "Submit": "Enviar",
"The main address for this room is": "O endereço principal desta sala é", "The main address for this room is": "O endereço principal desta sala é",
"This action cannot be performed by a guest user. Please register to be able to do this": "Esta ação não pode ser realizada por um/a usuário/a visitante. Por favor, registre-se para poder fazer isso", "This action cannot be performed by a guest user. Please register to be able to do this.": "Esta ação não pode ser realizada por um/a usuário/a visitante. Por favor, registre-se para poder fazer isso.",
"%(actionVerb)s this person?": "%(actionVerb)s esta pessoa?", "%(actionVerb)s this person?": "%(actionVerb)s esta pessoa?",
"This room has no local addresses": "Esta sala não tem endereços locais", "This room has no local addresses": "Esta sala não tem endereços locais",
"This room is private or inaccessible to guests. You may be able to join if you register": "Esta sala é privada ou inacessível para visitantes. Você poderá ingressar nela se registrar-se", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tentei carregar um ponto específico na linha do tempo desta sala, mas parece que você não tem permissões para ver a mensagem em questão.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question": "Tentei carregar um ponto específico na linha do tempo desta sala, mas parece que você não tem permissões para ver a mensagem em questão", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tentei carregar um ponto específico na linha do tempo desta sala, mas não o encontrei.",
"Tried to load a specific point in this room's timeline, but was unable to find it": "Tentei carregar um ponto específico na linha do tempo desta sala, mas não o encontrei",
"Turn Markdown off": "Desabilitar a formatação 'Markdown'", "Turn Markdown off": "Desabilitar a formatação 'Markdown'",
"Turn Markdown on": "Habilitar a marcação 'Markdown'", "Turn Markdown on": "Habilitar a marcação 'Markdown'",
"Unable to load device list": "Não foi possível carregar a lista de dispositivos", "Unable to load device list": "Não foi possível carregar a lista de dispositivos",
@ -644,7 +643,7 @@
"You have been invited to join this room by %(inviterName)s": "Você foi convidada/o por %(inviterName)s a ingressar nesta sala", "You have been invited to join this room by %(inviterName)s": "Você foi convidada/o por %(inviterName)s a ingressar nesta sala",
"You seem to be in a call, are you sure you want to quit?": "Parece que você está em uma chamada. Tem certeza que quer sair?", "You seem to be in a call, are you sure you want to quit?": "Parece que você está em uma chamada. Tem certeza que quer sair?",
"You seem to be uploading files, are you sure you want to quit?": "Parece que você está enviando arquivos. Tem certeza que quer sair?", "You seem to be uploading files, are you sure you want to quit?": "Parece que você está enviando arquivos. Tem certeza que quer sair?",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself": "Você não poderá desfazer esta mudança, pois estará dando a este(a) usuário(a) o mesmo nível de permissões que você", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Você não poderá desfazer esta mudança, pois estará dando a este(a) usuário(a) o mesmo nível de permissões que você.",
"Make Moderator": "Tornar moderador(a)", "Make Moderator": "Tornar moderador(a)",
"Room": "Sala", "Room": "Sala",
"(~%(searchCount)s results)": "(±%(searchCount)s resultados)", "(~%(searchCount)s results)": "(±%(searchCount)s resultados)",
@ -701,7 +700,6 @@
"%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)salterou sua imagem pública %(repeats)s vezes", "%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)salterou sua imagem pública %(repeats)s vezes",
"%(severalUsers)schanged their avatar": "%(severalUsers)salteraram sua imagem pública", "%(severalUsers)schanged their avatar": "%(severalUsers)salteraram sua imagem pública",
"Ban": "Banir", "Ban": "Banir",
"A registered account is required for this action": "Uma conta registrada é necessária para esta ação",
"Access Token:": "Token de acesso:", "Access Token:": "Token de acesso:",
"Always show message timestamps": "Sempre mostrar as datas das mensagens", "Always show message timestamps": "Sempre mostrar as datas das mensagens",
"Authentication": "Autenticação", "Authentication": "Autenticação",
@ -717,7 +715,6 @@
"Mute": "Mudo", "Mute": "Mudo",
"olm version:": "versão do olm:", "olm version:": "versão do olm:",
"Operation failed": "A operação falhou", "Operation failed": "A operação falhou",
"Registration required": "Registro obrigatório",
"Remove %(threePid)s?": "Remover %(threePid)s?", "Remove %(threePid)s?": "Remover %(threePid)s?",
"Report it": "Reportar", "Report it": "Reportar",
"riot-web version:": "versão do riot-web:", "riot-web version:": "versão do riot-web:",
@ -809,7 +806,7 @@
"Enable URL previews for this room (affects only you)": "Habilitar pré-visualizações de links para esta sala (afeta somente a você)", "Enable URL previews for this room (affects only you)": "Habilitar pré-visualizações de links para esta sala (afeta somente a você)",
"Drop file here to upload": "Arraste um arquivo aqui para enviar", "Drop file here to upload": "Arraste um arquivo aqui para enviar",
" (unsupported)": " (não suportado)", " (unsupported)": " (não suportado)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Conferência%(supportedText)s em andamento. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Conferência%(supportedText)s em andamento.",
"Online": "Online", "Online": "Online",
"Idle": "Ocioso", "Idle": "Ocioso",
"Offline": "Offline", "Offline": "Offline",
@ -861,7 +858,6 @@
"Anyone": "Qualquer pessoa", "Anyone": "Qualquer pessoa",
"Are you sure you want to leave the room '%(roomName)s'?": "Você tem certeza que deseja sair da sala '%(roomName)s'?", "Are you sure you want to leave the room '%(roomName)s'?": "Você tem certeza que deseja sair da sala '%(roomName)s'?",
"Custom level": "Nível personalizado", "Custom level": "Nível personalizado",
"(default: %(userName)s)": "(padrão: %(userName)s)",
"Device ID:": "ID do dispositivo:", "Device ID:": "ID do dispositivo:",
"device id: ": "id do dispositivo: ", "device id: ": "id do dispositivo: ",
"Device key:": "Chave do dispositivo:", "Device key:": "Chave do dispositivo:",
@ -872,10 +868,97 @@
"Register": "Registre-se", "Register": "Registre-se",
"Remote addresses for this room:": "Endereços remotos para esta sala:", "Remote addresses for this room:": "Endereços remotos para esta sala:",
"Save": "Salvar", "Save": "Salvar",
"Setting a user name will create a fresh account": "Definir um nome de usuária(o) vai criar uma conta nova",
"Tagged as: ": "Marcado como: ", "Tagged as: ": "Marcado como: ",
"You have <a>disabled</a> URL previews by default.": "Você <a>desabilitou</a> pré-visualizações de links por padrão.", "You have <a>disabled</a> URL previews by default.": "Você <a>desabilitou</a> pré-visualizações de links por padrão.",
"You have <a>enabled</a> URL previews by default.": "Você <a>habilitou</a> pré-visualizações de links por padrão.", "You have <a>enabled</a> URL previews by default.": "Você <a>habilitou</a> pré-visualizações de links por padrão.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Você inseriu um contato inválido. Tente usar o ID Matrix ou endereço de e-mail da pessoa que está buscando.", "You have entered an invalid contact. Try using their Matrix ID or email address.": "Você inseriu um contato inválido. Tente usar o ID Matrix ou endereço de e-mail da pessoa que está buscando.",
"Hide removed messages": "Ocultar mensagens removidas" "Hide removed messages": "Ocultar mensagens removidas",
"Add": "Adicionar",
"%(count)s new messages.one": "%(count)s nova mensagem",
"%(count)s new messages.other": "%(count)s novas mensagens",
"Disable markdown formatting": "Desabilitar formatação MarkDown",
"Error: Problem communicating with the given homeserver.": "Erro: problema de comunicação com o Servidor de Base fornecido.",
"Failed to fetch avatar URL": "Falha ao obter a URL da imagem de perfil",
"Home": "Início",
"The phone number entered looks invalid": "O número de telefone inserido parece ser inválido",
"Uploading %(filename)s and %(count)s others.zero": "Enviando o arquivo %(filename)s",
"Uploading %(filename)s and %(count)s others.one": "Enviando o arquivo %(filename)s e %(count)s outros arquivos",
"Uploading %(filename)s and %(count)s others.other": "Enviando o arquivo %(filename)s e %(count)s outros arquivos",
"Username invalid: %(errMessage)s": "Nome de usuária(o) inválido: %(errMessage)s",
"Searching known users": "Buscando pessoas conhecidas",
"You must <a>register</a> to use this functionality": "Você deve <a>se registrar</a> para poder usar esta funcionalidade",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Reenviar todas</a> ou <a>cancelar todas</a> agora. Você também pode selecionar mensagens individuais que queira reenviar ou cancelar.",
"Create new room": "Criar nova sala",
"Welcome page": "Página de boas vindas",
"Room directory": "Lista pública de salas",
"Start chat": "Iniciar conversa pessoal",
"New Password": "Nova senha",
"Start chatting": "Iniciar a conversa",
"Start Chatting": "Iniciar a conversa",
"Click on the button below to start chatting!": "Clique no botão abaixo para começar a conversar!",
"Create a new chat or reuse an existing one": "Criar uma nova conversa ou reutilizar alguma já existente",
"You already have existing direct chats with this user:": "Você já tem conversas pessoais com esta pessoa:",
"Username available": "Nome de usuária(o) disponível",
"Username not available": "Nome de usuária(o) indisponível",
"Something went wrong!": "Algo deu errado!",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Este será seu nome de conta no Servidor de Base <span></span>, ou então você pode escolher um <a>servidor diferente</a>.",
"If you already have a Matrix account you can <a>log in</a> instead.": "Se você já tem uma conta Matrix, pode também fazer <a>login</a>.",
"a room": "uma sala",
"Accept": "Aceitar",
"Active call (%(roomName)s)": "Chamada ativa (%(roomName)s)",
"Admin tools": "Ferramentas de administração",
"And %(count)s more...": "E mais %(count)s...",
"Alias (optional)": "Apelido (opcional)",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Não foi possível conectar ao Servidor de Base. Por favor, confira sua conectividade à internet, garanta que o <a>certificado SSL do Servidor de Base</a> é confiável, e que uma extensão do navegador não esteja bloqueando as requisições de rede.",
"<a>Click here</a> to join the discussion!": "<a>Clique aqui</a> para participar da conversa!",
"Close": "Fechar",
"Custom": "Personalizado",
"Decline": "Recusar",
"Disable Notifications": "Desabilitar notificações",
"Drop File Here": "Arraste o arquivo aqui",
"Enable Notifications": "Habilitar notificações",
"Encrypted by a verified device": "Criptografado por um dispositivo verificado",
"Encrypted by an unverified device": "Criptografado por um dispositivo não verificado",
"Failed to upload profile picture!": "Falha ao enviar a imagem de perfil!",
"Incoming call from %(name)s": "Chamada de %(name)s recebida",
"Incoming video call from %(name)s": "Chamada de vídeo de %(name)s recebida",
"Incoming voice call from %(name)s": "Chamada de voz de %(name)s recebida",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Participar por <voiceText>voz</voiceText> ou por <videoText>vídeo</videoText>.",
"Last seen": "Último uso",
"Level:": "Nível:",
"No display name": "Sem nome público de usuária(o)",
"Otherwise, <a>click here</a> to send a bug report.": "Caso contrário, <a>clique aqui</a> para enviar um relatório de erros.",
"Private Chat": "Conversa privada",
"Public Chat": "Conversa pública",
"Reason: %(reasonText)s": "Justificativa: %(reasonText)s",
"Rejoin": "Voltar a participar da sala",
"Room contains unknown devices": "Esta sala contém dispositivos desconhecidos",
"%(roomName)s does not exist.": "%(roomName)s não existe.",
"%(roomName)s is not accessible at this time.": "%(roomName)s não está acessível neste momento.",
"Seen by %(userName)s at %(dateTime)s": "Visto por %(userName)s em %(dateTime)s",
"Send anyway": "Enviar de qualquer maneira",
"Set": "Definir",
"Show Text Formatting Toolbar": "Exibir barra de formatação de texto",
"Start authentication": "Iniciar autenticação",
"This invitation was sent to an email address which is not associated with this account:": "Este convite foi enviado para um endereço de e-mail que não é associado a esta conta:",
"This room": "Esta sala",
"To link to a room it must have <a>an address</a>.": "Para produzir um link para uma sala, ela necessita ter <a>um endereço</a>.",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Não foi possível garantir que o endereço para o qual este convite foi enviado bate com alqum que está associado com sua conta.",
"Undecryptable": "Não é possível descriptografar",
"Unencrypted message": "Mensagem não criptografada",
"unknown caller": "a pessoa que está chamando é desconhecida",
"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 <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Você gostaria de <acceptText>aceitar</acceptText> ou <declineText>recusar</declineText> este convite?",
"You have been banned from %(roomName)s by %(userName)s.": "Você foi expulso(a) da sala %(roomName)s por %(userName)s.",
"You have been kicked from %(roomName)s by %(userName)s.": "Você foi removido(a) da sala %(roomName)s por %(userName)s.",
"You may wish to login with a different account, or add this email to this account.": "Você pode querer fazer login com uma conta diferente, ou adicionar este e-mail a esta conta.",
"Your home server does not support device management.": "O seu Servidor de Base não suporta o gerenciamento de dispositivos.",
"(~%(count)s results).one": "(~%(count)s resultado)",
"(~%(count)s results).other": "(~%(count)s resultados)",
"Device Name": "Nome do dispositivo"
} }

View file

@ -5,7 +5,7 @@
"Account": "Аккаунт", "Account": "Аккаунт",
"Add email address": "Добавить email адрес", "Add email address": "Добавить email адрес",
"Add phone number": "Добавить телефонный номер", "Add phone number": "Добавить телефонный номер",
"Admin": "Admin", "Admin": "Админ",
"Advanced": "Дополнительно", "Advanced": "Дополнительно",
"Algorithm": "Алгоритм", "Algorithm": "Алгоритм",
"all room members": "все участники комнаты", "all room members": "все участники комнаты",
@ -16,7 +16,7 @@
"An email has been sent to": "Email был отправлен", "An email has been sent to": "Email был отправлен",
"A new password must be entered.": "Введите новый пароль.", "A new password must be entered.": "Введите новый пароль.",
"answered the call.": "принятый звонок.", "answered the call.": "принятый звонок.",
"anyone": "кто угодно", "anyone": "любой",
"Anyone who knows the room's link, apart from guests": "Любой, кто знает ссылку на комнату, кроме гостей", "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, including guests": "Любой, кто знает ссылку комнаты, включая гостей",
"Are you sure you want to reject the invitation?": "Вы уверены что вы хотите отклонить приглашение?", "Are you sure you want to reject the invitation?": "Вы уверены что вы хотите отклонить приглашение?",
@ -50,16 +50,16 @@
"Create Room": "Создайте Комнату", "Create Room": "Создайте Комнату",
"Cryptography": "Шифрование", "Cryptography": "Шифрование",
"Curve25519 identity key": "Curve25519 идентификационный ключ", "Curve25519 identity key": "Curve25519 идентификационный ключ",
"Deactivate Account": "Деактивировать Учётную запись", "Deactivate Account": "Деактивировать учётную запись",
"Deactivate my account": "Деактивировать мою учётную запись", "Deactivate my account": "Деактивировать мою учётную запись",
"decline": "отказаться", "decline": "отказаться",
"Decryption error": "Ошибка дешифрования", "Decryption error": "Ошибка дешифрования",
"Default": "Default", "Default": "Стандарт",
"demote": "понижать", "demote": "понижать",
"Deops user with given id": "Deops пользователь с данным id", "Deops user with given id": "Deops пользователь с данным id",
"Device 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": "Устройство еще не будет в состоянии дешифровать историю, до присоединения к комнате",
"Direct Chat": ерсональное сообщение", "Direct Chat": риватный чат",
"Disable inline URL previews by default": "Отключить встроенные предварительные просмотры URL по умолчанию", "Disable inline URL previews by default": "Отключить встроенные предварительные просмотры URL по умолчанию",
"Display name": "Отображаемое имя", "Display name": "Отображаемое имя",
"Displays action": "Отображение действий", "Displays action": "Отображение действий",
@ -75,7 +75,7 @@
"Error": "Ошибка", "Error": "Ошибка",
"Event information": "Event information", "Event information": "Event information",
"Export E2E room keys": "Экспорт E2E ключей комнаты", "Export E2E room keys": "Экспорт E2E ключей комнаты",
"Failed to change password. Is your password correct?": "Не удалось изменить пароль. Ваш пароль правильный?", "Failed to change password. Is your password correct?": "Не удалось сменить пароль. Вы правильно ввели текущий пароль?",
"Failed to forget room": "Не удалось забыть комнату", "Failed to forget room": "Не удалось забыть комнату",
"Failed to leave room": "Не удалось выйти из комнаты", "Failed to leave room": "Не удалось выйти из комнаты",
"Failed to reject invitation": "Не удалось отклонить приглашение", "Failed to reject invitation": "Не удалось отклонить приглашение",
@ -83,35 +83,35 @@
"Failed to unban": "Не удалось отменить запрет", "Failed to unban": "Не удалось отменить запрет",
"Failed to upload file": "Не удалось закачать файл", "Failed to upload file": "Не удалось закачать файл",
"Favourite": "Избранное", "Favourite": "Избранное",
"favourite": "фаворит", "favourite": "Избранное",
"Favourites": "Фавориты", "Favourites": "Избранное",
"Filter room members": "Фильтр участников комнаты", "Filter room members": "Фильтр участников комнаты",
"Forget room": "Забыть комнату", "Forget room": "Забыть комнату",
"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.": "Для обеспечения безопасности эта сессия была завершена. Войдите в систему еще раз.",
"Found a bug?": "Нашли ошибку?", "Found a bug?": "Нашли ошибку?",
"had": "имеет", "had": "имеет",
"Hangup": "Отключение", "Hangup": "Отключение",
"Historical": "Исторический", "Historical": "История",
"Homeserver is": "Домашний сервер является", "Homeserver is": "Домашний сервер является",
"Identity Server is": "Регистрационный сервер", "Identity Server is": "Регистрационный сервер",
"I have verified my email address": "Я проверил мой адрес электронной почты", "I have verified my email address": "Я проверил мой адрес электронной почты",
"Import E2E room keys": "Импортировать E2E ключ комнаты", "Import E2E room keys": "Импортировать E2E ключ комнаты",
"Invalid Email Address": "Недействительный адрес электронной почты", "Invalid Email Address": "Недействительный адрес электронной почты",
"invited": "invited", "invited": "invited",
"Invite new room members": "Прегласить новых учасников комнаты", "Invite new room members": "Пригласить новых участников в комнату",
"Invites": "Приглашать", "Invites": "Приглашать",
"Invites user with given id to current room": "Пригласить пользователя с данным id в текущую комнату", "Invites user with given id to current room": "Пригласить пользователя с данным ID в текущую комнату",
"is a": "является", "is a": "является",
"Sign in with": "Я хочу регистрироваться с", "Sign in with": "Я хочу регистрироваться с",
"joined and left": "присоединенный и оставленный", "joined and left": "присоединенный и оставленный",
"joined": "присоединенный", "joined": "присоединенный",
"joined the room": "joined the room", "joined the room": "joined the room",
"Joins room with given alias": "Присоединяется к комнате с данным псевдонимом", "Joins room with given alias": "Присоединяется к комнате с данным псевдонимом",
"Kicks user with given id": "Кик пользователя с заданным id", "Kicks user with given id": "Выгнать пользователя с заданным id",
"Labs": "Лаборатория", "Labs": "Лаборатория",
"Leave room": "Уйти из комнаты", "Leave room": "Уйти из комнаты",
"left and rejoined": "Покинуть и переподключится", "left and rejoined": "Покинуть и пере подключится",
"left": "покинуть", "left": "покинуть",
"left the room": "left the room", "left the room": "left the room",
"Logged in as": "Зарегистрированный как", "Logged in as": "Зарегистрированный как",
@ -119,14 +119,14 @@
"Logout": "Выход из системы", "Logout": "Выход из системы",
"Low priority": "Низкий приоритет", "Low priority": "Низкий приоритет",
"made future room history visible to": "made future room history visible to", "made future room history visible to": "made future room history visible to",
"Manage Integrations": "Управление интеграций", "Manage Integrations": "Управление Интеграциями",
"Members only": "Только участники", "Members only": "Только участники",
"Mobile phone number": "Номер мобильного телефона", "Mobile phone number": "Номер мобильного телефона",
"Moderator": "Ведущий", "Moderator": "Ведущий",
"my Matrix ID": "мой Matrix ID", "my Matrix ID": "мой Matrix ID",
"Name": "Имя", "Name": "Имя",
"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": "Никогда не отправляйте зашифрованные сообщения на непроверенные устройства в этой комнате из вашего устройства",
"New password": "Новый пароль", "New password": "Новый пароль",
"New passwords must match each other.": "Новые пароли должны соответствовать друг другу.", "New passwords must match each other.": "Новые пароли должны соответствовать друг другу.",
"none": "никто", "none": "никто",
@ -153,13 +153,13 @@
"requested a VoIP conference": "requested a VoIP conference", "requested a VoIP conference": "requested a VoIP conference",
"Return to login screen": "Return to login screen", "Return to login screen": "Return to login screen",
"Send Reset Email": "Send Reset Email", "Send Reset Email": "Send Reset Email",
"sent an image": "sent an image", "sent an image": "отправил изображение",
"sent an invitation to": "sent an invitation to", "sent an invitation to": "sent an invitation to",
"set a profile picture": "set a profile picture", "set a profile picture": "set a profile picture",
"set their display name to": "set their display name to", "set their display name to": "set their display name to",
"Settings": "Настройки", "Settings": "Настройки",
"Start a chat": "Start a chat", "Start a chat": "Начать чат",
"Start Chat": "Start Chat", "Start Chat": "Начать чат",
"tag as": "tag as", "tag as": "tag as",
"These are experimental features that may break in unexpected ways. Use with caution": "These are experimental features that may break in unexpected ways. Use with caution", "These are experimental features that may break in unexpected ways. Use with caution": "These are experimental features that may break in unexpected ways. Use with caution",
"To send events of type": "Для отправки типа событий", "To send events of type": "Для отправки типа событий",
@ -170,8 +170,8 @@
"Unable to verify email address.": "Невозможно проверить адрес электронной почты.", "Unable to verify email address.": "Невозможно проверить адрес электронной почты.",
"Unban": "Отменить запрет", "Unban": "Отменить запрет",
"Unencrypted room": "Незашифрованная комната", "Unencrypted room": "Незашифрованная комната",
"unencrypted": "незашифрованно", "unencrypted": "незашифровано",
"unknown device": "неизвесное устройство", "unknown device": "неизвестное устройство",
"unknown error code": "неизвестная ошибка", "unknown error code": "неизвестная ошибка",
"unknown": "неизвестно", "unknown": "неизвестно",
"Upload avatar": "Загрузить аватар", "Upload avatar": "Загрузить аватар",
@ -189,8 +189,8 @@
"Video call": "Видио вызов", "Video call": "Видио вызов",
"Voice call": "Голосовой вызов", "Voice call": "Голосовой вызов",
"VoIP conference finished.": "VoIP конференция закончилась.", "VoIP conference finished.": "VoIP конференция закончилась.",
"VoIP conference started.": "VoIP Конференция стартовала.", "VoIP conference started.": "VoIP конференция началась.",
"(warning: cannot be disabled again!)": "(предупреждение: не может быть снова отключен!)", "(warning: cannot be disabled again!)": "(предупреждение: не может быть отключено!)",
"Warning!": "Предупреждение!", "Warning!": "Предупреждение!",
"was banned": "запрещен", "was banned": "запрещен",
"was invited": "приглашенный", "was invited": "приглашенный",
@ -200,7 +200,7 @@
"were": "быть", "were": "быть",
"Who can access this room?": "Кто может получить доступ к этой комнате?", "Who can access this room?": "Кто может получить доступ к этой комнате?",
"Who can read history?": "Кто может читать историю?", "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?": "С кем хотели бы Вы связываться?", "Who would you like to communicate with?": "С кем хотели бы Вы связываться?",
"withdrawn": "уходить", "withdrawn": "уходить",
"Would you like to": "Хотели бы Вы", "Would you like to": "Хотели бы Вы",
@ -227,10 +227,10 @@
"%(senderName)s answered the call.": "%(senderName)s ответил на звонок.", "%(senderName)s answered the call.": "%(senderName)s ответил на звонок.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s запрещенный %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s запрещенный %(targetName)s.",
"Call Timeout": "Время ожидания вызова", "Call Timeout": "Время ожидания вызова",
"%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s их имя измененное с %(oldDisplayName)s на %(displayName)s.", "%(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 their profile picture.": "%(senderName)s изменил фото профиля.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s уровень мощности изменен на %(powerLevelDiffText)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 room name to %(roomName)s.": "%(senderDisplayName)s имя комнаты изменено на %(roomName)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.",
"Conference call failed.": "Конференц-вызов прервался.", "Conference call failed.": "Конференц-вызов прервался.",
"Conference calling is in development and may not be reliable.": "Конференц-вызов находится в процессе и может не быть надежным.", "Conference calling is in development and may not be reliable.": "Конференц-вызов находится в процессе и может не быть надежным.",
@ -246,7 +246,7 @@
"Failed to set up conference call": "Не удалось установить конференц-вызов", "Failed to set up conference call": "Не удалось установить конференц-вызов",
"Failed to verify email address: make sure you clicked the link in the email": "Не удалось подтвердить email-адрес: убедитесь что вы щелкнули по ссылке электронной почты", "Failed to verify email address: make sure you clicked the link in the email": "Не удалось подтвердить email-адрес: убедитесь что вы щелкнули по ссылке электронной почты",
"Failure to create room": "Не удалось создать комнату", "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",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Гостевые пользователи не могут создавать новые комнаты. Зарегистрируйтесь для создания комнаты и чата.", "Guest users can't create new rooms. Please register to create room and start a chat.": "Гостевые пользователи не могут создавать новые комнаты. Зарегистрируйтесь для создания комнаты и чата.",
"click to reveal": "нажать для открытия", "click to reveal": "нажать для открытия",
"%(senderName)s invited %(targetName)s.": "%(senderName)s приглашает %(targetName)s.", "%(senderName)s invited %(targetName)s.": "%(senderName)s приглашает %(targetName)s.",
@ -254,16 +254,16 @@
"%(targetName)s joined the room.": "%(targetName)s вошёл в комнату.", "%(targetName)s joined the room.": "%(targetName)s вошёл в комнату.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s выкинул %(targetName)s.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s выкинул %(targetName)s.",
"%(targetName)s left the room.": "%(targetName)s покинул комнату.", "%(targetName)s left the room.": "%(targetName)s покинул комнату.",
"%(senderName)s made future room history visible to": "%(senderName)s история сделаной будущей комнаты, видимая для", "%(senderName)s made future room history visible to": "%(senderName)s сделал видимой для всех будущую историю комнаты",
"Missing room_id in request": "Отсутствует room_id в запросе", "Missing room_id in request": "Отсутствует room_id в запросе",
"Missing user_id in request": "Отсутствует user_id в запросе", "Missing user_id in request": "Отсутствует user_id в запросе",
"Must be viewing a room": "Комната должна быть посищена", "Must be viewing a room": "Посмотреть комнату",
"New Composer & Autocomplete": "Новый едитор & Автозаполнение", "New Composer & Autocomplete": "Новый автор & Автозаполнение",
"(not supported by this browser)": "(не поддерживаемый этим браузером)", "(not supported by this browser)": "(не поддерживаемый этим браузером)",
"af": "Африкаанс", "af": "Африкаанс",
"ar-ae": "Арабский (О.А.Е)", "ar-ae": "Арабский (О.А.Е)",
"ar-bh": "Арабский (Бахрейн)", "ar-bh": "Арабский (Бахрейн)",
"ar-dz": "Арабский (Алжыр)", "ar-dz": "Арабский (Алжир)",
"ar-eg": "Арабский (Египет)", "ar-eg": "Арабский (Египет)",
"ar-iq": "Арабский (Ирак)", "ar-iq": "Арабский (Ирак)",
"ar-jo": "Арабский (Иордания)", "ar-jo": "Арабский (Иордания)",
@ -285,7 +285,7 @@
"de-ch": "Немецкий (Швейцария)", "de-ch": "Немецкий (Швейцария)",
"de-li": "Немецкий (Лихтенштейн)", "de-li": "Немецкий (Лихтенштейн)",
"de-lu": "Немецкий (Люксембург)", "de-lu": "Немецкий (Люксембург)",
"el": "Гречиский", "el": "Греческий",
"en-au": "Английский (Австралия)", "en-au": "Английский (Австралия)",
"en-bz": "Английский (Белиз)", "en-bz": "Английский (Белиз)",
"en-ca": "Английский (Канада)", "en-ca": "Английский (Канада)",
@ -310,7 +310,7 @@
"es-pa": "Испанский (Панама)", "es-pa": "Испанский (Панама)",
"et": "Эстонский", "et": "Эстонский",
"fi": "Финский", "fi": "Финский",
"fr": "Французкий", "fr": "Французский",
"hr": "Хорватский", "hr": "Хорватский",
"it": "Итальянский", "it": "Итальянский",
"ja": "Японский", "ja": "Японский",
@ -320,7 +320,7 @@
"ro": "Румынский", "ro": "Румынский",
"uk": "Украинский", "uk": "Украинский",
"now. You can also select individual messages to resend or cancel.": "теперь. Вы можете также выбрать отдельные сообщения, чтобы снова послать или отменить.", "now. You can also select individual messages to resend or cancel.": "теперь. Вы можете также выбрать отдельные сообщения, чтобы снова послать или отменить.",
"Auto-complete": "Автозаполнение", "Auto-complete": "Авто-заполнение",
"Error changing language": "Ошибка изменения языка", "Error changing language": "Ошибка изменения языка",
"Riot was unable to find the correct Data for the selected Language.": "Riot был неспособен найти правельные данные для выбранного языка.", "Riot was unable to find the correct Data for the selected Language.": "Riot был неспособен найти правельные данные для выбранного языка.",
"Connectivity to the server has been lost.": "Связь с сервером была потеряна.", "Connectivity to the server has been lost.": "Связь с сервером была потеряна.",
@ -336,7 +336,7 @@
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Имена пользователей могут только содержать буквы, числа, точки, дефисы и подчеркивания.", "User names may only contain letters, numbers, dots, hyphens and underscores.": "Имена пользователей могут только содержать буквы, числа, точки, дефисы и подчеркивания.",
"An unknown error occurred.": "Произошла неизвестная ошибка.", "An unknown error occurred.": "Произошла неизвестная ошибка.",
"I already have an account": "У меня уже есть учетная запись", "I already have an account": "У меня уже есть учетная запись",
"An error occured: %(error_string)s": "Произошла ошибка: %(error_string)s", "An error occurred: %(error_string)s": "Произошла ошибка: %(error_string)s",
"Topic": "Тема", "Topic": "Тема",
"Make this room private": "Сделать эту комнату частной", "Make this room private": "Сделать эту комнату частной",
"Share message history with new users": "Поделись историей сообщений с новыми учасниками", "Share message history with new users": "Поделись историей сообщений с новыми учасниками",
@ -356,15 +356,15 @@
"Saturday": "Суббота", "Saturday": "Суббота",
"Sunday": "Воскресенье", "Sunday": "Воскресенье",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"Upload an avatar:": "Загрузить аватар", "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 need to be able to invite users to do that.": "Вам необходимо пригласить пользователей чтобы сделать это.",
"You cannot place VoIP calls in this browser.": "Вы не можете сделать вызовы VoIP с этим браузером.", "You cannot place VoIP calls in this browser.": "Вы не можете сделать вызовы VoIP с этим браузером.",
"You are already in a call.": "Вы уже находитесь в разговоре.", "You are already in a call.": "Связь уже установлена.",
"You're not in any rooms yet! Press": "Вы еще не находитесь ни в каких комнатах! Нажать", "You're not in any rooms yet! Press": "Вы еще не находитесь ни в каких комнатах! Нажать",
"You are trying to access %(roomName)s": "Вы пытаетесь получить доступ %(roomName)s", "You are trying to access %(roomName)s.": "Вы пытаетесь получить доступ к %(roomName)s.",
"You cannot place a call with yourself.": "Вы не можете позвонить самим себе.", "You cannot place a call with yourself.": "Вы не можете позвонить самим себе.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s анулировал %(targetName)s's преглашение.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s отменил %(targetName)s's приглашение.",
"Sep": "Сен.", "Sep": "Сен.",
"Jan": "Янв.", "Jan": "Янв.",
"Feb": "Фев.", "Feb": "Фев.",
@ -377,7 +377,7 @@
"Oct": "Окт.", "Oct": "Окт.",
"Nov": "Ноя.", "Nov": "Ноя.",
"Dec": "Дек.", "Dec": "Дек.",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s",
"Mon": "Пн", "Mon": "Пн",
"Sun": "Вс", "Sun": "Вс",
"Tue": "Вт", "Tue": "Вт",
@ -388,10 +388,10 @@
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Вам необходимо снова войти в генерировать сквозное шифрование (е2е) ключей для этого устройства и предоставить публичный ключ Вашему домашнему серверу. Это после выключения; приносим извинения за причиненные неудобства.", "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Вам необходимо снова войти в генерировать сквозное шифрование (е2е) ключей для этого устройства и предоставить публичный ключ Вашему домашнему серверу. Это после выключения; приносим извинения за причиненные неудобства.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш адрес электронной почты, кажется, не связан с Matrix ID на этом Homeserver.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш адрес электронной почты, кажется, не связан с Matrix ID на этом Homeserver.",
"to start a chat with someone": "Начать чат с кем-то", "to start a chat with someone": "Начать чат с кем-то",
"to tag direct chat": "отометить прямой чат", "to tag direct chat": "отметить прямой чат",
"To use it, just wait for autocomplete results to load and tab through them.": "Для его использования, просто подождите результатов автозаполнения для загрузки на вкладке и через них.", "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).", "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включил сквозное шифрование (algorithm %(algorithm)s).",
"Unable to restore previous session": "Невозможно востановить предыдущий сеанс", "Unable to restore previous session": "Невозможно восстановить предыдущий сеанс",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s запрет отменен %(targetName)s.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s запрет отменен %(targetName)s.",
"Unable to capture screen": "Невозможно записать снимок экрана", "Unable to capture screen": "Невозможно записать снимок экрана",
"Unable to enable Notifications": "Невозможно включить уведомления", "Unable to enable Notifications": "Невозможно включить уведомления",
@ -470,15 +470,14 @@
"Failed to ban user": "Не удалось забанить пользователя", "Failed to ban user": "Не удалось забанить пользователя",
"Failed to change power level": "Не удалось изменить уровень привилегий", "Failed to change power level": "Не удалось изменить уровень привилегий",
"Failed to delete device": "Не удалось удалить устройство", "Failed to delete device": "Не удалось удалить устройство",
"Failed to forget room %(errCode)s": "Не удалось забыть комнату %(errCode)s", "Failed to forget room %(errCode)s": "Не удалось удалить комнату %(errCode)s",
"Failed to join room": "Не удалось присоединиться к комнате", "Failed to join room": "Не удалось присоединиться к комнате",
"Failed to join the room": "Не удалось войти в комнату", "Failed to join the room": "Не удалось войти в комнату",
"A registered account is required for this action": "Необходима зарегистрированная учетная запись для этого действия",
"Access Token:": "Токен:", "Access Token:": "Токен:",
"Always show message timestamps": "Всегда показывать время сообщения", "Always show message timestamps": "Всегда показывать время сообщения",
"Authentication": "Авторизация", "Authentication": "Авторизация",
"olm version:": "версия olm:", "olm version:": "Версия olm:",
"%(items)s and %(remaining)s others": "%(items)s и %(remaining)s другие", "%(items)s and %(remaining)s others": "%(items)s и другие %(remaining)s",
"%(items)s and one other": "%(items)s и ещё один", "%(items)s and one other": "%(items)s и ещё один",
"%(items)s and %(lastItem)s": "%(items)s и %(lastItem)s", "%(items)s and %(lastItem)s": "%(items)s и %(lastItem)s",
"and one other...": "и ещё один...", "and one other...": "и ещё один...",
@ -491,14 +490,14 @@
"Current password": "Текущий пароль", "Current password": "Текущий пароль",
"Email": "Электронная почта", "Email": "Электронная почта",
"Failed to kick": "Не удалось выгнать", "Failed to kick": "Не удалось выгнать",
"Failed to load timeline position": "Не удалось узнать место во времени", "Failed to load timeline position": "Не удалось загрузить позицию графика",
"Failed to mute user": "Не удалось заглушить", "Failed to mute user": "Не удалось заглушить",
"Failed to reject invite": "Не удалось отклонить приглашение", "Failed to reject invite": "Не удалось отклонить приглашение",
"Failed to save settings": "Не удалось сохранить настройки", "Failed to save settings": "Не удалось сохранить настройки",
"Failed to set display name": "Не удалось установить отображаемое имя", "Failed to set display name": "Не удалось установить отображаемое имя",
"Failed to toggle moderator status": "Не удалось изменить статус модератора", "Failed to toggle moderator status": "Не удалось изменить статус модератора",
"Fill screen": "Заполнить экран", "Fill screen": "Заполнить экран",
"Guest users can't upload files. Please register to upload": "Гости не могут посылать файлы. Пожалуйста, зарегистрируйтесь для отправки", "Guest users can't upload files. Please register to upload.": "Гости не могут посылать файлы. Пожалуйста, зарегистрируйтесь для отправки.",
"Hide read receipts": "Скрыть отметки о прочтении", "Hide read receipts": "Скрыть отметки о прочтении",
"Hide Text Formatting Toolbar": "Скрыть панель форматирования текста", "Hide Text Formatting Toolbar": "Скрыть панель форматирования текста",
"Incorrect verification code": "Неверный код подтверждения", "Incorrect verification code": "Неверный код подтверждения",
@ -519,28 +518,27 @@
"New passwords don't match": "Пароли не совпадают", "New passwords don't match": "Пароли не совпадают",
"not set": "не установлено", "not set": "не установлено",
"not specified": "не указано", "not specified": "не указано",
"No devices with registered encryption keys": "Нет устройств с записанными ключами шифрования", "No devices with registered encryption keys": "Нет устройств с зарегистрированными ключами шифрования",
"No more results": "Нет больше результатов", "No more results": "Нет больше результатов",
"No results": "Нет результатов", "No results": "Нет результатов",
"OK": "ОК", "OK": "ОК",
"Only people who have been invited": "Только приглашённые люди", "Only people who have been invited": "Только приглашённые люди",
"Passwords can't be empty": ароли не могут быть пустыми", "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.": "Пожалуйста, проверьте вашу электронную почту и нажмите в ней ссылку. По завершении нажмите продолжить.", "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.": "Уровень силы должен быть положительным числом.",
"Press": "Нажать", "Press": "Нажать",
"Profile": "Профиль", "Profile": "Профиль",
"Reason": "Причина", "Reason": "Причина",
"Registration required": "Требуется регистрация",
"rejected": "отклонено", "rejected": "отклонено",
"%(targetName)s rejected the invitation.": "%(targetName)s отклонил приглашение.", "%(targetName)s rejected the invitation.": "%(targetName)s отклонил приглашение.",
"Reject invitation": "Отклонить приглашение", "Reject invitation": "Отклонить приглашение",
"Remove Contact Information?": "Убрать контактную информацию?", "Remove Contact Information?": "Удалить контактную информацию?",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s убрал своё отображаемое имя (%(oldDisplayName)s).", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s убрал своё отображаемое имя (%(oldDisplayName)s).",
"%(senderName)s removed their profile picture.": "%(senderName)s убрал своё изображение.", "%(senderName)s removed their profile picture.": "%(senderName)s убрал своё изображение.",
"%(senderName)s requested a VoIP conference.": "%(senderName)s запросил голосовую конференц-связь.", "%(senderName)s requested a VoIP conference.": "%(senderName)s запросил голосовую конференц-связь.",
"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.": "На данный момент сброс пароля сбросит все ключи шифрования на всех устройствах, зашифрованная история общения будет не читаема, если вы сперва не скачаете ваши ключи от комнаты и не загрузите их после. В будущем это будет улучшено.",
"restore": "восстановить", "restore": "восстановить",
"Return to app": "Вернуться в приложение", "Return to app": "Вернуться в приложение",
"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 не имеет права для отправки вам уведомлений, пожалуйста, проверьте настройки вашего браузера",
@ -567,7 +565,7 @@
"since the point in time of selecting this option": "с момента выбора этой настройки", "since the point in time of selecting this option": "с момента выбора этой настройки",
"since they joined": "с момента входа", "since they joined": "с момента входа",
"since they were invited": "с момента приглашения", "since they were invited": "с момента приглашения",
"Some of your messages have not been sent": "Некоторые из ваших сообщений не были отправлены", "Some of your messages have not been sent.": "Некоторые из ваших сообщений не были отправлены.",
"Someone": "Кто-то", "Someone": "Кто-то",
"Submit": "Отправить", "Submit": "Отправить",
"Success": "Успех", "Success": "Успех",
@ -575,7 +573,7 @@
"tag direct chat": "отметить прямое общение", "tag direct chat": "отметить прямое общение",
"The default role for new room members is": "Роль по умолчанию для новых участников комнаты", "The default role for new room members is": "Роль по умолчанию для новых участников комнаты",
"The main address for this room is": "Основной адрес для этой комнаты", "The main address for this room is": "Основной адрес для этой комнаты",
"This action cannot be performed by a guest user. Please register to be able to do this": "Это действие не может быть выполнено гостем. Пожалуйста, зарегистрируйтесь для этого", "This action cannot be performed by a guest user. Please register to be able to do this.": "Это действие не может быть выполнено гостем. Пожалуйста, зарегистрируйтесь для этого.",
"This email address is already in use": "Этот адрес электронной почты уже используется", "This email address is already in use": "Этот адрес электронной почты уже используется",
"This email address was not found": "Этот адрес электронной почты не найден", "This email address was not found": "Этот адрес электронной почты не найден",
"The email address linked to your account must be entered.": "Необходимо ввести адрес электронной почты, связанный с вашей учётной записью.", "The email address linked to your account must be entered.": "Необходимо ввести адрес электронной почты, связанный с вашей учётной записью.",
@ -583,10 +581,9 @@
"The remote side failed to pick up": "Удалённая сторона не смогла ответить", "The remote side failed to pick up": "Удалённая сторона не смогла ответить",
"This room has no local addresses": "Эта комната не имеет местного адреса", "This room has no local addresses": "Эта комната не имеет местного адреса",
"This room is not recognised.": "Эта комната не опознана.", "This room is not recognised.": "Эта комната не опознана.",
"This room is private or inaccessible to guests. You may be able to join if you register": "Эта комната личная или недоступна для гостей. Мы может быть войдёте, если зарегистрируйтесь",
"These are experimental features that may break in unexpected ways": "Это экспериментальные функции, которые могут неожиданным образом вызывать ошибки", "These are experimental features that may break in unexpected ways": "Это экспериментальные функции, которые могут неожиданным образом вызывать ошибки",
"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 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's internal ID is": "Внутренний ID этой комнаты", "This room's internal ID is": "Внутренний ID этой комнаты",
"times": "раз", "times": "раз",
@ -599,7 +596,7 @@
"Unknown room %(roomId)s": "Неизвестная комната %(roomId)s", "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?": "Похоже вы передаёте файлы, вы уверены, что хотите выйти?", "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, %(monthName)s %(day)s %(fullYear)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s",
"Make Moderator": "Сделать модератором", "Make Moderator": "Сделать модератором",
"Room": "Комната", "Room": "Комната",
"Cancel": "Отмена", "Cancel": "Отмена",
@ -607,7 +604,7 @@
"italic": "наклонный", "italic": "наклонный",
"strike": "перечёркнутый", "strike": "перечёркнутый",
"underline": "подчёркнутый", "underline": "подчёркнутый",
"code": "текст", "code": "код",
"quote": "цитата", "quote": "цитата",
"bullet": "пункт", "bullet": "пункт",
"numbullet": "нумерация", "numbullet": "нумерация",
@ -658,8 +655,8 @@
"Operation failed": "Действие не удалось", "Operation failed": "Действие не удалось",
"powered by Matrix": "управляемый с Matrix", "powered by Matrix": "управляемый с Matrix",
"Add a topic": "Добавить тему", "Add a topic": "Добавить тему",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Времея отображать в 12 часовом формате (напр. 2:30pm)", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Время отображать в 12 часовом формате (напр. 2:30pm)",
"Use compact timeline layout": "Используйте компактным указанием времени", "Use compact timeline layout": "Компактное отображение",
"Hide removed messages": "Скрыть удаленное сообщение", "Hide removed messages": "Скрыть удаленное сообщение",
"No Microphones detected": "Микрофоны не обнаружены", "No Microphones detected": "Микрофоны не обнаружены",
"Unknown devices": "Незнакомое устройство", "Unknown devices": "Незнакомое устройство",
@ -668,10 +665,298 @@
"Desktop specific": "Специфический десктоп", "Desktop specific": "Специфический десктоп",
"Start automatically after system login": "Автостарт после входа в систему", "Start automatically after system login": "Автостарт после входа в систему",
"Analytics": "Аналитика", "Analytics": "Аналитика",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot собирет анонимные данные, чтобы улутшыть эту програму.", "Riot collects anonymous analytics to allow us to improve the application.": "Riot собирает анонимные данные, чтобы улучшить эту программу.",
"Opt out of analytics": "Подтвердить отказ передачи аналитических данных", "Opt out of analytics": "Подтвердить отказ передачи аналитических данных",
"Logged in as:": "Зарегестрирован как:", "Logged in as:": "Зарегистрирован как:",
"Default Device": "Стандартное устройство", "Default Device": "Стандартное устройство",
"No Webcams detected": "Веб-камера не обнаружена", "No Webcams detected": "Веб-камера не обнаружена",
"VoIP": "VoIP" "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 can't set avatars. Please register.": "Гости не могут устанавливать аватар. Пожалуйста, зарегистрируйтесь.",
"Guests can't use labs features. Please register.": "Гости не могут использовать экспериментальные возможности. Пожалуйста, зарегистрируйтесь.",
"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": "Пользовательский уровень",
"Device already verified!": "Устройство уже верифицировано!",
"Device ID:": "ID устройства:",
"device id: ": "ID устройства: ",
"Device key:": "Ключ устройства:",
"disabled": "отключено",
"Disable markdown formatting": "Отключить форматирование Markdown",
"Email address": "Адрес email",
"Email address (optional)": "Адрес email (не обязательно)",
"enabled": "включено",
"Error decrypting attachment": "Ошибка расшифровки файла",
"Export": "Экспорт",
"Failed to register as guest:": "Ошибка регистрации как гостя:",
"Failed to set avatar.": "Не удалось установить аватар.",
"Import": "Импорт",
"Incorrect username and/or password.": "Неверное имя пользователя и/или пароль.",
"Invalid file%(extra)s": "Неправильный файл%(extra)s",
"Invited": "Приглашен",
"Jump to first unread message.": "Перейти к первому непрочитанному сообщению.",
"List this room in %(domain)s's room directory?": "Показывать эту комнату в списке комнат %(domain)s?",
"Message not sent due to unknown devices being present": "Сообщение не было отправлено из-за присутствия неизвестного устройства",
"Mobile phone number (optional)": "Номер мобильного телефона (не обязательно)",
"Once you&#39;ve followed the link it contains, click below": "Как только вы пройдете по ссылке, нажмите на кнопку ниже",
"Password:": "Пароль:",
"Privacy warning": "Предупреждение приватности",
"Privileged Users": "Привилегированные пользователи",
"Revoke Moderator": "Снять права Модератора",
"Refer a friend to Riot:": "Расскажите другу о Riot:",
"Register": "Регистрация",
"Remote addresses for this room:": "Удаленные адреса для этой комнаты:",
"Remove %(threePid)s?": "Удалить %(threePid)s?",
"Results from DuckDuckGo": "Результаты от DuckDuckGo",
"Save": "Сохранить",
"Searches DuckDuckGo for results": "Ищет результаты через DuckDuckGo",
"Server error": "Ошибка сервера",
"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.": "Сервер может быть недоступен, перегружен или что-то пошло не так.",
"Session ID": "ID сессии",
"%(senderName)s set a profile picture.": "%(senderName)s установил картинку профиля.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s установил отображаемое имя %(displayName)s.",
"Signed Out": "Вышли",
"Sorry, this homeserver is using a login which is not recognised ": "Извините, этот Home Server использует логин, который не удалось распознать ",
"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 с ID %(deviceId)s. Устройство помечено как верифицированное.",
"%(actionVerb)s this person?": "%(actionVerb)s этого пользователя?",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Файл '%(fileName)s' превышает ограничение размера загрузок на этом Home Server'е",
"This Home Server does not support login using email address.": "Этот Home Server не поддерживает вход по адресу email.",
"There was a problem logging in.": "Возникла проблема входа в учетную запись.",
"The visibility of existing history will be unchanged": "Видимость текущей истории не будет изменена",
"this invitation?": "это приглашение?",
"This room is not accessible by remote Matrix servers": "Это комната закрыта для других серверов Matrix",
"To ban users": "Забанить пользователей",
"to browse the directory": "просматривать директорию",
"To configure the room": "Настроить комнату",
"To invite users into the room": "Приглашать пользователей в комнату",
"to join the discussion": "присоединиться к дискуссии",
"To kick users": "Выгонять пользователей",
"To link to a room it must have": "Для создания ссылки на комнату она должна иметь",
"to make a room or": "создать комнату или",
"To remove other users' messages": "Удалять сообщения других пользователей",
"To reset your password, enter the email address linked to your account": "Чтобы сбросить ваш пароль введите адрес email, который используется аккаунтом",
"to tag as %(tagName)s": "отметить как %(tagName)s",
"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": "Вкл. звук",
"Unrecognised command:": "Неизвестная команда:",
"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!": "ВНИМАНИЕ: ОШИБКА ВЕРИФИКАЦИИ КЛЮЧЕЙ! Ключ для подписки устройства %(deviceId)s пользователя %(userId)s: \"%(fprint)s\", однако он не совпадает с предоставленным ключем \"%(fingerprint)s\". Это может означать перехват вашего канала коммуникации!",
"You have <a>disabled</a> URL previews by default.": "Предпросмотр ссылок <a>отключен</a> по-умолчанию.",
"You have <a>enabled</a> URL previews by default.": "Предпросмотр ссылок <a>включен</a> по-умолчанию.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Вы ввели неправильный адрес. Попробуйте использовать Matrix ID или адрес email.",
"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.": "Вы не сможете отменить это действие, так как даете пользователю такой же уровень доступа, как и у вас.",
"Set a Display Name": "Установить отображаемое имя",
"(~%(searchCount)s results)": "(~%(searchCount)s результатов)",
"%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)s отозвали свои приглашения %(repeats)s раз",
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)s отозвал свои приглашения %(repeats)s раз",
"%(severalUsers)shad their invitations withdrawn": "%(severalUsers)s отозвали свои приглашения",
"%(oneUser)shad their invitation withdrawn": "%(oneUser)s отозвал свое приглашение",
"Please select the destination room for this message": "Выберите комнату назначения для этого сообщения",
"Options": "Настройки",
"Passphrases must match": "Пароли должны совпадать",
"Passphrase must not be empty": "Пароль не должен быть пустым",
"Export room keys": "Экспортировать ключи",
"Enter passphrase": "Введите пароль",
"Confirm passphrase": "Подтвердите пароль",
"Import room keys": "Импортировать ключи",
"File to import": "Файл для импорта",
"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.": "Экспортированный файл защищен паролем. Вы должны ввести этот пароль для расшифровки.",
"You must join the room to see its files": "Вы должны зайти в комнату для просмотра файлов",
"Reject all %(invitedRooms)s invites": "Отклонить все %(invitedRooms)s приглашения",
"Start new chat": "Начать новый чат",
"Guest users can't invite users. Please register.": "Гости не могут приглашать пользователей. Пожалуйста, зарегистрируйтесь.",
"Failed to invite": "Ошибка приглашения",
"Failed to invite user": "Ошибка приглашения пользователя",
"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.": "Это сделает вашу учетную запись нерабочей. Вы не сможете зарегистрироваться снова с тем же 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": "Имя устройства",
"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": "Я верифицирую - ключи совпадают",
"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": "Все равно продолжить",
"Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "Отображаемое имя - это то, как вы отображаетесь в чате. Какое имя вы хотите?",
"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...": "Верифицировать...",
"ex. @bob:example.com": "например @bob:example.com",
"Add User": "Добавить пользователя",
"This Home Server would like to make sure you are not a robot": "Этот Home Server хочет удостовериться что вы не робот",
"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.": "Вы можете использовать пользовательские настройки сервера для использования другого Home Server'а при помощи указания его URL.",
"This allows you to use this app with an existing Matrix account on a different home server.": "Это позволяет использовать это приложение с существующей учетной записью на другом Home Server'е.",
"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": "Неправильный токен",
"A text message has been sent to": "Текстовое сообщение было отправлено",
"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",
"Default server": "Сервер по-умолчанию",
"Custom server": "Пользовательский сервер",
"Home server URL": "URL Home Server'а",
"Identity server URL": "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": "Добавить интеграцию",
"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": "Удалено или тип сообщения неизвестен",
"Disable URL previews by default for participants in this room": "Отключить предпросмотр URL для участников этой комнаты по-умолчанию",
"URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "Предпросмотр URL %(globalDisableUrlPreview)s по-умолчанию для участников этой комнаты.",
"URL Previews": "Предпросмотр URL",
"Enable URL previews for this room (affects only you)": "Включить предпросмотр URL в этой комнате (только для вас)",
"Drop file here to upload": "Перетащите файл сюда для загрузки",
" (unsupported)": " (не поддерживается)",
"Ongoing conference call%(supportedText)s.": "Идет конференц-звонок%(supportedText)s.",
"for %(amount)ss": "уже %(amount)sс",
"for %(amount)sm": "уже %(amount)sм",
"for %(amount)sh": "уже %(amount)sч",
"for %(amount)sd": "уже %(amount)sд",
"Online": "В сети",
"Idle": "Отошел",
"Offline": "Не в сети",
"Disable URL previews for this room (affects only you)": "Отключить предпросмотр URL в этой комнате (только для вас)",
"$senderDisplayName changed the room avatar to <img/>": "$senderDisplayName сменил аватар комнаты на <img/>",
"%(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": "Начать чат",
"Welcome page": "Домашняя страница",
"Add": "Добавить",
"%(count)s new messages.one": "%(count)s новое сообщение",
"%(count)s new messages.other": "%(count)s новых сообщений",
"Error: Problem communicating with the given homeserver.": "Ошибка: проблема связи с указанным сервером.",
"Failed to fetch avatar URL": "Ошибка получения аватара",
"The phone number entered looks invalid": "Введенный номер телефона выглядит неправильным",
"Uploading %(filename)s and %(count)s others.zero": "Загрузка %(filename)s",
"Uploading %(filename)s and %(count)s others.one": "Загрузка %(filename)s и %(count)s другой файл",
"Uploading %(filename)s and %(count)s others.other": "Загрузка %(filename)s и %(count)s других файлов",
"Username invalid: %(errMessage)s": "Неверное имя пользователя: %(errMessage)s",
"Searching known users": "Искать известных пользователей",
"You must <a>register</a> to use this functionality": "Вы должны <a>зарегистрироваться</a> для использования этой функции",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Отослать снова</a> или <a>отменить отправку</a>. Вы также можете выбрать на отправку или отмену отдельные сообщения.",
"New Password": "Новый пароль",
"Start chatting": "Начать общение",
"Start Chatting": "Начать общение",
"Click on the button below to start chatting!": "Нажмите на кнопку ниже для того, чтобы начать общение!",
"Create a new chat or reuse an existing one": "Создать новый чат или использовать уже существующий",
"You already have existing direct chats with this user:": "У вас уже есть существующие приватные чаты с этим пользователем:",
"Username available": "Имя пользователя доступно",
"Username not available": "Имя пользователя недоступно",
"Something went wrong!": "Что-то пошло не так!",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Это будет ваше имя пользователя на <span></span>, или вы можете выбрать <a>другой сервер</a>.",
"If you already have a Matrix account you can <a>log in</a> instead.": "Если вы уже имеете учетную запись Matrix, то вы можете <a>войти</a>.",
"Home": "Старт",
"a room": "комната",
"Accept": "Принять",
"Active call (%(roomName)s)": "Активный вызов (%(roomName)s)",
"Admin tools": "Админ утилита",
"And %(count)s more...": "И %(count)s больше...",
"Alias (optional)": "Псевдоним (опционально)",
"<a>Click here</a> to join the discussion!": "<a> Нажми здесь</a> чтоб присоединиться к обсуждению!",
"Close": "Закрыть",
"Disable Notifications": "Отключить оповещение",
"Drop File Here": "Вставить сюда файл",
"Enable Notifications": "Включить оповещение",
"Encrypted by a verified device": "Шифрование с помощью проверенных устройств",
"Encrypted by an unverified device": "Шифрование с помощью не проверенных устройств",
"Encryption is enabled in this room": "Шифрование в этой комнате включено",
"Encryption is not enabled in this room": "Шифрование в этой комнате не включено",
"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 <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Присоединен как <voiceText> голос</voiceText> или <videoText> видио </videoText>.",
"Last seen": "В последний раз видели",
"Level:": "Уровень:",
"No display name": "Нет отображаемое имя",
"Otherwise, <a>click here</a> to send a bug report.": "Иначе , <a> нажать </a> 2 чтоб отослать отчет о ошибке.",
"Private Chat": "Частный чат",
"Public Chat": "Общественный чат",
"Reason: %(reasonText)s": "Причина: %(reasonText)s",
"Rejoin": "Пере-соединиться",
"Set": "Вводить",
"Start authentication": "Начать идентификацию",
"This room": "Эта комната",
"(~%(count)s results).other": "(~%(count) найдено)",
"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",
"Send anyway": "Отправить в любом случае",
"Show Text Formatting Toolbar": "Показать панель инструментов форматирования текста",
"This invitation was sent to an email address which is not associated with this account:": "Это приглашение было отправлено на адрес электронной почты, который не связан с этой учетной записью:",
"To link to a room it must have <a>an address</a>.": "Для ссылки на комнату необходим <a> адрес</a>.",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Не удалось установить, что адрес на который было отправлено это приглашение соответствует вашей учетной записи.",
"Undecryptable": "Невозможно расшифровать",
"Unencrypted message": "Незашифрованое послание",
"unknown caller": "Звонящий неизвестен",
"Unnamed Room": "Комната без имени",
"Unverified": "Непроверенно",
"Upload new:": "Загрузить новый:",
"%(user)s is a": "%(user)s является",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (уровень доступа %(powerLevelNumber)s)",
"Verified": "Подтверждён",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Хотели бы вы <acceptText>подтвердить</acceptText> это приглашение или <declineText>отклонить</declineText>?",
"(~%(count)s results).one": "(~%(count)s Результат)",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Не удается подключиться к домашнему серверу - проверьте подключение, убедитесь, что ваш сертификат SSL <a>homeserver's SSL certificate</a> действителен, и расширение браузера не блокирует запросы.",
"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",
"Disable Peer-to-Peer for 1:1 calls": "Отключить Peer-to-Peer для 1:1 звонков",
"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?": "Вы хотите указать адрес электронной почты?",
"This will allow you to reset your password and receive notifications.": "Это позволит вам сбросить пароль и получить уведомления."
} }

View file

@ -119,7 +119,6 @@
"zh-sg": "Kinesiska (Singapore)", "zh-sg": "Kinesiska (Singapore)",
"zh-tw": "Kinesiska (Taiwan)", "zh-tw": "Kinesiska (Taiwan)",
"zu": "Zulu", "zu": "Zulu",
"A registered account is required for this action": "Ett registrerat konto behövs för den här handlingen",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ett SMS har skickats till +%(msisdn)s. Vänligen ange verifieringskoden ur meddelandet", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ett SMS har skickats till +%(msisdn)s. Vänligen ange verifieringskoden ur meddelandet",
"accept": "acceptera", "accept": "acceptera",
"%(targetName)s accepted an invitation.": "%(targetName)s accepterade en inbjudan.", "%(targetName)s accepted an invitation.": "%(targetName)s accepterade en inbjudan.",
@ -222,7 +221,6 @@
"decline": "avböj", "decline": "avböj",
"Decrypt %(text)s": "Dekryptera %(text)s", "Decrypt %(text)s": "Dekryptera %(text)s",
"Decryption error": "Dekrypteringsfel", "Decryption error": "Dekrypteringsfel",
"(default: %(userName)s)": "(standard: %(userName)s)",
"Delete": "Radera", "Delete": "Radera",
"demote": "degradera", "demote": "degradera",
"Deops user with given id": "Degraderar användaren med givet id", "Deops user with given id": "Degraderar användaren med givet id",
@ -291,5 +289,116 @@
"Failed to upload file": "Det gick inte att ladda upp filen", "Failed to upload file": "Det gick inte att ladda upp filen",
"Failed to verify email address: make sure you clicked the link in the email": "Det gick inte att bekräfta epostadressen, klicka på länken i epostmeddelandet", "Failed to verify email address: make sure you clicked the link in the email": "Det gick inte att bekräfta epostadressen, klicka på länken i epostmeddelandet",
"Favourite": "Favorit", "Favourite": "Favorit",
"favourite": "favorit" "favourite": "favorit",
"a room": "ett rum",
"Accept": "Godkänn",
"Access Token:": "Åtkomsttoken:",
"Active call (%(roomName)s)": "Aktiv samtal (%(roomName)s)",
"Add": "Lägg till",
"Admin tools": "Admin verktyg",
"And %(count)s more...": "Och %(count)s till...",
"Alias (optional)": "Alias (valfri)",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Det gick inte att ansluta till servern - kontrollera anslutningen, försäkra att din <a>hemservers TLS-certifikat</a> ä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.",
"changing room on a RoomView is not supported": "det går inte att byta rum i en RoomView",
"<a>Click here</a> to join the discussion!": "<a>Klicka här</a> för att gå med i diskussionen!",
"Close": "Stäng",
"%(count)s new messages.one": "%(count)s nytt meddelande",
"%(count)s new messages.other": "%(count)s nya meddelanden",
"Create a new chat or reuse an existing one": "Skapa en ny chatt eller använd en existerande",
"Custom": "Egen",
"Decline": "Avvisa",
"Disable Notifications": "Slå av aviseringar",
"Disable markdown formatting": "Slå av Markdown-formattering",
"Drop File Here": "Dra filen hit",
"Enable Notifications": "Slå på aviseringar",
"Encrypted by a verified device": "Krypterat av en verifierad enhet",
"Encrypted by an unverified device": "Krypterat av en overifierad enhet",
"Encryption is enabled in this room": "Kryptering är aktiverat i det här rummet",
"Encryption is not enabled in this room": "Kryptering är inte aktiverat i det här rummet",
"Enter passphrase": "Ge lösenfras",
"Error: Problem communicating with the given homeserver.": "Fel: Det gick inte att kommunicera med den angivna hemservern.",
"Failed to fetch avatar URL": "Det gick inte att hämta avatar-URL",
"Failed to upload profile picture!": "Det gick inte att ladda upp profilbild!",
"Failure to create room": "Det gick inte att skapa rum",
"Favourites": "Favoriter",
"Fill screen": "Fyll skärmen",
"Filter room members": "Filtrera rumsmedlemmar",
"Forget room": "Glöm bort rum",
"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 can't set avatars. Please register.": "Gäster kan inte välja en profilbild. Vänligen registrera dig.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Gäster kan inte skapa nya rum. Vänligen registrera dig för att skapa rum och starta chattar.",
"Guest users can't upload files. Please register to upload.": "Gäster kan inte ladda upp filer. Vänligen registrera dig för att ladda upp.",
"Guests can't use labs features. Please register.": "Gäster kan inte använda labb-egenskaper. Vänligen registrera dig.",
"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.",
"had": "hade",
"Hangup": "Lägg på",
"Hide read receipts": "Göm kvitteringar",
"Hide Text Formatting Toolbar": "Göm textformatteringsverktygsfältet",
"Historical": "Historiska",
"Home": "Hem",
"Homeserver is": "Hemservern är",
"Identity Server is": "Identitetsservern är",
"I have verified my email address": "Jag har verifierat min epostadress",
"Import": "Importera",
"Import E2E room keys": "Importera rumskrypteringsnycklar",
"Incoming call from %(name)s": "Inkommande samtal från %(name)s",
"Incoming video call from %(name)s": "Inkommande videosamtal från %(name)s",
"Incoming voice call from %(name)s": "Inkommande röstsamtal från %(name)s",
"Incorrect username and/or password.": "Fel användarnamn och/eller lösenord.",
"Incorrect verification code": "Fel verifieringskod",
"Interface Language": "Gränssnittsspråk",
"Invalid alias format": "Fel alias-format",
"Invalid address format": "Fel adressformat",
"Invalid Email Address": "Ogiltig epostadress",
"Invalid file%(extra)s": "Fel fil%(extra)s",
"%(senderName)s invited %(targetName)s.": "%(senderName)s bjöd in %(targetName)s.",
"Invite new room members": "Bjud in nya rumsmedlemmar",
"Invited": "Inbjuden",
"Invites": "Inbjudningar",
"Invites user with given id to current room": "Bjuder in användaren med det givna ID:t till det nuvarande rummet",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' är inte ett giltigt format för en adress",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' är inte ett giltigt format för ett alias",
"%(displayName)s is typing": "%(displayName)s skriver",
"Sign in with": "Logga in med",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Gå med som <voiceText>röst</voiceText> eller <videoText>video</videoText>.",
"Join Room": "Gå med i rum",
"joined and left": "gick med och lämnade",
"joined": "gick med",
"%(targetName)s joined the room.": "%(targetName)s gick med i rummet.",
"Joins room with given alias": "Går med i rummet med givet alias",
"Jump to first unread message.": "Hoppa till första olästa meddelande",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s kickade %(targetName)s.",
"Kick": "Kicka",
"Kicks user with given id": "Kickar användaren med givet ID",
"Labs": "Labb",
"Last seen": "Senast sedd",
"Leave room": "Lämna rummet",
"left and rejoined": "lämnade rummet och kom tillbaka",
"left": "lämnade",
"%(targetName)s left the room.": "%(targetName)s lämnade rummet.",
"Level:": "Nivå:",
"List this room in %(domain)s's room directory?": "Visa det här rummet i katalogen på %(domain)s?",
"Local addresses for this room:": "Lokala adresser för rummet:",
"Logged in as:": "Inloggad som:",
"Login as guest": "Logga in som gäst",
"Logout": "Logga ut",
"Low priority": "Lågprioritet",
"%(senderName)s made future room history visible to": "%(senderName)s gjorde framtida rumshistorik synligt åt",
"Manage Integrations": "Hantera integrationer",
"Markdown is disabled": "Markdown är inaktiverat",
"Markdown is enabled": "Markdown är aktiverat",
"matrix-react-sdk version:": "matrix-react-sdk -version:",
"Members only": "Endast medlemmar",
"Message not sent due to unknown devices being present": "Meddelandet skickades inte eftersom det finns okända enheter i rummet",
"Missing room_id in request": "room_id saknas i förfrågan",
"Missing user_id in request": "user_id saknas i förfrågan",
"Mobile phone number": "Telefonnummer",
"Mobile phone number (optional)": "Telefonnummer (valfri)",
"Moderator": "Moderator"
} }

View file

@ -22,10 +22,9 @@
"Create Room": "สรัางห้อง", "Create Room": "สรัางห้อง",
"Delete": "ลบ", "Delete": "ลบ",
"Default": "ค่าเริ่มต้น", "Default": "ค่าเริ่มต้น",
"(default: %(userName)s)": "(ค่าเริ่มต้น: %(userName)s)",
"Default Device": "อุปกรณ์เริ่มต้น", "Default Device": "อุปกรณ์เริ่มต้น",
"%(senderName)s banned %(targetName)s.": "%(senderName)s แบน %(targetName)s แล้ว", "%(senderName)s banned %(targetName)s.": "%(senderName)s แบน %(targetName)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\"",
"Decrypt %(text)s": "ถอดรหัส %(text)s", "Decrypt %(text)s": "ถอดรหัส %(text)s",
"Device ID": "ID อุปกรณ์", "Device ID": "ID อุปกรณ์",
"Device ID:": "ID อุปกรณ์:", "Device ID:": "ID อุปกรณ์:",
@ -78,7 +77,7 @@
"Remove": "ลบ", "Remove": "ลบ",
"Custom Server Options": "กำหนดเซิร์ฟเวอร์เอง", "Custom Server Options": "กำหนดเซิร์ฟเวอร์เอง",
"Failed to join the room": "การเข้าร่วมห้องล้มเหลว", "Failed to join the room": "การเข้าร่วมห้องล้มเหลว",
"Drop here %(toAction)s": "ปล่อยที่นี่ %(toAction)s", "Drop here %(toAction)s": "ปล่อยที่นี่%(toAction)s",
"Favourite": "รายการโปรด", "Favourite": "รายการโปรด",
"Failed to forget room %(errCode)s": "การลืมห้องล้มเหลว %(errCode)s", "Failed to forget room %(errCode)s": "การลืมห้องล้มเหลว %(errCode)s",
"%(targetName)s accepted an invitation.": "%(targetName)s ตอบรับคำเชิญแล้ว", "%(targetName)s accepted an invitation.": "%(targetName)s ตอบรับคำเชิญแล้ว",
@ -96,8 +95,8 @@
"all room members, from the point they are invited": "สมาชิกทั้งหมด นับตั้งแต่เมื่อได้รับคำเชิญ", "all room members, from the point they are invited": "สมาชิกทั้งหมด นับตั้งแต่เมื่อได้รับคำเชิญ",
"all room members, from the point they joined": "สมาชิกทั้งหมด นับตั้งแต่เมื่อเข้าร่วมห้อง", "all room members, from the point they joined": "สมาชิกทั้งหมด นับตั้งแต่เมื่อเข้าร่วมห้อง",
"an address": "ที่อยู่", "an address": "ที่อยู่",
"%(items)s and %(remaining)s others": "%(items)s และอีก %(remaining)s อย่าง", "%(items)s and %(remaining)s others": "%(items)s และอีก %(remaining)s ผู้ใช้",
"%(items)s and one other": "%(items)s และอีกหนึ่งอย่าง", "%(items)s and one other": "%(items)s และอีกหนึ่งผู้ใช้",
"%(items)s and %(lastItem)s": "%(items)s และ %(lastItem)s", "%(items)s and %(lastItem)s": "%(items)s และ %(lastItem)s",
"and %(overflowCount)s others...": "และอีก %(overflowCount)s ผู้ใช้...", "and %(overflowCount)s others...": "และอีก %(overflowCount)s ผู้ใช้...",
"and one other...": "และอีกหนึ่งผู้ใช้...", "and one other...": "และอีกหนึ่งผู้ใช้...",
@ -120,7 +119,7 @@
"Bans user with given id": "ผู้ใช้และ id ที่ถูกแบน", "Bans user with given id": "ผู้ใช้และ id ที่ถูกแบน",
"Blacklisted": "ขึ้นบัญชีดำ", "Blacklisted": "ขึ้นบัญชีดำ",
"Can't load user settings": "ไม่สามารถโหลดการตั้งค่าผู้ใช้ได้", "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 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 their profile picture.": "%(senderName)s เปลี่ยนรูปโปรไฟล์ของเขา",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s เปลี่ยนชื่อห้องไปเป็น %(roomName)s", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s เปลี่ยนชื่อห้องไปเป็น %(roomName)s",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ลบชื่อห้อง", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ลบชื่อห้อง",
@ -201,7 +200,7 @@
"Hangup": "วางสาย", "Hangup": "วางสาย",
"Historical": "ประวัติแชทเก่า", "Historical": "ประวัติแชทเก่า",
"Homeserver is": "เซิร์ฟเวอร์บ้านคือ", "Homeserver is": "เซิร์ฟเวอร์บ้านคือ",
"Identity Server is": "เซิร์ฟเวอร์ยืนยันตัวตนคือ", "Identity Server is": "เซิร์ฟเวอร์ระบุตัวตนคือ",
"I have verified my email address": "ฉันยืนยันที่อยู่อีเมลแล้ว", "I have verified my email address": "ฉันยืนยันที่อยู่อีเมลแล้ว",
"Import": "นำเข้า", "Import": "นำเข้า",
"Incorrect username and/or password.": "ชื่อผู้ใช้และ/หรือรหัสผ่านไม่ถูกต้อง", "Incorrect username and/or password.": "ชื่อผู้ใช้และ/หรือรหัสผ่านไม่ถูกต้อง",
@ -229,7 +228,7 @@
"Leave room": "ออกจากห้อง", "Leave room": "ออกจากห้อง",
"left and rejoined": "ออกแล้วกลับเข้าร่วมอีกครั้ง", "left and rejoined": "ออกแล้วกลับเข้าร่วมอีกครั้ง",
"left": "ออกไปแล้ว", "left": "ออกไปแล้ว",
"%(targetName)s left the room.": "%(targetName)s ออกจากห้องไปแล้ว", "%(targetName)s left the room.": "%(targetName)s ออกจากห้องแล้ว",
"List this room in %(domain)s's room directory?": "แสดงห้องนี้ในไดเรกทอรีห้องของ %(domain)s?", "List this room in %(domain)s's room directory?": "แสดงห้องนี้ในไดเรกทอรีห้องของ %(domain)s?",
"Logged in as:": "เข้าสู่ระบบในชื่อ:", "Logged in as:": "เข้าสู่ระบบในชื่อ:",
"Login as guest": "เข้าสู่ระบบในฐานะแขก", "Login as guest": "เข้าสู่ระบบในฐานะแขก",
@ -244,7 +243,7 @@
"New passwords don't match": "รหัสผ่านใหม่ไม่ตรงกัน", "New passwords don't match": "รหัสผ่านใหม่ไม่ตรงกัน",
"New passwords must match each other.": "รหัสผ่านใหม่ทั้งสองช่องต้องตรงกัน", "New passwords must match each other.": "รหัสผ่านใหม่ทั้งสองช่องต้องตรงกัน",
"none": "ไม่มี", "none": "ไม่มี",
"not set": "ไม่ได้ตั้ง", "not set": "ยังไม่ได้ตั้ง",
"not specified": "ไม่ได้ระบุ", "not specified": "ไม่ได้ระบุ",
"(not supported by this browser)": "(เบราว์เซอร์นี้ไม่รองรับ)", "(not supported by this browser)": "(เบราว์เซอร์นี้ไม่รองรับ)",
"<not supported>": "<ไม่รองรับ>", "<not supported>": "<ไม่รองรับ>",
@ -262,7 +261,6 @@
"Privileged Users": "ผู้ใช้ที่มีสิทธิพิเศษ", "Privileged Users": "ผู้ใช้ที่มีสิทธิพิเศษ",
"Revoke Moderator": "เพิกถอนผู้ช่วยดูแล", "Revoke Moderator": "เพิกถอนผู้ช่วยดูแล",
"Refer a friend to Riot:": "แนะนำเพื่อนให้รู้จัก Riot:", "Refer a friend to Riot:": "แนะนำเพื่อนให้รู้จัก Riot:",
"Registration required": "ต้องลงทะเบียนก่อน",
"rejected": "ปฏิเสธแล้ว", "rejected": "ปฏิเสธแล้ว",
"%(targetName)s rejected the invitation.": "%(targetName)s ปฏิเสธคำเชิญแล้ว", "%(targetName)s rejected the invitation.": "%(targetName)s ปฏิเสธคำเชิญแล้ว",
"Reject invitation": "ปฏิเสธคำเชิญ", "Reject invitation": "ปฏิเสธคำเชิญ",
@ -296,7 +294,6 @@
"Server unavailable, overloaded, or something else went wrong.": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งาน ทำงานหนักเกินไป หรือบางอย่างผิดปกติ", "Server unavailable, overloaded, or something else went wrong.": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งาน ทำงานหนักเกินไป หรือบางอย่างผิดปกติ",
"%(senderName)s set a profile picture.": "%(senderName)s ตั้งรูปโปรไฟล์", "%(senderName)s set a profile picture.": "%(senderName)s ตั้งรูปโปรไฟล์",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ตั้งชื่อที่แสดงเป็น %(displayName)s", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ตั้งชื่อที่แสดงเป็น %(displayName)s",
"Setting a user name will create a fresh account": "การตั้งชื่อผู้ใช้จะสร้างบัญชีใหม่",
"Show panel": "แสดงหน้าต่าง", "Show panel": "แสดงหน้าต่าง",
"Signed Out": "ออกจากระบบแล้ว", "Signed Out": "ออกจากระบบแล้ว",
"Sign in": "เข้าสู่ระบบ", "Sign in": "เข้าสู่ระบบ",
@ -318,10 +315,289 @@
"The file '%(fileName)s' failed to upload": "การอัปโหลดไฟล์ '%(fileName)s' ล้มเหลว", "The file '%(fileName)s' failed to upload": "การอัปโหลดไฟล์ '%(fileName)s' ล้มเหลว",
"This Home Server does not support login using email address.": "เซิร์ฟเวอร์บ้านนี้ไม่รองรับการลงชื่อเข้าใช้ด้วยที่อยู่อีเมล", "This Home Server does not support login using email address.": "เซิร์ฟเวอร์บ้านนี้ไม่รองรับการลงชื่อเข้าใช้ด้วยที่อยู่อีเมล",
"There was a problem logging in.": "มีปัญหาในการลงชื่อเข้าใช้", "There was a problem logging in.": "มีปัญหาในการลงชื่อเข้าใช้",
"This room is private or inaccessible to guests. You may be able to join if you register": "ห้องนี้เป็นส่วนตัวหรือไม่อนุญาตให้แขกเข้าถึง คุณอาจเข้าร่วมได้หากคุณลงทะเบียน",
"this invitation?": "คำเชิญนี้?", "this invitation?": "คำเชิญนี้?",
"This is a preview of this room. Room interactions have been disabled": "นี่คือตัวอย่างของห้อง การตอบสนองภายในห้องถูกปิดใช้งาน", "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's internal ID is": "ID ภายในของห้องนี้คือ", "This room's internal ID is": "ID ภายในของห้องนี้คือ",
"times": "เวลา" "times": "ครั้ง",
"%(oneUser)schanged their name": "%(oneUser)sเปลี่ยนชื่อของเขาแล้ว",
"%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)sเปลี่ยนชื่อของพวกเขา %(repeats)s ครั้ง",
"%(oneUser)schanged their name %(repeats)s times": "%(oneUser)sเปลี่ยนชื่อของเขา %(repeats)s ครั้ง",
"%(severalUsers)schanged their name": "%(severalUsers)sเปลี่ยนชื่อของพวกเขาแล้ว",
"Create new room": "สร้างห้องใหม่",
"Room directory": "ไดเรกทอรีห้อง",
"Start chat": "เริ่มแชท",
"Welcome page": "หน้าต้อนรับ",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "ไม่สามารถเชื่อมต่อไปยังเซิร์ฟเวอร์บ้านผ่านทาง HTTP ได้เนื่องจาก URL ที่อยู่บนเบราว์เซอร์เป็น HTTPS กรุณาใช้ HTTPS หรือ<a>เปิดใช้งานสคริปต์ที่ไม่ปลอดภัย</a>.",
"%(count)s new messages.one": "มี %(count)s ข้อความใหม่",
"%(count)s new messages.other": "มี %(count)s ข้อความใหม่",
"Disable inline URL previews by default": "ตั้งค่าเริ่มต้นให้ไม่แสดงตัวอย่าง URL ในแชท",
"Disable markdown formatting": "ปิดใช้งานการจัดรูปแบบ markdown",
"End-to-end encryption information": "ข้อมูลการเข้ารหัสจากปลายทางถึงปลายทาง",
"End-to-end encryption is in beta and may not be reliable": "การเข้ารหัสจากปลายทางถึงปลายทางยังอยู่ในเบต้า และอาจพึ่งพาไม่ได้",
"Error: Problem communicating with the given homeserver.": "ข้อผิดพลาด: มีปัญหาในการติดต่อกับเซิร์ฟเวอร์บ้านที่กำหนด",
"Export E2E room keys": "ส่งออกกุญแจถอดรหัส E2E",
"Failed to change power level": "การเปลี่ยนระดับอำนาจล้มเหลว",
"Import E2E room keys": "นำเข้ากุญแจถอดรหัส E2E",
"to favourite": "ไปยังรายการโปรด",
"to demote": "เพื่อลดขั้น",
"The default role for new room members is": "บทบาทเริ่มต้นของสมาชิกใหม่คือ",
"The phone number entered looks invalid": "ดูเหมือนว่าหมายเลขโทรศัพท์ที่กรอกรมาไม่ถูกต้อง",
"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' มีขนาดใหญ่เกินจำกัดของเซิร์ฟเวอร์บ้าน",
"To send messages": "เพื่อส่งข้อความ",
"to start a chat with someone": "เพื่อเริ่มแชทกับผู้อื่น",
"to tag as %(tagName)s": "เพื่อแท็กว่า %(tagName)s",
"to tag direct chat": "เพื่อแทกว่าแชทตรง",
"Turn Markdown off": "ปิด markdown",
"Turn Markdown on": "เปิด markdown",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ได้เปิดใช้งานการเข้ารหัสจากปลายทางถึงปลายทาง (อัลกอริทึม%(algorithm)s).",
"Unable to add email address": "ไมาสามารถเพิ่มที่อยู่อีเมล",
"Unable to verify email address.": "ไม่สามารถยืนยันที่อยู่อีเมล",
"Unban": "ปลดแบน",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s ปลดแบน %(targetName)s แล้ว",
"Unable to capture screen": "ไม่สามารถจับภาพหน้าจอ",
"Unable to enable Notifications": "ไม่สามารถเปิดใช้งานการแจ้งเตือน",
"Unable to load device list": "ไม่สามารถโหลดรายชื่ออุปกรณ์",
"Unencrypted room": "ห้องที่ไม่เข้ารหัส",
"unencrypted": "ยังไม่ได้เข้ารหัส",
"Unknown command": "คำสั่งที่ไม่รู้จัก",
"unknown device": "อุปกรณ์ที่ไม่รู้จัก",
"Unknown room %(roomId)s": "ห้องที่ไม่รู้จัก %(roomId)s",
"Unknown (user, device) pair:": "คู่ (ผู้ใช้, อุปกรณ์) ที่ไม่รู้จัก:",
"unknown": "ไม่รู้จัก",
"Unrecognised command:": "คำสั่งที่ไม่รู้จัก:",
"Unrecognised room alias:": "นามแฝงห้องที่ไม่รู้จัก:",
"Uploading %(filename)s and %(count)s others.zero": "กำลังอัปโหลด %(filename)s",
"Uploading %(filename)s and %(count)s others.one": "กำลังอัปโหลด %(filename)s และอีก %(count)s ไฟล์",
"Uploading %(filename)s and %(count)s others.other": "กำลังอัปโหลด %(filename)s และอีก %(count)s ไฟล์",
"uploaded a file": "อัปโหลดไฟล์",
"Upload Failed": "การอัปโหลดล้มเหลว",
"Upload Files": "อัปโหลดไฟล์",
"Upload file": "อัปโหลดไฟล์",
"Usage": "การใช้งาน",
"User ID": "ID ผู้ใช้",
"User Interface": "อินเตอร์เฟสผู้ใช้",
"User name": "ชื่อผู้ใช้",
"User": "ผู้ใช้",
"Warning!": "คำเตือน!",
"Who can access this room?": "ใครสามารถเข้าถึงห้องนี้ได้?",
"Who can read history?": "ใครสามารถอ่านประวัติแชทได้?",
"Who would you like to add to this room?": "คุณต้องการเพิ่มใครเข้าห้องนี้?",
"Who would you like to communicate with?": "คุณต้องการสื่อสารกับใคร?",
"You're not in any rooms yet! Press": "คุณยังไม่ได้อยู่ในห้องใดเลย! กด",
"You are trying to access %(roomName)s.": "คุณกำลังพยายามเข้าสู่ %(roomName)s",
"You have <a>disabled</a> URL previews by default.": "ค่าเริ่มต้นของคุณ<a>ปิดใช้งาน</a>ตัวอย่าง URL เอาไว้",
"You have <a>enabled</a> URL previews by default.": "ค่าเริ่มต้นของคุณ<a>เปิดใช้งาน</a>ตัวอย่าง URL เอาไว้",
"you must be a": "คุณต้องเป็น",
"You must <a>register</a> to use this functionality": "คุณต้อง<a>ลงทะเบียน</a>เพื่อใช้ฟังก์ชันนี้",
"You need to be logged in.": "คุณต้องเข้าสู่ระบบก่อน",
"You need to enter a user name.": "คุณต้องกรอกชื่อผู้ใช้ก่อน",
"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": "การเปลี่ยนรหัสผ่านเสร็จสมบูณณ์ คุณจะไม่ได้รับการแจ้งเตือนบนอุปกรณ์อื่น ๆ จนกว่าคุณจะกลับเข้าสู่ระบบในอุปกรณ์เหล่านั้น",
"Sun": "อา.",
"Mon": "จ.",
"Tue": "อ.",
"Wed": "พ.",
"Thu": "พฤ.",
"Fri": "ศ.",
"Sat": "ส.",
"Jan": "ม.ค.",
"Feb": "ก.พ.",
"Mar": "มี.ค.",
"Apr": "เม.ย.",
"May": "พ.ค.",
"Jun": "มิ.ย.",
"Jul": "ก.ค.",
"Aug": "ส.ค.",
"Sep": "ก.ย.",
"Oct": "ต.ค.",
"Nov": "พ.ย.",
"Dec": "ธ.ค.",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s %(day)s %(monthName)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s %(day)s %(monthName)s %(fullYear)s %(time)s",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"Set a display name:": "ตั้งชื่อที่แสดง:",
"Set a Display Name": "ตั้งชื่อที่แสดง",
"Passwords don't match.": "รหัสผ่านไม่ตรงกัน",
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "รหัสผ่านสั้นเกินไป (ขึ้นต่ำ %(MIN_PASSWORD_LENGTH)s ตัวอักษร)",
"An unknown error occurred.": "เกิดข้อผิดพลาดที่ไม่รู้จัก",
"I already have an account": "ฉันมีบัญชีอยู่แล้ว",
"An error occured: %(error_string)s": "เกิดข้อผิดพลาด: %(error_string)s",
"Topic": "หัวข้อ",
"Make Moderator": "เลื่อนขั้นเป็นผู้ช่วยดูแล",
"Make this room private": "ทำให้ห้องนี้เป็นส่วนตัว",
"Share message history with new users": "แบ่งประวัติแชทให้ผู้ใช้ใหม่",
"Encrypt room": "เข้ารหัสห้อง",
"Room": "ห้อง",
"(~%(searchCount)s results)": "(~%(searchCount)s ผลลัพธ์)",
"or": "หรือ",
"bold": "หนา",
"italic": "เอียง",
"strike": "ขีดทับ",
"underline": "ขีดเส้นใต้",
"code": "โค๊ด",
"quote": "อ้างอิง",
"were kicked %(repeats)s times": "ถูกเตะ %(repeats)s ครั้ง",
"was kicked %(repeats)s times": "ถูกเตะ %(repeats)s ครั้ง",
"were kicked": "ถูกเตะ",
"was kicked": "ถูกเตะ",
"New Password": "รหัสผ่านใหม่",
"Options": "ตัวเลือก",
"Export room keys": "ส่งออกกุณแจห้อง",
"Confirm passphrase": "ยืนยันรหัสผ่าน",
"Import room keys": "นำเข้ากุณแจห้อง",
"File to import": "ไฟล์ที่จะนำเข้า",
"Start new chat": "เริ่มแชทใหม่",
"Failed to invite": "การเชิญล้มเหลว",
"Failed to invite user": "การเชิญผู้ใช้ล้มเหลว",
"Failed to invite the following users to the %(roomName)s room:": "การเชิญผู้ใช้เหล่านี้เข้าสู่ห้อง %(roomName)s ล้มเหลว:",
"Confirm Removal": "ยืนยันการลบ",
"Unknown error": "ข้อผิดพลาดที่ไม่รู้จัก",
"Incorrect password": "รหัสผ่านไม่ถูกต้อง",
"Device name": "ชื่ออุปกรณ์",
"Device key": "Key อุปกรณ์",
"Unknown devices": "อุปกรณ์ที่ไม่รู้จัก",
"Unknown Address": "ที่อยู่ที่ไม่รู้จัก",
"Unblacklist": "ถอดบัญชีดำ",
"Blacklist": "ขึ้นบัญชีดำ",
"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.": "คุณสามารถกำหนดเซิร์ฟเวอร์บ้านเองได้โดยใส่ URL ของเซิร์ฟเวอร์นั้น เพื่อเข้าสู่ระบบของเซิร์ฟเวอร์ Matrix อื่น",
"This allows you to use this app with an existing Matrix account on a different home server.": "ทั้งนี่เพื่อให้คุณสามารถใช้ Riot กับบัญชี Matrix ที่มีอยู่แล้วบนเซิร์ฟเวอร์บ้านอื่น ๆ ได้",
"You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "คุณอาจเลือกเซิร์ฟเวอร์ระบุตัวตนเองด้วยก็ได้ แต่คุณจะไม่สามารถเชิญผู้ใช้อื่นด้วยที่อยู่อีเมล หรือรับคำเชิญจากผู้ใช้อื่นทางที่อยู่อีเมลได้",
"Default server": "เซิร์ฟเวอร์เริ่มต้น",
"Custom server": "เซิร์ฟเวอร์ที่กำหนดเอง",
"Home server URL": "URL เซิร์ฟเวอร์บ้าน",
"Identity server URL": "URL เซิร์ฟเวอร์ระบุตัวตน",
"%(severalUsers)sleft %(repeats)s times": "%(severalUsers)sออกจากห้อง %(repeats)s ครั้ง",
"%(oneUser)sleft %(repeats)s times": "%(oneUser)sออกจากห้อง %(repeats)s ครั้ง",
"%(severalUsers)sleft": "%(severalUsers)sออกจากห้องแล้ว",
"%(oneUser)sleft": "%(oneUser)sออกจากห้องแล้ว",
"el": "กรีก",
"en-au": "อังกฤษ (ออสเตรเลีย)",
"en-bz": "อังกฤษ (เบลีซ)",
"en-gb": "อังกฤษ (สหราชอาณาจักร)",
"en-nz": "อังกฤษ (นิวซีแลนด์)",
"en-jm": "อังกฤษ (จาเมกา)",
"en-ie": "อังกฤษ (ไอร์แลนด์)",
"en-tt": "อังกฤษ (ตรินิแดด)",
"af": "แอฟริกาใต้",
"ar-ae": "อาหรับ (สหรัฐอาหรับเอมิเรตส์)",
"ar-bh": "อาหรับ (บาห์เรน)",
"ar-dz": "อาหรับ (แอลจีเรีย)",
"ar-eg": "อาหรับ (อียิปต์)",
"ar-iq": "อาหรับ (อิรัก)",
"ar-jo": "อาหรับ (จอร์แดน)",
"ar-kw": "อาหรับ (คูเวต)",
"ar-lb": "อาหรับ (เลบานอน)",
"ar-ly": "อาหรับ (ลิเบีย)",
"ar-ma": "อาหรับ (โมร็อกโก)",
"ar-om": "อาหรับ (โอมาน)",
"ar-qa": "อาหรับ (กาตาร์)",
"ar-sa": "อาหรับ (ซาอุดีอาระเบีย)",
"ar-sy": "อาหรับ (ซีเรีย)",
"ar-tn": "อาหรับ (ตูนิเซีย)",
"ar-ye": "อาหรับ (เยเมน)",
"be": "เบลารุส",
"bg": "บัลแกเรีย",
"ca": "คาตาลัน",
"cs": "สาธารณรัฐเช็ก",
"da": "เดนมาร์ก",
"de-at": "เยอรมัน (ออสเตรีย)",
"de-ch": "เยอรมัน (สวิสเซอร์แลนด์)",
"de-lu": "เยอรมัน (ลักเซมเบิร์ก)",
"en-za": "อังกฤษ (แอฟริกาใต้)",
"es-ar": "สเปน (อาร์เจนตินา)",
"es-bo": "สเปน (โบลิเวีย)",
"es-cl": "สเปน (ชิลี)",
"es-co": "สเปน (โคลัมเบีย)",
"es-cr": "สเปน (คอสตาริกา)",
"es-do": "สเปน (สาธารณรัฐโดมินิกัน)",
"zu": "สูลู",
"zh-tw": "จีน (ไต้หวัน)",
"zh-sg": "จีน (สิงคโปร์)",
"zh-hk": "จีน (ฮ่องกง)",
"xh": "โซซา",
"ve": "เวนดา",
"ur": "อูรดู",
"uk": "ยูเครน",
"ts": "ซองก้า",
"tr": "ตุรกี",
"tn": "ซวานา",
"sv": "สวีเดน",
"sv-fi": "สวีเดน (ฟินแลนด์)",
"sr": "เซอร์เบีย",
"sq": "แอลเบเนีย",
"sl": "สโลเวเนีย",
"sk": "สโลวาเกีย",
"sb": "ซอร์เบีย",
"ru": "รัสเซีย",
"ru-mo": "รัสเซีย (สาธารณรัฐมอลโดวา)",
"ro": "โรมาเนีย",
"ro-mo": "โรมาเนีย (สาธารณรัฐมอลโดวา)",
"pt": "โปรตุเกส",
"pt-br": "โปรตุเกส (บราซิล)",
"pl": "โปแลนด์",
"no": "นอร์เวย์",
"nl": "ดัตช์",
"nl-be": "ดัตช์ (เบลเยียม)",
"mt": "มอลตา",
"ms": "มาเลเซีย",
"lv": "ลัตเวีย",
"lt": "ลิธัวเนีย",
"ji": "ยิดดิช",
"it": "อิตาลี",
"it-ch": "อิตาลี (สวิสเซอร์แลนด์)",
"is": "ไอซ์แลนด์",
"id": "อินโดนีเซีย",
"hu": "ฮังการี",
"hr": "โครเอเชีย",
"hi": "ฮินดู",
"he": "อิสราเอล",
"gd": "เกลิค (สกอตแลนด์)",
"fr-lu": "ฝรั่งเศส (ลักเซมเบิร์ก)",
"fr-ca": "ฝรั่งเศส (แคนาดา)",
"fr-ch": "ฝรั่งเศส (สวิสเซอร์แลนด์)",
"fr-be": "ฝรั่งเศส (เบลเยี่ยม)",
"fo": "แฟโร",
"fi": "ฟินแลนด์",
"fa": "ฟาร์ซิ",
"et": "เอสโตเนีย",
"es-ve": "สเปน (เวเนซุเอลา)",
"es-uy": "สเปน (อุรุกวัย)",
"es-sv": "สเปน (เอลซัลวาดอร์)",
"es": "สเปน (สเปน)",
"es-py": "สเปน (ปารากวัย)",
"es-pr": "สเปน (เปอร์โตริโก)",
"es-pe": "สเปน (เปรู)",
"es-pa": "สเปน (ปานามา)",
"es-ni": "สเปน (นิการากัว)",
"es-mx": "สเปน (เม็กซิโก)",
"es-hn": "สเปน (ฮอนดูรัส)",
"es-gt": "สเปน (กัวเตมาลา)",
"es-ec": "สเปน (เอกวาดอร์)",
"Add": "เพิ่ม",
"de-li": "เยอรมัน (ลิกเตนสไตน์)",
"eu": "บาสก์ (บาสก์)",
"ga": "ไอร์แลนด์",
"zh-cn": "จีน (สาธารณรัฐประชาชนจีน)",
"mk": "มาซิโดเนีย (อดีตสาธารณรัฐยูโกสลาฟมาซิโดเนีย)",
"a room": "ห้อง",
"Accept": "ยอมรับ",
"VoIP": "VoIP",
"Close": "ปิด",
"Custom": "กำหนดเอง",
"Decline": "ปฏิเสธ",
"Home": "เมนูหลัก",
"Last seen": "เห็นครั้งสุดท้าย",
"Rejoin": "กลับเข้าร่วม",
"Set": "ตั้ง",
"This room": "ห้องนี้",
"Unnamed Room": "ห้องที่ยังไม่ได้ตั้งชื่อ",
"%(user)s is a": "%(user)s เป็น",
"(~%(count)s results).one": "(~%(count)s ผลลัพท์)",
"(~%(count)s results).other": "(~%(count)s ผลลัพท์)"
} }

159
src/i18n/strings/uk.json Normal file
View file

@ -0,0 +1,159 @@
{
"af": "афрікаанс",
"ar-ae": "арабська (ОАЕ)",
"ar-bh": "арабська (Бахрейн)",
"ar-dz": "арабська (Алжир)",
"ar-eg": "арабська (Єгипет)",
"ar-iq": "арабська (Ірак)",
"ar-jo": "арабська (Йорданія)",
"ar-kw": "арабська (Кувейт)",
"ar-lb": "арабська (Ліван)",
"ar-ly": "арабська (Лівія)",
"ar-ma": "арабська (Марокко)",
"ar-om": "арабська (Оман)",
"ar-qa": "арабська (Катар)",
"ar-sa": "арабська (Саудівська Аравія)",
"ar-sy": "арабська (Сирія)",
"ar-tn": "арабська (Туніс)",
"ar-ye": "арабська (Йемен)",
"be": "білоруська",
"bg": "болгарська",
"ca": "каталонська",
"cs": "чеська",
"da": "данська",
"de-at": "німецька (Австрія)",
"de-ch": "німецька (Швейцарія)",
"de": "німецька",
"de-li": "німецька (Ліхтенштейн)",
"de-lu": "німецька (Люксембург)",
"el": "грецька",
"en-au": "англійська (Австралія)",
"en-bz": "англійська (Беліз)",
"en-ca": "англійська (Канада)",
"en": "англійська",
"en-gb": "англійська (Великобританія)",
"en-ie": "англійська (Ірландія)",
"en-jm": "англійська (Ямайка)",
"en-nz": "англійська (Нова Зеландія)",
"en-tt": "англійська (Тринідад)",
"en-us": "англійська (Сполучені Штати)",
"en-za": "англійська (ПАР)",
"es-ar": "іспанська (Аргентина)",
"es-bo": "іспанська (Болівія)",
"es-cl": "іспанська (Чилі)",
"es-co": "іспанська (Колумбія)",
"es-cr": "іспанська (Коста Ріка)",
"es-do": "іспанська (Домініканська Республіка)",
"es-ec": "іспанська (Еквадор)",
"es-gt": "іспанська (Гватемала)",
"es-hn": "іспанська (Гондурас)",
"es-mx": "іспанська (Мексика)",
"es-ni": "іспанська (Нікарагуа)",
"es-pa": "іспанська (Панама)",
"es-pe": "іспанська (Перу)",
"es-pr": "іспанська (Пуерто Ріко)",
"es-py": "іспанська (Парагвай)",
"es": "іспанська (Іспанія)",
"es-sv": "іспанська (Сальвадор)",
"es-uy": "іспанська (Уругвай)",
"es-ve": "іспанська (Венесуела)",
"et": "естонська",
"eu": "баскійська",
"fa": "перська",
"fi": "фінська",
"fo": "фарерська",
"Cancel": "Скасувати",
"Close": "Закрити",
"Create new room": "Створити нову кімнату",
"Custom Server Options": "Нетипові параметри сервера",
"Direct Chat": "Прямий чат",
"Dismiss": "Відхилити",
"Drop here %(toAction)s": "Кидайте сюди %(toAction)s",
"Error": "Помилка",
"Failed to forget room %(errCode)s": "Не вдалось забути кімнату %(errCode)s",
"Failed to join the room": "Не вдалося приєднатись до кімнати",
"Favourite": "Вибране",
"Mute": "Стишити",
"Notifications": "Сповіщення",
"Operation failed": "Не вдалося виконати дію",
"Please Register": "Зареєструйтеся, будь ласка",
"powered by Matrix": "працює на Matrix",
"Remove": "Прибрати",
"Room directory": "Каталог кімнат",
"Search": "Пошук",
"Settings": "Налаштування",
"Start chat": "Почати розмову",
"unknown error code": "невідомий код помилки",
"Sunday": "Неділя",
"Monday": "Понеділок",
"Tuesday": "Вівторок",
"Wednesday": "Середа",
"Thursday": "Четвер",
"Friday": "П'ятниця",
"Saturday": "Субота",
"OK": "Гаразд",
"Welcome page": "Ласкаво просимо",
"Failed to change password. Is your password correct?": "Не вдалось змінити пароль. Ви впевнені, що пароль введено правильно?",
"Continue": "Продовжити",
"fr-be": "французька (Бельгія)",
"fr-ca": "французька (Канада)",
"fr-ch": "французька (Швейцарія)",
"fr": "французька",
"fr-lu": "французька (Люксембург)",
"ga": "ірландська",
"gd": "гельська (Шотландія)",
"he": "іврит",
"hi": "гінді",
"hr": "хорватська",
"hu": "угорська",
"id": "індонезійська",
"is": "ісландська",
"it-ch": "італійська (Швейцарія)",
"it": "італійська",
"ja": "японська",
"ji": "ідиш",
"ko": "корейська",
"lt": "литовська",
"lv": "латвійська",
"mk": "македонська (КЮРМ)",
"ms": "малайська",
"mt": "мальтійська",
"nl-be": "нідерландська (Бельгія)",
"nl": "нідерландська",
"no": "норвезька",
"pl": "польська",
"pt-br": "бразильська португальська",
"pt": "португальська",
"rm": "ретороманська",
"ro-mo": "румунська (Молдова)",
"ro": "румунська",
"ru-mo": "російська (Молдова)",
"ru": "російська",
"sb": "лужицька",
"sk": "словацька",
"sl": "словенська",
"sq": "албанська",
"sr": "сербська",
"sv-fi": "шведська (Фінляндія)",
"sv": "шведська",
"sx": "сесото",
"sz": "північносаамська",
"th": "тайська",
"tn": "свана",
"tr": "турецька",
"ts": "тсонга",
"uk": "українська",
"ur": "урду",
"ve": "венда",
"vi": "в’єтнамська",
"xh": "коса",
"zh-cn": "спрощена китайська (КНР)",
"zh-hk": "традиційна китайська (Гонконг)",
"zh-sg": "спрощена китайська (Сингапур)",
"zh-tw": "традиційна китайська (Тайвань)",
"zu": "зулу",
"a room": "кімната",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Текстове повідомлення було надіслано +%(msisdn)s. Введіть, будь ласка, код підтвердження з цього повідомлення",
"Accept": "Прийняти",
"Account": "Обліковка"
}

View file

@ -76,7 +76,7 @@
"%(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",
"Guests can't set avatars. Please register.": "游客不能设置头像。请注册。.", "Guests can't set avatars. Please register.": "游客不能设置头像。请注册。.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "游客不能创建聊天室。请注册以创建聊天室和聊天.", "Guest users can't create new rooms. Please register to create room and start a chat.": "游客不能创建聊天室。请注册以创建聊天室和聊天.",
"Guest users can't upload files. Please register to upload": "游客不能上传文件。请注册以上传文件", "Guest users can't upload files. Please register to upload.": "游客不能上传文件。请注册以上传文件",
"Guests can't use labs features. Please register.": "游客不能使用实验性功能。请注册。.", "Guests can't use labs features. Please register.": "游客不能使用实验性功能。请注册。.",
"Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主动邀请。.", "Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主动邀请。.",
"had": "已经", "had": "已经",
@ -138,7 +138,7 @@
"since the point in time of selecting this option": "从选择此选项起", "since the point in time of selecting this option": "从选择此选项起",
"since they joined": "从他们加入时起", "since they joined": "从他们加入时起",
"since they were invited": "从他们被邀请时起", "since they were invited": "从他们被邀请时起",
"Some of your messages have not been sent": "部分消息发送失败", "Some of your messages have not been sent.": "部分消息发送失败",
"Someone": "某个用户", "Someone": "某个用户",
"Sorry, this homeserver is using a login which is not recognised ": "很抱歉,无法识别此主服务器使用的登录方式 ", "Sorry, this homeserver is using a login which is not recognised ": "很抱歉,无法识别此主服务器使用的登录方式 ",
"Start a chat": "创建聊天", "Start a chat": "创建聊天",
@ -147,7 +147,7 @@
"Success": "成功", "Success": "成功",
"The default role for new room members is": "此聊天室新成员的默认角色是", "The default role for new room members is": "此聊天室新成员的默认角色是",
"The main address for this room is": "此聊天室的主要地址是", "The main address for this room is": "此聊天室的主要地址是",
"This action cannot be performed by a guest user. Please register to be able to do this": "游客不能进行此操作。请注册", "This action cannot be performed by a guest user. Please register to be able to do this.": "游客不能进行此操作。请注册",
"This email address is already in use": "此邮箱地址已经被使用", "This email address is already in use": "此邮箱地址已经被使用",
"This email address was not found": "未找到此邮箱地址", "This email address was not found": "未找到此邮箱地址",
"%(actionVerb)s this person?": "%(actionVerb)s 这个用户?", "%(actionVerb)s this person?": "%(actionVerb)s 这个用户?",
@ -162,9 +162,9 @@
"de-at": "德语(奥地利)", "de-at": "德语(奥地利)",
"de-ch": "德语(瑞士)", "de-ch": "德语(瑞士)",
"de": "德语", "de": "德语",
"de-lu": "德语(卢森堡)", "de-lu": "德语 (卢森堡)",
"el": "希腊语", "el": "希腊语",
"en-au": "英语(澳大利亚)", "en-au": "英语 (澳大利亚)",
"en": "英语", "en": "英语",
"zh-cn": "中文(中国)", "zh-cn": "中文(中国)",
"zh-hk": "中文(香港)", "zh-hk": "中文(香港)",
@ -199,11 +199,162 @@
"Ed25519 fingerprint": "Ed25519指纹", "Ed25519 fingerprint": "Ed25519指纹",
"Invite new room members": "邀请新的聊天室成员", "Invite new room members": "邀请新的聊天室成员",
"Join Room": "加入聊天室", "Join Room": "加入聊天室",
"joined": "加入", "joined": "加入",
"%(targetName)s joined the room.": "%(targetName)s 加入聊天室。.", "%(targetName)s joined the room.": "%(targetName)s 加入聊天室。",
"Jump to first unread message.": "跳到第一条未读消息。", "Jump to first unread message.": "跳到第一条未读消息。",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.",
"Leave room": "离开聊天室", "Leave room": "离开聊天室",
"Login as guest": "以游客的身份登录", "Login as guest": "以游客的身份登录",
"New password": "新密码" "New password": "新密码",
"ar-ae": "阿拉伯语 (阿联酋)",
"ar-bh": "阿拉伯语 (巴林)",
"ar-dz": "阿拉伯语 (阿尔及利亚)",
"ar-eg": "阿拉伯语 (埃及)",
"ar-iq": "阿拉伯语 (伊拉克)",
"ar-jo": "阿拉伯语 (约旦)",
"ar-kw": "阿拉伯语 (科威特)",
"ar-lb": "阿拉伯语 (黎巴嫩)",
"ar-ly": "阿拉伯语 (利比亚)",
"ar-ma": "阿拉伯语 (摩洛哥)",
"ar-ye": "阿拉伯语 (也门)",
"en-ca": "英语 (加拿大)",
"en-gb": "英语 (英国)",
"en-ie": "英语 (爱尔兰)",
"en-nz": "英语 (新西兰)",
"Add a topic": "新话题",
"Admin": "管理员",
"Admin tools": "管理工具",
"VoIP": "IP 电话",
"Missing Media Permissions, click here to request.": "没有媒体存储权限,点此获取。",
"No Microphones detected": "未检测到麦克风",
"No Webcams detected": "未检测到摄像头",
"No media permissions": "没有媒体存取权限",
"You may need to manually permit Riot to access your microphone/webcam": "你可能需要手动授权 Riot 使用你的麦克风或摄像头",
"Default Device": "默认设备",
"Microphone": "麦克风",
"Camera": "摄像头",
"Hide removed messages": "隐藏被删除的消息",
"Authentication": "认证",
"Alias (optional)": "别名 (可选)",
"%(items)s and %(remaining)s others": "%(items)s 和其它 %(remaining)s 个",
"%(items)s and one other": "%(items)s 和其它一个",
"%(items)s and %(lastItem)s": "%(items)s 和 %(lastItem)s",
"and %(overflowCount)s others...": "和其它 %(overflowCount)s 个...",
"and one other...": "和其它一个...",
"%(names)s and one other are typing": "%(names)s 和另一个人正在打字",
"anyone": "任何人",
"Anyone": "任何人",
"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 reject the invitation?": "你确定要拒绝邀请吗?",
"Are you sure you want to upload the following files?": "你确定要上传这些文件吗?",
"Bans user with given id": "封禁指定 ID 的用户",
"Blacklisted": "已列入黑名单",
"Bug Report": "反馈漏洞",
"Bulk Options": "批量操作",
"Call Timeout": "通话超时",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "无法连接主服务器 - 请检查网络连接,确保你的<a>主服务器 SSL 证书</a>被信任,且没有浏览器插件拦截请求。",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "当浏览器地址栏里有 HTTPS 的 URL 时,不能使用 HTTP 连接主服务器。请使用 HTTPS 或者<a>允许不安全的脚本</a>。",
"Can't load user settings": "无法加载用户设置",
"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”。",
"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.": "目前,修改密码会导致所有设备上的端对端密钥被重置,使得加密的聊天记录不再可读。除非你事先导出聊天室密钥,修改密码后再导入。这个问题未来会改善。",
"Clear Cache and Reload": "清除缓存并刷新",
"Clear Cache": "清除缓存",
"<a>Click here</a> to join the discussion!": "<a>点此</a> 加入讨论!",
"Click to mute audio": "点此静音",
"Click to mute video": "点此静音",
"click to reveal": "点击展开",
"Click to unmute video": "点此打开声音",
"Click to unmute audio": "点此打开声音",
"Close": "关闭",
"Command error": "命令错误",
"Commands": "命令",
"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": "此客户端不支持视频会议",
"%(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": "自定义级别",
"Decline": "拒绝",
"Device already verified!": "设备已经验证!",
"Device ID:": "设备 ID:",
"device id: ": "设备 ID: ",
"Device key:": "设备密钥 :",
"Disable Notifications": "关闭消息通知",
"disabled": "已禁用",
"Disable markdown formatting": "禁用 Markdown 格式",
"Drop File Here": "把文件拖拽到这里",
"Email address (optional)": "电子邮件地址 (可选)",
"Enable Notifications": "启用消息通知",
"enabled": "已启用",
"Encrypted by a verified device": "由一个已验证的设备加密",
"Encrypted by an unverified device": "由一个未经验证的设备加密",
"Encryption is enabled in this room": "此聊天室启用了加密",
"Encryption is not enabled in this room": "此聊天室未启用加密",
"Enter passphrase": "输入密码",
"Error: Problem communicating with the given homeserver.": "错误: 与指定的主服务器通信时出错。",
"Export": "导出",
"Failed to fetch avatar URL": "获取 Avatar URL 失败",
"Failed to register as guest:": "无法注册为游客:",
"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 的视频通话",
"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' 不是一个合法的电子邮件地址格式",
"'%(alias)s' is not a valid format for an alias": "'%(alias)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 user_id in request": "请求中没有 user_id",
"Mobile phone number": "手机号码",
"Mobile phone number (optional)": "手机号码 (可选)",
"Moderator": "管理员",
"Mute": "静音",
"my Matrix ID": "我的 Matrix ID",
"Name": "姓名",
"Never send encrypted messages to unverified devices from this device": "不要从此设备向未验证的设备发送消息",
"Never send encrypted messages to unverified devices in this room": "不要在此聊天室里向未验证的设备发送消息",
"New passwords don't match": "两次输入的新密码不符",
"none": "无",
"not set": "未设置",
"not specified": "未指定",
"Notifications": "通知",
"(not supported by this browser)": "(此浏览器不支持)",
"<not supported>": "<不支持>",
"NOT verified": "未验证",
"No display name": "无昵称",
"No results": "没有更多结果",
"OK": "确定",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "(目前) 一旦聊天室开启加密,就不能再关闭",
"Operation failed": "操作失败",
"Password": "密码",
"Password:": "密码:",
"Passwords can't be empty": "密码不能为空",
"Permissions": "权限",
"Phone": "电话",
"Cancel": "取消",
"Create new room": "创建新房间",
"Custom Server Options": "自定义服务器选项",
"Dismiss": "设为已读"
} }

View file

@ -194,7 +194,7 @@
"%(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",
"Guests can't set avatars. Please register.": "游客不能設置頭像。請注冊。.", "Guests can't set avatars. Please register.": "游客不能設置頭像。請注冊。.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "游客不能創建聊天室。請注冊以創建聊天室和聊天.", "Guest users can't create new rooms. Please register to create room and start a chat.": "游客不能創建聊天室。請注冊以創建聊天室和聊天.",
"Guest users can't upload files. Please register to upload": "游客不能上傳文件。請注冊以上傳文件", "Guest users can't upload files. Please register to upload.": "游客不能上傳文件。請注冊以上傳文件",
"Guests can't use labs features. Please register.": "游客不能使用實驗性功能。請注冊。.", "Guests can't use labs features. Please register.": "游客不能使用實驗性功能。請注冊。.",
"Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主動邀請。.", "Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主動邀請。.",
"had": "已經", "had": "已經",
@ -265,7 +265,7 @@
"since the point in time of selecting this option": "從選擇此選項起", "since the point in time of selecting this option": "從選擇此選項起",
"since they joined": "從他們加入時起", "since they joined": "從他們加入時起",
"since they were invited": "從他們被邀請時起", "since they were invited": "從他們被邀請時起",
"Some of your messages have not been sent": "部分消息發送失敗", "Some of your messages have not been sent.": "部分消息發送失敗",
"Someone": "某個用戶", "Someone": "某個用戶",
"Sorry, this homeserver is using a login which is not recognised ": "很抱歉,無法識別此主伺服器使用的登錄方式 ", "Sorry, this homeserver is using a login which is not recognised ": "很抱歉,無法識別此主伺服器使用的登錄方式 ",
"Start a chat": "創建聊天", "Start a chat": "創建聊天",
@ -274,7 +274,7 @@
"Success": "成功", "Success": "成功",
"The default role for new room members is": "此聊天室新成員的默認角色是", "The default role for new room members is": "此聊天室新成員的默認角色是",
"The main address for this room is": "此聊天室的主要地址是", "The main address for this room is": "此聊天室的主要地址是",
"This action cannot be performed by a guest user. Please register to be able to do this": "訪客不能進行此操作。請注冊", "This action cannot be performed by a guest user. Please register to be able to do this.": "訪客不能進行此操作。請注冊",
"This email address is already in use": "此郵箱地址已經被使用", "This email address is already in use": "此郵箱地址已經被使用",
"This email address was not found": "未找到此郵箱地址", "This email address was not found": "未找到此郵箱地址",
"%(actionVerb)s this person?": "%(actionVerb)s 這個用戶?", "%(actionVerb)s this person?": "%(actionVerb)s 這個用戶?",
@ -290,7 +290,7 @@
"Would you like to": "你要", "Would you like to": "你要",
"You are already in a call.": "你已在電話通話中", "You are already in a call.": "你已在電話通話中",
"You're not in any rooms yet! Press": "你尚未加入任何聊天室!請按", "You're not in any rooms yet! Press": "你尚未加入任何聊天室!請按",
"You are trying to access %(roomName)s": "你將進入 %(roomName)聊天室", "You are trying to access %(roomName)s.": "你將進入 %(roomName)s聊天室",
"You cannot place a call with yourself.": "你不能打電話給自已", "You cannot place a call with yourself.": "你不能打電話給自已",
"You cannot place VoIP calls in this browser.": "在此瀏覽器下無法置入網路電話通話", "You cannot place VoIP calls in this browser.": "在此瀏覽器下無法置入網路電話通話",
"Sun": "星期日", "Sun": "星期日",
@ -340,7 +340,6 @@
"device id: ": "裝置 id:", "device id: ": "裝置 id:",
"Reason": "原因", "Reason": "原因",
"Register": "注冊", "Register": "注冊",
"Registration required": "要求註冊",
"rejected": "拒絕", "rejected": "拒絕",
"Default server": "默認的伺服器", "Default server": "默認的伺服器",
"Custom server": "自定的伺服器", "Custom server": "自定的伺服器",
@ -353,13 +352,13 @@
"This image cannot be displayed.": "這張圖片無法顯示", "This image cannot be displayed.": "這張圖片無法顯示",
"Error decrypting video": "解密影片出錯", "Error decrypting video": "解密影片出錯",
"Add an Integration": "新增整合器", "Add an Integration": "新增整合器",
"Ongoing conference call%(supportedText)s. %(joinText)s": "%(supportedText)s. %(joinText)s 正在進行電話會議", "Ongoing conference call%(supportedText)s.": "%(supportedText)s. 正在進行電話會議",
" (unsupported)": " (不支持)", " (unsupported)": " (不支持)",
"URL Previews": "網址預覽", "URL Previews": "網址預覽",
"Enable URL previews for this room (affects only you)": "啟用此房間的網址預覽(僅影響您)", "Enable URL previews for this room (affects only you)": "啟用此房間的網址預覽(僅影響您)",
"Drop file here to upload": "把文件放在這裡上傳", "Drop file here to upload": "把文件放在這裡上傳",
"Disable URL previews by default for participants in this room": "默認情況下,此房間的參與者禁用網址預覽", "Disable URL previews by default for participants in this room": "默認情況下,此房間的參與者禁用網址預覽",
"URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "默認情況下,這個房間的參與者的網址預覽是%(globalDisableUrlPreview)。", "URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "默認情況下,這個房間的參與者的網址預覽是%(globalDisableUrlPreview)s。",
"Removed or unknown message type": "已刪除或未知的信息類型", "Removed or unknown message type": "已刪除或未知的信息類型",
"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)。你想繼續嗎?" "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。你想繼續嗎?"
} }

View file

@ -15,6 +15,7 @@ limitations under the License.
*/ */
import Skinner from './Skinner'; import Skinner from './Skinner';
import RtsClient from './RtsClient';
module.exports.loadSkin = function(skinObject) { module.exports.loadSkin = function(skinObject) {
Skinner.load(skinObject); Skinner.load(skinObject);
@ -27,3 +28,7 @@ module.exports.resetSkin = function() {
module.exports.getComponent = function(componentName) { module.exports.getComponent = function(componentName) {
return Skinner.getComponent(componentName); return Skinner.getComponent(componentName);
}; };
module.exports.setFetch = function(fetchFunction) {
RtsClient.setFetch(fetchFunction);
};

View file

@ -18,6 +18,7 @@ limitations under the License.
import request from 'browser-request'; import request from 'browser-request';
import counterpart from 'counterpart'; import counterpart from 'counterpart';
import q from 'q'; import q from 'q';
import React from 'react';
import UserSettingsStore from './UserSettingsStore'; import UserSettingsStore from './UserSettingsStore';
@ -78,7 +79,7 @@ export function _t(...args) {
* with multiple args, each arg representing a captured group of the matching regexp. * with multiple args, each arg representing a captured group of the matching regexp.
* This function must return a JSX node. * This function must return a JSX node.
* *
* @return A list of strings/JSX nodes. * @return a React <span> component containing the generated text
*/ */
export function _tJsx(jsxText, patterns, subs) { export function _tJsx(jsxText, patterns, subs) {
// convert everything to arrays // convert everything to arrays
@ -121,7 +122,10 @@ export function _tJsx(jsxText, patterns, subs) {
output.push(inputText.substr(match.index + match[0].length)); output.push(inputText.substr(match.index + match[0].length));
} }
return output; // this is a bit of a fudge to avoid the 'Each child in an array or iterator
// should have a unique "key" prop' error: we explicitly pass the generated
// nodes into React.createElement as children of a <span>.
return React.createElement('span', null, ...output);
} }
// Allow overriding the text displayed when no translation exists // Allow overriding the text displayed when no translation exists

Some files were not shown because too many files have changed in this diff Show more