Merge branch 'rxl881/apps' into rob/apps

This commit is contained in:
Robert Swain 2017-06-13 15:41:52 +02:00
commit 03ba3bd431
29 changed files with 1263 additions and 335 deletions

View file

@ -1,3 +1,167 @@
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)
===================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.1...v0.9.2)

View file

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

View file

@ -97,11 +97,6 @@ export default class Login {
guest: true
};
}, (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;
});
}
@ -157,15 +152,7 @@ export default class Login {
accessToken: data.access_token
});
}, function(error) {
if (error.httpStatus == 400 && loginParams.medium) {
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 (error.httpStatus === 403) {
if (self._fallbackHsUrl) {
var fbClient = Matrix.createClient({
baseUrl: self._fallbackHsUrl,
@ -186,11 +173,6 @@ export default class Login {
});
}
}
else {
error.friendlyText = (
_t("There was a problem logging in.") + ' (HTTP ' + error.httpStatus + ")"
);
}
throw error;
});
}

View file

@ -13,7 +13,7 @@ WITHOUT 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 ModularWidgets from 'ModularWidgets';
import ModularWidgets from './ModularWidgets';
class AppWidget {
constructor(type, url, options) {

View file

@ -223,10 +223,8 @@ export default React.createClass({
ref='roomView'
autoJoin={this.props.autoJoin}
onRegistered={this.props.onRegistered}
eventId={this.props.initialEventId}
thirdPartyInvite={this.props.thirdPartyInvite}
oobData={this.props.roomOobData}
highlightedEventId={this.props.highlightedEventId}
eventPixelOffset={this.props.initialEventPixelOffset}
key={this.props.currentRoomId || 'roomview'}
opacity={this.props.middleOpacity}

View file

@ -466,7 +466,7 @@ module.exports = React.createClass({
this.notifyNewScreen('home');
break;
case 'view_set_mxid':
this._setMxId();
this._setMxId(payload);
break;
case 'view_start_chat_or_reuse':
this._chatCreateOrReuse(payload.user_id);
@ -570,6 +570,15 @@ module.exports = React.createClass({
const allRooms = RoomListSorter.mostRecentActivityFirst(
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;
for (let i = 0; i < allRooms.length; ++i) {
if (allRooms[i].roomId == this.state.currentRoomId) {
@ -607,6 +616,8 @@ module.exports = React.createClass({
// @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
// 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
// we received to join the room, if any.
// @param {string=} roomInfo.third_party_invite.inviteSignUrl 3pid invite sign URL
@ -618,40 +629,20 @@ module.exports = React.createClass({
this.focusComposer = true;
const newState = {
initialEventId: roomInfo.event_id,
highlightedEventId: roomInfo.event_id,
initialEventPixelOffset: undefined,
page_type: PageTypes.RoomView,
thirdPartyInvite: roomInfo.third_party_invite,
roomOobData: roomInfo.oob_data,
currentRoomAlias: roomInfo.room_alias,
autoJoin: roomInfo.auto_join,
};
if (!roomInfo.room_alias) {
newState.currentRoomId = roomInfo.room_id;
}
// if we aren't given an explicit event id, look for one in the
// scrollStateMap.
//
// TODO: do this in RoomView rather than here
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;
}
}
if (roomInfo.room_alias) {
console.log(
`Switching to room alias ${roomInfo.room_alias} at event ` +
newState.initialEventId,
roomInfo.event_id,
);
} else {
console.log(`Switching to room id ${roomInfo.room_id} at event ` +
newState.initialEventId,
roomInfo.event_id,
);
}
@ -680,7 +671,7 @@ module.exports = React.createClass({
}
}
if (roomInfo.event_id) {
if (roomInfo.event_id && roomInfo.highlighted) {
presentedId += "/" + roomInfo.event_id;
}
this.notifyNewScreen('room/' + presentedId);
@ -689,7 +680,7 @@ module.exports = React.createClass({
});
},
_setMxId: function() {
_setMxId: function(payload) {
const SetMxIdDialog = sdk.getComponent('views.dialogs.SetMxIdDialog');
const close = Modal.createDialog(SetMxIdDialog, {
homeserverUrl: MatrixClientPeg.get().getHomeserverUrl(),
@ -698,6 +689,11 @@ module.exports = React.createClass({
dis.dispatch({
action: 'cancel_after_sync_prepared',
});
if (payload.go_home_on_cancel) {
dis.dispatch({
action: 'view_home_page',
});
}
return;
}
this.onRegistered(credentials);
@ -778,6 +774,11 @@ module.exports = React.createClass({
}
dis.dispatch({
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;
}
@ -1137,6 +1138,10 @@ module.exports = React.createClass({
const payload = {
action: 'view_room',
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,
oob_data: oobData,
};
@ -1321,7 +1326,7 @@ module.exports = React.createClass({
});
} else {
dis.dispatch({
action: 'view_room_directory',
action: 'view_home_page',
});
}
},

View file

@ -83,36 +83,8 @@ module.exports = React.createClass({
// * invited us tovthe room
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?
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() {
@ -123,6 +95,13 @@ module.exports = React.createClass({
roomLoading: true,
peekLoading: false,
// 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,
editingRoomSettings: false,
uploadingRoomSettings: false,
@ -182,13 +161,32 @@ module.exports = React.createClass({
if (this.unmounted) {
return;
}
this.setState({
const newState = {
roomId: RoomViewStore.getRoomId(),
roomAlias: RoomViewStore.getRoomAlias(),
roomLoading: RoomViewStore.isRoomLoading(),
roomLoadError: RoomViewStore.getRoomLoadError(),
joining: RoomViewStore.isJoining(),
}, () => {
initialEventId: RoomViewStore.getInitialEventId(),
initialEventPixelOffset: RoomViewStore.getInitialEventPixelOffset(),
isInitialEventHighlighted: RoomViewStore.isInitialEventHighlighted(),
};
// 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.
this._onHaveRoom();
this.onRoom(MatrixClientPeg.get().getRoom(this.state.roomId));
});
@ -295,13 +293,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) {
return (!ObjectUtils.shallowEqual(this.props, nextProps) ||
!ObjectUtils.shallowEqual(this.state, nextState));
@ -327,7 +318,7 @@ module.exports = React.createClass({
this.unmounted = true;
// update the scroll map before we get unmounted
this._updateScrollMap();
this._updateScrollMap(this.state.roomId);
if (this.refs.roomView) {
// disconnect the D&D event listeners from the room view. This
@ -611,6 +602,18 @@ 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) {
if (!room || room.roomId !== this.state.roomId) {
return;
@ -1253,21 +1256,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
// restored when we switch back to it.
//
@ -1698,6 +1686,14 @@ module.exports = React.createClass({
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);
var messagePanel = (
<TimelinePanel ref={this._gatherTimelinePanelRef}
@ -1705,9 +1701,9 @@ module.exports = React.createClass({
manageReadReceipts={!UserSettingsStore.getSyncedSetting('hideReadReceipts', false)}
manageReadMarkers={true}
hidden={hideMessagePanel}
highlightedEventId={this.state.forwardingEvent ? this.state.forwardingEvent.getId() : this.props.highlightedEventId}
eventId={this.props.eventId}
eventPixelOffset={this.props.eventPixelOffset}
highlightedEventId={highlightedEventId}
eventId={this.state.initialEventId}
eventPixelOffset={this.state.initialEventPixelOffset}
onScroll={ this.onMessageListScroll }
onReadMarkerUpdated={ this._updateTopUnreadMessagesBar }
showUrlPreview = { this.state.showUrlPreview }

View file

@ -87,7 +87,27 @@ module.exports = React.createClass({
).then((data) => {
this.props.onLoggedIn(data);
}, (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(() => {
this.setState({
busy: false
@ -110,7 +130,16 @@ module.exports = React.createClass({
this._loginLogic.loginAsGuest().then(function(data) {
self.props.onLoggedIn(data);
}, 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() {
self.setState({
busy: false
@ -183,31 +212,22 @@ module.exports = React.createClass({
currentFlow: self._getCurrentFlowStep(),
});
}, function(err) {
self._setStateFromError(err, false);
self.setState({
errorText: self._errorTextFromError(err),
loginIncorrect: false,
});
}).finally(function() {
self.setState({
busy: false,
});
});
}).done();
},
_getCurrentFlowStep: function() {
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) {
if (err.friendlyText) {
return err.friendlyText;
}
let errCode = err.errcode;
if (!errCode && err.httpStatus) {
errCode = "HTTP " + err.httpStatus;
@ -219,8 +239,8 @@ module.exports = React.createClass({
if (err.cors === 'rejected') {
if (window.location.protocol === 'https:' &&
(this.state.enteredHomeserverUrl.startsWith("http:") ||
!this.state.enteredHomeserverUrl.startsWith("http")))
{
!this.state.enteredHomeserverUrl.startsWith("http"))
) {
errorText = <span>
{ _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>.",
@ -228,10 +248,9 @@ module.exports = React.createClass({
(sub) => { return <a href="https://www.google.com/search?&q=enable%20unsafe%20scripts">{ sub }</a>; }
)}
</span>;
}
else {
} else {
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>/,
(sub) => { return <a href={this.state.enteredHomeserverUrl}>{ sub }</a>; }
)}

View file

@ -227,8 +227,7 @@ module.exports = React.createClass({
? _t("%(severalUsers)sjoined", { severalUsers: "" })
: _t("%(oneUser)sjoined", { oneUser: "" });
}
break;
break;
case "left":
if (repeats > 1) {
res = (plural)
@ -238,7 +237,8 @@ module.exports = React.createClass({
res = (plural)
? _t("%(severalUsers)sleft", { severalUsers: "" })
: _t("%(oneUser)sleft", { oneUser: "" });
} break;
}
break;
case "joined_and_left":
if (repeats > 1) {
res = (plural)
@ -249,7 +249,7 @@ module.exports = React.createClass({
? _t("%(severalUsers)sjoined and left", { severalUsers: "" })
: _t("%(oneUser)sjoined and left", { oneUser: "" });
}
break;
break;
case "left_and_joined":
if (repeats > 1) {
res = (plural)
@ -259,8 +259,8 @@ module.exports = React.createClass({
res = (plural)
? _t("%(severalUsers)sleft and rejoined", { severalUsers: "" })
: _t("%(oneUser)sleft and rejoined", { oneUser: "" });
} break;
break;
}
break;
case "invite_reject":
if (repeats > 1) {
res = (plural)
@ -271,7 +271,7 @@ module.exports = React.createClass({
? _t("%(severalUsers)srejected their invitations", { severalUsers: "" })
: _t("%(oneUser)srejected their invitation", { oneUser: "" });
}
break;
break;
case "invite_withdrawal":
if (repeats > 1) {
res = (plural)
@ -282,7 +282,7 @@ module.exports = React.createClass({
? _t("%(severalUsers)shad their invitations withdrawn", { severalUsers: "" })
: _t("%(oneUser)shad their invitation withdrawn", { oneUser: "" });
}
break;
break;
case "invited":
if (repeats > 1) {
res = (plural)
@ -293,7 +293,7 @@ module.exports = React.createClass({
? _t("were invited")
: _t("was invited");
}
break;
break;
case "banned":
if (repeats > 1) {
res = (plural)
@ -304,7 +304,7 @@ module.exports = React.createClass({
? _t("were banned")
: _t("was banned");
}
break;
break;
case "unbanned":
if (repeats > 1) {
res = (plural)
@ -315,7 +315,7 @@ module.exports = React.createClass({
? _t("were unbanned")
: _t("was unbanned");
}
break;
break;
case "kicked":
if (repeats > 1) {
res = (plural)
@ -326,7 +326,7 @@ module.exports = React.createClass({
? _t("were kicked")
: _t("was kicked");
}
break;
break;
case "changed_name":
if (repeats > 1) {
res = (plural)
@ -337,7 +337,7 @@ module.exports = React.createClass({
? _t("%(severalUsers)schanged their name", { severalUsers: "" })
: _t("%(oneUser)schanged their name", { oneUser: "" });
}
break;
break;
case "changed_avatar":
if (repeats > 1) {
res = (plural)
@ -348,7 +348,7 @@ module.exports = React.createClass({
? _t("%(severalUsers)schanged their avatar", { severalUsers: "" })
: _t("%(oneUser)schanged their avatar", { oneUser: "" });
}
break;
break;
}
return res;

View file

@ -22,7 +22,6 @@ import ObjectUtils from '../../../ObjectUtils';
import AppsDrawer from './AppsDrawer';
import { _t, _tJsx} from '../../../languageHandler';
module.exports = React.createClass({
displayName: 'AuxPanel',
@ -92,12 +91,12 @@ module.exports = React.createClass({
let conferenceCallNotification = null;
if (this.props.displayConfCallNotification) {
let supportedText;
let joinText;
let supportedText = '';
let joinNode;
if (!MatrixClientPeg.get().supportsVoip()) {
supportedText = _t(" (unsupported)");
} else {
joinText = (<span>
joinNode = (<span>
{_tJsx(
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.",
[/<voiceText>(.*?)<\/voiceText>/, /<videoText>(.*?)<\/videoText>/],
@ -108,9 +107,13 @@ module.exports = React.createClass({
)}
</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 = (
<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>
);
}

View file

@ -381,6 +381,7 @@ module.exports = WithMatrixClient(React.createClass({
dis.dispatch({
action: 'view_room',
event_id: this.props.mxEvent.getId(),
highlighted: true,
room_id: this.props.mxEvent.getRoomId(),
});
},

View file

@ -38,6 +38,8 @@ import Unread from '../../../Unread';
import { findReadReceiptFromUserId } from '../../../utils/Receipt';
import WithMatrixClient from '../../../wrappers/WithMatrixClient';
import AccessibleButton from '../elements/AccessibleButton';
import GeminiScrollbar from 'react-gemini-scrollbar';
module.exports = WithMatrixClient(React.createClass({
displayName: 'MemberInfo',
@ -727,34 +729,36 @@ module.exports = WithMatrixClient(React.createClass({
const EmojiText = sdk.getComponent('elements.EmojiText');
return (
<div className="mx_MemberInfo">
<AccessibleButton className="mx_MemberInfo_cancel" onClick={this.onCancel}> <img src="img/cancel.svg" width="18" height="18"/></AccessibleButton>
<div className="mx_MemberInfo_avatar">
<MemberAvatar onClick={this.onMemberAvatarClick} member={this.props.member} width={48} height={48} />
</div>
<EmojiText element="h2">{memberName}</EmojiText>
<div className="mx_MemberInfo_profile">
<div className="mx_MemberInfo_profileField">
{ this.props.member.userId }
<GeminiScrollbar autoshow={true}>
<AccessibleButton className="mx_MemberInfo_cancel" onClick={this.onCancel}> <img src="img/cancel.svg" width="18" height="18"/></AccessibleButton>
<div className="mx_MemberInfo_avatar">
<MemberAvatar onClick={this.onMemberAvatarClick} member={this.props.member} width={48} height={48} />
</div>
<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>
<EmojiText element="h2">{memberName}</EmojiText>
<div className="mx_MemberInfo_profile">
<div className="mx_MemberInfo_profileField">
{ this.props.member.userId }
</div>
<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>
</div>
<div className="mx_MemberInfo_profileField">
<PresenceLabel activeAgo={ presenceLastActiveAgo }
currentlyActive={ presenceCurrentlyActive }
presenceState={ presenceState } />
</div>
</div>
<div className="mx_MemberInfo_profileField">
<PresenceLabel activeAgo={ presenceLastActiveAgo }
currentlyActive={ presenceCurrentlyActive }
presenceState={ presenceState } />
</div>
</div>
{ adminTools }
{ adminTools }
{ startChat }
{ startChat }
{ this._renderDevices() }
{ this._renderDevices() }
{ spinner }
{ spinner }
</GeminiScrollbar>
</div>
);
}

View file

@ -13,16 +13,15 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
var React = require('react');
import React from 'react';
import { _t } from '../../../languageHandler';
var CallHandler = require('../../../CallHandler');
var MatrixClientPeg = require('../../../MatrixClientPeg');
var Modal = require('../../../Modal');
var sdk = require('../../../index');
var dis = require('../../../dispatcher');
import CallHandler from '../../../CallHandler';
import MatrixClientPeg from '../../../MatrixClientPeg';
import Modal from '../../../Modal';
import sdk from '../../../index';
import dis from '../../../dispatcher';
import Autocomplete from './Autocomplete';
import classNames from 'classnames';
import UserSettingsStore from '../../../UserSettingsStore';
@ -107,7 +106,7 @@ export default class MessageComposer extends React.Component {
let QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
let TintableSvg = sdk.getComponent("elements.TintableSvg");
const fileList = [];
let fileList = [];
for (let i=0; i<files.length; i++) {
fileList.push(<li key={i}>
<TintableSvg key={i} src="img/files.svg" width="16" height="16" /> {files[i].name || _t('Attachment')}
@ -372,20 +371,20 @@ export default class MessageComposer extends React.Component {
controls.push(
<div key="controls_error" className="mx_MessageComposer_noperm_error">
{ _t('You do not have permission to post to this room') }
</div>
</div>,
);
}
// let autoComplete;
// if (UserSettingsStore.isFeatureEnabled('rich_text_editor')) {
// autoComplete = <div className="mx_MessageComposer_autocomplete_wrapper">
// <Autocomplete
// ref="autocomplete"
// onConfirm={this._onAutocompleteConfirm}
// query={this.state.autocompleteQuery}
// selection={this.state.selection} />
// </div>;
// }
let autoComplete;
if (UserSettingsStore.isFeatureEnabled('rich_text_editor')) {
autoComplete = <div className="mx_MessageComposer_autocomplete_wrapper">
<Autocomplete
ref="autocomplete"
onConfirm={this._onAutocompleteConfirm}
query={this.state.autocompleteQuery}
selection={this.state.selection} />
</div>;
}
const {style, blockType} = this.state.inputState;

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,5 +1,5 @@
{
"Filter room members": "Raum-Benutzer filtern",
"Filter room members": "Raum-Mitglieder filtern",
"You have no visible notifications": "Du hast keine sichtbaren Benachrichtigungen",
"Invites": "Einladungen",
"Favourites": "Favoriten",
@ -88,7 +88,7 @@
"Display name": "Anzeigename",
"Email Address": "E-Mail-Adresse",
"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",
"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",
@ -193,7 +193,7 @@
"Room name (optional)": "Raumname (optional)",
"Scroll to unread messages": "Zu den ungelesenen Nachrichten scrollen",
"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 invitation to": "sandte eine Einladung an",
"sent a video": "hat ein Video gesendet",
@ -270,7 +270,7 @@
"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?",
"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": "%(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 must be a": "nötige Rolle",
@ -392,7 +392,7 @@
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s zog Bann für %(targetName)s zurück.",
"Usage": "Verwendung",
"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 logged in.": "Du musst angemeldet sein.",
"There are no visible files in this room": "Es gibt keine sichtbaren Dateien in diesem Raum",
@ -564,7 +564,7 @@
"Click to mute audio": "Klicke um den Ton stumm zu stellen",
"Click to mute video": "Klicken, um das Video stummzuschalten",
"Command error": "Befehlsfehler",
"Decrypt %(text)s": "Entschlüssele %(text)s",
"Decrypt %(text)s": "%(text)s entschlüsseln",
"Delete": "Löschen",
"Devices": "Geräte",
"Direct chats": "Direkte Chats",
@ -586,7 +586,7 @@
"Invalid alias format": "Ungültiges Alias-Format",
"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 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",
"Kick": "Kicke",
"Level": "Berechtigungslevel",
@ -607,14 +607,14 @@
"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 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.": "Server nicht verfügbar, überlastet oder etwas anderes lief falsch.",
"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 nicht gesendet.",
"Submit": "Absenden",
"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.",
"%(actionVerb)s this person?": "Diese Person %(actionVerb)s?",
"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 was unable to find it.": "Der Versuch, einen spezifischen Punkt im Chatverlauf zu laden, ist fehlgeschlagen. Der Punkt konnte nicht gefunden werden.",
"Turn Markdown off": "Markdown deaktiveren",
@ -626,7 +626,7 @@
"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 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",
"(~%(searchCount)s results)": "(~%(searchCount)s Ergebnisse)",
"Cancel": "Abbrechen",
@ -655,7 +655,7 @@
"%(oneUser)sjoined %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal betreten",
"%(severalUsers)sjoined": "%(severalUsers)shaben den Raum betreten",
"%(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",
"%(severalUsers)sleft": "%(severalUsers)shaben den Raum verlassen",
"%(oneUser)sleft": "%(oneUser)sging",
@ -674,7 +674,7 @@
"%(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",
"%(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",
"was invited %(repeats)s times": "wurde %(repeats)s mal eingeladen",
"were invited": "wurden eingeladen",
@ -751,8 +751,8 @@
"Verify device": "Gerät verifizieren",
"I verify that the keys match": "Ich bestätige, dass die Schlüssel passen",
"Unable to restore session": "Sitzungswiederherstellung fehlgeschlagen",
"Continue anyway": "Fahre trotzdem fort",
"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?",
"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 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.",
"\"%(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",
@ -809,12 +809,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.",
"Blacklist": "Blockieren",
"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",
"Drop file here to upload": "Datei hier loslassen zum hochladen",
"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.",
"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?",
"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",
@ -841,7 +841,7 @@
"Camera": "Kamera",
"Device already verified!": "Gerät bereits verifiziert!",
"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.",
"Import": "Import",
"Incorrect username and/or password.": "Inkorrekter Nutzername und/oder Passwort.",
@ -862,7 +862,7 @@
"Register": "Registrieren",
"Save": "Speichern",
"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.",
"There was a problem logging in.": "Es gab ein Problem beim anmelden.",
"Unknown (user, device) pair:": "Unbekanntes (Nutzer-/Gerät-)Paar:",
@ -880,36 +880,95 @@
"%(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",
"Start new chat": "Neuen Chat starten",
"Disable markdown formatting": "Deaktiviere Markdown-Formatierung",
"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": "Fehler beim holen der Avatar-URL",
"The phone number entered looks invalid": "Die Telefonnummer, die eingegeben wurde, sieht ungültig aus",
"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.",
"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 spezifischen Punkt in der Chat-Historie zu laden, aber du hast keine Berechtigung diese Nachricht zu sehen.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Es wurde versucht einen spezifischen Punkt in der Chat-Historie zu laden, aber er konnte nicht gefunden werden.",
"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.": "Es wurde versucht, einen bestimmten Punkt im Chatverlauf dieses Raumes zu laden, der Punkt konnte jedoch nicht gefunden werden.",
"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 zu nutzen",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Sende erneut</a> oder <a>breche alles ab</a>. Du kannst auch auch individuelle Nachrichten erneut senden or abbrechen.",
"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": "Starte Chat",
"Start chat": "Chat starten",
"New Password": "Neues Passwort",
"Start chatting": "Starte plaudern",
"Start chatting": "Chat beginnen",
"Start Chatting": "Starte Gespräche",
"Click on the button below to start chatting!": "Klicke den Button unten um das Plaudern zu beginnen!",
"Create a new chat or reuse an existing one": "Erstelle einen neuen Chat oder nutze einen existierenden",
"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": "Nutzername verfügbar",
"Username not available": "Nutzername nicht verfügbar",
"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 Konto-Name auf dem <span></span> Heimserver, oder du kannst einen <a>anderen Server</a> auswählen.",
"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": "Nutzername falsch: %(errMessage)s"
"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.": "Ansonsten <a>klicke hier</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": "Starte Authentifizierung",
"Show Text Formatting Toolbar": "Zeige text-formatierende Werkzeugleiste",
"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 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 gekickt.",
"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"
}

View file

@ -1,13 +1,13 @@
{
"af": "Αφρικάνικα",
"Error": "Σφάλμα",
"Failed to forget room %(errCode)s": "Δεν ήταν δυνατή η διαγραφή του δωματίου",
"Failed to forget room %(errCode)s": "Δεν ήταν δυνατή η διαγραφή του δωματίου (%(errCode)s)",
"Failed to join the room": "Δεν ήταν δυνατή η σύνδεση στο δωμάτιο",
"Mute": "Σίγαση",
"Notifications": "Ειδοποιήσεις",
"Operation failed": "Η λειτουργία απέτυχε",
"Please Register": "Παρακαλώ εγγραφείτε",
"Remove": "Αφαίρεσε",
"Please Register": "Παρακαλούμε εγγραφείτε",
"Remove": "Αφαίρεση",
"Search": "Αναζήτηση",
"Settings": "Ρυθμίσεις",
"unknown error code": "άγνωστος κωδικός σφάλματος",
@ -195,7 +195,7 @@
"%(senderDisplayName)s removed the room name.": "Ο χρήστης %(senderDisplayName)s διέγραψε το όνομα του δωματίου.",
"Changes your display nickname": "Αλλάζει το όνομα χρήστη",
"Click here": "Κάνε κλικ εδώ",
"Drop here %(toAction)s": "Σύρε εδώ %(toAction)s",
"Drop here %(toAction)s": "Απόθεση εδώ %(toAction)s",
"Conference call failed.": "Η κλήση συνδιάσκεψης απέτυχε.",
"powered by Matrix": "βασισμένο στο πρωτόκολλο Matrix",
"Confirm password": "Επιβεβαίωση κωδικού",
@ -222,7 +222,7 @@
"device id: ": "id συσκευής: ",
"Device key:": "Κλειδί Συσκευής:",
"Devices": "Συσκευές",
"Direct Chat": "Απευθείας Συνομιλία",
"Direct Chat": "Απευθείας συνομιλία",
"Direct chats": "Απευθείας συνομιλίες",
"disabled": "ανενεργό",
"Disinvite": "Ανακάλεσε πρόσκληση",
@ -244,7 +244,7 @@
"Existing Call": "Υπάρχουσα Κλήση",
"Export": "Εξαγωγή",
"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 join room": "Δεν ήταν δυνατή η σύνδεση στο δωμάτιο",
"Failed to leave room": "Δεν ήταν δυνατή η αποχώρηση από το δωμάτιο",
@ -330,7 +330,7 @@
"<not supported>": "<δεν υποστηρίζεται>",
"No more results": "Δεν υπάρχουν άλλα αποτελέσματα",
"No results": "Κανένα αποτέλεσμα",
"OK": "ΟΚ",
"OK": "Εντάξει",
"olm version:": "έκδοση olm:",
"Password": "Κωδικός",
"Password:": "Κωδικός:",
@ -364,7 +364,7 @@
"cancel all": "ακύρωση όλων",
"or": "ή",
"Custom Server Options": "Προσαρμοσμένες ρυθμίσεις διακομιστή",
"Dismiss": "Αγνόησε",
"Dismiss": "Απόρριψη",
"Monday": "Δευτέρα",
"Tuesday": "Τρίτη",
"Wednesday": "Τετάρτη",
@ -382,5 +382,10 @@
"%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)s συνδέθηκαν και έφυγαν %(repeats)s φορές",
"%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)s συνδέθηκε και έφυγε %(repeats)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": "Αρχική σελίδα"
}

View file

@ -184,7 +184,7 @@
"Bug Report": "Bug Report",
"Bulk Options": "Bulk Options",
"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 load user settings": "Can't load user settings",
"Change Password": "Change Password",
@ -887,7 +887,7 @@
"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",
" (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)sm": "for %(amount)sm",
"for %(amount)sh": "for %(amount)sh",

View file

@ -813,7 +813,7 @@
"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",
" (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)sm": "for %(amount)sm",
"for %(amount)sh": "for %(amount)sh",
@ -824,5 +824,22 @@
"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)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"
}

View file

@ -294,7 +294,7 @@
"Found a bug?": "Trouvé un problème ?",
"%(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 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",
"Hangup": "Raccrocher",
"Hide read receipts": "Cacher les accusés de réception",
@ -386,7 +386,7 @@
"Email address": "Adresse e-mail",
"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.",
"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 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.",
@ -499,15 +499,15 @@
"to make a room or": "pour créer un salon ou",
"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 restore": "restaurer",
"to restore": "pour restaurer",
"To send events of type": "Pour envoyer des évènements du type",
"To send messages": "Pour envoyer des messages",
"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 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.",
"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 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 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.": "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 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).",
@ -619,7 +619,7 @@
"There are no visible files in this room": "Il n'y a pas de fichier visible dans ce salon",
"Room": "Salon",
"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",
"Resend all": "Tout renvoyer",
"(~%(searchCount)s results)": "(~%(searchCount)s résultats)",
@ -759,7 +759,7 @@
"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",
" (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",
"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)",
@ -834,11 +834,7 @@
"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",
"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.",
"Some of your messages have not been sent.": "Certains de vos messages nont pas été envoyés.",
"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.",
"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.": "Un instant donné de la chronologie na pu être chargé car il na pas pu être trouvé.",
"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",

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

@ -24,5 +24,160 @@
"Wednesday": "Szerda",
"Thursday": "Csütörtök",
"Friday": "Péntek",
"Saturday": "Szombat"
"Saturday": "Szombat",
"af": "Afrikaans",
"ar-ae": "Arabic (U.A.E.)",
"ar-bh": "Arabic (Bahrain)",
"ar-dz": "Arabic (Algeria)",
"ar-eg": "Arabic (Egypt)",
"ar-iq": "Arabic (Iraq)",
"ar-jo": "Arabic (Jordan)",
"ar-kw": "Arabic (Kuwait)",
"ar-lb": "Arabic (Lebanon)",
"ar-ly": "Arabic (Libya)",
"ar-ma": "Arabic (Morocco)",
"ar-om": "Arabic (Oman)",
"ar-qa": "Arabic (Qatar)",
"ar-sa": "Arabic (Saudi Arabia)",
"ar-sy": "Arabic (Syria)",
"ar-tn": "Arabic (Tunisia)",
"ar-ye": "Arabic (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"
}

View file

@ -808,7 +808,7 @@
"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",
" (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",
"Idle": "Ocioso",
"Offline": "Offline",

View file

@ -81,7 +81,7 @@
"Error": "Erro",
"Event information": "Informação do evento",
"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 leave room": "Falha ao tentar deixar a sala",
"Failed to reject invitation": "Falha ao tentar rejeitar convite",
@ -808,7 +808,7 @@
"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",
" (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",
"Idle": "Ocioso",
"Offline": "Offline",
@ -876,5 +876,93 @@
"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 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": "Аккаунт",
"Add email address": "Добавить email адрес",
"Add phone number": "Добавить телефонный номер",
"Admin": "Admin",
"Admin": "Админ",
"Advanced": "Дополнительно",
"Algorithm": "Алгоритм",
"all room members": "все участники комнаты",
@ -54,12 +54,12 @@
"Deactivate my account": "Деактивировать мою учётную запись",
"decline": "отказаться",
"Decryption error": "Ошибка дешифрования",
"Default": "Default",
"Default": "Стандарт",
"demote": "понижать",
"Deops user with given id": "Deops пользователь с данным id",
"Device ID": "Устройство ID",
"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 по умолчанию",
"Display name": "Отображаемое имя",
"Displays action": "Отображение действий",
@ -75,7 +75,7 @@
"Error": "Ошибка",
"Event information": "Event information",
"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 leave room": "Не удалось выйти из комнаты",
"Failed to reject invitation": "Не удалось отклонить приглашение",
@ -83,7 +83,7 @@
"Failed to unban": "Не удалось отменить запрет",
"Failed to upload file": "Не удалось закачать файл",
"Favourite": "Избранное",
"favourite": "фаворит",
"favourite": "Избранное",
"Favourites": "Избранное",
"Filter room members": "Фильтр участников комнаты",
"Forget room": "Забыть комнату",
@ -99,7 +99,7 @@
"Import E2E room keys": "Импортировать E2E ключ комнаты",
"Invalid Email Address": "Недействительный адрес электронной почты",
"invited": "invited",
"Invite new room members": "Пригласить новых учасников в комнату",
"Invite new room members": "Пригласить новых участников в комнату",
"Invites": "Приглашать",
"Invites user with given id to current room": "Пригласить пользователя с данным id в текущую комнату",
"is a": "является",
@ -108,10 +108,10 @@
"joined": "присоединенный",
"joined the room": "joined the room",
"Joins room with given alias": "Присоединяется к комнате с данным псевдонимом",
"Kicks user with given id": "Кик пользователя с заданным id",
"Kicks user with given id": "Выгнать пользователя с заданным id",
"Labs": "Лаборатория",
"Leave room": "Уйти из комнаты",
"left and rejoined": "Покинуть и переподключится",
"left and rejoined": "Покинуть и пере подключится",
"left": "покинуть",
"left the room": "left the room",
"Logged in as": "Зарегистрированный как",
@ -119,13 +119,13 @@
"Logout": "Выход из системы",
"Low priority": "Низкий приоритет",
"made future room history visible to": "made future room history visible to",
"Manage Integrations": "Управление интеграциями",
"Manage Integrations": "Управление Интеграциями",
"Members only": "Только участники",
"Mobile phone number": "Номер мобильного телефона",
"Moderator": "Ведущий",
"my Matrix ID": "мой Matrix ID",
"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": "Никогда не отправляйте зашифрованные сообщения в непроверенные устройства в этой комнате из этого устройства",
"New password": "Новый пароль",
"New passwords must match each other.": "Новые пароли должны соответствовать друг другу.",
@ -158,8 +158,8 @@
"set a profile picture": "set a profile picture",
"set their display name to": "set their display name to",
"Settings": "Настройки",
"Start a chat": "Start a chat",
"Start Chat": "Start Chat",
"Start a chat": "Начать чат",
"Start Chat": "Начать чат",
"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",
"To send events of type": "Для отправки типа событий",
@ -170,8 +170,8 @@
"Unable to verify email address.": "Невозможно проверить адрес электронной почты.",
"Unban": "Отменить запрет",
"Unencrypted room": "Незашифрованная комната",
"unencrypted": "незашифрованно",
"unknown device": "неизвесное устройство",
"unencrypted": "незашифровано",
"unknown device": "неизвестное устройство",
"unknown error code": "неизвестная ошибка",
"unknown": "неизвестно",
"Upload avatar": "Загрузить аватар",
@ -189,7 +189,7 @@
"Video call": "Видио вызов",
"Voice call": "Голосовой вызов",
"VoIP conference finished.": "VoIP конференция закончилась.",
"VoIP conference started.": "VoIP Конференция стартовала.",
"VoIP conference started.": "VoIP Конференция началась.",
"(warning: cannot be disabled again!)": "(предупреждение: не может быть отключено!)",
"Warning!": "Предупреждение!",
"was banned": "запрещен",
@ -230,7 +230,7 @@
"%(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 changed the room name to %(roomName)s.": "%(senderDisplayName)s имя комнаты изменено на %(roomName)s.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s измененная тема на %(topic)s.",
"Conference call failed.": "Конференц-вызов прервался.",
"Conference calling is in development and may not be reliable.": "Конференц-вызов находится в процессе и может не быть надежным.",
@ -246,7 +246,7 @@
"Failed to set up conference call": "Не удалось установить конференц-вызов",
"Failed to verify email address: make sure you clicked the link in the email": "Не удалось подтвердить email-адрес: убедитесь что вы щелкнули по ссылке электронной почты",
"Failure to create room": "Не удалось создать комнату",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s из %(fromPowerLevel)s до %(toPowerLevel)s",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId) изменил %(fromPowerLevel) на %(toPowerLevel)",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Гостевые пользователи не могут создавать новые комнаты. Зарегистрируйтесь для создания комнаты и чата.",
"click to reveal": "нажать для открытия",
"%(senderName)s invited %(targetName)s.": "%(senderName)s приглашает %(targetName)s.",
@ -257,13 +257,13 @@
"%(senderName)s made future room history visible to": "%(senderName)s сделал видимой для всех будущую историю комнаты",
"Missing room_id in request": "Отсутствует room_id в запросе",
"Missing user_id in request": "Отсутствует user_id в запросе",
"Must be viewing a room": "Комната должна быть посищена",
"New Composer & Autocomplete": "Новый едитор & Автозаполнение",
"Must be viewing a room": "Посмотреть комнату",
"New Composer & Autocomplete": "Новый автор & Автозаполнение",
"(not supported by this browser)": "(не поддерживаемый этим браузером)",
"af": "Африкаанс",
"ar-ae": "Арабский (О.А.Е)",
"ar-bh": "Арабский (Бахрейн)",
"ar-dz": "Арабский (Алжыр)",
"ar-dz": "Арабский (Алжир)",
"ar-eg": "Арабский (Египет)",
"ar-iq": "Арабский (Ирак)",
"ar-jo": "Арабский (Иордания)",
@ -285,7 +285,7 @@
"de-ch": "Немецкий (Швейцария)",
"de-li": "Немецкий (Лихтенштейн)",
"de-lu": "Немецкий (Люксембург)",
"el": "Гречиский",
"el": "Греческий",
"en-au": "Английский (Австралия)",
"en-bz": "Английский (Белиз)",
"en-ca": "Английский (Канада)",
@ -310,7 +310,7 @@
"es-pa": "Испанский (Панама)",
"et": "Эстонский",
"fi": "Финский",
"fr": "Французкий",
"fr": "Французский",
"hr": "Хорватский",
"it": "Итальянский",
"ja": "Японский",
@ -320,7 +320,7 @@
"ro": "Румынский",
"uk": "Украинский",
"now. You can also select individual messages to resend or cancel.": "теперь. Вы можете также выбрать отдельные сообщения, чтобы снова послать или отменить.",
"Auto-complete": "Автозаполнение",
"Auto-complete": "Авто-заполнение",
"Error changing language": "Ошибка изменения языка",
"Riot was unable to find the correct Data for the selected Language.": "Riot был неспособен найти правельные данные для выбранного языка.",
"Connectivity to the server has been lost.": "Связь с сервером была потеряна.",
@ -355,16 +355,16 @@
"Friday": "Пятница",
"Saturday": "Суббота",
"Sunday": "Воскресенье",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"%(weekDayName)s %(time)s": "%(weekDayName) %(time)",
"Upload an avatar:": "Загрузите аватар:",
"You need to be logged in.": "Вы должны быть зарегистрированы.",
"You need to be able to invite users to do that.": "Вам необходимо пригласить пользователей чтобы сделать это.",
"You cannot place VoIP calls in this browser.": "Вы не можете сделать вызовы VoIP с этим браузером.",
"You are already in a call.": "Вы уже находитесь в разговоре.",
"You are already in a call.": "Связь уже установлена.",
"You're not in any rooms yet! Press": "Вы еще не находитесь ни в каких комнатах! Нажать",
"You are trying to access %(roomName)s.": "Вы пытаетесь получить доступ %(roomName)s.",
"You cannot place a call with yourself.": "Вы не можете позвонить самим себе.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s анулировал %(targetName)s's преглашение.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s отменил %(targetName)s's приглашение.",
"Sep": "Сен.",
"Jan": "Янв.",
"Feb": "Фев.",
@ -389,9 +389,9 @@
"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 tag direct chat": "отметить прямой чат",
"To use it, just wait for autocomplete results to load and tab through them.": "Для его использования просто подождите загрузки результатов автозаполнения и нажимайте Tab для навигации.",
"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).",
"Unable to restore previous session": "Невозможно востановить предыдущий сеанс",
"Unable to restore previous session": "Невозможно восстановить предыдущий сеанс",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s запрет отменен %(targetName)s.",
"Unable to capture screen": "Невозможно записать снимок экрана",
"Unable to enable Notifications": "Невозможно включить уведомления",
@ -477,7 +477,7 @@
"Access Token:": "Токен:",
"Always show message timestamps": "Всегда показывать время сообщения",
"Authentication": "Авторизация",
"olm version:": "версия olm:",
"olm version:": "Версия olm:",
"%(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",
@ -491,7 +491,7 @@
"Current password": "Текущий пароль",
"Email": "Электронная почта",
"Failed to kick": "Не удалось выгнать",
"Failed to load timeline position": "Не удалось загрузить позицию таймлайна",
"Failed to load timeline position": "Не удалось загрузить позицию графика",
"Failed to mute user": "Не удалось заглушить",
"Failed to reject invite": "Не удалось отклонить приглашение",
"Failed to save settings": "Не удалось сохранить настройки",
@ -540,7 +540,7 @@
"%(senderName)s removed their profile picture.": "%(senderName)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.": "На данный момент сброс пароля сбросит все ключи шифрования на всех устройствах, зашифрованная история общения будет нечитаема, если вы сперва не скачаете ваши ключи от комнаты и не загрузите их после. В будущем это будет улучшено.",
"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": "восстановить",
"Return to app": "Вернуться в приложение",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot не имеет права для отправки вам уведомлений, пожалуйста, проверьте настройки вашего браузера",
@ -657,7 +657,7 @@
"Operation failed": "Действие не удалось",
"powered by Matrix": "управляемый с Matrix",
"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": "Компактное отображение",
"Hide removed messages": "Скрыть удаленное сообщение",
"No Microphones detected": "Микрофоны не обнаружены",
@ -667,19 +667,19 @@
"Desktop specific": "Специфический десктоп",
"Start automatically after system login": "Автостарт после входа в систему",
"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": "Подтвердить отказ передачи аналитических данных",
"Logged in as:": "Зарегестрирован как:",
"Logged in as:": "Зарегистрирован как:",
"Default Device": "Стандартное устройство",
"No Webcams detected": "Веб-камера не обнаружена",
"VoIP": "VoIP",
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Для обеспечения безопасности выход из системы удалит все ключи шифроования из этого браузера. Если вы хотите иметь возможность расшифровать переписку в будущем - вы должны экспортирвать ключи вручную.",
"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": "Нет медиа разрешений",
"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'?",
@ -694,7 +694,7 @@
"disabled": "отключено",
"Disable markdown formatting": "Отключить форматирование Markdown",
"Email address": "Адрес email",
"Email address (optional)": "Адрем email (не обязательно)",
"Email address (optional)": "Адрес email (не обязательно)",
"enabled": "включено",
"Error decrypting attachment": "Ошибка расшифровки файла",
"Export": "Экспорт",
@ -712,7 +712,7 @@
"Password:": "Пароль:",
"Privacy warning": "Предупреждение приватности",
"Privileged Users": "Привилегированные пользователи",
"Revoke Moderator": "Снять модераторские права",
"Revoke Moderator": "Снять права Модератора",
"Refer a friend to Riot:": "Расскажите другу о Riot:",
"Register": "Регистрация",
"Remote addresses for this room:": "Удаленные адреса для этой комнаты:",
@ -724,8 +724,8 @@
"Server may be unavailable or overloaded": "Сервер может быть недоступен или перегружен",
"Server may be unavailable, overloaded, or search timed out :(": "Сервер может быть недоступен, перегружен или поиск прекращен по тайм-ауту :(",
"Server may be unavailable, overloaded, or the file too big": "Сервер может быть недоступен, перегружен или размер файла слишком большой",
"Server may be unavailable, overloaded, or you hit a bug.": "Сервер может быть недоступен, перегружен или вы нашли баг.",
"Server unavailable, overloaded, or something else went wrong.": "Сервер может быть недоступен, перегружен или произошло что-то страшное.",
"Server may be unavailable, overloaded, or you hit a bug.": "Сервер может быть недоступен, перегружен или вы нашли ошибку.",
"Server unavailable, overloaded, or something else went wrong.": "Сервер может быть недоступен, перегружен или что-то пошло не так.",
"Session ID": "ID сессии",
"%(senderName)s set a profile picture.": "%(senderName)s установил картинку профиля.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s установил отображаемое имя %(displayName)s.",
@ -743,7 +743,7 @@
"This room is not accessible by remote Matrix servers": "Это комната закрыта для других серверов Matrix",
"To ban users": "Забанить пользователей",
"to browse the directory": "просматривать директорию",
"To configure the room": "Конфигурировать комнату",
"To configure the room": "Настроить комнату",
"To invite users into the room": "Приглашать пользователей в комнату",
"to join the discussion": "присоединиться к дискуссии",
"To kick users": "Выгонять пользователей",
@ -752,21 +752,21 @@
"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.": "Вы попытались загрузить указанное сообщение в комнате, однако сервер не смог его найти.",
"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": "Разглушить",
"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>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 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 результатов)",
@ -784,7 +784,7 @@
"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.": "Экспортированный файл позволит любому пользователю расшифровать и зашифровать сообщения, которые вы видите, поэтому вы должны быть крайне осторожны и держать файл в надежном месте. Чтобы поспособствовать этому вы должны ввести пароль, который будет использоваться для шифрования ключей. Вы сможете импоортировать ключи только зная этот пароль.",
"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": "Вы должны зайти в комнату для просмотра файлов",
@ -818,7 +818,7 @@
"\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" содержит неизвестные прежде устройства.",
"Unknown Address": "Неизвестный адрес",
"Unblacklist": "Удалить из черного списка",
"Blacklist": "Добавить в черный список",
"Blacklist": "Черный список",
"Unverify": "Убрать верификацию",
"Verify...": "Верифицировать...",
"ex. @bob:example.com": "например @bob:example.com",
@ -853,11 +853,11 @@
"Enable URL previews for this room (affects only you)": "Включить предпросмотр URL в этой комнате (только для вас)",
"Drop file here to upload": "Перетащите файл сюда для загрузки",
" (unsupported)": " (не поддерживается)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Идет конференц-звонок%(supportedText)s. %(joinText)s",
"for %(amount)ss": "для %(amount)s",
"for %(amount)sm": "для %(amount)s",
"for %(amount)sh": "для %(amount)s",
"for %(amount)sd": "для %(amount)s",
"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": "Не в сети",
@ -865,18 +865,16 @@
"$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": "Создать комнату",
"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.": "Ошибка: проблема коммуникаций с указанным Home Server'ом.",
"Error: Problem communicating with the given homeserver.": "Ошибка: проблема связи с указанным сервером.",
"Failed to fetch avatar URL": "Ошибка получения аватара",
"The phone number entered looks invalid": "Введенный номер телефона выглядит неправильным",
"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.": "Ошибка загрузки истории комнаты: запрошенный элемент не найден.",
"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 других файлов",
@ -894,5 +892,66 @@
"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>."
"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) забанил Вас в % (roomName).",
"You have been kicked from %(roomName)s by %(userName)s.": "%(userName) выгнал Вас из %(roomName).",
"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.": "Ваш домашний сервер не поддерживает управление устройствами."
}

View file

@ -78,7 +78,7 @@
"Remove": "ลบ",
"Custom Server Options": "กำหนดเซิร์ฟเวอร์เอง",
"Failed to join the room": "การเข้าร่วมห้องล้มเหลว",
"Drop here %(toAction)s": "ปล่อยที่นี่ %(toAction)s",
"Drop here %(toAction)s": "ปล่อยที่นี่%(toAction)s",
"Favourite": "รายการโปรด",
"Failed to forget room %(errCode)s": "การลืมห้องล้มเหลว %(errCode)s",
"%(targetName)s accepted an invitation.": "%(targetName)s ตอบรับคำเชิญแล้ว",
@ -120,7 +120,7 @@
"Bans user with given id": "ผู้ใช้และ id ที่ถูกแบน",
"Blacklisted": "ขึ้นบัญชีดำ",
"Can't load user settings": "ไม่สามารถโหลดการตั้งค่าผู้ใช้ได้",
"%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s ได้เปลี่ยนชื่อที่แสดงจาก %(oldDisplayName)s ไปเป็น %(displayName)s",
"%(senderName)s changed their 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 ลบชื่อห้อง",
@ -244,7 +244,7 @@
"New passwords don't match": "รหัสผ่านใหม่ไม่ตรงกัน",
"New passwords must match each other.": "รหัสผ่านใหม่ทั้งสองช่องต้องตรงกัน",
"none": "ไม่มี",
"not set": "ไม่ได้ตั้ง",
"not set": "ยังไม่ได้ตั้ง",
"not specified": "ไม่ได้ระบุ",
"(not supported by this browser)": "(เบราว์เซอร์นี้ไม่รองรับ)",
"<not supported>": "<ไม่รองรับ>",
@ -475,8 +475,132 @@
"Custom server": "เซิร์ฟเวอร์ที่กำหนดเอง",
"Home server URL": "URL เซิร์ฟเวอร์บ้าน",
"Identity server URL": "URL เซิร์ฟเวอร์ระบุตัวตน",
"%(severalUsers)sleft %(repeats)s times": "%(targetName)sออกจากห้อง %(repeats)s ครั้ง",
"%(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ออกจากห้องแล้ว"
"%(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 ผลลัพท์)"
}

View file

@ -162,9 +162,9 @@
"de-at": "德语(奥地利)",
"de-ch": "德语(瑞士)",
"de": "德语",
"de-lu": "德语(卢森堡)",
"de-lu": "德语 (卢森堡)",
"el": "希腊语",
"en-au": "英语(澳大利亚)",
"en-au": "英语 (澳大利亚)",
"en": "英语",
"zh-cn": "中文(中国)",
"zh-hk": "中文(香港)",
@ -199,11 +199,158 @@
"Ed25519 fingerprint": "Ed25519指纹",
"Invite new room members": "邀请新的聊天室成员",
"Join Room": "加入聊天室",
"joined": "加入",
"%(targetName)s joined the room.": "%(targetName)s 加入聊天室。.",
"joined": "加入",
"%(targetName)s joined the room.": "%(targetName)s 加入聊天室。",
"Jump to first unread message.": "跳到第一条未读消息。",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.",
"Leave room": "离开聊天室",
"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": "电话"
}

View file

@ -290,7 +290,7 @@
"Would you like to": "你要",
"You are already in a call.": "你已在電話通話中",
"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 VoIP calls in this browser.": "在此瀏覽器下無法置入網路電話通話",
"Sun": "星期日",
@ -353,13 +353,13 @@
"This image cannot be displayed.": "這張圖片無法顯示",
"Error decrypting video": "解密影片出錯",
"Add an Integration": "新增整合器",
"Ongoing conference call%(supportedText)s. %(joinText)s": "%(supportedText)s. %(joinText)s 正在進行電話會議",
"Ongoing conference call%(supportedText)s.": "%(supportedText)s. 正在進行電話會議",
" (unsupported)": " (不支持)",
"URL Previews": "網址預覽",
"Enable URL previews for this room (affects only you)": "啟用此房間的網址預覽(僅影響您)",
"Drop file here to upload": "把文件放在這裡上傳",
"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": "已刪除或未知的信息類型",
"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

@ -23,16 +23,38 @@ import { _t } from '../languageHandler';
const INITIAL_STATE = {
// Whether we're joining the currently viewed room
joining: false,
// Any error occurred during joining
// Any error that has occurred during joining
joinError: null,
// The room ID of the room
// The room ID of the room currently being viewed
roomId: null,
// The event to scroll to when the room is first viewed
initialEventId: null,
// The offset to display the initial event at (see scrollStateMap)
initialEventPixelOffset: null,
// Whether to highlight the initial event
isInitialEventHighlighted: false,
// The room alias of the room (or null if not originally specified in view_room)
roomAlias: null,
// Whether the current room is loading
roomLoading: false,
// Any error that has occurred during loading
roomLoadError: null,
// A map from room id to scroll state.
//
// 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: {},
};
/**
@ -56,8 +78,11 @@ class RoomViewStore extends Store {
__onDispatch(payload) {
switch (payload.action) {
// view_room:
// - room_alias: '#somealias:matrix.org'
// - room_id: '!roomid123:matrix.org'
// - room_alias: '#somealias:matrix.org'
// - room_id: '!roomid123:matrix.org'
// - event_id: '$213456782:matrix.org'
// - event_offset: 100
// - highlighted: true
case 'view_room':
this._viewRoom(payload);
break;
@ -88,20 +113,41 @@ class RoomViewStore extends Store {
case 'on_logged_out':
this.reset();
break;
case 'update_scroll_state':
this._updateScrollState(payload);
break;
}
}
_viewRoom(payload) {
// Always set the room ID if present
if (payload.room_id) {
this._setState({
const newState = {
roomId: payload.room_id,
initialEventId: payload.event_id,
initialEventPixelOffset: undefined,
isInitialEventHighlighted: payload.highlighted,
roomLoading: false,
roomLoadError: null,
});
};
// If an event ID wasn't specified, default to the one saved for this room
// via update_scroll_state. Assume initialEventPixelOffset should be set.
if (!newState.initialEventId) {
const roomScrollState = this._state.scrollStateMap[payload.room_id];
if (roomScrollState) {
newState.initialEventId = roomScrollState.focussedEvent;
newState.initialEventPixelOffset = roomScrollState.pixelOffset;
}
}
this._setState(newState);
} else if (payload.room_alias) {
// Resolve the alias and then do a second dispatch with the room ID acquired
this._setState({
roomId: null,
initialEventId: null,
initialEventPixelOffset: null,
isInitialEventHighlighted: null,
roomAlias: payload.room_alias,
roomLoading: true,
roomLoadError: null,
@ -111,6 +157,8 @@ class RoomViewStore extends Store {
dis.dispatch({
action: 'view_room',
room_id: result.room_id,
event_id: payload.event_id,
highlighted: payload.highlighted,
room_alias: payload.room_alias,
});
}, (err) => {
@ -137,7 +185,9 @@ class RoomViewStore extends Store {
this._setState({
joining: true,
});
MatrixClientPeg.get().joinRoom(this._state.roomId, payload.opts).done(() => {
MatrixClientPeg.get().joinRoom(
this._state.roomAlias || this._state.roomId, payload.opts,
).done(() => {
dis.dispatch({
action: 'joined_room',
});
@ -168,34 +218,63 @@ class RoomViewStore extends Store {
});
}
_updateScrollState(payload) {
// Clobber existing scroll state for the given room ID
const newScrollStateMap = this._state.scrollStateMap;
newScrollStateMap[payload.room_id] = payload.scroll_state;
this._setState({
scrollStateMap: newScrollStateMap,
});
}
reset() {
this._state = Object.assign({}, INITIAL_STATE);
}
// The room ID of the room currently being viewed
getRoomId() {
return this._state.roomId;
}
// The event to scroll to when the room is first viewed
getInitialEventId() {
return this._state.initialEventId;
}
// The offset to display the initial event at (see scrollStateMap)
getInitialEventPixelOffset() {
return this._state.initialEventPixelOffset;
}
// Whether to highlight the initial event
isInitialEventHighlighted() {
return this._state.isInitialEventHighlighted;
}
// The room alias of the room (or null if not originally specified in view_room)
getRoomAlias() {
return this._state.roomAlias;
}
// Whether the current room is loading (true whilst resolving an alias)
isRoomLoading() {
return this._state.roomLoading;
}
// Any error that has occurred during loading
getRoomLoadError() {
return this._state.roomLoadError;
}
// Whether we're joining the currently viewed room
isJoining() {
return this._state.joining;
}
// Any error that has occurred during joining
getJoinError() {
return this._state.joinError;
}
}
let singletonRoomViewStore = null;

View file

@ -28,8 +28,8 @@ describe('RoomViewStore', function() {
});
it('can be used to view a room by ID and join', function(done) {
peg.get().joinRoom = (roomId) => {
expect(roomId).toBe("!randomcharacters:aser.ver");
peg.get().joinRoom = (roomAddress) => {
expect(roomAddress).toBe("!randomcharacters:aser.ver");
done();
};
@ -40,8 +40,8 @@ describe('RoomViewStore', function() {
it('can be used to view a room by alias and join', function(done) {
peg.get().getRoomIdForAlias.returns(q({room_id: "!randomcharacters:aser.ver"}));
peg.get().joinRoom = (roomId) => {
expect(roomId).toBe("!randomcharacters:aser.ver");
peg.get().joinRoom = (roomAddress) => {
expect(roomAddress).toBe("#somealias2:aser.ver");
done();
};