mirror of https://github.com/vector-im/riot-web
Merge branches 'develop' and 't3chguy/m.relates_to' of github.com:matrix-org/matrix-react-sdk into t3chguy/m.relates_to
commit
80fbc757f5
|
@ -147,7 +147,10 @@ class Analytics {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
trackPageChange() {
|
trackPageChange(generationTimeMs) {
|
||||||
|
if (typeof generationTimeMs !== 'number') {
|
||||||
|
throw new Error('Analytics.trackPageChange: expected generationTimeMs to be a number');
|
||||||
|
}
|
||||||
if (this.disabled) return;
|
if (this.disabled) return;
|
||||||
if (this.firstPage) {
|
if (this.firstPage) {
|
||||||
// De-duplicate first page
|
// De-duplicate first page
|
||||||
|
@ -156,6 +159,7 @@ class Analytics {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this._paq.push(['setCustomUrl', getRedactedUrl()]);
|
this._paq.push(['setCustomUrl', getRedactedUrl()]);
|
||||||
|
this._paq.push(['setGenerationTimeMs', generationTimeMs]);
|
||||||
this._paq.push(['trackPageView']);
|
this._paq.push(['trackPageView']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -256,6 +256,10 @@ const Notifier = {
|
||||||
},
|
},
|
||||||
|
|
||||||
onEventDecrypted: function(ev) {
|
onEventDecrypted: function(ev) {
|
||||||
|
// 'decrypted' means the decryption process has finished: it may have failed,
|
||||||
|
// in which case it might decrypt soon if the keys arrive
|
||||||
|
if (ev.isDecryptionFailure()) return;
|
||||||
|
|
||||||
const idx = this.pendingEncryptedEventIds.indexOf(ev.getId());
|
const idx = this.pendingEncryptedEventIds.indexOf(ev.getId());
|
||||||
if (idx === -1) return;
|
if (idx === -1) return;
|
||||||
|
|
||||||
|
|
|
@ -670,6 +670,20 @@ export default React.createClass({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onJoinClick: function() {
|
||||||
|
this.setState({membershipBusy: true});
|
||||||
|
this._matrixClient.joinGroup(this.props.groupId).then(() => {
|
||||||
|
// don't reset membershipBusy here: wait for the membership change to come down the sync
|
||||||
|
}).catch((e) => {
|
||||||
|
this.setState({membershipBusy: false});
|
||||||
|
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||||
|
Modal.createTrackedDialog('Error joining room', '', ErrorDialog, {
|
||||||
|
title: _t("Error"),
|
||||||
|
description: _t("Unable to join community"),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
_onLeaveClick: function() {
|
_onLeaveClick: function() {
|
||||||
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
||||||
Modal.createTrackedDialog('Leave Group', '', QuestionDialog, {
|
Modal.createTrackedDialog('Leave Group', '', QuestionDialog, {
|
||||||
|
@ -686,9 +700,9 @@ export default React.createClass({
|
||||||
}).catch((e) => {
|
}).catch((e) => {
|
||||||
this.setState({membershipBusy: false});
|
this.setState({membershipBusy: false});
|
||||||
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||||
Modal.createTrackedDialog('Error leaving room', '', ErrorDialog, {
|
Modal.createTrackedDialog('Error leaving community', '', ErrorDialog, {
|
||||||
title: _t("Error"),
|
title: _t("Error"),
|
||||||
description: _t("Unable to leave room"),
|
description: _t("Unable to leave community"),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -708,8 +722,14 @@ export default React.createClass({
|
||||||
const header = this.state.editing ? <h2> { _t('Community Settings') } </h2> : <div />;
|
const header = this.state.editing ? <h2> { _t('Community Settings') } </h2> : <div />;
|
||||||
const changeDelayWarning = this.state.editing && this.state.isUserPrivileged ?
|
const changeDelayWarning = this.state.editing && this.state.isUserPrivileged ?
|
||||||
<div className="mx_GroupView_changeDelayWarning">
|
<div className="mx_GroupView_changeDelayWarning">
|
||||||
{ _t( 'Changes made to your community might not be seen by other users ' +
|
{ _t(
|
||||||
'for up to 30 minutes.',
|
'Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> ' +
|
||||||
|
'might not be seen by other users for up to 30 minutes.',
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
'bold1': (sub) => <b> { sub } </b>,
|
||||||
|
'bold2': (sub) => <b> { sub } </b>,
|
||||||
|
},
|
||||||
) }
|
) }
|
||||||
</div> : <div />;
|
</div> : <div />;
|
||||||
return <div className={groupSettingsSectionClasses}>
|
return <div className={groupSettingsSectionClasses}>
|
||||||
|
@ -853,9 +873,8 @@ export default React.createClass({
|
||||||
const BaseAvatar = sdk.getComponent("avatars.BaseAvatar");
|
const BaseAvatar = sdk.getComponent("avatars.BaseAvatar");
|
||||||
|
|
||||||
const group = this._matrixClient.getGroup(this.props.groupId);
|
const group = this._matrixClient.getGroup(this.props.groupId);
|
||||||
if (!group) return null;
|
|
||||||
|
|
||||||
if (group.myMembership === 'invite') {
|
if (group && group.myMembership === 'invite') {
|
||||||
if (this.state.membershipBusy || this.state.inviterProfileBusy) {
|
if (this.state.membershipBusy || this.state.inviterProfileBusy) {
|
||||||
return <div className="mx_GroupView_membershipSection">
|
return <div className="mx_GroupView_membershipSection">
|
||||||
<Spinner />
|
<Spinner />
|
||||||
|
@ -896,33 +915,72 @@ export default React.createClass({
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>;
|
</div>;
|
||||||
} else if (group.myMembership === 'join' && this.state.editing) {
|
}
|
||||||
const leaveButtonTooltip = this.state.isUserPrivileged ?
|
|
||||||
|
let membershipContainerExtraClasses;
|
||||||
|
let membershipButtonExtraClasses;
|
||||||
|
let membershipButtonTooltip;
|
||||||
|
let membershipButtonText;
|
||||||
|
let membershipButtonOnClick;
|
||||||
|
|
||||||
|
// User is not in the group
|
||||||
|
if ((!group || group.myMembership === 'leave') &&
|
||||||
|
this.state.summary &&
|
||||||
|
this.state.summary.profile &&
|
||||||
|
Boolean(this.state.summary.profile.is_joinable)
|
||||||
|
) {
|
||||||
|
membershipButtonText = _t("Join this community");
|
||||||
|
membershipButtonOnClick = this._onJoinClick;
|
||||||
|
|
||||||
|
membershipButtonExtraClasses = 'mx_GroupView_joinButton';
|
||||||
|
membershipContainerExtraClasses = 'mx_GroupView_membershipSection_leave';
|
||||||
|
} else if (
|
||||||
|
group &&
|
||||||
|
group.myMembership === 'join' &&
|
||||||
|
this.state.editing
|
||||||
|
) {
|
||||||
|
membershipButtonText = _t("Leave this community");
|
||||||
|
membershipButtonOnClick = this._onLeaveClick;
|
||||||
|
membershipButtonTooltip = this.state.isUserPrivileged ?
|
||||||
_t("You are an administrator of this community") :
|
_t("You are an administrator of this community") :
|
||||||
_t("You are a member of this community");
|
_t("You are a member of this community");
|
||||||
const leaveButtonClasses = classnames({
|
|
||||||
"mx_RoomHeader_textButton": true,
|
membershipButtonExtraClasses = {
|
||||||
"mx_GroupView_textButton": true,
|
'mx_GroupView_leaveButton': true,
|
||||||
"mx_GroupView_leaveButton": true,
|
'mx_RoomHeader_textButton_danger': this.state.isUserPrivileged,
|
||||||
"mx_RoomHeader_textButton_danger": this.state.isUserPrivileged,
|
};
|
||||||
});
|
membershipContainerExtraClasses = 'mx_GroupView_membershipSection_joined';
|
||||||
return <div className="mx_GroupView_membershipSection mx_GroupView_membershipSection_joined">
|
} else {
|
||||||
<div className="mx_GroupView_membershipSubSection">
|
return null;
|
||||||
{ /* Empty div for flex alignment */ }
|
|
||||||
<div />
|
|
||||||
<div className="mx_GroupView_membership_buttonContainer">
|
|
||||||
<AccessibleButton
|
|
||||||
className={leaveButtonClasses}
|
|
||||||
onClick={this._onLeaveClick}
|
|
||||||
title={leaveButtonTooltip}
|
|
||||||
>
|
|
||||||
{ _t("Leave") }
|
|
||||||
</AccessibleButton>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>;
|
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
|
const membershipButtonClasses = classnames([
|
||||||
|
'mx_RoomHeader_textButton',
|
||||||
|
'mx_GroupView_textButton',
|
||||||
|
],
|
||||||
|
membershipButtonExtraClasses,
|
||||||
|
);
|
||||||
|
|
||||||
|
const membershipContainerClasses = classnames(
|
||||||
|
'mx_GroupView_membershipSection',
|
||||||
|
membershipContainerExtraClasses,
|
||||||
|
);
|
||||||
|
|
||||||
|
return <div className={membershipContainerClasses}>
|
||||||
|
<div className="mx_GroupView_membershipSubSection">
|
||||||
|
{ /* Empty div for flex alignment */ }
|
||||||
|
<div />
|
||||||
|
<div className="mx_GroupView_membership_buttonContainer">
|
||||||
|
<AccessibleButton
|
||||||
|
className={membershipButtonClasses}
|
||||||
|
onClick={membershipButtonOnClick}
|
||||||
|
title={membershipButtonTooltip}
|
||||||
|
>
|
||||||
|
{ membershipButtonText }
|
||||||
|
</AccessibleButton>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getLongDescriptionNode: function() {
|
_getLongDescriptionNode: function() {
|
||||||
|
|
|
@ -291,6 +291,8 @@ export default React.createClass({
|
||||||
this.handleResize();
|
this.handleResize();
|
||||||
window.addEventListener('resize', this.handleResize);
|
window.addEventListener('resize', this.handleResize);
|
||||||
|
|
||||||
|
this._pageChanging = false;
|
||||||
|
|
||||||
// check we have the right tint applied for this theme.
|
// check we have the right tint applied for this theme.
|
||||||
// N.B. we don't call the whole of setTheme() here as we may be
|
// N.B. we don't call the whole of setTheme() here as we may be
|
||||||
// racing with the theme CSS download finishing from index.js
|
// racing with the theme CSS download finishing from index.js
|
||||||
|
@ -368,13 +370,58 @@ export default React.createClass({
|
||||||
window.removeEventListener('resize', this.handleResize);
|
window.removeEventListener('resize', this.handleResize);
|
||||||
},
|
},
|
||||||
|
|
||||||
componentDidUpdate: function() {
|
componentWillUpdate: function(props, state) {
|
||||||
|
if (this.shouldTrackPageChange(this.state, state)) {
|
||||||
|
this.startPageChangeTimer();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
componentDidUpdate: function(prevProps, prevState) {
|
||||||
|
if (this.shouldTrackPageChange(prevState, this.state)) {
|
||||||
|
const durationMs = this.stopPageChangeTimer();
|
||||||
|
Analytics.trackPageChange(durationMs);
|
||||||
|
}
|
||||||
if (this.focusComposer) {
|
if (this.focusComposer) {
|
||||||
dis.dispatch({action: 'focus_composer'});
|
dis.dispatch({action: 'focus_composer'});
|
||||||
this.focusComposer = false;
|
this.focusComposer = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
startPageChangeTimer() {
|
||||||
|
// This shouldn't happen because componentWillUpdate and componentDidUpdate
|
||||||
|
// are used.
|
||||||
|
if (this._pageChanging) {
|
||||||
|
console.warn('MatrixChat.startPageChangeTimer: timer already started');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._pageChanging = true;
|
||||||
|
performance.mark('riot_MatrixChat_page_change_start');
|
||||||
|
},
|
||||||
|
|
||||||
|
stopPageChangeTimer() {
|
||||||
|
if (!this._pageChanging) {
|
||||||
|
console.warn('MatrixChat.stopPageChangeTimer: timer not started');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._pageChanging = false;
|
||||||
|
performance.mark('riot_MatrixChat_page_change_stop');
|
||||||
|
performance.measure(
|
||||||
|
'riot_MatrixChat_page_change_delta',
|
||||||
|
'riot_MatrixChat_page_change_start',
|
||||||
|
'riot_MatrixChat_page_change_stop',
|
||||||
|
);
|
||||||
|
performance.clearMarks('riot_MatrixChat_page_change_start');
|
||||||
|
performance.clearMarks('riot_MatrixChat_page_change_stop');
|
||||||
|
const measurement = performance.getEntriesByName('riot_MatrixChat_page_change_delta').pop();
|
||||||
|
return measurement.duration;
|
||||||
|
},
|
||||||
|
|
||||||
|
shouldTrackPageChange(prevState, state) {
|
||||||
|
return prevState.currentRoomId !== state.currentRoomId ||
|
||||||
|
prevState.view !== state.view ||
|
||||||
|
prevState.page_type !== state.page_type;
|
||||||
|
},
|
||||||
|
|
||||||
setStateForNewView: function(state) {
|
setStateForNewView: function(state) {
|
||||||
if (state.view === undefined) {
|
if (state.view === undefined) {
|
||||||
throw new Error("setStateForNewView with no view!");
|
throw new Error("setStateForNewView with no view!");
|
||||||
|
@ -1341,7 +1388,6 @@ export default React.createClass({
|
||||||
if (this.props.onNewScreen) {
|
if (this.props.onNewScreen) {
|
||||||
this.props.onNewScreen(screen);
|
this.props.onNewScreen(screen);
|
||||||
}
|
}
|
||||||
Analytics.trackPageChange();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
onAliasClick: function(event, alias) {
|
onAliasClick: function(event, alias) {
|
||||||
|
|
|
@ -38,10 +38,6 @@
|
||||||
"The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload",
|
"The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload",
|
||||||
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads",
|
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads",
|
||||||
"Upload Failed": "Upload Failed",
|
"Upload Failed": "Upload Failed",
|
||||||
"Failure to create room": "Failure to create room",
|
|
||||||
"Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
|
|
||||||
"Send anyway": "Send anyway",
|
|
||||||
"Send": "Send",
|
|
||||||
"Sun": "Sun",
|
"Sun": "Sun",
|
||||||
"Mon": "Mon",
|
"Mon": "Mon",
|
||||||
"Tue": "Tue",
|
"Tue": "Tue",
|
||||||
|
@ -81,7 +77,6 @@
|
||||||
"Failed to invite users to community": "Failed to invite users to community",
|
"Failed to invite users to community": "Failed to invite users to community",
|
||||||
"Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s",
|
"Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s",
|
||||||
"Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:",
|
"Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:",
|
||||||
"Unnamed Room": "Unnamed Room",
|
|
||||||
"Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings",
|
"Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings",
|
||||||
"Riot was not given permission to send notifications - please try again": "Riot was not given permission to send notifications - please try again",
|
"Riot was not given permission to send notifications - please try again": "Riot was not given permission to send notifications - please try again",
|
||||||
"Unable to enable Notifications": "Unable to enable Notifications",
|
"Unable to enable Notifications": "Unable to enable Notifications",
|
||||||
|
@ -179,6 +174,11 @@
|
||||||
"%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing",
|
"%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing",
|
||||||
"%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing",
|
"%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing",
|
||||||
"%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing",
|
"%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing",
|
||||||
|
"Failure to create room": "Failure to create room",
|
||||||
|
"Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
|
||||||
|
"Send anyway": "Send anyway",
|
||||||
|
"Send": "Send",
|
||||||
|
"Unnamed Room": "Unnamed Room",
|
||||||
"Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions",
|
"Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions",
|
||||||
"Not a valid Riot keyfile": "Not a valid Riot keyfile",
|
"Not a valid Riot keyfile": "Not a valid Riot keyfile",
|
||||||
"Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?",
|
"Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?",
|
||||||
|
@ -186,7 +186,6 @@
|
||||||
"Message Replies": "Message Replies",
|
"Message Replies": "Message Replies",
|
||||||
"Message Pinning": "Message Pinning",
|
"Message Pinning": "Message Pinning",
|
||||||
"Presence Management": "Presence Management",
|
"Presence Management": "Presence Management",
|
||||||
"Tag Panel": "Tag Panel",
|
|
||||||
"Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing",
|
"Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing",
|
||||||
"Use compact timeline layout": "Use compact timeline layout",
|
"Use compact timeline layout": "Use compact timeline layout",
|
||||||
"Hide removed messages": "Hide removed messages",
|
"Hide removed messages": "Hide removed messages",
|
||||||
|
@ -253,29 +252,6 @@
|
||||||
"Failed to set display name": "Failed to set display name",
|
"Failed to set display name": "Failed to set display name",
|
||||||
"Disable Notifications": "Disable Notifications",
|
"Disable Notifications": "Disable Notifications",
|
||||||
"Enable Notifications": "Enable Notifications",
|
"Enable Notifications": "Enable Notifications",
|
||||||
"Invalid alias format": "Invalid alias format",
|
|
||||||
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias",
|
|
||||||
"Invalid address format": "Invalid address format",
|
|
||||||
"'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address",
|
|
||||||
"not specified": "not specified",
|
|
||||||
"not set": "not set",
|
|
||||||
"Remote addresses for this room:": "Remote addresses for this room:",
|
|
||||||
"Addresses": "Addresses",
|
|
||||||
"The main address for this room is": "The main address for this room is",
|
|
||||||
"Local addresses for this room:": "Local addresses for this room:",
|
|
||||||
"This room has no local addresses": "This room has no local addresses",
|
|
||||||
"New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)",
|
|
||||||
"Invalid community ID": "Invalid community ID",
|
|
||||||
"'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID",
|
|
||||||
"Flair": "Flair",
|
|
||||||
"Showing flair for these communities:": "Showing flair for these communities:",
|
|
||||||
"This room is not showing flair for any communities": "This room is not showing flair for any communities",
|
|
||||||
"New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)",
|
|
||||||
"You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.",
|
|
||||||
"You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.",
|
|
||||||
"URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.",
|
|
||||||
"URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.",
|
|
||||||
"URL Previews": "URL Previews",
|
|
||||||
"Cannot add any more widgets": "Cannot add any more widgets",
|
"Cannot add any more widgets": "Cannot add any more widgets",
|
||||||
"The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.",
|
"The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.",
|
||||||
"Add a widget": "Add a widget",
|
"Add a widget": "Add a widget",
|
||||||
|
@ -373,11 +349,11 @@
|
||||||
"numbullet": "numbullet",
|
"numbullet": "numbullet",
|
||||||
"Markdown is disabled": "Markdown is disabled",
|
"Markdown is disabled": "Markdown is disabled",
|
||||||
"Markdown is enabled": "Markdown is enabled",
|
"Markdown is enabled": "Markdown is enabled",
|
||||||
|
"Unpin Message": "Unpin Message",
|
||||||
|
"Jump to message": "Jump to message",
|
||||||
"No pinned messages.": "No pinned messages.",
|
"No pinned messages.": "No pinned messages.",
|
||||||
"Loading...": "Loading...",
|
"Loading...": "Loading...",
|
||||||
"Pinned Messages": "Pinned Messages",
|
"Pinned Messages": "Pinned Messages",
|
||||||
"Unpin Message": "Unpin Message",
|
|
||||||
"Jump to message": "Jump to message",
|
|
||||||
"%(duration)ss": "%(duration)ss",
|
"%(duration)ss": "%(duration)ss",
|
||||||
"%(duration)sm": "%(duration)sm",
|
"%(duration)sm": "%(duration)sm",
|
||||||
"%(duration)sh": "%(duration)sh",
|
"%(duration)sh": "%(duration)sh",
|
||||||
|
@ -500,6 +476,29 @@
|
||||||
"Scroll to unread messages": "Scroll to unread messages",
|
"Scroll to unread messages": "Scroll to unread messages",
|
||||||
"Jump to first unread message.": "Jump to first unread message.",
|
"Jump to first unread message.": "Jump to first unread message.",
|
||||||
"Close": "Close",
|
"Close": "Close",
|
||||||
|
"Invalid alias format": "Invalid alias format",
|
||||||
|
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias",
|
||||||
|
"Invalid address format": "Invalid address format",
|
||||||
|
"'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address",
|
||||||
|
"not specified": "not specified",
|
||||||
|
"not set": "not set",
|
||||||
|
"Remote addresses for this room:": "Remote addresses for this room:",
|
||||||
|
"Addresses": "Addresses",
|
||||||
|
"The main address for this room is": "The main address for this room is",
|
||||||
|
"Local addresses for this room:": "Local addresses for this room:",
|
||||||
|
"This room has no local addresses": "This room has no local addresses",
|
||||||
|
"New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)",
|
||||||
|
"Invalid community ID": "Invalid community ID",
|
||||||
|
"'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID",
|
||||||
|
"Flair": "Flair",
|
||||||
|
"Showing flair for these communities:": "Showing flair for these communities:",
|
||||||
|
"This room is not showing flair for any communities": "This room is not showing flair for any communities",
|
||||||
|
"New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)",
|
||||||
|
"You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.",
|
||||||
|
"You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.",
|
||||||
|
"URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.",
|
||||||
|
"URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.",
|
||||||
|
"URL Previews": "URL Previews",
|
||||||
"Error decrypting audio": "Error decrypting audio",
|
"Error decrypting audio": "Error decrypting audio",
|
||||||
"Error decrypting attachment": "Error decrypting attachment",
|
"Error decrypting attachment": "Error decrypting attachment",
|
||||||
"Decrypt %(text)s": "Decrypt %(text)s",
|
"Decrypt %(text)s": "Decrypt %(text)s",
|
||||||
|
@ -766,19 +765,22 @@
|
||||||
"Failed to update community": "Failed to update community",
|
"Failed to update community": "Failed to update community",
|
||||||
"Unable to accept invite": "Unable to accept invite",
|
"Unable to accept invite": "Unable to accept invite",
|
||||||
"Unable to reject invite": "Unable to reject invite",
|
"Unable to reject invite": "Unable to reject invite",
|
||||||
|
"Unable to join community": "Unable to join community",
|
||||||
"Leave Community": "Leave Community",
|
"Leave Community": "Leave Community",
|
||||||
"Leave %(groupName)s?": "Leave %(groupName)s?",
|
"Leave %(groupName)s?": "Leave %(groupName)s?",
|
||||||
"Leave": "Leave",
|
"Leave": "Leave",
|
||||||
"Unable to leave room": "Unable to leave room",
|
"Unable to leave community": "Unable to leave community",
|
||||||
"Community Settings": "Community Settings",
|
"Community Settings": "Community Settings",
|
||||||
"Changes made to your community might not be seen by other users for up to 30 minutes.": "Changes made to your community might not be seen by other users for up to 30 minutes.",
|
"Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.",
|
||||||
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.",
|
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.",
|
||||||
"Add rooms to this community": "Add rooms to this community",
|
"Add rooms to this community": "Add rooms to this community",
|
||||||
"Featured Rooms:": "Featured Rooms:",
|
"Featured Rooms:": "Featured Rooms:",
|
||||||
"Featured Users:": "Featured Users:",
|
"Featured Users:": "Featured Users:",
|
||||||
"%(inviter)s has invited you to join this community": "%(inviter)s has invited you to join this community",
|
"%(inviter)s has invited you to join this community": "%(inviter)s has invited you to join this community",
|
||||||
|
"Join this community": "Join this community",
|
||||||
"You are an administrator of this community": "You are an administrator of this community",
|
"You are an administrator of this community": "You are an administrator of this community",
|
||||||
"You are a member of this community": "You are a member of this community",
|
"You are a member of this community": "You are a member of this community",
|
||||||
|
"Leave this community": "Leave this community",
|
||||||
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!",
|
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!",
|
||||||
"Long Description (HTML)": "Long Description (HTML)",
|
"Long Description (HTML)": "Long Description (HTML)",
|
||||||
"Description": "Description",
|
"Description": "Description",
|
||||||
|
|
Loading…
Reference in New Issue