Merge branch 'develop' into luke/groups-are-communities

This commit is contained in:
Luke Barnard 2017-10-18 15:57:37 +01:00
commit a40704f085
17 changed files with 1499 additions and 962 deletions

View file

@ -101,7 +101,9 @@
"eslint-plugin-babel": "^4.0.1", "eslint-plugin-babel": "^4.0.1",
"eslint-plugin-flowtype": "^2.30.0", "eslint-plugin-flowtype": "^2.30.0",
"eslint-plugin-react": "^7.4.0", "eslint-plugin-react": "^7.4.0",
"estree-walker": "^0.5.0",
"expect": "^1.16.0", "expect": "^1.16.0",
"flow-parser": "^0.57.3",
"json-loader": "^0.5.3", "json-loader": "^0.5.3",
"karma": "^1.7.0", "karma": "^1.7.0",
"karma-chrome-launcher": "^0.2.3", "karma-chrome-launcher": "^0.2.3",
@ -121,6 +123,7 @@
"rimraf": "^2.4.3", "rimraf": "^2.4.3",
"sinon": "^1.17.3", "sinon": "^1.17.3",
"source-map-loader": "^0.1.5", "source-map-loader": "^0.1.5",
"walk": "^2.3.9",
"webpack": "^1.12.14" "webpack": "^1.12.14"
} }
} }

153
scripts/gen-i18n.js Normal file
View 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"
);

View file

@ -94,13 +94,30 @@ function _onGroupInviteFinished(groupId, addrs) {
} }
function _onGroupAddRoomFinished(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 = []; const errorList = [];
return Promise.all(addrs.map((addr) => { return Promise.all(addrs.map((addr) => {
return groupStore return groupStore
.addRoomToGroup(addr.address) .addRoomToGroup(addr.address)
.catch(() => { errorList.push(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(() => { })).then(() => {
if (errorList.length === 0) { if (errorList.length === 0) {
return; return;

View file

@ -448,8 +448,18 @@ export default React.createClass({
_initGroupStore: function(groupId) { _initGroupStore: function(groupId) {
this._groupStore = GroupStoreCache.getGroupStore(MatrixClientPeg.get(), groupId); this._groupStore = GroupStoreCache.getGroupStore(MatrixClientPeg.get(), groupId);
this._groupStore.on('update', () => { 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({ this.setState({
summary: this._groupStore.getSummary(), summary,
isGroupPublicised: this._groupStore.getGroupPublicity(),
isUserPrivileged: this._groupStore.isUserPrivileged(),
error: null, error: null,
}); });
}); });
@ -598,22 +608,15 @@ export default React.createClass({
}); });
}, },
_onPubliciseOffClick: function() {
this._setPublicity(false);
},
_onPubliciseOnClick: function() {
this._setPublicity(true);
},
_onAddRoomsClick: function() { _onAddRoomsClick: function() {
showGroupAddRoomDialog(this.props.groupId); showGroupAddRoomDialog(this.props.groupId);
}, },
_setPublicity: function(publicity) { _onPublicityToggle: function() {
this.setState({ this.setState({
publicityBusy: true, publicityBusy: true,
}); });
const publicity = !this.state.isGroupPublicised;
this._groupStore.setGroupPublicity(publicity).then(() => { this._groupStore.setGroupPublicity(publicity).then(() => {
this.setState({ this.setState({
publicityBusy: false, publicityBusy: false,
@ -737,100 +740,113 @@ export default React.createClass({
<Spinner /> <Spinner />
</div>; </div>;
} }
return <div className="mx_GroupView_membershipSection mx_GroupView_membershipSection_invited"> 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_membershipSubSection">
<div className="mx_GroupView_membershipSection_description"> <div className="mx_GroupView_membershipSection_description">
{ youAreAMemberText } { _t("%(inviter)s has invited you to join this group", {inviter: group.inviter.userId}) }
</div> </div>
<div className="mx_GroupView_membership_buttonContainer"> <div className="mx_GroupView_membership_buttonContainer">
<AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton" <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} onClick={this._onLeaveClick}
title={leaveButtonTooltip}
> >
{ _t("Leave") } { _t("Leave") }
</AccessibleButton> </AccessibleButton>
</div> </div>
</div> </div>
{ publicisedSection }
</div>; </div>;
} }
return null; 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() { render: function() {
const GroupAvatar = sdk.getComponent("avatars.GroupAvatar"); const GroupAvatar = sdk.getComponent("avatars.GroupAvatar");
const Loader = sdk.getComponent("elements.Spinner"); const Spinner = sdk.getComponent("elements.Spinner");
const TintableSvg = sdk.getComponent("elements.TintableSvg"); const TintableSvg = sdk.getComponent("elements.TintableSvg");
if (this.state.summary === null && this.state.error === null || this.state.saving) { if (this.state.summary === null && this.state.error === null || this.state.saving) {
return <Loader />; return <Spinner />;
} else if (this.state.summary) { } else if (this.state.summary) {
const summary = this.state.summary; const summary = this.state.summary;
let avatarNode; let avatarNode;
let nameNode; let nameNode;
let shortDescNode; let shortDescNode;
let bodyNodes = []; const bodyNodes = [
this._getMembershipSection(),
this.state.editing ? this._getMemberSettingsSection() : null,
this._getLongDescriptionNode(),
this._getRoomsNode(),
];
const rightButtons = []; const rightButtons = [];
const headerClasses = { const headerClasses = {
mx_GroupView_header: true, mx_GroupView_header: true,
@ -838,7 +854,7 @@ export default React.createClass({
if (this.state.editing) { if (this.state.editing) {
let avatarImage; let avatarImage;
if (this.state.uploadingAvatar) { if (this.state.uploadingAvatar) {
avatarImage = <Loader />; avatarImage = <Spinner />;
} else { } else {
const GroupAvatar = sdk.getComponent('avatars.GroupAvatar'); const GroupAvatar = sdk.getComponent('avatars.GroupAvatar');
avatarImage = <GroupAvatar groupId={this.props.groupId} avatarImage = <GroupAvatar groupId={this.props.groupId}
@ -887,15 +903,6 @@ export default React.createClass({
width="18" height="18" alt={_t("Cancel")} /> width="18" height="18" alt={_t("Cancel")} />
</AccessibleButton>, </AccessibleButton>,
); );
bodyNodes = [
<textarea className="mx_GroupView_editLongDesc"
value={this.state.profileForm.long_description}
onChange={this._onLongDescChange}
tabIndex="3"
key="editLongDesc"
/>,
this._getRoomsNode(),
];
} else { } else {
const groupAvatarUrl = summary.profile ? summary.profile.avatar_url : null; const groupAvatarUrl = summary.profile ? summary.profile.avatar_url : null;
avatarNode = <GroupAvatar avatarNode = <GroupAvatar
@ -916,25 +923,13 @@ export default React.createClass({
if (summary.profile && summary.profile.short_description) { if (summary.profile && summary.profile.short_description) {
shortDescNode = <span>{ summary.profile.short_description }</span>; shortDescNode = <span>{ summary.profile.short_description }</span>;
} }
rightButtons.push(
let description = null; <AccessibleButton className="mx_GroupHeader_button"
if (summary.profile && summary.profile.long_description) { onClick={this._onEditClick} title={_t("Community Settings")} key="_editButton"
description = sanitizedHtmlNode(summary.profile.long_description); >
} <TintableSvg src="img/icons-settings-room.svg" width="16" height="16" />
bodyNodes = [ </AccessibleButton>,
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>,
);
}
if (this.props.collapsedRhs) { if (this.props.collapsedRhs) {
rightButtons.push( rightButtons.push(
<AccessibleButton className="mx_GroupHeader_button" <AccessibleButton className="mx_GroupHeader_button"

View file

@ -489,7 +489,12 @@ module.exports = React.createClass({
const AddressTile = sdk.getComponent("elements.AddressTile"); const AddressTile = sdk.getComponent("elements.AddressTile");
for (let i = 0; i < this.state.userList.length; i++) { for (let i = 0; i < this.state.userList.length; i++) {
query.push( 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 = (
<AddressSelector ref={(ref) => {this.addressSelector = ref;}} <AddressSelector ref={(ref) => {this.addressSelector = ref;}}
addressList={this.state.queryList} addressList={this.state.queryList}
showAddress={this.props.pickerType === 'user'}
onSelected={this.onSelected} onSelected={this.onSelected}
truncateAt={TRUNCATE_QUERY_LIST} truncateAt={TRUNCATE_QUERY_LIST}
/> />

View file

@ -30,6 +30,8 @@ export default React.createClass({
// List of the addresses to display // List of the addresses to display
addressList: React.PropTypes.arrayOf(UserAddressType).isRequired, addressList: React.PropTypes.arrayOf(UserAddressType).isRequired,
// Whether to show the address on the address tiles
showAddress: React.PropTypes.bool,
truncateAt: React.PropTypes.number.isRequired, truncateAt: React.PropTypes.number.isRequired,
selected: React.PropTypes.number, selected: React.PropTypes.number,
@ -142,7 +144,13 @@ export default React.createClass({
key={this.props.addressList[i].addressType + "/" + this.props.addressList[i].address} key={this.props.addressList[i].addressType + "/" + this.props.addressList[i].address}
ref={(ref) => { this.addressListElement = ref; }} 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>, </div>,
); );
} }

View file

@ -87,7 +87,10 @@ export default React.createClass({
info = ( info = (
<div className="mx_AddressTile_mx"> <div className="mx_AddressTile_mx">
<div className={nameClasses}>{ name }</div> <div className={nameClasses}>{ name }</div>
<div className={idClasses}>{ address.address }</div> { this.props.showAddress ?
<div className={idClasses}>{ address.address }</div> :
<div />
}
</div> </div>
); );
} else if (isMatrixAddress) { } else if (isMatrixAddress) {

View file

@ -161,10 +161,11 @@ export default withMatrixClient(React.createClass({
{ this.makeGroupMemberTiles(this.state.searchQuery, this.state.members) } { this.makeGroupMemberTiles(this.state.searchQuery, this.state.members) }
</div> : <div />; </div> : <div />;
const invited = this.state.invitedMembers ? <div className="mx_MemberList_invited"> const invited = (this.state.invitedMembers && this.state.invitedMembers.length > 0) ?
<h2>{ _t("Invited") }</h2> <div className="mx_MemberList_invited">
{ this.makeGroupMemberTiles(this.state.searchQuery, this.state.invitedMembers) } <h2>{ _t("Invited") }</h2>
</div> : <div />; { this.makeGroupMemberTiles(this.state.searchQuery, this.state.invitedMembers) }
</div> : <div />;
return ( return (
<div className="mx_MemberList"> <div className="mx_MemberList">

View file

@ -61,5 +61,7 @@
"Thursday": "Dijous", "Thursday": "Dijous",
"Friday": "Divendres", "Friday": "Divendres",
"Saturday": "Dissabte", "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é"
} }

View file

@ -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 display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s hat den Anzeigenamen von \"%(oldDisplayName)s\" auf \"%(displayName)s\" geändert.",
"%(senderName)s changed their profile picture.": "%(senderName)s hat das Profilbild geändert.", "%(senderName)s changed their profile picture.": "%(senderName)s hat das Profilbild geändert.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s änderte den Raumnamen zu %(roomName)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s 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\".", "%(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", "/ddg is not a command": "/ddg ist kein Kommando",
"%(senderName)s ended the call.": "%(senderName)s hat den Anruf beendet.", "%(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.", "%(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 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, 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 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).", "%(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", "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", "%(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", "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)shaben ihre Einladung %(repeats)s-mal abgelehnt",
"%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)shat die Einladung %(repeats)s mal abgelehnt", "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)shat die Einladung %(repeats)s mal abgelehnt",
"%(severalUsers)srejected their invitations": "%(severalUsers)shaben ihre Einladung abgelehnt", "%(severalUsers)srejected their invitations": "%(severalUsers)shaben ihre Einladungen abgelehnt",
"%(oneUser)srejected their invitation": "%(oneUser)shat die Einladung 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", "%(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", "%(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 %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s",
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(day)s %(monthName)s", "%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(day)s %(monthName)s",
"Copied!": "Kopiert!", "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

View file

@ -825,5 +825,27 @@
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(fullYear)sko %(monthName)sk %(day)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(fullYear)sko %(monthName)sk %(day)s",
"Copied!": "Kopiatuta!", "Copied!": "Kopiatuta!",
"Failed to copy": "Kopiak huts egin du", "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:"
} }

View file

@ -182,7 +182,7 @@
"Failed to unban": "Porttikiellon poistaminen epäonnistui", "Failed to unban": "Porttikiellon poistaminen epäonnistui",
"Failed to upload file": "Tiedoston lataaminen epäonnistui", "Failed to upload file": "Tiedoston lataaminen epäonnistui",
"Failed to upload profile picture!": "Profiilikuvan 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", "Failure to create room": "Huoneen luominen epäonnistui",
"favourite": "suosikki", "favourite": "suosikki",
"Favourites": "Suosikit", "Favourites": "Suosikit",
@ -330,7 +330,7 @@
"unknown caller": "tuntematon soittaja", "unknown caller": "tuntematon soittaja",
"unknown device": "tuntematon laite", "unknown device": "tuntematon laite",
"Unknown room %(roomId)s": "Tuntematon huone %(roomId)s", "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", "Unmute": "Poista mykistys",
"Unnamed Room": "Nimeämätön huone", "Unnamed Room": "Nimeämätön huone",
"Unrecognised command:": "Tuntematon komento:", "Unrecognised command:": "Tuntematon komento:",

View file

@ -827,5 +827,105 @@
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(monthName)s %(day)s", "%(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", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(fullYear)s %(monthName)s %(day)s",
"Copied!": "Lemásolva!", "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"
} }

View file

@ -893,5 +893,53 @@
"%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s adicionado por %(senderName)s", "%(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 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", "%(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)"
} }

View file

@ -437,7 +437,7 @@
"tag direct chat": "Тег прямого чата", "tag direct chat": "Тег прямого чата",
"The default role for new room members is": "Роль по умолчанию для новых участников комнаты", "The default role for new room members is": "Роль по умолчанию для новых участников комнаты",
"The main address for this room is": "Основной адрес для этой комнаты", "The main address for this room is": "Основной адрес для этой комнаты",
"This email address is already in use": "Этот адрес электронной почты уже используется", "This email address is already in use": "Этот адрес эл. почты уже используется",
"This email address was not found": "Этот адрес электронной почты не найден", "This email address was not found": "Этот адрес электронной почты не найден",
"The email address linked to your account must be entered.": "Необходимо ввести адрес электронной почты, связанный с вашей учетной записью.", "The email address linked to your account must be entered.": "Необходимо ввести адрес электронной почты, связанный с вашей учетной записью.",
"The file '%(fileName)s' failed to upload": "Не удалось отправить файл '%(fileName)s'", "The file '%(fileName)s' failed to upload": "Не удалось отправить файл '%(fileName)s'",
@ -549,8 +549,8 @@
"device id: ": "ID устройства: ", "device id: ": "ID устройства: ",
"Device key:": "Ключ устройства:", "Device key:": "Ключ устройства:",
"disabled": "отключено", "disabled": "отключено",
"Email address": "Адрес электронной почты", "Email address": "Адрес эл. почты",
"Email address (optional)": "Адрес электронной почты (необязательно)", "Email address (optional)": "Адрес эл. почты (необязательно)",
"enabled": "включено", "enabled": "включено",
"Error decrypting attachment": "Ошибка при расшифровке вложения", "Error decrypting attachment": "Ошибка при расшифровке вложения",
"Export": "Экспорт", "Export": "Экспорт",
@ -877,5 +877,105 @@
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(monthName)s %(day)s", "%(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", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s",
"Copied!": "Скопировано!", "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": "Добавить комнаты в эту группу"
} }

View file

@ -61,6 +61,14 @@ export default class GroupStore extends EventEmitter {
return this._rooms; 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) { addRoomToGroup(roomId) {
return this._matrixClient return this._matrixClient
.addRoomToGroup(this.groupId, roomId) .addRoomToGroup(this.groupId, roomId)