Merge branch 'develop' into luke/groups-are-communities
This commit is contained in:
commit
a40704f085
17 changed files with 1499 additions and 962 deletions
|
@ -101,7 +101,9 @@
|
|||
"eslint-plugin-babel": "^4.0.1",
|
||||
"eslint-plugin-flowtype": "^2.30.0",
|
||||
"eslint-plugin-react": "^7.4.0",
|
||||
"estree-walker": "^0.5.0",
|
||||
"expect": "^1.16.0",
|
||||
"flow-parser": "^0.57.3",
|
||||
"json-loader": "^0.5.3",
|
||||
"karma": "^1.7.0",
|
||||
"karma-chrome-launcher": "^0.2.3",
|
||||
|
@ -121,6 +123,7 @@
|
|||
"rimraf": "^2.4.3",
|
||||
"sinon": "^1.17.3",
|
||||
"source-map-loader": "^0.1.5",
|
||||
"walk": "^2.3.9",
|
||||
"webpack": "^1.12.14"
|
||||
}
|
||||
}
|
||||
|
|
153
scripts/gen-i18n.js
Normal file
153
scripts/gen-i18n.js
Normal file
|
@ -0,0 +1,153 @@
|
|||
/*
|
||||
Copyright 2017 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Regenerates the translations en_EN file by walking the source tree and
|
||||
* parsing each file with flow-parser. Emits a JSON file with the
|
||||
* translatable strings mapped to themselves in the order they appeared
|
||||
* in the files and grouped by the file they appeared in.
|
||||
*
|
||||
* Usage: node scripts/gen-i18n.js
|
||||
*/
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const walk = require('walk');
|
||||
|
||||
const flowParser = require('flow-parser');
|
||||
const estreeWalker = require('estree-walker');
|
||||
|
||||
const TRANSLATIONS_FUNCS = ['_t', '_td', '_tJsx'];
|
||||
|
||||
const INPUT_TRANSLATIONS_FILE = 'src/i18n/strings/en_EN.json';
|
||||
|
||||
const FLOW_PARSER_OPTS = {
|
||||
esproposal_class_instance_fields: true,
|
||||
esproposal_class_static_fields: true,
|
||||
esproposal_decorators: true,
|
||||
esproposal_export_star_as: true,
|
||||
types: true,
|
||||
};
|
||||
|
||||
function getObjectValue(obj, key) {
|
||||
for (const prop of obj.properties) {
|
||||
if (prop.key.type == 'Identifier' && prop.key.name == key) {
|
||||
return prop.value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function getTKey(arg) {
|
||||
if (arg.type == 'Literal') {
|
||||
return arg.value;
|
||||
} else if (arg.type == 'BinaryExpression' && arg.operator == '+') {
|
||||
return getTKey(arg.left) + getTKey(arg.right);
|
||||
} else if (arg.type == 'TemplateLiteral') {
|
||||
return arg.quasis.map((q) => {
|
||||
return q.value.raw;
|
||||
}).join('');
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function getTranslations(file) {
|
||||
const tree = flowParser.parse(fs.readFileSync(file, { encoding: 'utf8' }), FLOW_PARSER_OPTS);
|
||||
|
||||
const trs = new Set();
|
||||
|
||||
estreeWalker.walk(tree, {
|
||||
enter: function(node, parent) {
|
||||
if (
|
||||
node.type == 'CallExpression' &&
|
||||
TRANSLATIONS_FUNCS.includes(node.callee.name)
|
||||
) {
|
||||
const tKey = getTKey(node.arguments[0]);
|
||||
// This happens whenever we call _t with non-literals (ie. whenever we've
|
||||
// had to use a _td to compensate) so is expected.
|
||||
if (tKey === null) return;
|
||||
|
||||
let isPlural = false;
|
||||
if (node.arguments.length > 1 && node.arguments[1].type == 'ObjectExpression') {
|
||||
const countVal = getObjectValue(node.arguments[1], 'count');
|
||||
if (countVal) {
|
||||
isPlural = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (isPlural) {
|
||||
trs.add(tKey + "|other");
|
||||
const plurals = enPlurals[tKey];
|
||||
if (plurals) {
|
||||
for (const pluralType of Object.keys(plurals)) {
|
||||
trs.add(tKey + "|" + pluralType);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
trs.add(tKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return trs;
|
||||
}
|
||||
|
||||
// gather en_EN plural strings from the input translations file:
|
||||
// the en_EN strings are all in the source with the exception of
|
||||
// pluralised strings, which we need to pull in from elsewhere.
|
||||
const inputTranslationsRaw = JSON.parse(fs.readFileSync(INPUT_TRANSLATIONS_FILE, { encoding: 'utf8' }));
|
||||
const enPlurals = {};
|
||||
|
||||
for (const key of Object.keys(inputTranslationsRaw)) {
|
||||
const parts = key.split("|");
|
||||
if (parts.length > 1) {
|
||||
const plurals = enPlurals[parts[0]] || {};
|
||||
plurals[parts[1]] = inputTranslationsRaw[key];
|
||||
enPlurals[parts[0]] = plurals;
|
||||
}
|
||||
}
|
||||
|
||||
const translatables = new Set();
|
||||
|
||||
walk.walkSync("src", {
|
||||
listeners: {
|
||||
file: function(root, fileStats, next) {
|
||||
if (!fileStats.name.endsWith('.js')) return;
|
||||
|
||||
const fullPath = path.join(root, fileStats.name);
|
||||
const trs = getTranslations(fullPath);
|
||||
console.log(`${fullPath} (${trs.size} strings)`);
|
||||
for (const tr of trs.values()) {
|
||||
translatables.add(tr);
|
||||
}
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
const trObj = {};
|
||||
for (const tr of translatables) {
|
||||
trObj[tr] = tr;
|
||||
if (tr.includes("|")) {
|
||||
trObj[tr] = inputTranslationsRaw[tr];
|
||||
}
|
||||
}
|
||||
|
||||
fs.writeFileSync(
|
||||
"src/i18n/strings/en_EN.json",
|
||||
JSON.stringify(trObj, translatables.values(), 4) + "\n"
|
||||
);
|
||||
|
|
@ -94,13 +94,30 @@ function _onGroupInviteFinished(groupId, addrs) {
|
|||
}
|
||||
|
||||
function _onGroupAddRoomFinished(groupId, addrs) {
|
||||
const groupStore = GroupStoreCache.getGroupStore(MatrixClientPeg.get(), groupId);
|
||||
const matrixClient = MatrixClientPeg.get();
|
||||
const groupStore = GroupStoreCache.getGroupStore(matrixClient, groupId);
|
||||
const errorList = [];
|
||||
return Promise.all(addrs.map((addr) => {
|
||||
return groupStore
|
||||
.addRoomToGroup(addr.address)
|
||||
.catch(() => { errorList.push(addr.address); })
|
||||
.reflect();
|
||||
.then(() => {
|
||||
const roomId = addr.address;
|
||||
const room = matrixClient.getRoom(roomId);
|
||||
// Can the user change related groups?
|
||||
if (!room || !room.currentState.mayClientSendStateEvent("m.room.related_groups", matrixClient)) {
|
||||
return;
|
||||
}
|
||||
// Get the related groups
|
||||
const relatedGroupsEvent = room.currentState.getStateEvents('m.room.related_groups', '');
|
||||
const groups = relatedGroupsEvent ? relatedGroupsEvent.getContent().groups || [] : [];
|
||||
|
||||
// Add this group as related
|
||||
if (!groups.includes(groupId)) {
|
||||
groups.push(groupId);
|
||||
return MatrixClientPeg.get().sendStateEvent(roomId, 'm.room.related_groups', {groups}, '');
|
||||
}
|
||||
}).reflect();
|
||||
})).then(() => {
|
||||
if (errorList.length === 0) {
|
||||
return;
|
||||
|
|
|
@ -448,8 +448,18 @@ export default React.createClass({
|
|||
_initGroupStore: function(groupId) {
|
||||
this._groupStore = GroupStoreCache.getGroupStore(MatrixClientPeg.get(), groupId);
|
||||
this._groupStore.on('update', () => {
|
||||
const summary = this._groupStore.getSummary();
|
||||
if (summary.profile) {
|
||||
// Default profile fields should be "" for later sending to the server (which
|
||||
// requires that the fields are strings, not null)
|
||||
["avatar_url", "long_description", "name", "short_description"].forEach((k) => {
|
||||
summary.profile[k] = summary.profile[k] || "";
|
||||
});
|
||||
}
|
||||
this.setState({
|
||||
summary: this._groupStore.getSummary(),
|
||||
summary,
|
||||
isGroupPublicised: this._groupStore.getGroupPublicity(),
|
||||
isUserPrivileged: this._groupStore.isUserPrivileged(),
|
||||
error: null,
|
||||
});
|
||||
});
|
||||
|
@ -598,22 +608,15 @@ export default React.createClass({
|
|||
});
|
||||
},
|
||||
|
||||
_onPubliciseOffClick: function() {
|
||||
this._setPublicity(false);
|
||||
},
|
||||
|
||||
_onPubliciseOnClick: function() {
|
||||
this._setPublicity(true);
|
||||
},
|
||||
|
||||
_onAddRoomsClick: function() {
|
||||
showGroupAddRoomDialog(this.props.groupId);
|
||||
},
|
||||
|
||||
_setPublicity: function(publicity) {
|
||||
_onPublicityToggle: function() {
|
||||
this.setState({
|
||||
publicityBusy: true,
|
||||
});
|
||||
const publicity = !this.state.isGroupPublicised;
|
||||
this._groupStore.setGroupPublicity(publicity).then(() => {
|
||||
this.setState({
|
||||
publicityBusy: false,
|
||||
|
@ -737,100 +740,113 @@ export default React.createClass({
|
|||
<Spinner />
|
||||
</div>;
|
||||
}
|
||||
|
||||
return <div className="mx_GroupView_membershipSection mx_GroupView_membershipSection_invited">
|
||||
<div className="mx_GroupView_membershipSection_description">
|
||||
{ _t("%(inviter)s has invited you to join this community", {inviter: group.inviter.userId}) }
|
||||
</div>
|
||||
<div className="mx_GroupView_membership_buttonContainer">
|
||||
<AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
|
||||
onClick={this._onAcceptInviteClick}
|
||||
>
|
||||
{ _t("Accept") }
|
||||
</AccessibleButton>
|
||||
<AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
|
||||
onClick={this._onRejectInviteClick}
|
||||
>
|
||||
{ _t("Decline") }
|
||||
</AccessibleButton>
|
||||
</div>
|
||||
</div>;
|
||||
} else if (group.myMembership === 'join') {
|
||||
let youAreAMemberText = _t("You are a member of this community");
|
||||
if (this.state.summary.user && this.state.summary.user.is_privileged) {
|
||||
youAreAMemberText = _t("You are an administrator of this community");
|
||||
}
|
||||
|
||||
let publicisedButton;
|
||||
if (this.state.publicityBusy) {
|
||||
publicisedButton = <Spinner />;
|
||||
}
|
||||
|
||||
let publicisedSection;
|
||||
if (this.state.summary.user && this.state.summary.user.is_publicised) {
|
||||
if (!this.state.publicityBusy) {
|
||||
publicisedButton = <AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
|
||||
onClick={this._onPubliciseOffClick}
|
||||
>
|
||||
{ _t("Unpublish") }
|
||||
</AccessibleButton>;
|
||||
}
|
||||
publicisedSection = <div className="mx_GroupView_membershipSubSection">
|
||||
{ _t("This community is published on your profile") }
|
||||
<div className="mx_GroupView_membership_buttonContainer">
|
||||
{ publicisedButton }
|
||||
</div>
|
||||
</div>;
|
||||
} else {
|
||||
if (!this.state.publicityBusy) {
|
||||
publicisedButton = <AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
|
||||
onClick={this._onPubliciseOnClick}
|
||||
>
|
||||
{ _t("Publish") }
|
||||
</AccessibleButton>;
|
||||
}
|
||||
publicisedSection = <div className="mx_GroupView_membershipSubSection">
|
||||
{ _t("This community is not published on your profile") }
|
||||
<div className="mx_GroupView_membership_buttonContainer">
|
||||
{ publicisedButton }
|
||||
</div>
|
||||
</div>;
|
||||
}
|
||||
|
||||
return <div className="mx_GroupView_membershipSection mx_GroupView_membershipSection_joined">
|
||||
<div className="mx_GroupView_membershipSubSection">
|
||||
<div className="mx_GroupView_membershipSection_description">
|
||||
{ youAreAMemberText }
|
||||
{ _t("%(inviter)s has invited you to join this group", {inviter: group.inviter.userId}) }
|
||||
</div>
|
||||
<div className="mx_GroupView_membership_buttonContainer">
|
||||
<AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
|
||||
onClick={this._onAcceptInviteClick}
|
||||
>
|
||||
{ _t("Accept") }
|
||||
</AccessibleButton>
|
||||
<AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
|
||||
onClick={this._onRejectInviteClick}
|
||||
>
|
||||
{ _t("Decline") }
|
||||
</AccessibleButton>
|
||||
</div>
|
||||
</div>
|
||||
</div>;
|
||||
} else if (group.myMembership === 'join' && this.state.editing) {
|
||||
const leaveButtonTooltip = this.state.isUserPrivileged ?
|
||||
_t("You are a member of this group") :
|
||||
_t("You are an administrator of this group");
|
||||
const leaveButtonClasses = classnames({
|
||||
"mx_RoomHeader_textButton": true,
|
||||
"mx_GroupView_textButton": true,
|
||||
"mx_GroupView_leaveButton": true,
|
||||
"mx_RoomHeader_textButton_danger": this.state.isUserPrivileged,
|
||||
});
|
||||
return <div className="mx_GroupView_membershipSection mx_GroupView_membershipSection_joined">
|
||||
<div className="mx_GroupView_membershipSubSection">
|
||||
{ /* 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>
|
||||
{ publicisedSection }
|
||||
</div>;
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
|
||||
_getMemberSettingsSection: function() {
|
||||
return <div className="mx_GroupView_memberSettings">
|
||||
<h3> { _t("Community Member Settings") } </h3>
|
||||
<div className="mx_GroupView_memberSettings_toggle">
|
||||
<input type="checkbox"
|
||||
onClick={this._onPublicityToggle}
|
||||
checked={this.state.isGroupPublicised}
|
||||
tabIndex="3"
|
||||
id="isGroupPublicised"
|
||||
/>
|
||||
<label htmlFor="isGroupPublicised"
|
||||
onClick={this._onPublicityToggle}
|
||||
>
|
||||
{ _t("Publish this community on your profile") }
|
||||
</label>
|
||||
</div>
|
||||
</div>;
|
||||
},
|
||||
|
||||
_getLongDescriptionNode: function() {
|
||||
const summary = this.state.summary;
|
||||
let description = null;
|
||||
if (summary.profile && summary.profile.long_description) {
|
||||
description = sanitizedHtmlNode(summary.profile.long_description);
|
||||
}
|
||||
return this.state.editing && this.state.isUserPrivileged ?
|
||||
<div className="mx_GroupView_groupDesc">
|
||||
<h3> { _t("Long Description (HTML)") } </h3>
|
||||
<textarea
|
||||
value={this.state.profileForm.long_description}
|
||||
onChange={this._onLongDescChange}
|
||||
tabIndex="4"
|
||||
key="editLongDesc"
|
||||
/>
|
||||
</div> :
|
||||
<div className="mx_GroupView_groupDesc">
|
||||
{ description }
|
||||
</div>;
|
||||
},
|
||||
|
||||
render: function() {
|
||||
const GroupAvatar = sdk.getComponent("avatars.GroupAvatar");
|
||||
const Loader = sdk.getComponent("elements.Spinner");
|
||||
const Spinner = sdk.getComponent("elements.Spinner");
|
||||
const TintableSvg = sdk.getComponent("elements.TintableSvg");
|
||||
|
||||
if (this.state.summary === null && this.state.error === null || this.state.saving) {
|
||||
return <Loader />;
|
||||
return <Spinner />;
|
||||
} else if (this.state.summary) {
|
||||
const summary = this.state.summary;
|
||||
|
||||
let avatarNode;
|
||||
let nameNode;
|
||||
let shortDescNode;
|
||||
let bodyNodes = [];
|
||||
const bodyNodes = [
|
||||
this._getMembershipSection(),
|
||||
this.state.editing ? this._getMemberSettingsSection() : null,
|
||||
this._getLongDescriptionNode(),
|
||||
this._getRoomsNode(),
|
||||
];
|
||||
const rightButtons = [];
|
||||
const headerClasses = {
|
||||
mx_GroupView_header: true,
|
||||
|
@ -838,7 +854,7 @@ export default React.createClass({
|
|||
if (this.state.editing) {
|
||||
let avatarImage;
|
||||
if (this.state.uploadingAvatar) {
|
||||
avatarImage = <Loader />;
|
||||
avatarImage = <Spinner />;
|
||||
} else {
|
||||
const GroupAvatar = sdk.getComponent('avatars.GroupAvatar');
|
||||
avatarImage = <GroupAvatar groupId={this.props.groupId}
|
||||
|
@ -887,15 +903,6 @@ export default React.createClass({
|
|||
width="18" height="18" alt={_t("Cancel")} />
|
||||
</AccessibleButton>,
|
||||
);
|
||||
bodyNodes = [
|
||||
<textarea className="mx_GroupView_editLongDesc"
|
||||
value={this.state.profileForm.long_description}
|
||||
onChange={this._onLongDescChange}
|
||||
tabIndex="3"
|
||||
key="editLongDesc"
|
||||
/>,
|
||||
this._getRoomsNode(),
|
||||
];
|
||||
} else {
|
||||
const groupAvatarUrl = summary.profile ? summary.profile.avatar_url : null;
|
||||
avatarNode = <GroupAvatar
|
||||
|
@ -916,25 +923,13 @@ export default React.createClass({
|
|||
if (summary.profile && summary.profile.short_description) {
|
||||
shortDescNode = <span>{ summary.profile.short_description }</span>;
|
||||
}
|
||||
|
||||
let description = null;
|
||||
if (summary.profile && summary.profile.long_description) {
|
||||
description = sanitizedHtmlNode(summary.profile.long_description);
|
||||
}
|
||||
bodyNodes = [
|
||||
this._getMembershipSection(),
|
||||
<div key="groupDesc" className="mx_GroupView_groupDesc">{ description }</div>,
|
||||
this._getRoomsNode(),
|
||||
];
|
||||
if (summary.user && summary.user.is_privileged) {
|
||||
rightButtons.push(
|
||||
<AccessibleButton className="mx_GroupHeader_button"
|
||||
onClick={this._onEditClick} title={_t("Edit Community")} key="_editButton"
|
||||
>
|
||||
<TintableSvg src="img/icons-settings-room.svg" width="16" height="16" />
|
||||
</AccessibleButton>,
|
||||
);
|
||||
}
|
||||
rightButtons.push(
|
||||
<AccessibleButton className="mx_GroupHeader_button"
|
||||
onClick={this._onEditClick} title={_t("Community Settings")} key="_editButton"
|
||||
>
|
||||
<TintableSvg src="img/icons-settings-room.svg" width="16" height="16" />
|
||||
</AccessibleButton>,
|
||||
);
|
||||
if (this.props.collapsedRhs) {
|
||||
rightButtons.push(
|
||||
<AccessibleButton className="mx_GroupHeader_button"
|
||||
|
|
|
@ -489,7 +489,12 @@ module.exports = React.createClass({
|
|||
const AddressTile = sdk.getComponent("elements.AddressTile");
|
||||
for (let i = 0; i < this.state.userList.length; i++) {
|
||||
query.push(
|
||||
<AddressTile key={i} address={this.state.userList[i]} canDismiss={true} onDismissed={this.onDismissed(i)} />,
|
||||
<AddressTile
|
||||
key={i}
|
||||
address={this.state.userList[i]}
|
||||
canDismiss={true}
|
||||
onDismissed={this.onDismissed(i)}
|
||||
showAddress={this.props.pickerType === 'user'} />,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -539,6 +544,7 @@ module.exports = React.createClass({
|
|||
addressSelector = (
|
||||
<AddressSelector ref={(ref) => {this.addressSelector = ref;}}
|
||||
addressList={this.state.queryList}
|
||||
showAddress={this.props.pickerType === 'user'}
|
||||
onSelected={this.onSelected}
|
||||
truncateAt={TRUNCATE_QUERY_LIST}
|
||||
/>
|
||||
|
|
|
@ -30,6 +30,8 @@ export default React.createClass({
|
|||
|
||||
// List of the addresses to display
|
||||
addressList: React.PropTypes.arrayOf(UserAddressType).isRequired,
|
||||
// Whether to show the address on the address tiles
|
||||
showAddress: React.PropTypes.bool,
|
||||
truncateAt: React.PropTypes.number.isRequired,
|
||||
selected: React.PropTypes.number,
|
||||
|
||||
|
@ -142,7 +144,13 @@ export default React.createClass({
|
|||
key={this.props.addressList[i].addressType + "/" + this.props.addressList[i].address}
|
||||
ref={(ref) => { this.addressListElement = ref; }}
|
||||
>
|
||||
<AddressTile address={this.props.addressList[i]} justified={true} networkName="vector" networkUrl="img/search-icon-vector.svg" />
|
||||
<AddressTile
|
||||
address={this.props.addressList[i]}
|
||||
showAddress={this.props.showAddress}
|
||||
justified={true}
|
||||
networkName="vector"
|
||||
networkUrl="img/search-icon-vector.svg"
|
||||
/>
|
||||
</div>,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -87,7 +87,10 @@ export default React.createClass({
|
|||
info = (
|
||||
<div className="mx_AddressTile_mx">
|
||||
<div className={nameClasses}>{ name }</div>
|
||||
<div className={idClasses}>{ address.address }</div>
|
||||
{ this.props.showAddress ?
|
||||
<div className={idClasses}>{ address.address }</div> :
|
||||
<div />
|
||||
}
|
||||
</div>
|
||||
);
|
||||
} else if (isMatrixAddress) {
|
||||
|
|
|
@ -161,10 +161,11 @@ export default withMatrixClient(React.createClass({
|
|||
{ this.makeGroupMemberTiles(this.state.searchQuery, this.state.members) }
|
||||
</div> : <div />;
|
||||
|
||||
const invited = this.state.invitedMembers ? <div className="mx_MemberList_invited">
|
||||
<h2>{ _t("Invited") }</h2>
|
||||
{ this.makeGroupMemberTiles(this.state.searchQuery, this.state.invitedMembers) }
|
||||
</div> : <div />;
|
||||
const invited = (this.state.invitedMembers && this.state.invitedMembers.length > 0) ?
|
||||
<div className="mx_MemberList_invited">
|
||||
<h2>{ _t("Invited") }</h2>
|
||||
{ this.makeGroupMemberTiles(this.state.searchQuery, this.state.invitedMembers) }
|
||||
</div> : <div />;
|
||||
|
||||
return (
|
||||
<div className="mx_MemberList">
|
||||
|
|
|
@ -61,5 +61,7 @@
|
|||
"Thursday": "Dijous",
|
||||
"Friday": "Divendres",
|
||||
"Saturday": "Dissabte",
|
||||
"OK": "D'acord"
|
||||
"OK": "D'acord",
|
||||
"a room": "una sala",
|
||||
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "S'ha enviat un missatge de text a +%(msisdn)s. Entreu si us plau el codi de verificació que conté"
|
||||
}
|
||||
|
|
|
@ -336,7 +336,7 @@
|
|||
"%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s hat den Anzeigenamen von \"%(oldDisplayName)s\" auf \"%(displayName)s\" geändert.",
|
||||
"%(senderName)s changed their profile picture.": "%(senderName)s hat das Profilbild geändert.",
|
||||
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.",
|
||||
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s änderte den Raumnamen zu %(roomName)s.",
|
||||
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s hat den Raumnamen geändert zu %(roomName)s.",
|
||||
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s hat das Thema geändert in \"%(topic)s\".",
|
||||
"/ddg is not a command": "/ddg ist kein Kommando",
|
||||
"%(senderName)s ended the call.": "%(senderName)s hat den Anruf beendet.",
|
||||
|
@ -350,7 +350,7 @@
|
|||
"%(targetName)s left the room.": "%(targetName)s hat den Raum verlassen.",
|
||||
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden).",
|
||||
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie beigetreten sind).",
|
||||
"%(senderName)s made future room history visible to all room members.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für Alle Raum-Mitglieder.",
|
||||
"%(senderName)s made future room history visible to all room members.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder.",
|
||||
"%(senderName)s made future room history visible to anyone.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für Jeder.",
|
||||
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für unbekannt (%(visibility)s).",
|
||||
"Missing room_id in request": "Fehlende room_id in Anfrage",
|
||||
|
@ -530,7 +530,7 @@
|
|||
"%(oneUser)sleft left and rejoined": "%(oneUser)sging und trat erneut bei",
|
||||
"%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)shaben ihre Einladung %(repeats)s-mal abgelehnt",
|
||||
"%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)shat die Einladung %(repeats)s mal abgelehnt",
|
||||
"%(severalUsers)srejected their invitations": "%(severalUsers)shaben ihre Einladung abgelehnt",
|
||||
"%(severalUsers)srejected their invitations": "%(severalUsers)shaben ihre Einladungen abgelehnt",
|
||||
"%(oneUser)srejected their invitation": "%(oneUser)shat die Einladung abgelehnt",
|
||||
"%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)swurden die ursprünglichen Einladungen %(repeats)s mal wieder entzogen",
|
||||
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)swurde die Einladung %(repeats)s mal wieder entzogen",
|
||||
|
@ -899,5 +899,104 @@
|
|||
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s",
|
||||
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(day)s %(monthName)s",
|
||||
"Copied!": "Kopiert!",
|
||||
"Failed to copy": "Kopieren fehlgeschlagen"
|
||||
"Failed to copy": "Kopieren fehlgeschlagen",
|
||||
"Ignored Users": "Ignorierte Benutzer",
|
||||
"Ignore": "Ignorieren",
|
||||
"You are now ignoring %(userId)s": "Du ignorierst jetzt %(userId)s",
|
||||
"You are no longer ignoring %(userId)s": "%(userId)s wird nicht mehr ignoriert",
|
||||
"Message removed by %(userId)s": "Nachricht wurde von %(userId)s entfernt",
|
||||
"Filter group members": "Gruppen-Mitglieder filtern",
|
||||
"Filter group rooms": "Gruppen-Räume filtern",
|
||||
"Remove from group": "Aus der Gruppe entfernen",
|
||||
"Invite new group members": "Neue Gruppen-Mitglieder einladen",
|
||||
"Who would you like to add to this group?": "Wen möchtest Du zu dieser Gruppe hinzufügen?",
|
||||
"Name or matrix ID": "Name oder Matrix-ID",
|
||||
"Unable to leave room": "Verlassen des Raumes fehlgeschlagen",
|
||||
"%(inviter)s has invited you to join this group": "%(inviter)s hat dich eingeladen, dieser Gruppe beizutreten",
|
||||
"You are a member of this group": "Du bist ein Mitglied dieser Gruppe",
|
||||
"Leave": "Verlassen",
|
||||
"Failed to invite the following users to %(groupId)s:": "Die folgenden Benutzer konnten nicht in die Gruppe %(groupId)s eingeladen werden:",
|
||||
"Leave Group": "Gruppe verlassen",
|
||||
"Leave %(groupName)s?": "%(groupName)s verlassen?",
|
||||
"Add a Room": "Raum hinzufügen",
|
||||
"Add a User": "Benutzer hinzufügen",
|
||||
"You are an administrator of this group": "Du bist ein Administrator in dieser Gruppe",
|
||||
"Light theme": "Helles Thema",
|
||||
"Dark theme": "Dunkles Thema",
|
||||
"You have entered an invalid address.": "Du hast eine ungültige Adresse eingegeben.",
|
||||
"Matrix ID": "Matrix-ID",
|
||||
"This group is not published on your profile": "Diese Gruppe wird nicht in deinem Profil angezeigt",
|
||||
"Which rooms would you like to add to this group?": "Welche Räume möchtest du zu dieser Gruppe hinzufügen?",
|
||||
"Advanced options": "Erweiterte Optionen",
|
||||
"Block users on other matrix homeservers from joining this room": "Blockiere Nutzer anderer Matrix-Heimserver die diesen Raum betreten wollen",
|
||||
"This setting cannot be changed later!": "Diese Einstellung kann nicht nachträglich geändert werden!",
|
||||
"Unignore": "Entignorieren",
|
||||
"User Options": "Benutzer-Optionen",
|
||||
"Unignored user": "Benutzer entignoriert",
|
||||
"Ignored user": "Benutzer ignoriert",
|
||||
"Stops ignoring a user, showing their messages going forward": "Stoppt das Ignorieren eines Benutzers, nachfolgende Nachrichten werden angezeigt",
|
||||
"Ignores a user, hiding their messages from you": "Ignoriert einen Benutzer, verbirgt ihre Nachrichten vor dir",
|
||||
"Disable Emoji suggestions while typing": "Deaktiviere Emoji-Vorschläge während des Tippens",
|
||||
"Banned by %(displayName)s": "Gebannt von %(displayName)s",
|
||||
"To send messages, you must be a": "Um Nachrichten zu senden musst du sein ein",
|
||||
"To invite users into the room, you must be a": "Notwendiges Berechtigungslevel, um Benutzer in diesen Raum einladen zu können:",
|
||||
"To configure the room, you must be a": "Notwendiges Berechtigungslevel, um diesen Raum konfigurieren:",
|
||||
"To kick users, you must be a": "Notwendiges Berechtigungslevel, um Benutzer zu kicken:",
|
||||
"To ban users, you must be a": "Notwendiges Berechtigungslevel, um einen Benutzer zu verbannen:",
|
||||
"To remove other users' messages, you must be a": "Um Nachrichten von Benutzern zu löschen, musst du sein ein",
|
||||
"To send events of type <eventType/>, you must be a": "Um Ereignisse desTyps <eventType/> zu senden, musst du sein ein",
|
||||
"To change the room's avatar, you must be a": "Um das Raumbild zu ändern, musst du sein ein",
|
||||
"To change the room's name, you must be a": "Um den Raumnamen zu ändern, musst du sein ein",
|
||||
"To change the room's main address, you must be a": "Um die Hauptadresse des Raumes zu ändern, musst du sein ein",
|
||||
"To change the room's history visibility, you must be a": "Um die Sichtbarkeit der Raum-Historie zu ändern, musst du sein ein",
|
||||
"To change the permissions in the room, you must be a": "Um Berechtigungen in diesem Raum zu ändern, musst du sein ein",
|
||||
"To change the topic, you must be a": "Um das Thema zu ändern, musst du sein ein",
|
||||
"To modify widgets in the room, you must be a": "Um Widgets in dem Raum zu ändern, musst du sein ein",
|
||||
"Description": "Beschreibung",
|
||||
"Invite to Group": "In Gruppe einladen",
|
||||
"Unable to accept invite": "Einladung kann nicht akzeptiert werden",
|
||||
"Failed to remove user from group": "Benutzer konnte nicht aus Gruppe entfernt werden",
|
||||
"Failed to invite users group": "Benutzer-Gruppe konnte nicht eingeladen werden",
|
||||
"Failed to invite users to %(groupId)s": "Benutzer konnten nicht in %(groupId)s eingeladen werden",
|
||||
"Unable to reject invite": "Einladung konnte nicht abgelehnt werden",
|
||||
"Add users to the group summary": "Füge Benutzer zur Gruppen-Übersicht hinzu",
|
||||
"Who would you like to add to this summary?": "Wen möchtest zu dieser Übersicht hinzufügen?",
|
||||
"Add to summary": "Zur Übersicht hinzufügen",
|
||||
"Failed to add the following users to the summary of %(groupId)s:": "Hinzufügen der folgenden Benutzer zur Übersicht von %(groupId)s fehlgeschlagen:",
|
||||
"Add rooms to the group summary": "Füge Räume zur Gruppen-Übersicht hinzu",
|
||||
"Which rooms would you like to add to this summary?": "Welche Räume möchtest du zu dieser Übersicht hinzufügen?",
|
||||
"Room name or alias": "Raum-Name oder Alias",
|
||||
"Failed to add the following rooms to the summary of %(groupId)s:": "Folgende Räume konnten nicht zu der Übersicht von %(groupId)s hinzugefügt werden:",
|
||||
"Failed to remove the room from the summary of %(groupId)s": "Raum konnte nicht aus der Übersicht von %(groupId)s entfernt werden",
|
||||
"The room '%(roomName)s' could not be removed from the summary.": "Der Raum '%(roomName)s' konnte nicht aus der Übersicht entfernt werden.",
|
||||
"Failed to remove a user from the summary of %(groupId)s": "Benutzer konnte nicht aus der Übersicht von %(groupId)s entfernt werden",
|
||||
"The user '%(displayName)s' could not be removed from the summary.": "Der Benutzer '%(displayName)s' konnte nicht aus der Übersicht entfernt werden.",
|
||||
"Unknown": "Unbekannt",
|
||||
"Add rooms to the group": "Füge Räume der Gruppe hinzu",
|
||||
"Add to group": "Zur Gruppe hinzufügen",
|
||||
"Failed to add the following rooms to %(groupId)s:": "Die folgenden Räume konnten %(groupId)s nicht hinzugefügt werden:",
|
||||
"Unpublish": "Depublizieren",
|
||||
"This group is published on your profile": "Diese Gruppe ist in deinem Profil veröffentlicht",
|
||||
"Publish": "Veröffentlichen",
|
||||
"Matrix Room ID": "Matrix-Raum-ID",
|
||||
"email address": "E-Mail-Adresse",
|
||||
"Try using one of the following valid address types: %(validTypesList)s.": "Versuche eine der folgenden validen Adresstypen zu benutzen: %(validTypesList)s.",
|
||||
"Failed to remove room from group": "Entfernen des Raumes aus der Gruppe fehlgeschagen",
|
||||
"Failed to remove '%(roomName)s' from %(groupId)s": "Entfernen von '%(roomName)s' aus %(groupId)s fehlgeschlagen",
|
||||
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Bist du sicher, dass du '%(roomName)s' aus '%(groupId)s' entfernen möchtest?",
|
||||
"Removing a room from the group will also remove it from the group page.": "Das Entfernen eines Raumes aus der Gruppe wird ihn auch aus der Gruppen-Seite entfernen.",
|
||||
"Related Groups": "Verbundene Gruppen",
|
||||
"Related groups for this room:": "Verbundene Gruppen in diesen Raum:",
|
||||
"This room has no related groups": "Dieser Raum hat keine zugehörigen Gruppen",
|
||||
"New group ID (e.g. +foo:%(localDomain)s)": "Neue Gruppen-ID (z.B. +foo:%(localDomain)s)",
|
||||
"Invites sent": "Einladungen gesendet",
|
||||
"Your group invitations have been sent.": "Deine Gruppen-Einladungen wurden gesendet.",
|
||||
"Remove avatar": "Profilbild entfernen",
|
||||
"Disable big emoji in chat": "Große Emojis im Chat deaktiveren",
|
||||
"There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?": "Sonst ist hier niemand! Möchtest Du <a>Benutzer einladen</a> oder die <a>Warnungen über den leeren Raum deaktivieren</a>?",
|
||||
"Pinned Messages": "Angeheftete Nachrichten",
|
||||
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s hat die angehefteten Nachrichten für diesen Raum geändert.",
|
||||
"Jump to read receipt": "Zur Lesebestätigung springen",
|
||||
"Message Pinning": "Nachricht-Anheftung",
|
||||
"Add rooms to this group": "Füge Räume zu dieser Gruppe hinzu"
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -825,5 +825,27 @@
|
|||
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(fullYear)sko %(monthName)sk %(day)s",
|
||||
"Copied!": "Kopiatuta!",
|
||||
"Failed to copy": "Kopiak huts egin du",
|
||||
"Cancel": "Utzi"
|
||||
"Cancel": "Utzi",
|
||||
"Advanced options": "Aukera aurreratuak",
|
||||
"Block users on other matrix homeservers from joining this room": "Eragotzi beste matrix hasiera-zerbitzarietako erabiltzaileak gela honetara elkartzea",
|
||||
"This setting cannot be changed later!": "Ezarpen hau ezin da gero aldatu!",
|
||||
"Ignored Users": "Ezikusitako erabiltzaileak",
|
||||
"Ignore": "Ezikusi",
|
||||
"Unignore": "Ez ezikusi",
|
||||
"User Options": "Erabiltzaile-aukerak",
|
||||
"You are now ignoring %(userId)s": "%(userId)s ezikusten ari zara",
|
||||
"You are no longer ignoring %(userId)s": "Ez zaude jada %(userId)s ezikusten",
|
||||
"Unignored user": "Ez ezikusitako erabiltzailea",
|
||||
"Ignored user": "Ezikusitako erabiltzailea",
|
||||
"Stops ignoring a user, showing their messages going forward": "Utzi erabiltzailea ezikusteari, erakutsi bere mezuak",
|
||||
"Ignores a user, hiding their messages from you": "Ezikusi erabiltzailea, ezkutatu bere mezuak zuretzat",
|
||||
"Disable Emoji suggestions while typing": "Desgaitu Emoji proposamenak idaztean",
|
||||
"Banned by %(displayName)s": "%(displayName)s erabiltzaileak debekatuta",
|
||||
"Message removed by %(userId)s": "%(userId)s erabiltzaileak kendu du mezua",
|
||||
"To send messages, you must be a": "Mezuak bidaltzeko hau izan behar zara:",
|
||||
"To invite users into the room, you must be a": "Erabiltzaileak gonbidatzeko hau izan behar zara:",
|
||||
"To configure the room, you must be a": "Gela konfiguratzeko hau izan behar zara:",
|
||||
"To kick users, you must be a": "Erabiltzaileak kanporatzeko hau izan behar zara:",
|
||||
"To ban users, you must be a": "Erabiltzaileak debekatzeko hau izan behar zara:",
|
||||
"To remove other users' messages, you must be a": "Beste erabiltzaileen mezuak kentzeko hau izan behar zara:"
|
||||
}
|
||||
|
|
|
@ -182,7 +182,7 @@
|
|||
"Failed to unban": "Porttikiellon poistaminen epäonnistui",
|
||||
"Failed to upload file": "Tiedoston lataaminen epäonnistui",
|
||||
"Failed to upload profile picture!": "Profiilikuvan lataaminen epäonnistui",
|
||||
"Failed to verify email address: make sure you clicked the link in the email": "Varmenna sähköpostiosoitteesi: varmista että klikkasit sähköpostissa olevaa linkkiä",
|
||||
"Failed to verify email address: make sure you clicked the link in the email": "Sähköpostin varmennus epäonnistui: varmista että seurasit sähköpostissa olevaa linkkiä",
|
||||
"Failure to create room": "Huoneen luominen epäonnistui",
|
||||
"favourite": "suosikki",
|
||||
"Favourites": "Suosikit",
|
||||
|
@ -330,7 +330,7 @@
|
|||
"unknown caller": "tuntematon soittaja",
|
||||
"unknown device": "tuntematon laite",
|
||||
"Unknown room %(roomId)s": "Tuntematon huone %(roomId)s",
|
||||
"Unknown (user, device) pair:": "Tuntematon (käyttäjä,laite) -pari.",
|
||||
"Unknown (user, device) pair:": "Tuntematon (käyttäjä, laite) -pari:",
|
||||
"Unmute": "Poista mykistys",
|
||||
"Unnamed Room": "Nimeämätön huone",
|
||||
"Unrecognised command:": "Tuntematon komento:",
|
||||
|
|
|
@ -827,5 +827,105 @@
|
|||
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(monthName)s %(day)s",
|
||||
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(fullYear)s %(monthName)s %(day)s",
|
||||
"Copied!": "Lemásolva!",
|
||||
"Failed to copy": "Sikertelen másolás"
|
||||
"Failed to copy": "Sikertelen másolás",
|
||||
"Advanced options": "További beállítások",
|
||||
"Block users on other matrix homeservers from joining this room": "Felhasználók szobába való belépésének megakadályozása távoli szerverekről",
|
||||
"This setting cannot be changed later!": "Ezt a beállítást később nem lehet megváltoztatni!",
|
||||
"Ignored Users": "Figyelmen kívül hagyott felhasználók",
|
||||
"Ignore": "Figyelmen kívül hagy",
|
||||
"Unignore": "Figyelembe vesz",
|
||||
"User Options": "Felhasználói beállítások",
|
||||
"You are now ignoring %(userId)s": "Most figyelmen kívül hagyod: %(userId)s",
|
||||
"You are no longer ignoring %(userId)s": "Ismét figyelembe veszed: %(userId)s",
|
||||
"Unignored user": "Figyelembe vett felhasználó",
|
||||
"Ignored user": "Figyelmen kívül hagyott felhasználó",
|
||||
"Stops ignoring a user, showing their messages going forward": "Felhasználót újra figyelembe vesszük és megmutatjuk az új üzeneteit",
|
||||
"Ignores a user, hiding their messages from you": "Felhasználó figyelmen kívül hagyásával elrejtheted az üzeneteit magad elől",
|
||||
"Disable Emoji suggestions while typing": "Emoji ajánlások kikapcsolása gépelés közben",
|
||||
"Banned by %(displayName)s": "Kitiltotta: %(displayName)s",
|
||||
"Message removed by %(userId)s": "Üzenetet törölte: %(userId)s",
|
||||
"To send messages, you must be a": "Ahhoz, hogy üzenetet tudj küldeni, neked ilyen szinten kell lenned:",
|
||||
"To invite users into the room, you must be a": "Hogy meghívj valakit a szobába, ilyen szinten kell lenned:",
|
||||
"To configure the room, you must be a": "A szoba beállításához ilyen szinten kell lenned:",
|
||||
"To kick users, you must be a": "Felhasználó kirúgásához ilyen szinten kell lenned:",
|
||||
"To ban users, you must be a": "Felhasználó kizárásához ilyen szinten kell lenned:",
|
||||
"To remove other users' messages, you must be a": "Más üzenetének a törléséhez ilyen szinten kell lenned:",
|
||||
"To send events of type <eventType/>, you must be a": "<eventType/> esemény küldéséhez ilyen szinten kell lenned:",
|
||||
"To change the room's avatar, you must be a": "A szoba avatar-jának a megváltoztatásához ilyen szinten kell lenned:",
|
||||
"To change the room's name, you must be a": "A szoba nevének megváltoztatásához ilyen szinten kell lenned:",
|
||||
"To change the room's main address, you must be a": "A szoba elsődleges címének a megváltoztatásához ilyen szinten kell lenned:",
|
||||
"To change the room's history visibility, you must be a": "A szoba naplója elérhetőségének a megváltoztatásához ilyen szinten kell lenned:",
|
||||
"To change the permissions in the room, you must be a": "A szobában a jogosultság megváltoztatásához ilyen szinten kell lenned:",
|
||||
"To change the topic, you must be a": "A téma megváltoztatásához ilyen szinten kell lenned:",
|
||||
"To modify widgets in the room, you must be a": "A szoba kisalkalmazásainak megváltoztatásához ilyen szinten kell lenned:",
|
||||
"Description": "Leírás",
|
||||
"Filter group members": "Csoport tagok szürése",
|
||||
"Filter group rooms": "Csoport szobák szűrése",
|
||||
"Remove from group": "Csoportból való törlés",
|
||||
"Invite new group members": "Új csoport tagok meghívása",
|
||||
"Who would you like to add to this group?": "Kit szeretnél ehhez a csoporthoz hozzáadni?",
|
||||
"Name or matrix ID": "Név vagy Matrix azonosító",
|
||||
"Invite to Group": "Meghívás a csoportba",
|
||||
"Unable to accept invite": "A meghívót nem lehet elfogadni",
|
||||
"Unable to leave room": "A szobát nem lehet elhagyni",
|
||||
"%(inviter)s has invited you to join this group": "%(inviter)s meghívott a csoportba",
|
||||
"You are a member of this group": "Ennek a csoportnak a tagja vagy",
|
||||
"Leave": "Elhagy",
|
||||
"Failed to remove user from group": "A felhasználót nem sikerült törölni a csoportból",
|
||||
"Failed to invite the following users to %(groupId)s:": "Az alábbi felhasználókat nem sikerült meghívni a(z) %(groupId)s:",
|
||||
"Failed to invite users group": "Nem sikerült meghívni a felhasználói csoportot",
|
||||
"Failed to invite users to %(groupId)s": "Nem sikerült meghívni a felhasználókat ebbe a csoportba: %(groupId)s",
|
||||
"Unable to reject invite": "Nem sikerül elutasítani a meghívót",
|
||||
"Leave Group": "Csoport elhagyása",
|
||||
"Leave %(groupName)s?": "Elhagyod a csoportot: %(groupName)s?",
|
||||
"Flair": "Szimat",
|
||||
"Add a Room": "Szoba hozzáadása",
|
||||
"Add a User": "Felhasználó hozzáadása",
|
||||
"Add users to the group summary": "Felhasználók hozzáadása a csoport összefoglalóhoz",
|
||||
"Who would you like to add to this summary?": "Kit szeretnél hozzáadni ehhez az összefoglalóhoz?",
|
||||
"Add to summary": "Összefoglalóhoz adás",
|
||||
"Failed to add the following users to the summary of %(groupId)s:": "Az alábbi felhasználókat nem sikerült hozzáadni a(z) %(groupId)s csoport összefoglalójához:",
|
||||
"Add rooms to the group summary": "Szobák hozzáadása a csoport összefoglalóhoz",
|
||||
"Which rooms would you like to add to this summary?": "Melyik szobákat szeretnéd hozzáadni ehhez az összefoglalóhoz?",
|
||||
"Room name or alias": "Szoba neve vagy beceneve",
|
||||
"You are an administrator of this group": "A csoport adminisztrátora vagy",
|
||||
"Failed to add the following rooms to the summary of %(groupId)s:": "Az alábbi szobákat nem sikerült hozzáadni a(z) %(groupId)s csoport összefoglalójához:",
|
||||
"Failed to remove the room from the summary of %(groupId)s": "Az alábbi szobákat nem sikerült eltávolítani a(z) %(groupId)s csoport összefoglalójából",
|
||||
"The room '%(roomName)s' could not be removed from the summary.": "Nem sikerült törölni az összefoglalóból ezt a szobát: '%(roomName)s'.",
|
||||
"Failed to remove a user from the summary of %(groupId)s": "Nem sikerült törölni az összefoglalóból ezt a felhasználót: %(groupId)s",
|
||||
"The user '%(displayName)s' could not be removed from the summary.": "Nem sikerült törölni az összefoglalóból ezt a felhasználót: %(groupId)s.",
|
||||
"Light theme": "Világos téma",
|
||||
"Dark theme": "Sötét téma",
|
||||
"Unknown": "Ismeretlen",
|
||||
"Add rooms to the group": "Szobák hozzáadása a csoporthoz",
|
||||
"Which rooms would you like to add to this group?": "Melyik szobákat szeretnéd hozzáadni ehhez a csoporthoz?",
|
||||
"Add to group": "Csoport hozzáadása",
|
||||
"Failed to add the following rooms to %(groupId)s:": "Az alábbi szobákat nem sikerült hozzáadni a(z) %(groupId)s csoporthoz:",
|
||||
"Unpublish": "Megjelenés visszavonása",
|
||||
"This group is published on your profile": "Ez a csoport megjelenik a profilodban",
|
||||
"Publish": "Nyilvánosságra hozás",
|
||||
"This group is not published on your profile": "Ez a csoport nem jelenik meg a profilodban",
|
||||
"Matrix ID": "Matrix azonosító",
|
||||
"Matrix Room ID": "Szoba Matrix azonosító",
|
||||
"email address": "E-mail cím",
|
||||
"Try using one of the following valid address types: %(validTypesList)s.": "Próbáld meg valamelyik érvényes cím típust: %(validTypesList)s.",
|
||||
"You have entered an invalid address.": "Érvénytelen címet adtál meg.",
|
||||
"Failed to remove room from group": "A csoportból nem sikerült szobát törölni",
|
||||
"Failed to remove '%(roomName)s' from %(groupId)s": "A(z) %(groupId)s csoportból nem sikerült törölni: %(roomName)s",
|
||||
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Biztos, hogy törlöd a(z) %(roomName)s szobát a(z) %(groupId)s csoportból?",
|
||||
"Removing a room from the group will also remove it from the group page.": "A szoba törlése a csoportból a csoport oldalról is törli azt.",
|
||||
"Related Groups": "Érintett csoportok",
|
||||
"Related groups for this room:": "A szobához tartozó érintett csoportok:",
|
||||
"This room has no related groups": "A szobában nincsenek érintett csoportok",
|
||||
"New group ID (e.g. +foo:%(localDomain)s)": "Új csoport azonosító (pl.: +foo:%(localDomain)s)",
|
||||
"Invites sent": "Meghívó elküldve",
|
||||
"Your group invitations have been sent.": "A csoport meghívók elküldve.",
|
||||
"Jump to read receipt": "Olvasási visszaigazolásra ugrás",
|
||||
"Disable big emoji in chat": "Nagy emoji-k tiltása a csevegésben",
|
||||
"There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?": "Itt nincs senki más! Szeretnél <a>meghívni másokat</a> vagy <a>ne figyelmeztessünk az üres szobával kapcsolatban</a>?",
|
||||
"Message Pinning": "Üzenet kitűzése",
|
||||
"Remove avatar": "Avatar törlése",
|
||||
"Pinned Messages": "Kitűzött üzenetek",
|
||||
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s megváltoztatta a szoba kitűzött szövegeit.",
|
||||
"Add rooms to this group": "Szoba hozzáadás ehhez a csoporthoz"
|
||||
}
|
||||
|
|
|
@ -893,5 +893,53 @@
|
|||
"%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s adicionado por %(senderName)s",
|
||||
"%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s removido por %(senderName)s",
|
||||
"%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modificado por %(senderName)s",
|
||||
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "A verificação através de robot está atualmente indisponível na versão desktop - utilize um <a>navegador web</a>"
|
||||
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "A verificação através de robot está atualmente indisponível na versão desktop - utilize um <a>navegador web</a>",
|
||||
"Advanced options": "Opções avançadas",
|
||||
"This setting cannot be changed later!": "Esta definição não pode ser alterada mais tarde!",
|
||||
"Ignored Users": "Utilizadores Ignorados",
|
||||
"Ignore": "Ignorar",
|
||||
"User Options": "Opções de Utilizador",
|
||||
"Ignored user": "Utilizador ignorado",
|
||||
"Description": "Descrição",
|
||||
"Filter group members": "Filtrar membros do grupo",
|
||||
"Filter group rooms": "Filtrar salas do grupo",
|
||||
"Remove from group": "Remover do grupo",
|
||||
"Invite new group members": "Convidar novos membros para o grupo",
|
||||
"Name or matrix ID": "Nome ou ID do matrix",
|
||||
"Invite to Group": "Convidar para Grupo",
|
||||
"You are a member of this group": "É um membro deste grupo",
|
||||
"Leave": "Sair",
|
||||
"Failed to remove user from group": "Não foi possível remover o utilizador do grupo",
|
||||
"Leave Group": "Sair do Grupo",
|
||||
"Add a Room": "Adicionar uma sala",
|
||||
"Add a User": "Adicionar um utilizador",
|
||||
"Unknown": "Desconhecido",
|
||||
"Add rooms to the group": "Adicionar salas ao grupo",
|
||||
"Which rooms would you like to add to this group?": "Que salas quer adicionar a este grupo?",
|
||||
"Add to group": "Adicionar ao grupo",
|
||||
"email address": "endereço de email",
|
||||
"Related Groups": "Grupos Relacionados",
|
||||
"Related groups for this room:": "Grupos relacionados para esta sala:",
|
||||
"This room has no related groups": "Esta sala não tem grupos relacionados",
|
||||
"Invites sent": "Convites enviados",
|
||||
"Your group invitations have been sent.": "Os seus convites de grupo foram enviados.",
|
||||
"Block users on other matrix homeservers from joining this room": "Impede utilizadores de outros servidores base matrix de se juntar a esta sala",
|
||||
"Unignore": "Deixar de ignorar",
|
||||
"You are now ignoring %(userId)s": "Está agora a ignorar %(userId)s",
|
||||
"You are no longer ignoring %(userId)s": "%(userId)s já não é ignorado",
|
||||
"Unignored user": "Utilizador não ignorado",
|
||||
"Stops ignoring a user, showing their messages going forward": "Deixa de ignorar um utilizador, mostrando as suas mensagens daqui para a frente",
|
||||
"Ignores a user, hiding their messages from you": "Ignora um utilizador, deixando de mostrar as mensagens dele",
|
||||
"Disable big emoji in chat": "Desativar emojis grandes no chat",
|
||||
"Disable Emoji suggestions while typing": "Desativar sugestões de Emoji durante a escrita",
|
||||
"There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?": "Não há ninguém aqui! Gostarias de <a>convidar alguém</a> ou <a>parar avisos sobre a sala vazia</a>?",
|
||||
"Remove avatar": "Remover avatar",
|
||||
"Banned by %(displayName)s": "Banido por %(displayName)s",
|
||||
"Message removed by %(userId)s": "Mensagem removida por %(userId)s",
|
||||
"To send messages, you must be a": "Para enviar mensagens, tens de ser um(a)",
|
||||
"To invite users into the room, you must be a": "Para convidar utilizadores para esta sala, tens de ser um(a)",
|
||||
"To configure the room, you must be a": "Para configurar esta sala, tens de ser um(a)",
|
||||
"To ban users, you must be a": "Para banir utilizadores, tens de ser um(a)",
|
||||
"To remove other users' messages, you must be a": "Para remover mensagens de outros utilizadores, tens de ser um(a)",
|
||||
"To send events of type <eventType/>, you must be a": "Para enviar eventos do tipo <eventType/>, tens de ser um(a)"
|
||||
}
|
||||
|
|
|
@ -437,7 +437,7 @@
|
|||
"tag direct chat": "Тег прямого чата",
|
||||
"The default role for new room members is": "Роль по умолчанию для новых участников комнаты",
|
||||
"The main address for this room is": "Основной адрес для этой комнаты",
|
||||
"This email address is already in use": "Этот адрес электронной почты уже используется",
|
||||
"This email address is already in use": "Этот адрес эл. почты уже используется",
|
||||
"This email address was not found": "Этот адрес электронной почты не найден",
|
||||
"The email address linked to your account must be entered.": "Необходимо ввести адрес электронной почты, связанный с вашей учетной записью.",
|
||||
"The file '%(fileName)s' failed to upload": "Не удалось отправить файл '%(fileName)s'",
|
||||
|
@ -549,8 +549,8 @@
|
|||
"device id: ": "ID устройства: ",
|
||||
"Device key:": "Ключ устройства:",
|
||||
"disabled": "отключено",
|
||||
"Email address": "Адрес электронной почты",
|
||||
"Email address (optional)": "Адрес электронной почты (необязательно)",
|
||||
"Email address": "Адрес эл. почты",
|
||||
"Email address (optional)": "Адрес эл. почты (необязательно)",
|
||||
"enabled": "включено",
|
||||
"Error decrypting attachment": "Ошибка при расшифровке вложения",
|
||||
"Export": "Экспорт",
|
||||
|
@ -877,5 +877,105 @@
|
|||
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(monthName)s %(day)s",
|
||||
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s",
|
||||
"Copied!": "Скопировано!",
|
||||
"Failed to copy": "Не удалось скопировать"
|
||||
"Failed to copy": "Не удалось скопировать",
|
||||
"Advanced options": "Дополнительные параметры",
|
||||
"Block users on other matrix homeservers from joining this room": "Блокировать пользователей, входящих в эту комнату с других серверов matrix",
|
||||
"This setting cannot be changed later!": "Этот параметр нельзя изменить позднее!",
|
||||
"Ignored Users": "Игнорируемые пользователи",
|
||||
"Ignore": "Игнорировать",
|
||||
"Unignore": "Перестать игнорировать",
|
||||
"User Options": "Параметры пользователя",
|
||||
"You are now ignoring %(userId)s": "Теперь вы игнорируете %(userId)s",
|
||||
"You are no longer ignoring %(userId)s": "Вы больше не игнорируете %(userId)s",
|
||||
"Unignored user": "Неигнорируемый пользователь",
|
||||
"Ignored user": "Игнорируемый пользователь",
|
||||
"Stops ignoring a user, showing their messages going forward": "Прекращает игнорирование пользователя, показывая их будущие сообщения",
|
||||
"Ignores a user, hiding their messages from you": "Игнорирует пользователя, скрывая сообщения от вас",
|
||||
"Disable Emoji suggestions while typing": "Отключить предложения Emoji при наборе текста",
|
||||
"Banned by %(displayName)s": "Запрещено %(displayName)s",
|
||||
"Message removed by %(userId)s": "Сообщение удалено %(userId)s",
|
||||
"To send messages, you must be a": "Для отправки сообщений необходимо быть",
|
||||
"To invite users into the room, you must be a": "Чтобы пригласить пользователей в комнату, необходимо быть",
|
||||
"To configure the room, you must be a": "Чтобы настроить комнату, необходимо быть",
|
||||
"To kick users, you must be a": "Чтобы выкидывать пользователей, необходимо быть",
|
||||
"To ban users, you must be a": "Чтобы банить пользователей, необходимо быть",
|
||||
"To remove other users' messages, you must be a": "Чтобы удалять сообщения других пользователей, необходимо быть",
|
||||
"To send events of type <eventType/>, you must be a": "Для отправки событий типа <eventType/>, необходимо быть",
|
||||
"To change the room's avatar, you must be a": "Чтобы изменить аватар комнаты, необходимо быть",
|
||||
"To change the room's name, you must be a": "Чтобы изменить имя комнаты, необходимо быть",
|
||||
"To change the room's main address, you must be a": "Чтобы изменить основной адрес комнаты, необходимо быть",
|
||||
"To change the room's history visibility, you must be a": "Чтобы изменить видимость истории комнаты, необходимо быть",
|
||||
"To change the permissions in the room, you must be a": "Чтобы изменить разрешения в комнате, необходимо быть",
|
||||
"To change the topic, you must be a": "Чтобы изменить тему, необходимо быть",
|
||||
"To modify widgets in the room, you must be a": "Чтобы изменить виджеты в комнате, необходимо быть",
|
||||
"Description": "Описание",
|
||||
"Filter group members": "Фильтрация членов группы",
|
||||
"Filter group rooms": "Фильтрация комнат группы",
|
||||
"Remove from group": "Удалить из группы",
|
||||
"Invite new group members": "Пригласить новых членов группы",
|
||||
"Who would you like to add to this group?": "Кого вы хотите добавить в эту группу?",
|
||||
"Name or matrix ID": "Имя или matrix ID",
|
||||
"Invite to Group": "Пригласить в группу",
|
||||
"Unable to accept invite": "Невозможно принять приглашение",
|
||||
"Unable to leave room": "Невозможно покинуть комнату",
|
||||
"%(inviter)s has invited you to join this group": "%(inviter)s пригласил(а) вас присоединиться к этой группе",
|
||||
"You are a member of this group": "Вы являетесь членом этой группы",
|
||||
"Leave": "Покинуть",
|
||||
"Failed to remove user from group": "Не удалось удалить пользователя из группы",
|
||||
"Failed to invite the following users to %(groupId)s:": "Не удалось пригласить следующих пользователей в %(groupId)s:",
|
||||
"Failed to remove '%(roomName)s' from %(groupId)s": "Не удалось удалить '%(roomName)s' из %(groupId)s",
|
||||
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Вы действительно хотите удалить '%(roomName)s' из %(groupId)s?",
|
||||
"Removing a room from the group will also remove it from the group page.": "Удаление комнаты из группы также приведет к удалению ее со страницы группы.",
|
||||
"Related Groups": "Связанные группы",
|
||||
"Related groups for this room:": "Связанные группы для этой комнаты:",
|
||||
"This room has no related groups": "Эта комната не связана ни с одной из групп",
|
||||
"New group ID (e.g. +foo:%(localDomain)s)": "Новый ID группы (например +foo:%(localDomain)s)",
|
||||
"Invites sent": "Приглашение отправлено",
|
||||
"Your group invitations have been sent.": "Ваши приглашения в группу были отправлены.",
|
||||
"Jump to read receipt": "Перейти к отчету о прочтении",
|
||||
"Disable big emoji in chat": "Отключить большие emoji в чате",
|
||||
"There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?": "Больше никого нет! Хотите <a>пригласить кого-нибудь</a> или <a>отключить уведомление о пустой комнате</a>?",
|
||||
"Message Pinning": "Закрепление сообщений",
|
||||
"Remove avatar": "Удалить аватар",
|
||||
"Failed to invite users group": "Не удалось пригласить группу пользователей",
|
||||
"Failed to invite users to %(groupId)s": "Не удалось пригласить пользователей в %(groupId)s",
|
||||
"Unable to reject invite": "Невозможно отклонить приглашение",
|
||||
"Leave Group": "Покинуть группу",
|
||||
"Leave %(groupName)s?": "Покинуть %(groupName)s?",
|
||||
"Flair": "Талант",
|
||||
"Add a Room": "Добавить комнату",
|
||||
"Add a User": "Добавить пользователя",
|
||||
"Add users to the group summary": "Добавление пользователей в сводку по группе",
|
||||
"Who would you like to add to this summary?": "Кого вы хотите добавить в эту сводку?",
|
||||
"Add to summary": "Добавить в сводку",
|
||||
"Failed to add the following users to the summary of %(groupId)s:": "Не удалось добавить следующих пользователей в сводку %(groupId)s:",
|
||||
"Add rooms to the group summary": "Добавление комнат в сводку по группе",
|
||||
"Which rooms would you like to add to this summary?": "Какие комнаты вы хотите добавить в эту сводку?",
|
||||
"Room name or alias": "Название комнаты или псевдоним",
|
||||
"Pinned Messages": "Закрепленные сообщения",
|
||||
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s изменил закрепленные сообщения для этой комнаты.",
|
||||
"You are an administrator of this group": "Вы являетесь администратором этой группы",
|
||||
"Failed to add the following rooms to the summary of %(groupId)s:": "Не удалось добавить следующие комнаты в сводку %(groupId)s:",
|
||||
"Failed to remove the room from the summary of %(groupId)s": "Не удалось удалить комнату из сводки %(groupId)s",
|
||||
"The room '%(roomName)s' could not be removed from the summary.": "Комнату '%(roomName)s' не удалось удалить из сводки.",
|
||||
"Failed to remove a user from the summary of %(groupId)s": "Не удалось удалить пользователя из сводки %(groupId)s",
|
||||
"The user '%(displayName)s' could not be removed from the summary.": "Пользователя '%(displayName)s' не удалось удалить из сводки.",
|
||||
"Light theme": "Светлая тема",
|
||||
"Dark theme": "Темная тема",
|
||||
"Unknown": "Неизвестно",
|
||||
"Add rooms to the group": "Добавить комнаты в группу",
|
||||
"Which rooms would you like to add to this group?": "Какие комнаты вы хотите добавить в эту группу?",
|
||||
"Add to group": "Добавить в группу",
|
||||
"Failed to add the following rooms to %(groupId)s:": "Не удалось добавить следующие комнаты в %(groupId)s:",
|
||||
"Unpublish": "Отменить публикацию",
|
||||
"This group is published on your profile": "Эта группа публикуется в вашем профиле",
|
||||
"Publish": "Публикация",
|
||||
"This group is not published on your profile": "Эта группа не публикуется в вашем профиле",
|
||||
"Matrix ID": "Matrix ID",
|
||||
"Matrix Room ID": "Matrix ID комнаты",
|
||||
"email address": "адрес email",
|
||||
"Try using one of the following valid address types: %(validTypesList)s.": "Попробуйте использовать один из следующих допустимых типов адресов: %(validTypesList)s.",
|
||||
"You have entered an invalid address.": "Введен неправильный адрес.",
|
||||
"Failed to remove room from group": "Не удалось удалить комнату из группы",
|
||||
"Add rooms to this group": "Добавить комнаты в эту группу"
|
||||
}
|
||||
|
|
|
@ -61,6 +61,14 @@ export default class GroupStore extends EventEmitter {
|
|||
return this._rooms;
|
||||
}
|
||||
|
||||
getGroupPublicity() {
|
||||
return this._summary.user ? this._summary.user.is_publicised : null;
|
||||
}
|
||||
|
||||
isUserPrivileged() {
|
||||
return this._summary.user ? this._summary.user.is_privileged : null;
|
||||
}
|
||||
|
||||
addRoomToGroup(roomId) {
|
||||
return this._matrixClient
|
||||
.addRoomToGroup(this.groupId, roomId)
|
||||
|
|
Loading…
Reference in a new issue