Merge remote-tracking branch 'origin/develop' into dbkr/e2e_backups

This commit is contained in:
David Baker 2018-10-02 16:59:15 +01:00
commit fa30707eae
38 changed files with 1067 additions and 593 deletions

View file

@ -34,5 +34,5 @@ ln -s $REACT_SDK_DIR/$RIOT_WEB_DIR riot/riot-web
# PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ./install.sh
# CHROME_PATH=$(which google-chrome-stable) ./run.sh
./install.sh
./run.sh
./run.sh --travis
popd

View file

@ -1,3 +1,48 @@
Changes in [0.13.5](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.5) (2018-10-01)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.5-rc.1...v0.13.5)
* No changes since rc.1
Changes in [0.13.5-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.5-rc.1) (2018-09-27)
===============================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.4...v0.13.5-rc.1)
* resync when LL is toggled, show message when enabled
[\#2178](https://github.com/matrix-org/matrix-react-sdk/pull/2178)
* Update from Weblate.
[\#2179](https://github.com/matrix-org/matrix-react-sdk/pull/2179)
* Split npm start into an init and watch script
[\#2175](https://github.com/matrix-org/matrix-react-sdk/pull/2175)
* show canonical aliases in timeline, and set/remove implicit ones
[\#2171](https://github.com/matrix-org/matrix-react-sdk/pull/2171)
* Fix stale RR and improve LL reliability in RoomView & MemberList.
[\#2168](https://github.com/matrix-org/matrix-react-sdk/pull/2168)
* pass --travis flag to e2e tests to disable tests known not to work Travis CI
[\#2170](https://github.com/matrix-org/matrix-react-sdk/pull/2170)
* Add m.room.aliases to the timeline
[\#2167](https://github.com/matrix-org/matrix-react-sdk/pull/2167)
* postpone loading the members until the user joined the room
[\#2165](https://github.com/matrix-org/matrix-react-sdk/pull/2165)
* Allow translation tags object to be a variable
[\#2166](https://github.com/matrix-org/matrix-react-sdk/pull/2166)
* Don't try to exit fullscreen if not fullscreen
[\#2164](https://github.com/matrix-org/matrix-react-sdk/pull/2164)
* avoid updating the memberlist while the spinner is shown
[\#2161](https://github.com/matrix-org/matrix-react-sdk/pull/2161)
* fix logging room id when LL members fail
[\#2163](https://github.com/matrix-org/matrix-react-sdk/pull/2163)
* dont keep the spinner in the memberlist when fetching /members fails
[\#2162](https://github.com/matrix-org/matrix-react-sdk/pull/2162)
* only dispatch an action for self-membership
[\#2160](https://github.com/matrix-org/matrix-react-sdk/pull/2160)
* avoid unneeded lookups in memberDict
[\#2153](https://github.com/matrix-org/matrix-react-sdk/pull/2153)
* Update from Weblate.
[\#2157](https://github.com/matrix-org/matrix-react-sdk/pull/2157)
* avoid memberlist refresh for events related to rooms other but the current
[\#2156](https://github.com/matrix-org/matrix-react-sdk/pull/2156)
Changes in [0.13.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.4) (2018-09-10)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.4-rc.1...v0.13.4)

View file

@ -1,6 +1,6 @@
{
"name": "matrix-react-sdk",
"version": "0.13.4",
"version": "0.13.5",
"description": "SDK for matrix.org using React",
"author": "matrix.org",
"repository": {
@ -38,10 +38,12 @@
"reskindex:watch": "node scripts/reskindex.js -h header -w",
"i18n": "matrix-gen-i18n",
"prunei18n": "matrix-prune-i18n",
"build": "npm run reskindex && babel src -d lib --source-maps --copy-files",
"build:watch": "babel src -w -d lib --source-maps --copy-files",
"build": "npm run reskindex && npm run start:init",
"build:watch": "babel src -w --skip-initial-build -d lib --source-maps --copy-files",
"emoji-data-strip": "node scripts/emoji-data-strip.js",
"start": "parallelshell \"npm run build:watch\" \"npm run reskindex:watch\"",
"start": "npm run start:init && npm run start:all",
"start:all": "concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n build,reskindex \"npm run build:watch\" \"npm run reskindex:watch\"",
"start:init": "babel src -d lib --source-maps --copy-files",
"lint": "eslint src/",
"lintall": "eslint src/ test/",
"lintwithexclusions": "eslint --max-warnings 20 --ignore-path .eslintignore.errorfiles src test",
@ -73,7 +75,7 @@
"linkifyjs": "^2.1.6",
"lodash": "^4.13.1",
"lolex": "2.3.2",
"matrix-js-sdk": "0.11.0",
"matrix-js-sdk": "0.11.1",
"optimist": "^0.6.1",
"pako": "^1.0.5",
"prop-types": "^15.5.8",
@ -85,15 +87,15 @@
"react-dom": "^15.6.0",
"react-gemini-scrollbar": "matrix-org/react-gemini-scrollbar#5e97aef",
"resize-observer-polyfill": "^1.5.0",
"sanitize-html": "^1.18.4",
"slate": "0.34.7",
"slate-react": "^0.12.4",
"slate-html-serializer": "^0.6.1",
"slate-md-serializer": "matrix-org/slate-md-serializer#f7c4ad3",
"sanitize-html": "^1.18.4",
"slate-react": "^0.12.4",
"text-encoding-utf-8": "^1.0.1",
"url": "^0.11.0",
"velocity-vector": "vector-im/velocity#059e3b2",
"whatwg-fetch": "^1.0.0"
"whatwg-fetch": "^1.1.1"
},
"devDependencies": {
"babel-cli": "^6.5.2",
@ -111,6 +113,7 @@
"babel-preset-es2017": "^6.14.0",
"babel-preset-react": "^6.11.1",
"chokidar": "^1.6.1",
"concurrently": "^4.0.1",
"eslint": "^3.13.1",
"eslint-config-google": "^0.7.1",
"eslint-plugin-babel": "^4.0.1",
@ -120,20 +123,19 @@
"expect": "^1.16.0",
"flow-parser": "^0.57.3",
"json-loader": "^0.5.3",
"karma": "^1.7.0",
"karma": "^3.0.0",
"karma-chrome-launcher": "^0.2.3",
"karma-cli": "^0.1.2",
"karma-junit-reporter": "^0.4.1",
"karma-junit-reporter": "^1.2.0",
"karma-logcapture-reporter": "0.0.1",
"karma-mocha": "^0.2.2",
"karma-sourcemap-loader": "^0.3.7",
"karma-spec-reporter": "^0.0.31",
"karma-summary-reporter": "^1.3.3",
"karma-webpack": "^1.7.0",
"karma-webpack": "^3.0.5",
"matrix-mock-request": "^1.2.1",
"matrix-react-test-utils": "^0.1.1",
"mocha": "^5.0.5",
"parallelshell": "3.0.1",
"react-addons-test-utils": "^15.4.0",
"require-json": "0.0.1",
"rimraf": "^2.4.3",

View file

@ -158,6 +158,7 @@ function getTranslationsJs(file) {
} catch (e) {
console.log();
console.error(`ERROR: ${file}:${node.loc.start.line} ${tKey}`);
console.error(e);
process.exit(1);
}
}

View file

@ -31,6 +31,7 @@ import RtsClient from './RtsClient';
import Modal from './Modal';
import sdk from './index';
import ActiveWidgetStore from './stores/ActiveWidgetStore';
import PlatformPeg from "./PlatformPeg";
/**
* Called at startup, to attempt to build a logged-in Matrix session. It tries
@ -237,6 +238,27 @@ async function _restoreFromLocalStorage() {
function _handleLoadSessionFailure(e) {
console.log("Unable to load session", e);
if (e instanceof Matrix.InvalidStoreError) {
if (e.reason === Matrix.InvalidStoreError.TOGGLED_LAZY_LOADING) {
return Promise.resolve().then(() => {
const lazyLoadEnabled = e.value;
if (lazyLoadEnabled) {
const LazyLoadingResyncDialog =
sdk.getComponent("views.dialogs.LazyLoadingResyncDialog");
return new Promise((resolve) => {
Modal.createDialog(LazyLoadingResyncDialog, {
onFinished: resolve,
});
});
}
}).then(() => {
return MatrixClientPeg.get().store.deleteAllData();
}).then(() => {
PlatformPeg.get().reload();
});
}
}
const def = Promise.defer();
const SessionRestoreErrorDialog =
sdk.getComponent('views.dialogs.SessionRestoreErrorDialog');

View file

@ -63,7 +63,7 @@ class ScalarAuthClient {
validateToken(token) {
let url = SdkConfig.get().integrations_rest_url + "/account";
const defer = Promise.defer();
return new Promise(function(resolve, reject) {
request({
method: "GET",
uri: url,
@ -71,17 +71,16 @@ class ScalarAuthClient {
json: true,
}, (err, response, body) => {
if (err) {
defer.reject(err);
reject(err);
} else if (response.statusCode / 100 !== 2) {
defer.reject({statusCode: response.statusCode});
reject({statusCode: response.statusCode});
} else if (!body || !body.user_id) {
defer.reject(new Error("Missing user_id in response"));
reject(new Error("Missing user_id in response"));
} else {
defer.resolve(body.user_id);
resolve(body.user_id);
}
});
return defer.promise;
})
}
registerForToken() {
@ -96,9 +95,9 @@ class ScalarAuthClient {
}
exchangeForScalarToken(openid_token_object) {
const defer = Promise.defer();
const scalar_rest_url = SdkConfig.get().integrations_rest_url;
return new Promise(function(resolve, reject) {
request({
method: 'POST',
uri: scalar_rest_url+'/register',
@ -106,46 +105,44 @@ class ScalarAuthClient {
json: true,
}, (err, response, body) => {
if (err) {
defer.reject(err);
reject(err);
} else if (response.statusCode / 100 !== 2) {
defer.reject({statusCode: response.statusCode});
reject({statusCode: response.statusCode});
} else if (!body || !body.scalar_token) {
defer.reject(new Error("Missing scalar_token in response"));
reject(new Error("Missing scalar_token in response"));
} else {
defer.resolve(body.scalar_token);
resolve(body.scalar_token);
}
});
return defer.promise;
})
}
getScalarPageTitle(url) {
const defer = Promise.defer();
let scalarPageLookupUrl = SdkConfig.get().integrations_rest_url + '/widgets/title_lookup';
scalarPageLookupUrl = this.getStarterLink(scalarPageLookupUrl);
scalarPageLookupUrl += '&curl=' + encodeURIComponent(url);
return new Promise(function(resolve, reject) {
request({
method: 'GET',
uri: scalarPageLookupUrl,
json: true,
}, (err, response, body) => {
if (err) {
defer.reject(err);
reject(err);
} else if (response.statusCode / 100 !== 2) {
defer.reject({statusCode: response.statusCode});
reject({statusCode: response.statusCode});
} else if (!body) {
defer.reject(new Error("Missing page title in response"));
reject(new Error("Missing page title in response"));
} else {
let title = "";
if (body.page_title_cache_item && body.page_title_cache_item.cached_title) {
title = body.page_title_cache_item.cached_title;
}
defer.resolve(title);
resolve(title);
}
});
return defer.promise;
})
}
/**

View file

@ -198,6 +198,64 @@ function textForMessageEvent(ev) {
return message;
}
function textForRoomAliasesEvent(ev) {
// An alternative implementation of this as a first-class event can be found at
// https://github.com/matrix-org/matrix-react-sdk/blob/dc7212ec2bd12e1917233ed7153b3e0ef529a135/src/components/views/messages/RoomAliasesEvent.js
// This feels a bit overkill though, and it's not clear the i18n really needs it
// so instead it's landing as a simple textual event.
const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
const oldAliases = ev.getPrevContent().aliases || [];
const newAliases = ev.getContent().aliases || [];
const addedAliases = newAliases.filter((x) => !oldAliases.includes(x));
const removedAliases = oldAliases.filter((x) => !newAliases.includes(x));
if (!addedAliases.length && !removedAliases.length) {
return '';
}
if (addedAliases.length && !removedAliases.length) {
return _t('%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.', {
senderName: senderName,
count: addedAliases.length,
addedAddresses: addedAliases.join(', '),
});
} else if (!addedAliases.length && removedAliases.length) {
return _t('%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.', {
senderName: senderName,
count: removedAliases.length,
removedAddresses: removedAliases.join(', '),
});
} else {
return _t(
'%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.', {
senderName: senderName,
addedAddresses: addedAliases.join(', '),
removedAddresses: removedAliases.join(', '),
},
);
}
}
function textForCanonicalAliasEvent(ev) {
const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
const oldAlias = ev.getPrevContent().alias;
const newAlias = ev.getContent().alias;
if (newAlias) {
return _t('%(senderName)s set the main address for this room to %(address)s.', {
senderName: senderName,
address: ev.getContent().alias,
});
}
else if (oldAlias) {
return _t('%(senderName)s removed the main address for this room.', {
senderName: senderName,
});
}
}
function textForCallAnswerEvent(event) {
const senderName = event.sender ? event.sender.name : _t('Someone');
const supported = MatrixClientPeg.get().supportsVoip() ? '' : _t('(not supported by this browser)');
@ -215,6 +273,12 @@ function textForCallHangupEvent(event) {
reason = _t('(could not connect media)');
} else if (eventContent.reason === "invite_timeout") {
reason = _t('(no answer)');
} else if (eventContent.reason === "user hangup") {
// workaround for https://github.com/vector-im/riot-web/issues/5178
// it seems Android randomly sets a reason of "user hangup" which is
// interpreted as an error code :(
// https://github.com/vector-im/riot-android/issues/2623
reason = '';
} else {
reason = _t('(unknown failure: %(reason)s)', {reason: eventContent.reason});
}
@ -359,6 +423,8 @@ const handlers = {
};
const stateHandlers = {
'm.room.aliases': textForRoomAliasesEvent,
'm.room.canonical_alias': textForCanonicalAliasEvent,
'm.room.name': textForRoomNameEvent,
'm.room.topic': textForTopicEvent,
'm.room.member': textForMemberEvent,

View file

@ -144,26 +144,25 @@ function createRoomTimelineAction(matrixClient, timelineEvent, room, toStartOfTi
/**
* @typedef RoomMembershipAction
* @type {Object}
* @property {string} action 'MatrixActions.RoomMember.membership'.
* @property {RoomMember} member the member whose membership was updated.
* @property {string} action 'MatrixActions.Room.myMembership'.
* @property {Room} room to room for which the self-membership changed.
* @property {string} membership the new membership
* @property {string} oldMembership the previous membership, can be null.
*/
/**
* Create a MatrixActions.Room.selfMembership action that represents
* a MatrixClient `RoomMember.membership` matrix event for the syncing user,
* emitted when the member's membership is updated.
* Create a MatrixActions.Room.myMembership action that represents
* a MatrixClient `Room.myMembership` event for the syncing user,
* emitted when the syncing user's membership is updated for a room.
*
* @param {MatrixClient} matrixClient the matrix client.
* @param {MatrixEvent} membershipEvent the m.room.member event.
* @param {RoomMember} member the member whose membership was updated.
* @param {string} oldMembership the member's previous membership.
* @returns {RoomMembershipAction} an action of type `MatrixActions.RoomMember.membership`.
* @param {Room} room to room for which the self-membership changed.
* @param {string} membership the new membership
* @param {string} oldMembership the previous membership, can be null.
* @returns {RoomMembershipAction} an action of type `MatrixActions.Room.myMembership`.
*/
function createSelfRoomMembershipAction(matrixClient, membershipEvent, member, oldMembership) {
if (member.userId === matrixClient.getUserId()) {
return { action: 'MatrixActions.Room.selfMembership', member };
}
return null;
function createSelfMembershipAction(matrixClient, room, membership, oldMembership) {
return { action: 'MatrixActions.Room.myMembership', room, membership, oldMembership};
}
/**
@ -205,7 +204,7 @@ export default {
this._addMatrixClientListener(matrixClient, 'Room', createRoomAction);
this._addMatrixClientListener(matrixClient, 'Room.tags', createRoomTagsAction);
this._addMatrixClientListener(matrixClient, 'Room.timeline', createRoomTimelineAction);
this._addMatrixClientListener(matrixClient, 'RoomMember.membership', createSelfRoomMembershipAction);
this._addMatrixClientListener(matrixClient, 'Room.myMembership', createSelfMembershipAction);
this._addMatrixClientListener(matrixClient, 'Event.decrypted', createEventDecryptedAction);
},

View file

@ -286,6 +286,14 @@ export default React.createClass({
register_hs_url: paramHs,
});
}
// Set a default IS with query param `is_url`
const paramIs = this.props.startingFragmentQueryParams.is_url;
if (paramIs) {
console.log('Setting register_is_url ', paramIs);
this.setState({
register_is_url: paramIs,
});
}
// a thing to call showScreen with once login completes. this is kept
// outside this.state because updating it should never trigger a
@ -1253,8 +1261,8 @@ export default React.createClass({
// its own dispatch).
dis.dispatch({action: 'sync_state', prevState, state});
if (state === "ERROR") {
self.setState({syncError: data.error});
if (state === "ERROR" || state === "RECONNECTING") {
self.setState({syncError: data.error || true});
} else if (self.state.syncError) {
self.setState({syncError: null});
}

View file

@ -91,13 +91,16 @@ module.exports = React.createClass({
},
getInitialState: function() {
const llMembers = MatrixClientPeg.get().hasLazyLoadMembersEnabled();
return {
room: null,
roomId: null,
roomLoading: true,
peekLoading: false,
shouldPeek: true,
// used to trigger a rerender in TimelinePanel once the members are loaded,
// so RR are rendered again (now with the members available), ...
membersLoaded: !llMembers,
// The event to be scrolled to initially
initialEventId: null,
// The offset in pixels from the event with which to scroll vertically
@ -148,7 +151,7 @@ module.exports = React.createClass({
MatrixClientPeg.get().on("Room.name", this.onRoomName);
MatrixClientPeg.get().on("Room.accountData", this.onRoomAccountData);
MatrixClientPeg.get().on("RoomState.members", this.onRoomStateMember);
MatrixClientPeg.get().on("RoomMember.membership", this.onRoomMemberMembership);
MatrixClientPeg.get().on("Room.myMembership", this.onMyMembership);
MatrixClientPeg.get().on("accountData", this.onAccountData);
// Start listening for RoomViewStore updates
@ -314,16 +317,6 @@ module.exports = React.createClass({
// Stop peeking because we have joined this room previously
MatrixClientPeg.get().stopPeeking();
this.setState({isPeeking: false});
// lazy load members if enabled
if (SettingsStore.isFeatureEnabled('feature_lazyloading')) {
room.loadMembersIfNeeded().catch((err) => {
const errorMessage = `Fetching room members for ${room.roomId} failed.` +
" Room members will appear incomplete.";
console.error(errorMessage);
console.error(err);
});
}
}
}
},
@ -422,8 +415,8 @@ module.exports = React.createClass({
MatrixClientPeg.get().removeListener("Room.timeline", this.onRoomTimeline);
MatrixClientPeg.get().removeListener("Room.name", this.onRoomName);
MatrixClientPeg.get().removeListener("Room.accountData", this.onRoomAccountData);
MatrixClientPeg.get().removeListener("Room.myMembership", this.onMyMembership);
MatrixClientPeg.get().removeListener("RoomState.members", this.onRoomStateMember);
MatrixClientPeg.get().removeListener("RoomMember.membership", this.onRoomMemberMembership);
MatrixClientPeg.get().removeListener("accountData", this.onAccountData);
}
@ -592,6 +585,27 @@ module.exports = React.createClass({
this._warnAboutEncryption(room);
this._calculatePeekRules(room);
this._updatePreviewUrlVisibility(room);
this._loadMembersIfJoined(room);
},
_loadMembersIfJoined: async function(room) {
// lazy load members if enabled
const cli = MatrixClientPeg.get();
if (cli.hasLazyLoadMembersEnabled()) {
if (room && room.getMyMembership() === 'join') {
try {
await room.loadMembersIfNeeded();
if (!this.unmounted) {
this.setState({membersLoaded: true});
}
} catch (err) {
const errorMessage = `Fetching room members for ${room.roomId} failed.` +
" Room members will appear incomplete.";
console.error(errorMessage);
console.error(err);
}
}
}
},
_warnAboutEncryption: function(room) {
@ -703,9 +717,10 @@ module.exports = React.createClass({
this._updateRoomMembers();
},
onRoomMemberMembership: function(ev, member, oldMembership) {
if (member.userId == MatrixClientPeg.get().credentials.userId) {
onMyMembership: function(room, membership, oldMembership) {
if (room.roomId === this.state.roomId) {
this.forceUpdate();
this._loadMembersIfJoined(room);
}
},
@ -1753,6 +1768,7 @@ module.exports = React.createClass({
onReadMarkerUpdated={this._updateTopUnreadMessagesBar}
showUrlPreview = {this.state.showUrlPreview}
className="mx_RoomView_messagePanel"
membersLoaded={this.state.membersLoaded}
/>);
let topUnreadMessagesBar = null;

View file

@ -814,7 +814,7 @@ module.exports = React.createClass({
}
return (
<div>
<h3>{ _t("Debug Logs Submission") }</h3>
<h3>{ _t("Submit Debug Logs") }</h3>
<div className="mx_UserSettings_section">
<p>{
_t( "If you've submitted a bug via GitHub, debug logs can help " +

View file

@ -321,6 +321,12 @@ module.exports = React.createClass({
case "RegistrationForm.ERR_PHONE_NUMBER_INVALID":
errMsg = _t('This doesn\'t look like a valid phone number.');
break;
case "RegistrationForm.ERR_MISSING_EMAIL":
errMsg = _t('An email address is required to register on this homeserver.');
break;
case "RegistrationForm.ERR_MISSING_PHONE_NUMBER":
errMsg = _t('A phone number is required to register on this homeserver.');
break;
case "RegistrationForm.ERR_USERNAME_INVALID":
errMsg = _t('User names may only contain letters, numbers, dots, hyphens and underscores.');
break;

View file

@ -140,9 +140,9 @@ export default class BugReportDialog extends React.Component {
"not contain messages.",
) }
</p>
<p>
<p><b>
{ _t(
"Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.",
"Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.",
{},
{
a: (sub) => <a
@ -153,13 +153,13 @@ export default class BugReportDialog extends React.Component {
</a>,
},
) }
</p>
</b></p>
<div className="mx_BugReportDialog_field_container">
<label
htmlFor="mx_BugReportDialog_issueUrl"
className="mx_BugReportDialog_field_label"
>
{ _t("GitHub issue link:") }
{ _t("What GitHub issue are these logs for?") }
</label>
<input
id="mx_BugReportDialog_issueUrl"
@ -167,7 +167,7 @@ export default class BugReportDialog extends React.Component {
className="mx_BugReportDialog_field_input"
onChange={this._onIssueUrlChange}
value={this.state.issueUrl}
placeholder="https://github.com/vector-im/riot-web/issues/1337"
placeholder="https://github.com/vector-im/riot-web/issues/..."
/>
</div>
<div className="mx_BugReportDialog_field_container">

View file

@ -0,0 +1,32 @@
/*
Copyright 2018 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.
*/
import React from 'react';
import QuestionDialog from './QuestionDialog';
import { _t } from '../../../languageHandler';
export default (props) => {
const description =
_t("Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!");
return (<QuestionDialog
hasCancelButton={false}
title={_t("Updating Riot")}
description={<div>{description}</div>}
button={_t("OK")}
onFinished={props.onFinished}
/>);
};

View file

@ -182,12 +182,16 @@ module.exports = React.createClass({
});
}
const emailValid = email === '' || Email.looksValid(email);
this.markFieldValid(field_id, emailValid, "RegistrationForm.ERR_EMAIL_INVALID");
if (this._authStepIsRequired('m.login.email.identity') && (!emailValid || email === '')) {
this.markFieldValid(field_id, false, "RegistrationForm.ERR_MISSING_EMAIL");
} else this.markFieldValid(field_id, emailValid, "RegistrationForm.ERR_EMAIL_INVALID");
break;
case FIELD_PHONE_NUMBER:
const phoneNumber = this.refs.phoneNumber ? this.refs.phoneNumber.value : '';
const phoneNumberValid = phoneNumber === '' || phoneNumberLooksValid(phoneNumber);
this.markFieldValid(field_id, phoneNumberValid, "RegistrationForm.ERR_PHONE_NUMBER_INVALID");
if (this._authStepIsRequired('m.login.msisdn') && (!phoneNumberValid || phoneNumber === '')) {
this.markFieldValid(field_id, false, "RegistrationForm.ERR_MISSING_PHONE_NUMBER");
} else this.markFieldValid(field_id, phoneNumberValid, "RegistrationForm.ERR_PHONE_NUMBER_INVALID");
break;
case FIELD_USERNAME:
// XXX: SPEC-1

View file

@ -1,5 +1,6 @@
/*
Copyright 2016 OpenMarket Ltd
Copyright 2018 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.
@ -97,18 +98,19 @@ module.exports = React.createClass({
}
}
// save new canonical alias
let oldCanonicalAlias = null;
if (this.props.canonicalAliasEvent) {
oldCanonicalAlias = this.props.canonicalAliasEvent.getContent().alias;
}
if (oldCanonicalAlias !== this.state.canonicalAlias) {
let newCanonicalAlias = this.state.canonicalAlias;
if (this.props.canSetCanonicalAlias && oldCanonicalAlias !== newCanonicalAlias) {
console.log("AliasSettings: Updating canonical alias");
promises = [Promise.all(promises).then(
MatrixClientPeg.get().sendStateEvent(
this.props.roomId, "m.room.canonical_alias", {
alias: this.state.canonicalAlias,
alias: newCanonicalAlias,
}, "",
),
)];
@ -145,6 +147,7 @@ module.exports = React.createClass({
if (!alias || alias.length === 0) return; // ignore attempts to create blank aliases
const localDomain = MatrixClientPeg.get().getDomain();
if (!alias.includes(':')) alias += ':' + localDomain;
if (this.isAliasValid(alias) && alias.endsWith(localDomain)) {
this.state.domainToAliases[localDomain] = this.state.domainToAliases[localDomain] || [];
this.state.domainToAliases[localDomain].push(alias);
@ -161,11 +164,18 @@ module.exports = React.createClass({
description: _t('\'%(alias)s\' is not a valid format for an alias', { alias: alias }),
});
}
if (!this.props.canonicalAlias) {
this.setState({
canonicalAlias: alias
});
}
},
onLocalAliasChanged: function(alias, index) {
if (alias === "") return; // hit the delete button to delete please
const localDomain = MatrixClientPeg.get().getDomain();
if (!alias.includes(':')) alias += ':' + localDomain;
if (this.isAliasValid(alias) && alias.endsWith(localDomain)) {
this.state.domainToAliases[localDomain][index] = alias;
} else {
@ -184,10 +194,15 @@ module.exports = React.createClass({
// promptly setState anyway, it's just about acceptable. The alternative
// would be to arbitrarily deepcopy to a temp variable and then setState
// that, but why bother when we can cut this corner.
this.state.domainToAliases[localDomain].splice(index, 1);
const alias = this.state.domainToAliases[localDomain].splice(index, 1);
this.setState({
domainToAliases: this.state.domainToAliases,
});
if (this.props.canonicalAlias === alias) {
this.setState({
canonicalAlias: null,
});
}
},
onCanonicalAliasChange: function(event) {
@ -204,12 +219,14 @@ module.exports = React.createClass({
let canonical_alias_section;
if (this.props.canSetCanonicalAlias) {
let found = false;
canonical_alias_section = (
<select onChange={this.onCanonicalAliasChange} defaultValue={this.state.canonicalAlias}>
<select onChange={this.onCanonicalAliasChange} value={this.state.canonicalAlias}>
<option value="" key="unset">{ _t('not specified') }</option>
{
Object.keys(self.state.domainToAliases).map(function(domain, i) {
return self.state.domainToAliases[domain].map(function(alias, j) {
Object.keys(self.state.domainToAliases).map((domain, i) => {
return self.state.domainToAliases[domain].map((alias, j) => {
if (alias === this.state.canonicalAlias) found = true;
return (
<option value={alias} key={i + "_" + j}>
{ alias }
@ -218,6 +235,12 @@ module.exports = React.createClass({
});
})
}
{
found || !this.stateCanonicalAlias ? '' :
<option value={ this.state.canonicalAlias } key='arbitrary'>
{ this.state.canonicalAlias }
</option>
}
</select>
);
} else {

View file

@ -47,6 +47,9 @@ const eventTileTypes = {
};
const stateEventTileTypes = {
'm.room.aliases': 'messages.TextualEvent',
// 'm.room.aliases': 'messages.RoomAliasesEvent', // too complex
'm.room.canonical_alias': 'messages.TextualEvent',
'm.room.create': 'messages.RoomCreate',
'm.room.member': 'messages.TextualEvent',
'm.room.name': 'messages.TextualEvent',
@ -58,7 +61,6 @@ const stateEventTileTypes = {
'm.room.power_levels': 'messages.TextualEvent',
'm.room.pinned_events': 'messages.TextualEvent',
'm.room.server_acl': 'messages.TextualEvent',
'im.vector.modular.widgets': 'messages.TextualEvent',
};
@ -484,7 +486,9 @@ module.exports = withMatrixClient(React.createClass({
const eventType = this.props.mxEvent.getType();
// Info messages are basically information about commands processed on a room
const isInfoMessage = (eventType !== 'm.room.message' && eventType !== 'm.sticker' && eventType != 'm.room.create');
const isInfoMessage = (
eventType !== 'm.room.message' && eventType !== 'm.sticker' && eventType != 'm.room.create'
);
const tileHandler = getHandlerTile(this.props.mxEvent);
// This shouldn't happen: the caller should check we support this type

View file

@ -34,18 +34,23 @@ module.exports = React.createClass({
getInitialState: function() {
const cli = MatrixClientPeg.get();
if (cli.hasLazyLoadMembersEnabled()) {
return {loading: true};
// show an empty list
return this._getMembersState([]);
} else {
return this._getMembersState();
return this._getMembersState(this.roomMembers());
}
},
componentWillMount: function() {
this._mounted = false;
this._mounted = true;
const cli = MatrixClientPeg.get();
if (!cli.hasLazyLoadMembersEnabled()) {
if (cli.hasLazyLoadMembersEnabled()) {
this._showMembersAccordingToMembershipWithLL();
cli.on("Room.myMembership", this.onMyMembership);
} else {
this._listenForMembersChanges();
}
cli.on("Room", this.onRoom); // invites & joining after peek
const enablePresenceByHsUrl = SdkConfig.get()["enable_presence_by_hs_url"];
const hsUrl = MatrixClientPeg.get().baseUrl;
this._showPresence = true;
@ -59,7 +64,6 @@ module.exports = React.createClass({
cli.on("RoomState.members", this.onRoomStateMember);
cli.on("RoomMember.name", this.onRoomMemberName);
cli.on("RoomState.events", this.onRoomStateEvent);
cli.on("Room", this.onRoom); // invites
// We listen for changes to the lastPresenceTs which is essentially
// listening for all presence events (we display most of not all of
// the information contained in presence events).
@ -67,47 +71,50 @@ module.exports = React.createClass({
// cli.on("Room.timeline", this.onRoomTimeline);
},
componentDidMount: async function() {
this._mounted = true;
const cli = MatrixClientPeg.get();
if (cli.hasLazyLoadMembersEnabled()) {
await this._waitForMembersToLoad();
if (this._mounted) {
this.setState(this._getMembersState());
this._listenForMembersChanges();
}
}
},
componentWillUnmount: function() {
this._mounted = false;
const cli = MatrixClientPeg.get();
if (cli) {
cli.removeListener("RoomState.members", this.onRoomStateMember);
cli.removeListener("RoomMember.name", this.onRoomMemberName);
cli.removeListener("Room.myMembership", this.onMyMembership);
cli.removeListener("RoomState.events", this.onRoomStateEvent);
cli.removeListener("Room", this.onRoom);
cli.removeListener("User.lastPresenceTs", this.onUserLastPresenceTs);
// cli.removeListener("Room.timeline", this.onRoomTimeline);
}
// cancel any pending calls to the rate_limited_funcs
this._updateList.cancelPendingCall();
},
_waitForMembersToLoad: async function() {
if (!this.props.roomId) return {};
/**
* If lazy loading is enabled, either:
* show a spinner and load the members if the user is joined,
* or show the members available so far if the user is invited
*/
_showMembersAccordingToMembershipWithLL: async function() {
const cli = MatrixClientPeg.get();
if (cli.hasLazyLoadMembersEnabled()) {
const cli = MatrixClientPeg.get();
const room = cli.getRoom(this.props.roomId);
if (room) {
const membership = room && room.getMyMembership();
if (membership === "join") {
this.setState({loading: true});
try {
await room.loadMembersIfNeeded();
} catch(ex) {/* already logged in RoomView */}
} catch (ex) {/* already logged in RoomView */}
if (this._mounted) {
this.setState(this._getMembersState(this.roomMembers()));
this._listenForMembersChanges();
}
} else if (membership === "invite") {
// show the members we've got when invited
this.setState(this._getMembersState(this.roomMembers()));
}
}
},
_getMembersState: function() {
const members = this.roomMembers();
_getMembersState: function(members) {
// set the state after determining _showPresence to make sure it's
// taken into account while rerendering
return {
@ -124,34 +131,6 @@ module.exports = React.createClass({
};
},
/*
onRoomTimeline: function(ev, room, toStartOfTimeline, removed, data) {
// ignore anything but real-time updates at the end of the room:
// updates from pagination will happen when the paginate completes.
if (toStartOfTimeline || !data || !data.liveEvent) return;
// treat any activity from a user as implicit presence to update the
// ordering of the list whenever someone says something.
// Except right now we're not tiebreaking "active now" users in this way
// so don't bother for now.
if (ev.getSender()) {
// console.log("implicit presence from " + ev.getSender());
var tile = this.refs[ev.getSender()];
if (tile) {
// work around a race where you might have a room member object
// before the user object exists. XXX: why does this ever happen?
var all_members = room.currentState.members;
var userId = ev.getSender();
if (all_members[userId].user === null) {
all_members[userId].user = MatrixClientPeg.get().getUser(userId);
}
this._updateList(); // reorder the membership list
}
}
},
*/
onUserLastPresenceTs(event, user) {
// Attach a SINGLE listener for global presence changes then locate the
// member tile and re-render it. This is more efficient than every tile
@ -170,7 +149,13 @@ module.exports = React.createClass({
// We listen for room events because when we accept an invite
// we need to wait till the room is fully populated with state
// before refreshing the member list else we get a stale list.
this._updateList();
this._showMembersAccordingToMembershipWithLL();
},
onMyMembership: function(room, membership, oldMembership) {
if (room.roomId === this.props.roomId && membership === "join") {
this._showMembersAccordingToMembershipWithLL();
}
},
onRoomStateMember: function(ev, state, member) {
@ -197,6 +182,7 @@ module.exports = React.createClass({
_updateList: new rate_limited_func(function() {
// console.log("Updating memberlist");
const newState = {
loading: false,
members: this.roomMembers(),
};
newState.filteredJoinedMembers = this._filterMembers(newState.members, 'join', this.state.searchQuery);

View file

@ -273,6 +273,7 @@ module.exports = React.createClass({
});
let name = this.state.roomName;
if (name == undefined || name == null) name = '';
name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon
let badgeContent;

View file

@ -65,5 +65,6 @@
"Cancel Sending": "إلغاء الإرسال",
"Collapse panel": "طي الجدول",
"Set Password": "تعيين كلمة سرية",
"Checking for an update...": "البحث عن تحديث …"
"Checking for an update...": "البحث عن تحديث …",
"powered by Matrix": "مشغل بواسطة Matrix"
}

View file

@ -1256,5 +1256,25 @@
"Lazy loading is not supported by your current homeserver.": "Отложеното зареждане не се поддържа от текущия сървър.",
"Sorry, your homeserver is too old to participate in this room.": "Съжаляваме, вашият сървър е прекалено стар за да участва в тази стая.",
"Please contact your homeserver administrator.": "Моля, свържете се се със сървърния администратор.",
"Legal": "Юридически"
"Legal": "Юридически",
"Registration Required": "Нужна е регистрация",
"You need to register to do this. Would you like to register now?": "За да направите това е нужно да се регистрирате. Искате ли да се регистрирате сега?",
"Unable to connect to Homeserver. Retrying...": "Неуспешно свързване със сървъра. Опитване отново...",
"This room has been replaced and is no longer active.": "Тази стая е била заменена и вече не е активна.",
"The conversation continues here.": "Разговора продължава тук.",
"Upgrade room to version %(ver)s": "Обновете стаята до версия %(ver)s",
"This room is a continuation of another conversation.": "Тази стая е продължение на предишен разговор.",
"Click here to see older messages.": "Кликнете тук за да видите предишните съобщения.",
"Failed to upgrade room": "Неуспешно обновяване на стаята",
"The room upgrade could not be completed": "Обновяването на тази стая не можа да бъде завършено",
"Upgrade this room to version %(version)s": "Обновете тази стая до версия %(version)s",
"Unable to query for supported registration methods": "Неуспешно запитване за поддържани методи за регистрация",
"Forces the current outbound group session in an encrypted room to be discarded": "Принудително прекратява текущата изходяща групова сесия в шифрована стая",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s добави %(addedAddresses)s като адрес за тази стая.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s добави %(addedAddresses)s като адреси за тази стая.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s премахна %(removedAddresses)s като адрес за тази стая.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s премахна %(removedAddresses)s като адреси за тази стая.",
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s добави %(addedAddresses)s и премахна %(removedAddresses)s като адреси за тази стая.",
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s настрой основния адрес на тази стая на %(address)s.",
"%(senderName)s removed the main address for this room.": "%(senderName)s премахна основния адрес на тази стая."
}

View file

@ -130,7 +130,7 @@
"Unable to create widget.": "No s'ha pogut crear el giny.",
"Failed to send request.": "No s'ha pogut enviar la sol·licitud.",
"This room is not recognised.": "No es reconeix aquesta sala.",
"Power level must be positive integer.": "El nivell de potència ha de ser un enter positiu.",
"Power level must be positive integer.": "El nivell de poders ha de ser un enter positiu.",
"You are not in this room.": "No heu entrat a aquesta sala.",
"You do not have permission to do that in this room.": "No teniu el permís per realitzar aquesta acció en aquesta sala.",
"Missing room_id in request": "Falta l'ID de la sala en la vostra sol·licitud",
@ -167,7 +167,7 @@
"%(targetName)s joined the room.": "%(targetName)s ha entrat a la sala.",
"VoIP conference finished.": "S'ha finalitzat la conferència VoIP.",
"%(targetName)s rejected the invitation.": "%(targetName)s ha rebutjat la invitació.",
"%(targetName)s left the room.": "%(targetName)s ha sortir de la sala.",
"%(targetName)s left the room.": "%(targetName)s ha sortit de la sala.",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s ha readmès a %(targetName)s.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s ha fet fora a %(targetName)s.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha retirat la invitació per a %(targetName)s.",
@ -191,7 +191,7 @@
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha fet visible l'històric de la sala per a desconeguts (%(visibility)s).",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha activat l'encriptació d'extrem a extrem (algoritme %(algorithm)s).",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s fins %(toPowerLevel)s",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha canviat el nivell de potència de %(powerLevelDiffText)s.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha canviat el nivell de poders de %(powerLevelDiffText)s.",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s ha canviat els missatges fixats de la sala.",
"%(widgetName)s widget modified by %(senderName)s": "%(senderName)s ha modificat el giny %(widgetName)s",
"%(widgetName)s widget added by %(senderName)s": "%(senderName)s ha afegit el giny %(widgetName)s",
@ -301,7 +301,7 @@
"Failed to ban user": "No s'ha pogut expulsar l'usuari",
"Failed to mute user": "No s'ha pogut silenciar l'usuari",
"Failed to toggle moderator status": "No s'ha pogut canviar l'estat del moderador",
"Failed to change power level": "No s'ha pogut canviar el nivell de potència",
"Failed to change power level": "No s'ha pogut canviar el nivell de poders",
"You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "No podreu desfer aquest canvi ja que estareu baixant de grau de privilegis. Només un altre usuari amb més privilegis podrà fer que els recupereu.",
"Are you sure?": "Esteu segur?",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "No podreu desfer aquesta acció ja que esteu donant al usuari el mateix nivell de privilegi que el vostre.",
@ -401,7 +401,7 @@
"Press <StartChatButton> to start a chat with someone": "Prem <StartChatButton> per a començar un xat amb algú",
"You may wish to login with a different account, or add this email to this account.": "És possible que vulgueu iniciar la sessió amb un altre compte o bé afegir aquest correu electrònic a aquest compte.",
"You have been invited to join this room by %(inviterName)s": "Heu sigut convidat a aquesta sala per %(inviterName)s",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Voleu <acceptText>accept</acceptText> o bé declineText>decline</declineText> aquesta invitació?",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Voleu <acceptText>accept</acceptText> o bé <declineText>decline</declineText> aquesta invitació?",
"Reason: %(reasonText)s": "Raó: %(reasonText)s",
"Rejoin": "Trona a entrar",
"You have been kicked from %(roomName)s by %(userName)s.": "%(userName)s us ha fet fora de la sala %(roomName)s.",

View file

@ -1266,5 +1266,16 @@
"The room upgrade could not be completed": "Die Raum-Aufrüstung konnte nicht fertiggestellt werden",
"Upgrade this room to version %(version)s": "Diesen Raum zur Version %(version)s aufrüsten",
"Forces the current outbound group session in an encrypted room to be discarded": "Erzwingt, dass die aktuell ausgehende Gruppen-Sitzung in einem verschlüsseltem Raum verworfen wird",
"Error Discarding Session": "Sitzung konnte nicht verworfen werden"
"Error Discarding Session": "Sitzung konnte nicht verworfen werden",
"Registration Required": "Registrierung erforderlich",
"You need to register to do this. Would you like to register now?": "Du musst dich registrieren um dies zu tun. Möchtest du dich jetzt registrieren?",
"Unable to connect to Homeserver. Retrying...": "Verbindung mit Heimserver nicht möglich. Versuche erneut...",
"Unable to query for supported registration methods": "Unterstützte Registrierungsmethoden können nicht abgefragt werden",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s fügte %(addedAddresses)s als Adresse zu diesem Raum hinzu.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s fügte %(addedAddresses)s als Adressen zu diesem Raum hinzu.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s entfernte %(removedAddresses)s als Adresse von diesem Raum.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s entfernte %(removedAddresses)s als Adressen von diesem Raum.",
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s setzte die Hauptadresse zu diesem Raum auf %(address)s.",
"%(senderName)s removed the main address for this room.": "%(senderName)s entfernte die Hauptadresse von diesem Raum.",
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s fügte %(addedAddresses)s hinzu und entfernte %(removedAddresses)s als Adressen von diesem Raum."
}

View file

@ -43,6 +43,10 @@
"The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads",
"Upload Failed": "Upload Failed",
"Failure to create room": "Failure to create room",
"Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
"Send anyway": "Send anyway",
"Send": "Send",
"Sun": "Sun",
"Mon": "Mon",
"Tue": "Tue",
@ -82,6 +86,7 @@
"Failed to invite users to community": "Failed to invite users to community",
"Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s",
"Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:",
"Unnamed Room": "Unnamed Room",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings",
"Riot was not given permission to send notifications - please try again": "Riot was not given permission to send notifications - please try again",
"Unable to enable Notifications": "Unable to enable Notifications",
@ -174,6 +179,13 @@
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s removed the room name.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s added %(addedAddresses)s as addresses for this room.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s added %(addedAddresses)s as an address for this room.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s removed %(removedAddresses)s as addresses for this room.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s removed %(removedAddresses)s as an address for this room.",
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.",
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s set the main address for this room to %(address)s.",
"%(senderName)s removed the main address for this room.": "%(senderName)s removed the main address for this room.",
"Someone": "Someone",
"(not supported by this browser)": "(not supported by this browser)",
"%(senderName)s answered the call.": "%(senderName)s answered the call.",
@ -199,11 +211,6 @@
"%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing",
"%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing",
"%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing",
"Failure to create room": "Failure to create room",
"Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
"Send anyway": "Send anyway",
"Send": "Send",
"Unnamed Room": "Unnamed Room",
"This homeserver has hit its Monthly Active User limit.": "This homeserver has hit its Monthly Active User limit.",
"This homeserver has exceeded one of its resource limits.": "This homeserver has exceeded one of its resource limits.",
"Please <a>contact your service administrator</a> to continue using the service.": "Please <a>contact your service administrator</a> to continue using the service.",
@ -343,6 +350,31 @@
"Off": "Off",
"On": "On",
"Noisy": "Noisy",
"Invalid alias format": "Invalid alias format",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias",
"Invalid address format": "Invalid address format",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address",
"not specified": "not specified",
"not set": "not set",
"Remote addresses for this room:": "Remote addresses for this room:",
"Addresses": "Addresses",
"The main address for this room is": "The main address for this room is",
"Local addresses for this room:": "Local addresses for this room:",
"This room has no local addresses": "This room has no local addresses",
"New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)",
"Invalid community ID": "Invalid community ID",
"'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID",
"Flair": "Flair",
"Showing flair for these communities:": "Showing flair for these communities:",
"This room is not showing flair for any communities": "This room is not showing flair for any communities",
"New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)",
"You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.",
"You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.",
"URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.",
"URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.",
"In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.",
"URL Previews": "URL Previews",
"When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.",
"Cannot add any more widgets": "Cannot add any more widgets",
"The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.",
"Add a widget": "Add a widget",
@ -447,11 +479,11 @@
"At this time it is not possible to reply with an emote.": "At this time it is not possible to reply with an emote.",
"Markdown is disabled": "Markdown is disabled",
"Markdown is enabled": "Markdown is enabled",
"Unpin Message": "Unpin Message",
"Jump to message": "Jump to message",
"No pinned messages.": "No pinned messages.",
"Loading...": "Loading...",
"Pinned Messages": "Pinned Messages",
"Unpin Message": "Unpin Message",
"Jump to message": "Jump to message",
"%(duration)ss": "%(duration)ss",
"%(duration)sm": "%(duration)sm",
"%(duration)sh": "%(duration)sh",
@ -592,31 +624,6 @@
"Scroll to unread messages": "Scroll to unread messages",
"Jump to first unread message.": "Jump to first unread message.",
"Close": "Close",
"Invalid alias format": "Invalid alias format",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias",
"Invalid address format": "Invalid address format",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address",
"not specified": "not specified",
"not set": "not set",
"Remote addresses for this room:": "Remote addresses for this room:",
"Addresses": "Addresses",
"The main address for this room is": "The main address for this room is",
"Local addresses for this room:": "Local addresses for this room:",
"This room has no local addresses": "This room has no local addresses",
"New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)",
"Invalid community ID": "Invalid community ID",
"'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID",
"Flair": "Flair",
"Showing flair for these communities:": "Showing flair for these communities:",
"This room is not showing flair for any communities": "This room is not showing flair for any communities",
"New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)",
"You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.",
"You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.",
"URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.",
"URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.",
"In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.",
"URL Previews": "URL Previews",
"When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.",
"Sunday": "Sunday",
"Monday": "Monday",
"Tuesday": "Tuesday",
@ -828,8 +835,8 @@
"Failed to send logs: ": "Failed to send logs: ",
"Submit debug logs": "Submit debug logs",
"Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.",
"Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.",
"GitHub issue link:": "GitHub issue link:",
"Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.": "Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.",
"What GitHub issue are these logs for?": "What GitHub issue are these logs for?",
"Notes:": "Notes:",
"Send logs": "Send logs",
"Unavailable": "Unavailable",
@ -895,6 +902,8 @@
"Ignore request": "Ignore request",
"Loading device info...": "Loading device info...",
"Encryption key request": "Encryption key request",
"Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!",
"Updating Riot": "Updating Riot",
"Failed to upgrade room": "Failed to upgrade room",
"The room upgrade could not be completed": "The room upgrade could not be completed",
"Upgrade this room to version %(version)s": "Upgrade this room to version %(version)s",
@ -1022,7 +1031,7 @@
"You must <a>register</a> to use this functionality": "You must <a>register</a> to use this functionality",
"You must join the room to see its files": "You must join the room to see its files",
"There are no visible files in this room": "There are no visible files in this room",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n",
"<h1>HTML for your community's page</h1>\r\n<p>\r\n Use the long description to introduce new members to the community, or distribute\r\n some important <a href=\"foo\">links</a>\r\n</p>\r\n<p>\r\n You can even use 'img' tags\r\n</p>\r\n": "<h1>HTML for your community's page</h1>\r\n<p>\r\n Use the long description to introduce new members to the community, or distribute\r\n some important <a href=\"foo\">links</a>\r\n</p>\r\n<p>\r\n You can even use 'img' tags\r\n</p>\r\n",
"Add rooms to the community summary": "Add rooms to the community summary",
"Which rooms would you like to add to this summary?": "Which rooms would you like to add to this summary?",
"Add to summary": "Add to summary",
@ -1176,7 +1185,7 @@
"Device ID:": "Device ID:",
"Device key:": "Device key:",
"Ignored Users": "Ignored Users",
"Debug Logs Submission": "Debug Logs Submission",
"Submit Debug Logs": "Submit Debug Logs",
"If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot collects anonymous analytics to allow us to improve the application.",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.",
@ -1258,6 +1267,8 @@
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Password too short (min %(MIN_PASSWORD_LENGTH)s).",
"This doesn't look like a valid email address.": "This doesn't look like a valid email address.",
"This doesn't look like a valid phone number.": "This doesn't look like a valid phone number.",
"An email address is required to register on this homeserver.": "An email address is required to register on this homeserver.",
"A phone number is required to register on this homeserver.": "A phone number is required to register on this homeserver.",
"You need to enter a user name.": "You need to enter a user name.",
"An unknown error occurred.": "An unknown error occurred.",
"I already have an account": "I already have an account",

View file

@ -53,9 +53,9 @@
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "La dosiero «%(fileName)s» estas tro granda por la hejma servilo",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Averto: ajna persono aldonita al komunumo estos publike videbla al iu ajn, kiu konas la identigilon de tiu komunumo",
"Which rooms would you like to add to this community?": "Kiujn ĉambrojn vi volas aldoni al ĉi tiu komunumo?",
"Show these rooms to non-members on the community page and room list?": "Ĉu la ĉambroj montriĝu al malanoj en la komunuma paĝo kaj listo de ĉambroj?",
"Show these rooms to non-members on the community page and room list?": "Montri tiujn babilejojn al malanoj en la komunuma paĝo kaj listo de babilejoj?",
"Add rooms to the community": "Aldoni ĉambrojn al la komunumo",
"Room name or alias": "Nomo aŭ kromnomo de ĉambro",
"Room name or alias": "Nomo aŭ kromnomo de babilejo",
"Add to community": "Aldoni al komunumo",
"Failed to invite the following users to %(groupId)s:": "Malsukcesis inviti jenajn uzantojn al %(groupId)s:",
"Failed to invite users to community": "Malsukcesis inviti novajn uzantojn al komunumo",
@ -74,28 +74,28 @@
"Who would you like to communicate with?": "Kun kiu vi volas komuniki?",
"Email, name or matrix ID": "Retpoŝtadreso, nomo, aŭ Matrix-identigaĵo",
"Start Chat": "Komenci babilon",
"Invite new room members": "Inviti novajn ĉambranojn",
"Who would you like to add to this room?": "Kiun vi ŝatus aldoni al tiu ĉi ĉambro?",
"Invite new room members": "Inviti novajn babilejanojn",
"Who would you like to add to this room?": "Kiun vi ŝatus aldoni al tiu ĉi babilejo?",
"Send Invites": "Sendi invitojn",
"Failed to invite user": "Malsukcesis inviti uzanton",
"Operation failed": "Ago malsukcesis",
"Failed to invite": "Invito malsukcesis",
"Failed to invite the following users to the %(roomName)s room:": "Malsukcesis inviti la jenajn uzantojn al la ĉambro %(roomName)s:",
"Failed to invite the following users to the %(roomName)s room:": "Malsukcesis inviti la jenajn uzantojn al la babilejo %(roomName)s:",
"You need to be logged in.": "Vi devas saluti.",
"You need to be able to invite users to do that.": "Vi bezonas permeson inviti uzantojn por tio.",
"Unable to create widget.": "Fenestraĵo ne kreeblas.",
"Failed to send request.": "Malsukcesis sendi peton.",
"This room is not recognised.": "Ĉi tiu ĉambro ne estas rekonita.",
"This room is not recognised.": "Ĉi tiu babilejo ne estas rekonita.",
"Power level must be positive integer.": "Nivelo de potenco devas esti entjero pozitiva.",
"You are not in this room.": "Vi ne estas en tiu ĉi ĉambro.",
"You do not have permission to do that in this room.": "Vi ne havas permeson fari tion en tiu ĉi ĉambro.",
"You are not in this room.": "Vi ne estas en tiu ĉi babilejo.",
"You do not have permission to do that in this room.": "Vi ne havas permeson fari tion en tiu babilejo.",
"Missing room_id in request": "En peto mankas «room_id»",
"Room %(roomId)s not visible": "Ĉambro %(roomId)s ne videblas",
"Room %(roomId)s not visible": "babilejo %(roomId)s ne videblas",
"Missing user_id in request": "En peto mankas «user_id»",
"Usage": "Uzo",
"/ddg is not a command": "/ddg ne estas komando",
"To use it, just wait for autocomplete results to load and tab through them.": "Por uzi ĝin, atendu aperon de sugestaj rezultoj, kaj tabu tra ili.",
"Unrecognised room alias:": "Nerekonita ĉambra alinomo:",
"Unrecognised room alias:": "Nerekonita babileja kromnomo:",
"Ignored user": "Malatentata uzanto",
"You are now ignoring %(userId)s": "Vi nun malatentas uzanton %(userId)s",
"Unignored user": "Reatentata uzanto",
@ -119,16 +119,16 @@
"%(senderName)s changed their profile picture.": "%(senderName)s ŝanĝis sian profilbildon.",
"%(senderName)s set a profile picture.": "%(senderName)s agordis profilbildon.",
"VoIP conference started.": "Rettelefona voko komenciĝis.",
"%(targetName)s joined the room.": "%(targetName)s venis en la ĉambron.",
"%(targetName)s joined the room.": "%(targetName)s venis en la babilejo.",
"VoIP conference finished.": "Rettelefona voko finiĝis.",
"%(targetName)s rejected the invitation.": "%(targetName)s rifuzis la inviton.",
"%(targetName)s left the room.": "%(targetName)s forlasis la ĉambron.",
"%(targetName)s left the room.": "%(targetName)s forlasis la babilejo.",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s malbaris uzanton %(targetName)s.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s forpelis uzanton %(targetName)s.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s nuligis inviton por %(targetName)s.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ŝanĝis la temon al «%(topic)s».",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s forigis nomon de la ĉambro.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ŝanĝis nomon de la ĉambro al %(roomName)s.",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s forigis nomon de la babilejo.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ŝanĝis nomon de la babilejo al %(roomName)s.",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sendis bildon.",
"Someone": "Iu",
"(not supported by this browser)": "(nesubtenata de tiu ĉi foliumilo)",
@ -138,16 +138,16 @@
"(unknown failure: %(reason)s)": "(nekonata eraro: %(reason)s)",
"%(senderName)s ended the call.": "%(senderName)s finis la vokon.",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s faris vokon de speco: %(callType)s.",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sendis ĉambran inviton al %(targetDisplayName)s.",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj, de la tempo de invito.",
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj, de la tempo de aliĝo.",
"%(senderName)s made future room history visible to all room members.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj.",
"%(senderName)s made future room history visible to anyone.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj.",
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s videbligis estontan historion de la ĉambro al nekonatoj (%(visibility)s).",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sendis babilejan inviton al %(targetDisplayName)s.",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s videbligis estontan historion de la babilejo al ĉiuj babilejanoj, ekde la tempo de invito.",
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s videbligis estontan historion de la babilejo al ĉiuj babilejanoj, ekde la tempo de aliĝo.",
"%(senderName)s made future room history visible to all room members.": "%(senderName)s videbligis estontan historion de la babilejo al ĉiuj babilejanoj.",
"%(senderName)s made future room history visible to anyone.": "%(senderName)s videbligis estontan historion de la babilejo al ĉiuj.",
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s videbligis estontan historion de la babilejo al nekonata (%(visibility)s).",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ŝaltis ĝiscelan ĉifradon (algoritmo: %(algorithm)s).",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s al %(toPowerLevel)s",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ŝanĝis la potencan nivelon de %(powerLevelDiffText)s.",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s ŝanĝis la fiksitajn mesaĝojn de la ĉambro.",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s ŝanĝis la fiksitajn mesaĝojn de la babilejo.",
"%(widgetName)s widget modified by %(senderName)s": "Fenestraĵon %(widgetName)s ŝanĝis %(senderName)s",
"%(widgetName)s widget added by %(senderName)s": "Fenestraĵon %(widgetName)s aldonis %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "Fenestraĵon %(widgetName)s forigis %(senderName)s",
@ -155,13 +155,13 @@
"%(names)s and %(count)s others are typing|other": "%(names)s kaj %(count)s aliaj tajpas",
"%(names)s and %(count)s others are typing|one": "%(names)s kaj unu alia tajpas",
"%(names)s and %(lastPerson)s are typing": "%(names)s kaj %(lastPerson)s tajpas",
"Failure to create room": "Malsukcesis krei ĉambron",
"Failure to create room": "Malsukcesis krei babilejon",
"Server may be unavailable, overloaded, or you hit a bug.": "Servilo povas esti neatingebla, troŝarĝita, aŭ vi renkontis cimon.",
"Unnamed Room": "Sennoma ĉambro",
"Unnamed Room": "Sennoma Babilejo",
"Your browser does not support the required cryptography extensions": "Via foliumilo ne subtenas la bezonatajn ĉifrajn kromprogramojn",
"Not a valid Riot keyfile": "Nevalida ŝlosila dosiero de Riot",
"Authentication check failed: incorrect password?": "Aŭtentiga kontrolo malsukcesis: ĉu pro malĝusta pasvorto?",
"Failed to join room": "Malsukcesis aliĝi al ĉambro",
"Failed to join room": "Malsukcesis aliĝi al babilejo",
"Message Pinning": "Fikso de mesaĝoj",
"Disable Emoji suggestions while typing": "Malŝalti mienetajn sugestojn dum tajpado",
"Use compact timeline layout": "Uzi densan okazordan aranĝon",
@ -174,7 +174,7 @@
"Always show message timestamps": "Ĉiam montri mesaĝajn tempindikojn",
"Autoplay GIFs and videos": "Aŭtomate ludi GIF-bildojn kaj videojn",
"Call Failed": "Voko malsukcesis",
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "En la ĉambro estas nekonataj aparatoj. Se vi daŭrigos ne kontrolinte ilin, iu povos subaŭskulti vian vokon.",
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "En la babilejo estas nekonataj aparatoj: se vi daŭrigos ne kontrolante ilin, iu povos subaŭskulti vian vokon.",
"Review Devices": "Kontroli aparatojn",
"Call Anyway": "Tamen voki",
"Answer Anyway": "Tamen respondi",
@ -183,18 +183,18 @@
"Send anyway": "Tamen sendi",
"Send": "Sendi",
"Enable automatic language detection for syntax highlighting": "Ŝalti aŭtomatan rekonon de lingvo por sintaksa markado",
"Hide avatars in user and room mentions": "Kaŝi profilbildojn en mencioj de uzantoj kaj ĉambroj",
"Hide avatars in user and room mentions": "Kaŝi profilbildojn en mencioj de uzantoj kaj babilejoj",
"Disable big emoji in chat": "Malŝalti grandajn mienetojn en babilo",
"Don't send typing notifications": "Ne elsendi sciigojn pri tajpado",
"Automatically replace plain text Emoji": "Aŭtomate anstataŭigi tekstajn mienetojn",
"Mirror local video feed": "Speguli lokan videon",
"Disable Peer-to-Peer for 1:1 calls": "Malŝalti samtavolajn duopajn vokojn",
"Never send encrypted messages to unverified devices from this device": "Neniam sendi neĉifritajn mesaĝojn al nekontrolitaj aparatoj de tiu ĉi aparato",
"Never send encrypted messages to unverified devices in this room from this device": "Neniam sendi ĉifritajn mesaĝojn al nekontrolitaj aparatoj en tiu ĉi ĉambro de tiu ĉi aparto",
"Never send encrypted messages to unverified devices in this room from this device": "Neniam sendi ĉifritajn mesaĝojn al nekontrolitaj aparatoj en tiu ĉi babilejo el tiu ĉi aparato",
"Enable inline URL previews by default": "Ŝalti entekstan antaŭrigardon al retadresoj",
"Enable URL previews for this room (only affects you)": "Ŝalti antaŭrigardon al retadresoj por ĉi tiu ĉambro (nur pro vi)",
"Enable URL previews by default for participants in this room": "Ŝalti antaŭrigardon al retadresoj por anoj de ĉi tiu ĉambro",
"Room Colour": "Koloro de ĉambro",
"Enable URL previews for this room (only affects you)": "Ŝalti URL-antaŭrigardon en ĉi tiu babilejo (nur por vi)",
"Enable URL previews by default for participants in this room": "Ŝalti URL-antaŭrigardon por anoj de ĉi tiu babilejo",
"Room Colour": "Babilejo-koloro",
"Active call (%(roomName)s)": "Aktiva voko (%(roomName)s)",
"unknown caller": "nekonata vokanto",
"Incoming voice call from %(name)s": "Envena voĉvoko de %(name)s",
@ -216,7 +216,7 @@
"New passwords don't match": "Novaj pasvortoj ne kongruas",
"Passwords can't be empty": "Pasvortoj ne povas esti malplenaj",
"Continue": "Daŭrigi",
"Export E2E room keys": "Elporti ĝiscele ĉifrajn ŝlosilojn de la ĉambro",
"Export E2E room keys": "Elporti ĝiscele ĉifrajn ŝlosilojn de la babilejo",
"Do you want to set an email address?": "Ĉu vi volas agordi retpoŝtadreson?",
"Current password": "Nuna pasvorto",
"Password": "Pasvorto",
@ -236,7 +236,7 @@
"Disable Notifications": "Malŝalti sciigojn",
"Enable Notifications": "Ŝalti sciigojn",
"Cannot add any more widgets": "Pluaj fenestraĵoj ne aldoneblas",
"The maximum permitted number of widgets have already been added to this room.": "La plejgranda nombro da fenestraĵoj jam aldoniĝis al ĉi tiu ĉambro.",
"The maximum permitted number of widgets have already been added to this room.": "La maksimuma permesata nombro de fenestraĵoj jam aldoniĝis al tiu babilejo.",
"Add a widget": "Aldoni fenestraĵon",
"Drop File Here": "Demetu dosieron tien ĉi",
"Drop file here to upload": "Demetu dosieron tien ĉi por ĝin alŝuti",
@ -275,7 +275,7 @@
"Devices": "Aparatoj",
"Unignore": "Reatenti",
"Ignore": "Malatenti",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ŝanĝo de pasvorto nuntempe nuligos ĉiujn ĝiscele ĉifrajn ŝlosilojn sur ĉiuj viaj aparatoj. Tio faros ĉifritajn babilajn historiojn nelegeblaj, krom se vi unue elportos viajn ĉambrajn ŝlosilojn kaj reenportos ilin poste. Estontece ĉi tio pliboniĝos.",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ŝanĝo de pasvorto nuntempe nuligos ĉiujn ĝiscele ĉifrajn ŝlosilojn sur ĉiuj viaj aparatoj. Tio igos ĉifritajn babilajn historiojn nelegeblaj, krom se vi unue elportos viajn babilejajn ŝlosilojn kaj reenportos ilin poste. Estonte tio pliboniĝos.",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ŝanĝis la profilbildon de %(roomName)s",
"You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Vi estas direktota al ekstera retejo por aŭtentigi vian konton por uzo kun %(integrationsUrl)s. Ĉu vi volas daŭrigi tion?",
"Jump to read receipt": "Salti al legokonfirmo",
@ -413,7 +413,7 @@
"No users have specific privileges in this room": "Neniuj uzantoj havas specialajn privilegiojn en tiu ĉi ĉambro",
"Banned users": "Forbaritaj uzantoj",
"This room is not accessible by remote Matrix servers": "Ĉi tiu ĉambro ne atingeblas por foraj serviloj de Matrix",
"Leave room": "Eliri el ĉambro",
"Leave room": "Eliri babilejon",
"Favourite": "Ŝatata",
"Tagged as: ": "Etikedita kiel: ",
"To link to a room it must have <a>an address</a>.": "Por esti ligebla, ĉambro devas havi <a>adreson</a>.",
@ -874,13 +874,13 @@
"Unbans user with given id": "Malforbaras uzanton kun la donita identigaĵo",
"Define the power level of a user": "Difini la potencan nivelon de uzanto",
"Deops user with given id": "Senestrigas uzanton kun donita identigaĵo",
"Invites user with given id to current room": "Invitas uzanton kun donita identigaĵo al la nuna ĉambro",
"Joins room with given alias": "Aliĝigas al ĉambro kun la donita kromnomo",
"Sets the room topic": "Agordas la ĉambran temon",
"Invites user with given id to current room": "Invitas uzanton per identigilo al la nuna babilejo",
"Joins room with given alias": "Aliĝas al babilejo per kromnomo",
"Sets the room topic": "Agordas la babilejan temon",
"Kicks user with given id": "Forpelas uzanton kun la donita identigaĵo",
"Changes your display nickname": "Ŝanĝas vian vidigan nomon",
"Searches DuckDuckGo for results": "Serĉas rezultojn per DuckDuckGo",
"Changes colour scheme of current room": "Ŝanĝas kolorsĥemon de la nuna ĉambro",
"Changes colour scheme of current room": "Ŝanĝas kolorskemon de la nuna babilejo",
"Verifies a user, device, and pubkey tuple": "Kontrolas opon de uzanto, aparato, kaj publika ŝlosilo",
"Ignores a user, hiding their messages from you": "Malatentas uzanton, kaŝante ĝiajn mesaĝojn de vi",
"Stops ignoring a user, showing their messages going forward": "Ĉesas malatenti uzanton, montronte ĝiajn pluajn mesaĝojn",
@ -938,7 +938,7 @@
"The platform you're on": "Via sistemtipo",
"Which officially provided instance you are using, if any": "Kiun oficiale disponeblan aperon vi uzas, se iun ajn",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Ĉu vi uzas la riĉtekstan reĝimon de la riĉteksta redaktilo aŭ ne",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Kiam ĉi tiu paĝo enhavas identigeblajn informojn, ekzemple ĉambron, uzantan aŭ grupan identigilon, ĝi sendiĝas al la servilo sen tiuj.",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Kiam ĉi tiu paĝo enhavas identigeblajn informojn, ekzemple babilejon, uzantan aŭ grupan identigilon, ili estas formetataj antaŭ sendado al la servilo.",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s",
"Disable Community Filter Panel": "Malŝalti komunuman filtran breton",
"Failed to add tag %(tagName)s to room": "Malsukcesis aldoni etikedon %(tagName)s al ĉambro",
@ -1044,10 +1044,10 @@
"Failed to send custom event.": "Malsukcesis sendi propran okazon.",
"What's new?": "Kio novas?",
"Notify me for anything else": "Sciigu min pri ĉio alia",
"When I'm invited to a room": "Kiam mi estas invitita al ĉambro",
"When I'm invited to a room": "Kiam mi estas invitita al babilejo",
"Keywords": "Ŝlosilvortoj",
"Can't update user notification settings": "Agordoj de sciigoj al uzanto ne ĝisdatigeblas",
"Notify for all other messages/rooms": "Sciigu min por ĉiu alia babilejo",
"Notify for all other messages/rooms": "Sciigu min por ĉiuj aliaj mesaĝoj/babilejoj",
"Unable to look up room ID from server": "Ĉambra identigaĵo ne akireblas de la servilo",
"Couldn't find a matching Matrix room": "Malsukcesis trovi kongruan ĉambron en Matrix",
"All Rooms": "Ĉiuj babilejoj",

File diff suppressed because it is too large Load diff

View file

@ -46,7 +46,7 @@
"New password": "Pasahitz berria",
"User name": "Erabiltzaile-izena",
"Email address": "E-mail helbidea",
"Email address (optional)": "E-mail helbidea (aukerazkoa)",
"Email address (optional)": "E-mail helbidea (aukerakoa)",
"Confirm your new password": "Berretsi zure pasahitza",
"This Home Server would like to make sure you are not a robot": "Hasiera zerbitzari honek robot bat ez zarela egiaztatu nahi du",
"I have verified my email address": "Nire e-mail helbidea baieztatu dut",
@ -138,7 +138,7 @@
"Hangup": "Eseki",
"Homeserver is": "Hasiera zerbitzaria:",
"Identity Server is": "Identitate zerbitzaria:",
"Mobile phone number (optional)": "Mugikor zenbakia (aukerazkoa)",
"Mobile phone number (optional)": "Mugikor zenbakia (aukerakoa)",
"Moderator": "Moderatzailea",
"Account": "Kontua",
"Access Token:": "Sarbide tokena:",
@ -157,7 +157,7 @@
"Microphone": "Mikrofonoa",
"Camera": "Kamera",
"Hide removed messages": "Ezkutatu kendutako mezuak",
"Alias (optional)": "Ezizena (aukerazkoa)",
"Alias (optional)": "Ezizena (aukerakoa)",
"%(names)s and %(lastPerson)s are typing": "%(names)s eta %(lastPerson)s idazten ari dira",
"An error has occurred.": "Errore bat gertatu da.",
"Are you sure?": "Ziur zaude?",
@ -359,7 +359,7 @@
"riot-web version:": "riot-web bertsioa:",
"Room %(roomId)s not visible": "%(roomId)s gela ez dago ikusgai",
"Room Colour": "Gelaren kolorea",
"Room name (optional)": "Gelaren izena (aukerazkoa)",
"Room name (optional)": "Gelaren izena (aukerakoa)",
"%(roomName)s does not exist.": "Ez dago %(roomName)s izeneko gela.",
"%(roomName)s is not accessible at this time.": "%(roomName)s ez dago eskuragarri orain.",
"Scroll to bottom of page": "Korritu orria behera arte",
@ -566,7 +566,7 @@
"To continue, please enter your password.": "Jarraitzeko sartu zure pasahitza.",
"To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Gailu hau fidagarria dela egiaztatzeko, kontaktatu bere jabea beste medio bat erabiliz (adib. aurrez aurre edo telefonoz deituz) eta galdetu beraien erabiltzaile-ezarpenetan bere gailurako ikusten duen gakoa hemen beheko bera den:",
"If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Bat badator sakatu egiaztatu botoia. Bat ez badator, beste inor gailu hau atzematen dago eta blokeatu beharko zenuke.",
"In future this verification process will be more sophisticated.": "etorkizunean egiaztaketa metodoa hobetuko da.",
"In future this verification process will be more sophisticated.": "Etorkizunean egiaztaketa metodo hau hobetuko da.",
"Unable to restore session": "Ezin izan da saioa berreskuratu",
"If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Aurretik Riot bertsio berriago bat erabili baduzu, zure saioa bertsio honekin bateraezina izan daiteke. Itxi leiho hau eta itzuli bertsio berriagora.",
"We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Gailu bakoitzaren egiaztaketa prozesua jarraitzea aholkatzen dizugu, benetako jabeari dagozkiela baieztatzeko, baina mezua egiaztatu gabe birbidali dezakezu ere.",
@ -1266,5 +1266,16 @@
"Legal": "Legezkoa",
"Please <a>contact your service administrator</a> to continue using this service.": "<a>Jarri kontaktuan zerbitzuaren administratzailearekin</a> zerbitzu hau erabiltzen jarraitzeko.",
"Forces the current outbound group session in an encrypted room to be discarded": "Uneko irteerako talde saioa zifratutako gela batean baztertzera behartzen du",
"Error Discarding Session": "Errorea saioa baztertzean"
"Error Discarding Session": "Errorea saioa baztertzean",
"Registration Required": "Erregistratzea ezinbestekoa da",
"You need to register to do this. Would you like to register now?": "Hau egiteko erregistratu egin behar zara. Orain erregistratu nahi duzu?",
"Unable to connect to Homeserver. Retrying...": "Ezin izan da hasiera zerbitzarira konektatu. Berriro saiatzen...",
"Unable to query for supported registration methods": "Ezin izan da onartutako erregistratze metodoei buruz itaundu",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s erabiltzaileak %(addedAddresses)s gehitu du gelako helbide gisa.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s erabiltzaileak %(addedAddresses)s helbideak gehitu dizkio gela honi.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s erabiltzileak %(removedAddresses)s helbideak kendu ditu gela honetatik.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s erabiltzaileak %(removedAddresses)s helbideak kendu ditu gela honetatik.",
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s erabiltzaileak %(addedAddresses)s helbideak gehitu eta %(removedAddresses)s helbideak kendu ditu gela honetatik.",
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s erabiltzileak %(address)s ezarri du gela honetako helbide nagusi gisa.",
"%(senderName)s removed the main address for this room.": "%(senderName)s erabiltzaileak gela honen helbide nagusia kendu du."
}

View file

@ -1269,5 +1269,15 @@
"Error Discarding Session": "Erreur lors du rejet de la session",
"Registration Required": "Enregistrement nécessaire",
"You need to register to do this. Would you like to register now?": "Vous devez vous enregistrer pour faire cela. Voulez-vous créer un compte maintenant ?",
"Unable to query for supported registration methods": "Impossible de demander les méthodes d'enregistrement prises en charge"
"Unable to query for supported registration methods": "Impossible de demander les méthodes d'enregistrement prises en charge",
"Unable to connect to Homeserver. Retrying...": "Impossible de se connecter au serveur d'accueil. Reconnexion...",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s a ajouté %(addedAddresses)s comme adresse pour ce salon.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s a ajouté %(addedAddresses)s comme adresses pour ce salon.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s a supprimé %(removedAddresses)s comme adresse pour ce salon.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s a supprimé %(removedAddresses)s comme adresses pour ce salon.",
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s a ajouté %(addedAddresses)s et supprimé %(removedAddresses)s comme adresses pour ce salon.",
"%(senderName)s set the canonical address for this room to %(address)s.": "%(senderName)s a défini l'adresse canonique de ce salon comme %(address)s.",
"%(senderName)s removed the canonical address for this room.": "%(senderName)s a supprimé l'adresse canonique de ce salon.",
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s à défini l'adresse principale pour ce salon comme %(address)s.",
"%(senderName)s removed the main address for this room.": "%(senderName)s a supprimé l'adresse principale de ce salon."
}

View file

@ -1269,5 +1269,15 @@
"Forces the current outbound group session in an encrypted room to be discarded": "A jelenlegi csoport munkamenet törlését kikényszeríti a titkosított szobában",
"Registration Required": "Regisztrációt igényel",
"You need to register to do this. Would you like to register now?": "Hogy ezt megtedd regisztrálnod kell. Szeretnél regisztrálni?",
"Unable to query for supported registration methods": "A támogatott regisztrációs folyamatok listáját nem sikerült lekérdezni"
"Unable to query for supported registration methods": "A támogatott regisztrációs folyamatok listáját nem sikerült lekérdezni",
"Unable to connect to Homeserver. Retrying...": "A matrix szerverrel nem lehet felvenni a kapcsolatot. Újrapróbálkozás...",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s szoba címnek beállította: %(addedAddresses)s.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s szoba címnek hozzáadta: %(addedAddresses)s.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s törölte a szoba címek közül: %(removedAddresses)s.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s törölte a szoba címek közül: %(removedAddresses)s.",
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s hozzáadta a szoba címekhez: %(addedAddresses)s és törölte a címek közül: %(removedAddresses)s.",
"%(senderName)s set the canonical address for this room to %(address)s.": "%(senderName)s olvasható címet allított be a szobához: %(address)s.",
"%(senderName)s removed the canonical address for this room.": "%(senderName)s törölte a szoba olvasható címét.",
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s elsődleges szoba címnek beállította: %(address)s.",
"%(senderName)s removed the main address for this room.": "A szoba elsődleges címét %(senderName)s törölte."
}

View file

@ -341,5 +341,39 @@
"Collapse panel": "Lipat panel",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Dengan browser ini, tampilan dari aplikasi mungkin tidak sesuai, dan beberapa atau bahkan semua fitur mungkin tidak berjalan. Jika Anda ingin tetap mencobanya, Anda bisa melanjutkan, tapi Anda tanggung sendiri jika muncul masalah yang terjadi!",
"Checking for an update...": "Cek pembaruan...",
"There are advanced notifications which are not shown here": "Ada notifikasi lanjutan yang tidak ditampilkan di sini"
"There are advanced notifications which are not shown here": "Ada notifikasi lanjutan yang tidak ditampilkan di sini",
"This email address is already in use": "Alamat email ini telah terpakai",
"This phone number is already in use": "Nomor telepon ini telah terpakai",
"Failed to verify email address: make sure you clicked the link in the email": "Gagal memverifikasi alamat email: pastikan Anda telah menekan link di dalam email",
"The version of Riot.im": "Versi Riot.im",
"Your language of choice": "Pilihan bahasamu",
"Your homeserver's URL": "URL Homeserver Anda",
"Your identity server's URL": "URL Server Identitas Anda",
"e.g. %(exampleValue)s": "",
"Every page you use in the app": "Setiap halaman yang digunakan di app",
"e.g. <CurrentPageURL>": "e.g. <URLHalamanSaatIni>",
"Your User Agent": "User Agent Anda",
"Your device resolution": "Resolusi perangkat Anda",
"Analytics": "Analitik",
"The information being sent to us to help make Riot.im better includes:": "Informasi yang dikirim membantu kami memperbaiki Riot.im, termasuk:",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Apabila terdapat informasi yang dapat digunakan untuk pengenalan pada halaman ini, seperti ruang, pengguna, atau ID grup, kami akan menghapusnya sebelum dikirim ke server.",
"Call Failed": "Panggilan Gagal",
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Ada perangkat yang belum dikenal di ruang ini: apabila Anda melanjutkan tanpa memverifikasi terlebih dahulu, pembicaraan Anda dapat disadap orang yang tidak diinginkan.",
"Review Devices": "Telaah Perangkat",
"Call Anyway": "Tetap Panggil",
"Answer Anyway": "Tetap Jawab",
"Call": "Panggilan",
"Answer": "Jawab",
"Call Timeout": "Masa Berakhir Panggilan",
"The remote side failed to pick up": "Gagal jawab oleh pihak lain",
"Unable to capture screen": "Tidak dapat menangkap tampilan",
"Existing Call": "Panggilan Berlangsung",
"VoIP is unsupported": "VoIP tidak didukung",
"You cannot place VoIP calls in this browser.": "Anda tidak dapat melakukan panggilan VoIP di browser ini.",
"A conference call could not be started because the intgrations server is not available": "Panggilan massal tidak dapat dimulai karena server integrasi tidak tersedia",
"Call in Progress": "Panggilan Berlangsung",
"A call is currently being placed!": "Sedang melakukan panggilan sekarang!",
"A call is already in progress!": "Masih ada panggilan berlangsung!",
"Permission Required": "Permisi Dibutuhkan",
"You do not have permission to start a conference call in this room": "Anda tidak memiliki permisi untuk memulai panggilan massal di ruang ini"
}

View file

@ -13,7 +13,7 @@
"Cancel": "Annulla",
"Close": "Chiudi",
"Create new room": "Crea una nuova stanza",
"Custom Server Options": "Opzioni Server Personalizzate",
"Custom Server Options": "Opzioni server personalizzate",
"Dismiss": "Chiudi",
"Error": "Errore",
"Favourite": "Preferito",
@ -1265,5 +1265,16 @@
"Click here to see older messages.": "Clicca qui per vedere i messaggi precedenti.",
"Failed to upgrade room": "Aggiornamento stanza fallito",
"The room upgrade could not be completed": "Non è stato possibile completare l'aggiornamento della stanza",
"Upgrade this room to version %(version)s": "Aggiorna questa stanza alla versione %(version)s"
"Upgrade this room to version %(version)s": "Aggiorna questa stanza alla versione %(version)s",
"Registration Required": "Registrazione necessaria",
"You need to register to do this. Would you like to register now?": "Devi registrarti per eseguire questa azione. Vuoi registrarti ora?",
"Unable to connect to Homeserver. Retrying...": "Impossibile connettersi all'homeserver. Riprovo...",
"Unable to query for supported registration methods": "Impossibile richiedere i metodi di registrazione supportati",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s ha aggiunto %(addedAddresses)s come indirizzo per questa stanza.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s ha aggiunto %(addedAddresses)s come indirizzi per questa stanza.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s ha rimosso %(removedAddresses)s tra gli indirizzi di questa stanza.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s ha rimosso %(removedAddresses)s tra gli indirizzi di questa stanza.",
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s ha aggiunto %(addedAddresses)s e rimosso %(removedAddresses)s tra gli indirizzi di questa stanza.",
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s ha messo %(address)s come indirizzo principale per questa stanza.",
"%(senderName)s removed the main address for this room.": "%(senderName)s ha rimosso l'indirizzo principale di questa stanza."
}

View file

@ -738,9 +738,9 @@
"No results": "Jokių rezultatų",
"Delete": "Ištrinti",
"%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s",
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s pasikeitė savo vardą",
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s pasikeitė savo avatarą",
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s pasikeitė savo avatarą",
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s pasikeitė vardą",
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s pasikeitė avatarą",
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s pasikeitė avatarą",
"collapse": "suskleisti",
"expand": "išskleisti",
"Room directory": "Kambarių katalogas",
@ -782,5 +782,93 @@
"Send Logs": "Siųsti žurnalus",
"Refresh": "Įkelti iš naujo",
"Unable to restore session": "Nepavyko atkurti seanso",
"Invalid Email Address": "Neteisingas el. pašto adresas"
"Invalid Email Address": "Neteisingas el. pašto adresas",
"You cannot place VoIP calls in this browser.": "Negalite inicijuoti VoIP skambučių šioje naršyklėje.",
"You cannot place a call with yourself.": "Negalite skambinti patys sau.",
"Registration Required": "Reikalinga registracija",
"You need to register to do this. Would you like to register now?": "Norėdami tai atlikti, turite užsiregistruoti. Ar norėtumėte užsiregistruoti dabar?",
"Missing roomId.": "Trūksta kambario ID (roomId).",
"Leave room": "Išeiti iš kambario",
"(could not connect media)": "(nepavyko prijungti medijos)",
"This homeserver has hit its Monthly Active User limit.": "Šis namų serveris pasiekė savo mėnesinį aktyvių naudotojų limitą.",
"This homeserver has exceeded one of its resource limits.": "Šis namų serveris viršijo vieno iš savo išteklių limitą.",
"Unable to connect to Homeserver. Retrying...": "Nepavyksta prisijungti prie namų serverio. Bandoma iš naujo...",
"Hide avatar changes": "Slėpti avatarų pasikeitimus",
"Disable Community Filter Panel": "Išjungti bendruomenės filtro skydelį",
"Enable widget screenshots on supported widgets": "Palaikomuose valdikliuose įjungti valdiklių ekrano kopijas",
"Export E2E room keys": "Eksportuoti E2E kambario raktus",
"Select devices": "Pasirinkti įrenginius",
"Last seen": "Paskutinį kartą matytas",
"Unignore": "Nustoti nepaisyti",
"and %(count)s others...|other": "ir %(count)s kitų...",
"and %(count)s others...|one": "ir dar vienas...",
"Mention": "Paminėti",
"At this time it is not possible to reply with a file so this will be sent without being a reply.": "Šiuo metu neįmanoma atsakyti failu, taigi, šis failas bus išsiųstas ne atsakymo pavidalu.",
"This room has been replaced and is no longer active.": "Šis kambarys buvo pakeistas ir daugiau nebėra aktyvus.",
"You do not have permission to post to this room": "Jūs neturite leidimų rašyti šiame kambaryje",
"Turn Markdown on": "Įjungti Markdown",
"Turn Markdown off": "Išjungti Markdown",
"Markdown is disabled": "Markdown yra išjungta",
"Markdown is enabled": "Markdown yra įjungta",
"Drop here to favourite": "Vilkite čia, norėdami pridėti į mėgstamus",
"Drop here to restore": "Vilkite čia, norėdami atkurti",
"System Alerts": "Sistemos įspėjimai",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Norėtumėte <acceptText>priimti</acceptText> ar <declineText>atmesti</declineText> šį pakvietimą?",
"This is a preview of this room. Room interactions have been disabled": "Tai yra kambario peržiūra. Kambario sąveikos yra išjungtos",
"To change the room's avatar, you must be a": "Norėdami pakeisti kambario avatarą, privalote būti",
"Failed to unban": "Nepavyko atblokuoti",
"Privacy warning": "Privatumo įspėjimas",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Šifruotos žinutės nebus matomos kliento programose, kurios kol kas neįgyvendino šifravimo",
"Tagged as: ": "Pažymėtas kaip: ",
"To link to a room it must have <a>an address</a>.": "Norint susieti kambarį, jis privalo turėti <a>adresą</a>.",
"Internal room ID: ": "Vidinis kambario ID: ",
"not specified": "nenurodyta",
"not set": "nenustatyta",
"In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "Šifruotuose kambariuose, tokiuose kaip šis, URL nuorodų peržiūra pagal numatymą yra išjungta, kad būtų užtikrinta, jog jūsų namų serveris (kuriame yra generuojamos peržiūros) negalės rinkti informacijos apie šiame kambaryje matomas nuorodas.",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s pakeitė %(roomName)s avatarą",
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s pašalino kambario avatarą.",
"%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s pakeitė kambario avatarą į <img/>",
"Removed or unknown message type": "Žinutė pašalinta arba yra nežinomo tipo",
"Username on %(hs)s": "Naudotojo vardas ties %(hs)s",
"Filter community members": "Filtruoti bendruomenės dalyvius",
"Removing a room from the community will also remove it from the community page.": "Pašalinus kambarį iš bendruomenės, taip pat pašalins jį iš bendruomenės puslapio.",
"Filter community rooms": "Filtruoti bendruomenės kambarius",
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Padėkite patobulinti Riot.im, siųsdami <UsageDataLink>anoniminius naudojimosi duomenis</UsageDataLink>. Tai panaudos slapuką (žiūrėkite mūsų <PolicyLink>Slapukų politiką</PolicyLink>).",
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Padėkite patobulinti Riot.im, siųsdami <UsageDataLink>anoniminius naudojimosi duomenis</UsageDataLink>. Tai panaudos slapuką.",
"Please <a>contact your service administrator</a> to get this limit increased.": "Norėdami padidinti šį limitą, <a>susisiekite su savo paslaugų administratoriumi</a>.",
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Šis namų serveris pasiekė savo mėnesinį aktyvių naudotojų limitą, taigi, <b>kai kurie naudotojai negalės prisijungti</b>.",
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Šis namų serveris viršijo vieno iš savo išteklių limitą, taigi, <b>kai kurie naudotojai negalės prisijungti</b>.",
"An error ocurred whilst trying to remove the widget from the room": "Įvyko klaida, bandant pašalinti valdiklį iš kambario",
"Blacklist": "Įtraukti į juodąjį sąrašą",
"Unblacklist": "Pašalinti iš juodojo sąrašo",
"Verify...": "Patvirtinti...",
"Communities": "Bendruomenės",
"Home": "Pradžia",
"%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s išėjo %(count)s kartų(-us)",
"%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s išėjo",
"%(oneUser)sleft %(count)s times|other": "%(oneUser)s išėjo %(count)s kartų(-us)",
"%(oneUser)sleft %(count)s times|one": "%(oneUser)s išėjo",
"%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s pasikeitė vardus",
"%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s pasikeitė vardą %(count)s kartų(-us)",
"%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s pasikeitė avatarą %(count)s kartų(-us)",
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s pasikeitė avatarą %(count)s kartų(-us)",
"And %(count)s more...|other": "Ir dar %(count)s...",
"Existing Call": "Esamas skambutis",
"A call is already in progress!": "Skambutis jau yra inicijuojamas!",
"Default": "Numatytasis",
"Restricted": "Apribotas",
"Moderator": "Moderatorius",
"Ignores a user, hiding their messages from you": "Nepaiso naudotojo, paslepiant nuo jūsų jo žinutes",
"Stops ignoring a user, showing their messages going forward": "Sustabdo naudotojo nepaisymą, rodant jo tolimesnes žinutes",
"Hide avatars in user and room mentions": "Slėpti avatarus naudotojų ir kambarių paminėjimuose",
"Revoke Moderator": "Panaikinti moderatorių",
"deleted": "perbrauktas",
"underlined": "pabrauktas",
"inline-code": "įterptas kodas",
"block-quote": "citatos blokas",
"bulleted-list": "suženklintasis sąrašas",
"numbered-list": "sąrašas su numeriais",
"Invites": "Pakvietimai",
"You have no historical rooms": "Jūs neturite istorinių kambarių",
"Historical": "Istoriniai"
}

View file

@ -640,7 +640,7 @@
"Display your community flair in rooms configured to show it.": "Vis samfunnssærpreget ditt i rom som er stilt inn til å visa det.",
"You're not currently a member of any communities.": "Du er for augeblunket ikkje medlem i nokre samfunn.",
"Yes, I want to help!": "Ja, eg vil vera til nytte!",
"You are not receiving desktop notifications": "Du fær ikkje nokre skrivebordsvarsel",
"You are not receiving desktop notifications": "Du fær ikkje skrivebordsvarsel",
"Enable them now": "Skru dei på no",
"What's New": "Kva er nytt",
"Update": "Oppdatering",

View file

@ -52,7 +52,7 @@
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s tog bort rummets namn.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s bytte rummets ämne till \"%(topic)s\".",
"Changes to who can read history will only apply to future messages in this room": "Ändringar till vem som kan läsa meddelandehistorik tillämpas endast till framtida meddelanden i det här rummet",
"Changes your display nickname": "Byter ditt synliga namn",
"Changes your display nickname": "Ändrar ditt visningsnamn",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Om du byter lösenord kommer för tillfället alla krypteringsnycklar på alla enheter att nollställas, vilket gör all krypterad meddelandehistorik omöjligt att läsa, om du inte först exporterar rumsnycklarna och sedan importerar dem efteråt. I framtiden kommer det här att förbättras.",
"Claimed Ed25519 fingerprint key": "Påstådd Ed25519-fingeravtrycksnyckel",
"Clear Cache and Reload": "Töm cache och ladda om",
@ -96,7 +96,7 @@
"Devices will not yet be able to decrypt history from before they joined the room": "Enheter kan inte ännu dekryptera meddelandehistorik från före de gick med i rummet",
"Direct chats": "Direkt-chattar",
"Disinvite": "Häv inbjudan",
"Display name": "Namn",
"Display name": "Visningsnamn",
"Displays action": "Visar åtgärd",
"Don't send typing notifications": "Skicka inte \"skriver\"-status",
"Download %(text)s": "Ladda ner %(text)s",
@ -135,7 +135,7 @@
"Failed to send email": "Det gick inte att skicka epost",
"Failed to send request.": "Det gick inte att sända begäran.",
"Failed to set avatar.": "Misslyckades med att ange avatar.",
"Failed to set display name": "Det gick inte att sätta namnet",
"Failed to set display name": "Det gick inte att ange visningsnamn",
"Failed to set up conference call": "Det gick inte att starta konferenssamtalet",
"Failed to toggle moderator status": "Det gick inte att växla moderator-status",
"Failed to unban": "Det gick inte att avbanna",
@ -462,7 +462,7 @@
"The Home Server may be too old to support third party networks": "Hemservern kan vara för gammal för stöda tredje parters nätverk",
"Noisy": "Högljudd",
"Room not found": "Rummet hittades inte",
"Messages containing my display name": "Meddelanden som innehåller mitt namn",
"Messages containing my display name": "Meddelanden som innehåller mitt visningsnamn",
"Messages in one-to-one chats": "Meddelanden i privata chattar",
"Unavailable": "Otillgänglig",
"View Decrypted Source": "Visa dekrypterad källa",
@ -1262,5 +1262,10 @@
"Create a new room with the same name, description and avatar": "Skapa ett nytt rum med samma namn, beskrivning och avatar",
"Update any local room aliases to point to the new room": "Uppdatera lokala rumsalias att peka på det nya rummet",
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Hindra användare från att prata i den gamla rumsversionen och posta ett meddelande som rekommenderar användare att flytta till det nya rummet",
"Put a link back to the old room at the start of the new room so people can see old messages": "Sätta en länk tillbaka till det gamla rummet i början av det nya rummet så att folk kan se gamla meddelanden"
"Put a link back to the old room at the start of the new room so people can see old messages": "Sätta en länk tillbaka till det gamla rummet i början av det nya rummet så att folk kan se gamla meddelanden",
"Registration Required": "Registrering krävs",
"You need to register to do this. Would you like to register now?": "Du måste registrera dig för att göra detta. Vill du registrera dig nu?",
"Forces the current outbound group session in an encrypted room to be discarded": "Tvingar den aktuella utgående gruppsessionen i ett krypterat rum att överges",
"Unable to connect to Homeserver. Retrying...": "Det gick inte att ansluta till hemserver. Försöker igen ...",
"Unable to query for supported registration methods": "Det gick inte att hämta stödda registreringsmetoder"
}

View file

@ -65,7 +65,7 @@
"For security, this session has been signed out. Please sign in again.": "出于安全考虑,此会话已被注销。请重新登录。.",
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "出于安全考虑,用户注销时会清除浏览器里的端到端加密密钥。如果你想要下次登录 Riot 时能解密过去的聊天记录,请导出你的聊天室密钥。",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 从 %(fromPowerLevel)s 变为 %(toPowerLevel)s",
"Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主动邀请。.",
"Guests cannot join this room even if explicitly invited.": "即使有人主动邀请,游客也不能加入此聊天室。",
"Hangup": "挂断",
"Hide read receipts": "隐藏已读回执",
"Hide Text Formatting Toolbar": "隐藏格式工具栏",
@ -76,7 +76,7 @@
"Import E2E room keys": "导入聊天室端到端加密密钥",
"Incorrect verification code": "验证码错误",
"Interface Language": "界面语言",
"Invalid alias format": "别名格式错误",
"Invalid alias format": "别名格式无效",
"Invalid address format": "地址格式错误",
"Invalid Email Address": "邮箱地址格式错误",
"Invalid file%(extra)s": "非法文件%(extra)s",
@ -84,7 +84,7 @@
"Return to login screen": "返回登录页面",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot 没有通知发送权限 - 请检查您的浏览器设置",
"Riot was not given permission to send notifications - please try again": "Riot 没有通知发送权限 - 请重试",
"riot-web version:": "riot-网页版",
"riot-web version:": "riot-web 版本",
"Room %(roomId)s not visible": "聊天室 %(roomId)s 已隐藏",
"Room Colour": "聊天室颜色",
"Room name (optional)": "聊天室名称 (可选)",
@ -133,15 +133,15 @@
"Algorithm": "算法",
"Always show message timestamps": "总是显示消息时间戳",
"%(names)s and %(lastPerson)s are typing": "%(names)s 和 %(lastPerson)s 正在输入",
"A new password must be entered.": "一个新的密码必须输入。.",
"A new password must be entered.": "必须输入新密码。",
"%(senderName)s answered the call.": "%(senderName)s 接了通话。.",
"An error has occurred.": "一个错误出现了。",
"An error has occurred.": "发生了一个错误。",
"Attachment": "附件",
"Autoplay GIFs and videos": "自动播放 GIF 与视频",
"%(senderName)s banned %(targetName)s.": "%(senderName)s 封禁了 %(targetName)s.",
"Ban": "封禁",
"Banned users": "被封禁的用户",
"Click here to fix": "点击这里修复",
"Click here to fix": "点击这里修复",
"Confirm password": "确认密码",
"Confirm your new password": "确认你的新密码",
"Continue": "继续",
@ -153,7 +153,7 @@
"%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.",
"Leave room": "退出聊天室",
"New password": "新密码",
"Add a topic": "添加一个主题",
"Add a topic": "添加主题",
"Admin": "管理员",
"Admin Tools": "管理工具",
"VoIP": "IP 电话",
@ -167,7 +167,7 @@
"Camera": "摄像头",
"Hide removed messages": "隐藏被删除的消息",
"Authentication": "认证",
"Alias (optional)": "别名 (可选)",
"Alias (optional)": "别名(可选)",
"%(items)s and %(lastItem)s": "%(items)s 和 %(lastItem)s",
"and %(count)s others...|other": "和其它 %(count)s 个...",
"and %(count)s others...|one": "和其它一个...",
@ -180,7 +180,7 @@
"Are you sure you want to upload the following files?": "你确定要上传这些文件吗?",
"Bans user with given id": "按照 ID 封禁指定的用户",
"Blacklisted": "已拉黑",
"Bulk Options": "批量操作",
"Bulk Options": "批量选项",
"Call Timeout": "通话超时",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "无法连接主服务器 - 请检查网络连接,确保你的<a>主服务器 SSL 证书</a>被信任,且没有浏览器插件拦截请求。",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "当浏览器地址栏里有 HTTPS 的 URL 时,不能使用 HTTP 连接主服务器。请使用 HTTPS 或者<a>允许不安全的脚本</a>。",
@ -214,7 +214,7 @@
"Custom": "自定义",
"Custom level": "自定义级别",
"Decline": "拒绝",
"Device already verified!": "设备已验证!",
"Device already verified!": "设备已验证!",
"Device ID:": "设备 ID:",
"device id: ": "设备 ID: ",
"Device key:": "设备密钥 :",
@ -231,7 +231,7 @@
"Export": "导出",
"Failed to fetch avatar URL": "获取 Avatar URL 失败",
"Failed to upload profile picture!": "头像上传失败!",
"Guest access is disabled on this Home Server.": "此服务器禁用了游客访问。",
"Guest access is disabled on this Home Server.": "此服务器已禁止游客访问。",
"Home": "主页面",
"Import": "导入",
"Incoming call from %(name)s": "来自 %(name)s 的通话",
@ -242,8 +242,8 @@
"Invited": "已邀请",
"Invites": "邀请",
"Invites user with given id to current room": "按照 ID 邀请指定用户加入当前聊天室",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' 不是一个合法的邮箱地址格式",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' 不是一个合法的昵称格式",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' 不符合电子邮箱地址的格式",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' 不符合别名的格式",
"%(displayName)s is typing": "%(displayName)s 正在输入",
"Sign in with": "第三方登录",
"Message not sent due to unknown devices being present": "消息未发送,因为有未知的设备存在",
@ -289,7 +289,7 @@
"Could not connect to the integration server": "无法连接关联的服务器",
"Curve25519 identity key": "Curve25519 认证密钥",
"Edit": "编辑",
"Joins room with given alias": "指定的别名加入聊天室",
"Joins room with given alias": "通过指定的别名加入聊天室",
"Labs": "实验室",
"%(targetName)s left the room.": "%(targetName)s 退出了聊天室。",
"Logged in as:": "登录为:",
@ -315,14 +315,14 @@
"Verified": "已验证",
"Verified key": "已验证的密钥",
"Video call": "视频通话",
"Voice call": "通话",
"Voice call": "音通话",
"VoIP conference finished.": "VoIP 会议结束。",
"VoIP conference started.": "VoIP 会议开始。",
"VoIP is unsupported": "不支持 VoIP",
"Warning!": "警告!",
"You must <a>register</a> to use this functionality": "你必须 <a>注册</a> 以使用此功能",
"You need to be logged in.": "你需要登录。",
"You need to enter a user name.": "你需要输入一个用户名。",
"You need to enter a user name.": "必须输入用户名。",
"Your password has been reset": "你的密码已被重置",
"Topic": "主题",
"Make Moderator": "使成为主持人",
@ -381,22 +381,22 @@
"Example": "例子",
"Create": "创建",
"Failed to upload image": "上传图像失败",
"Add a widget": "添加一个小挂件",
"Add a widget": "添加小挂件",
"Accept": "接受",
"Access Token:": "访问令牌:",
"Cannot add any more widgets": "无法添加更多小挂件",
"Delete widget": "删除小挂件",
"Define the power level of a user": "定义一个用户的特权级",
"Define the power level of a user": "定义一位用户的滥权等级",
"Drop here to tag %(section)s": "拖拽到这里标记 %(section)s",
"Enable automatic language detection for syntax highlighting": "为语法高亮启用自动检测编程语言",
"Failed to change power level": "修改特权级别失败",
"Failed to change power level": "滥权等级修改失败",
"Kick": "移除",
"Kicks user with given id": "按照 ID 移除特定的用户",
"Last seen": "最近一次上线",
"Level:": "级别:",
"Local addresses for this room:": "此聊天室的本地地址:",
"New passwords must match each other.": "新密码必须互相匹配。",
"Power level must be positive integer.": "权限级别必须是正整数。",
"Power level must be positive integer.": "滥权等级必须是正整数。",
"Reason: %(reasonText)s": "理由: %(reasonText)s",
"Revoke Moderator": "撤销主持人",
"Revoke widget access": "撤回小挂件的访问权",
@ -409,9 +409,9 @@
"Save": "保存",
"Send anyway": "仍然发送",
"Sets the room topic": "设置聊天室主题",
"Show Text Formatting Toolbar": "显示文格式工具栏",
"Show Text Formatting Toolbar": "显示文格式工具栏",
"This room has no local addresses": "此聊天室没有本地地址",
"This doesn't appear to be a valid email address": "这看起来不是一个合法的邮箱地址",
"This doesn't appear to be a valid email address": "这似乎不是有效的邮箱地址",
"This is a preview of this room. Room interactions have been disabled": "这是此聊天室的预览。交互操作已被禁用",
"This phone number is already in use": "此手机号码已被使用",
"This room": "此聊天室",
@ -439,12 +439,12 @@
"Usage": "用法",
"Who can read history?": "谁可以阅读历史消息?",
"You are not in this room.": "您不在此聊天室中。",
"You have no visible notifications": "没有可见的通知",
"You have no visible notifications": "没有可见的通知",
"Missing password.": "缺少密码。",
"Passwords don't match.": "密码不匹配。",
"I already have an account": "我已经有一个帐号",
"I already have an account": "我已经有帐号",
"Unblacklist": "移出黑名单",
"Not a valid Riot keyfile": "不是一个有效的 Riot 密钥文件",
"Not a valid Riot keyfile": "不是有效的 Riot 密钥文件",
"%(targetName)s accepted an invitation.": "%(targetName)s 已接受邀请。",
"Do you want to load widget from URL:": "你是否要从此 URL 中加载小挂件:",
"Hide join/leave messages (invites/kicks/bans unaffected)": "隐藏加入/退出消息(邀请/踢出/封禁不受影响)",
@ -452,7 +452,7 @@
"Publish this room to the public in %(domain)s's room directory?": "是否将此聊天室发布至 %(domain)s 的聊天室目录中?",
"Manage Integrations": "管理集成",
"No users have specific privileges in this room": "此聊天室中没有用户有特殊权限",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s 发起了一个 %(callType)s 通话。",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s 发起了 %(callType)s 通话。",
"Please check your email and click on the link it contains. Once this is done, click continue.": "请检查你的电子邮箱并点击里面包含的链接。完成时请点击继续。",
"Press <StartChatButton> to start a chat with someone": "按下 <StartChatButton> 来开始和某个人聊天",
"%(senderName)s removed their profile picture.": "%(senderName)s 移除了他们的头像。",
@ -462,7 +462,7 @@
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "验证码将发送至 +%(msisdn)s请输入收到的验证码",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s 接受了 %(displayName)s 的邀请。",
"Active call (%(roomName)s)": "当前通话 (来自聊天室 %(roomName)s)",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s 将级别调整%(powerLevelDiffText)s 。",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s 将级别调整%(powerLevelDiffText)s 。",
"Changes colour scheme of current room": "修改了样式",
"Deops user with given id": "按照 ID 取消特定用户的管理员权限",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "通过 <voiceText>语言</voiceText> 或者 <videoText>视频</videoText>加入.",
@ -481,9 +481,9 @@
"%(roomName)s is not accessible at this time.": "%(roomName)s 此时无法访问。",
"Start authentication": "开始认证",
"The maximum permitted number of widgets have already been added to this room.": "此聊天室可拥有的小挂件数量已达到上限。",
"The phone number entered looks invalid": "输入的手机号码看起来无效",
"The phone number entered looks invalid": "此手机号码似乎无效",
"The remote side failed to pick up": "对方未能接听",
"This Home Server does not support login using email address.": "HS不支持使用邮箱地址登陆。",
"This Home Server does not support login using email address.": "此主服务器不支持使用邮箱地址登陆。",
"This invitation was sent to an email address which is not associated with this account:": "此邀请被发送到与此帐户不相关的邮箱地址:",
"This room is not recognised.": "无法识别此聊天室。",
"To get started, please pick a username!": "请点击用户名!",
@ -500,7 +500,7 @@
"User name": "用户名",
"(no answer)": "(没有回答)",
"(warning: cannot be disabled again!)": "(警告:无法再被禁用!)",
"WARNING: Device already verified, but keys do NOT MATCH!": "警告:设备已验证,但密钥不匹配!",
"WARNING: Device already verified, but keys do NOT MATCH!": "警告:设备已验证,但密钥不匹配!",
"Who can access this room?": "谁有权访问此聊天室?",
"Who would you like to add to this room?": "你想把谁添加到此聊天室?",
"Who would you like to communicate with?": "你想和谁交流?",
@ -513,12 +513,12 @@
"You seem to be in a call, are you sure you want to quit?": "您似乎正在进行通话,确定要退出吗?",
"You seem to be uploading files, are you sure you want to quit?": "您似乎正在上传文件,确定要退出吗?",
"You should not yet trust it to secure data": "你不应该相信它来保护你的数据",
"Upload an avatar:": "上传一个头像:",
"This doesn't look like a valid email address.": "这看起来不是一个合法的邮箱地址。",
"This doesn't look like a valid phone number.": "这看起来不是一个合法的手机号码。",
"Upload an avatar:": "上传头像:",
"This doesn't look like a valid email address.": "这似乎不是有效的邮箱地址。",
"This doesn't look like a valid phone number.": "这似乎不是有效的手机号码。",
"User names may only contain letters, numbers, dots, hyphens and underscores.": "用户名只可以包含字母、数字、点、连字号和下划线。",
"An unknown error occurred.": "一个未知错误出现了。",
"An error occurred: %(error_string)s": "一个错误出现了 %(error_string)s",
"An unknown error occurred.": "发生了一个未知错误。",
"An error occurred: %(error_string)s": "发生了一个错误: %(error_string)s",
"Encrypt room": "加密聊天室",
"There are no visible files in this room": "此聊天室中没有可见的文件",
"Active call": "当前通话",
@ -531,28 +531,28 @@
"Check for update": "检查更新",
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s 移除了聊天室头像。",
"Something went wrong!": "出了点问题!",
"If you already have a Matrix account you can <a>log in</a> instead.": "如果你已经有一个 Matrix 帐号,你可以<a>登录</a>。",
"Do you want to set an email address?": "要设置一个邮箱地址吗?",
"If you already have a Matrix account you can <a>log in</a> instead.": "若您已经拥有 Matrix 帐号,您也可以 <a>登录</a>。",
"Do you want to set an email address?": "您想要设置一个邮箱地址吗?",
"New address (e.g. #foo:%(localDomain)s)": "新的地址(例如 #foo:%(localDomain)s",
"Upload new:": "上传新的:",
"User ID": "用户 ID",
"Username invalid: %(errMessage)s": "用户名无效: %(errMessage)s",
"Verification Pending": "验证等待中",
"(unknown failure: %(reason)s)": "(未知错误:%(reason)s",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告:密钥验证失败!%(userId)s 和 device %(deviceId)s 的签名密钥是 \"%(fprint)s\",和提供的咪呀 \"%(fingerprint)s\" 不匹配。这可能意味着你的通信正在被窃听!",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告:密钥验证失败!%(userId)s 和 device %(deviceId)s 的签名密钥为 \"%(fprint)s\",与提供的密钥 \"%(fingerprint)s\" 不匹配。这可能意味着你的通信正在被窃听!",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s 收回了 %(targetName)s 的邀请。",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "你想要 <acceptText>接受</acceptText> 还是 <declineText>拒绝</declineText> 这个邀请?",
"You already have existing direct chats with this user:": "你已经有和此用户的直接聊天:",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "你现在还不再任何聊天室!按下 <CreateRoomButton> 来创建一个聊天室或者 <RoomDirectoryButton> 来浏览目录",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "您尚未处于任何聊天室中!按下 <CreateRoomButton> 创建一个聊天室或 <RoomDirectoryButton> 来浏览目录",
"You cannot place a call with yourself.": "你怎么寂寞到要和自己打电话,不支持的啦。",
"You have been kicked from %(roomName)s by %(userName)s.": "您已被 %(userName)s 从聊天室 %(roomName)s 中移除。",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "你已经登出了所有的设备并不再接收推送通知。要重新启用通知,请在每个设备上登录",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "你已经登出了所有的设备并不再接收推送通知。要重新启用通知,请在每个设备上重新登录",
"You have <a>disabled</a> URL previews by default.": "你已经默认 <a>禁用</a> 链接预览。",
"You have <a>enabled</a> URL previews by default.": "你已经默认 <a>启用</a> 链接预览。",
"Your home server does not support device management.": "你的 home server 不支持设备管理。",
"Set a display name:": "设置一个昵称:",
"Set a display name:": "设置昵称:",
"This server does not support authentication with a phone number.": "此服务器不支持使用手机号码认证。",
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "密码过短(最短为 %(MIN_PASSWORD_LENGTH)s)。",
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "密码长度过短(至少应为 %(MIN_PASSWORD_LENGTH)s 位)。",
"Make this room private": "将此聊天室转为私密聊天室",
"Share message history with new users": "和新用户共享消息历史",
"Copied!": "已复制!",
@ -563,7 +563,7 @@
"Please select the destination room for this message": "请选择此消息的目标聊天室",
"Start automatically after system login": "在系统登录后自动启动",
"Analytics": "统计分析服务",
"Reject all %(invitedRooms)s invites": "拒绝所有 %(invitedRooms)s 邀请",
"Reject all %(invitedRooms)s invites": "拒绝所有 %(invitedRooms)s 邀请",
"You may wish to login with a different account, or add this email to this account.": "您可能是想要用另一个账户登录,或是将此电子邮件关联至当前账户。",
"Sun": "周日",
"Mon": "周一",
@ -584,11 +584,11 @@
"Oct": "十月",
"Nov": "十一月",
"Dec": "十二月",
"Desktop specific": "桌面特有的",
"Desktop specific": "桌面版特有功能",
"You must join the room to see its files": "你必须加入聊天室以看到它的文件",
"Failed to invite the following users to the %(roomName)s room:": "邀请以下用户到 %(roomName)s 聊天室失败:",
"Confirm Removal": "确认移除",
"Verifies a user, device, and pubkey tuple": "验证一个用户、设备和密钥元组",
"Verifies a user, device, and pubkey tuple": "验证用户、设备与公钥元组",
"Unknown devices": "未知设备",
"Unknown Address": "未知地址",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s 删除了他们的昵称 (%(oldDisplayName)s).",
@ -599,14 +599,14 @@
"Unable to remove contact information": "无法移除联系人信息",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot 收集匿名的分析数据以允许我们改善它。",
"\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" 包含你以前没见过的设备。",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "你可以使用自定义的服务器选项来通过指定一个不同的主服务器 URL 来登录其他 Matrix 服务器。",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "你可以使用自定义服务器选项并指定一个不同的主服务器 URL 来登录其他 Matrix 服务器。",
"This allows you to use this app with an existing Matrix account on a different home server.": "这允许你使用其他主服务器上的 Matrix 帐号。",
"Please check your email to continue registration.": "请查看你的电子邮件以继续注册。",
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "如果你不指定一个邮箱地址,你将不能重置你的密码。你确定吗?",
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "如果不指定一个邮箱地址,您将无法重置你的密码。你确定吗?",
"Home server URL": "主服务器 URL",
"Identity server URL": "身份认证服务器 URL",
"What does this mean?": "这是什么意思?",
"Add an Integration": "添加一个集成",
"Add an Integration": "添加集成",
"Removed or unknown message type": "被移除或未知的消息类型",
"Ongoing conference call%(supportedText)s.": "正在进行的会议通话 %(supportedText)s.",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s 修改了 %(roomName)s 的头像",
@ -615,7 +615,7 @@
"Authentication check failed: incorrect password?": "身份验证失败:密码错误?",
"This will allow you to reset your password and receive notifications.": "这将允许你重置你的密码和接收通知。",
"Share without verifying": "不验证就分享",
"You added a new device '%(displayName)s', which is requesting encryption keys.": "添加了一个新的设备 '%(displayName)s',它正在请求加密密钥。",
"You added a new device '%(displayName)s', which is requesting encryption keys.": "添加了一个新的设备 '%(displayName)s',它正在请求加密密钥。",
"Your unverified device '%(displayName)s' is requesting encryption keys.": "你的未经验证的设备 '%(displayName)s' 正在请求加密密钥。",
"Encryption key request": "加密密钥请求",
"Autocomplete Delay (ms):": "自动补全延迟(毫秒):",
@ -634,15 +634,15 @@
"Invite new community members": "邀请新社区成员",
"Invite to Community": "邀请到社区",
"Room name or alias": "聊天室名称或别名",
"Ignored user": "忽视用户",
"Ignored user": "已忽略的用户",
"You are now ignoring %(userId)s": "你正在忽视 %(userId)s",
"Unignored user": "接触忽视用户",
"Unignored user": "未忽略的用户",
"You are no longer ignoring %(userId)s": "你不再忽视 %(userId)s",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s 解除了 %(targetName)s 的封禁。",
"(could not connect media)": "(无法连接媒体)",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s 更改了聊天室的置顶消息。",
"%(names)s and %(count)s others are typing|other": "%(names)s 和另外 %(count)s 个人正在输入",
"%(names)s and %(count)s others are typing|one": "%(names)s 另一个人正在输入",
"%(names)s and %(count)s others are typing|one": "%(names)s 另一个人正在输入",
"Send": "发送",
"Message Pinning": "消息置顶",
"Disable Emoji suggestions while typing": "输入时禁用 Emoji 建议",
@ -659,8 +659,8 @@
"%(senderName)s sent an image": "%(senderName)s 发送了一张图片",
"%(senderName)s sent a video": "%(senderName)s 发送了一个视频",
"%(senderName)s uploaded a file": "%(senderName)s 上传了一个文件",
"Unignore": "取消忽",
"Ignore": "忽",
"Unignore": "取消忽",
"Ignore": "忽",
"Jump to read receipt": "跳到阅读回执",
"Mention": "提及",
"Invite": "邀请",
@ -706,11 +706,11 @@
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s 更换了他们的头像 %(count)s 次",
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s 更换了他们的头像",
"%(items)s and %(count)s others|other": "%(items)s 和其他 %(count)s 人",
"%(items)s and %(count)s others|one": "%(items)s 和另一个人",
"%(items)s and %(count)s others|one": "%(items)s 与另一个",
"collapse": "折叠",
"expand": "展开",
"email address": "邮箱地址",
"You have entered an invalid address.": "你输入了一个无效地址。",
"You have entered an invalid address.": "您输入了无效的地址。",
"Advanced options": "高级选项",
"Leave": "退出",
"Description": "描述",
@ -718,7 +718,7 @@
"Light theme": "浅色主题",
"Dark theme": "深色主题",
"Status.im theme": "Status.im 主题",
"Ignored Users": "忽视用户",
"Ignored Users": "已忽略的用户",
"Room Notification": "聊天室通知",
"The platform you're on": "您使用的平台是",
"The version of Riot.im": "Riot.im 的版本是",
@ -734,10 +734,10 @@
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(monthName)s %(day)s %(time)s, %(weekDayName)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(fullYear)s %(monthName)s %(day)s, %(weekDayName)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(fullYear)s %(monthName)s %(day)s %(time)s, %(weekDayName)s",
"Who would you like to add to this community?": "你想把谁添加到此社区中?",
"Who would you like to add to this community?": "您想把谁添加至此社区中?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "警告:您添加的一切用户都将会对一切知道此社区的 ID 的人公开",
"Name or matrix ID": "名称或 Matrix ID",
"Which rooms would you like to add to this community?": "您想把哪个聊天室添加此社区中?",
"Which rooms would you like to add to this community?": "您想把哪个聊天室添加此社区中?",
"Add rooms to the community": "添加聊天室到社区",
"Add to community": "添加到社区",
"Failed to invite users to community": "邀请用户到社区失败",
@ -747,7 +747,7 @@
"Kick this user?": "是否移除此用户?",
"Unban this user?": "是否解封此用户?",
"Ban this user?": "是否封禁此用户?",
"Send an encrypted reply…": "发送加密回复…",
"Send an encrypted reply…": "发送加密回复…",
"Send a reply (unencrypted)…": "发送回复(未加密)…",
"Send an encrypted message…": "发送加密消息…",
"Send a message (unencrypted)…": "发送消息 (未加密)…",
@ -763,9 +763,9 @@
"To kick users, you must be a": "若要移除用户,您至少要是",
"To ban users, you must be a": "若要封禁用户,您至少要是",
"To remove other users' messages, you must be a": "若要删除其他用户的消息,您至少要是",
"%(user)s is a %(userRole)s": "%(user)s 是一 %(userRole)s",
"To link to a room it must have <a>an address</a>.": "要链接一个聊天室,它必须有一个<a>地址</a>。",
"To send events of type <eventType/>, you must be a": "要发送类型为 <eventType/> 的事件,你必须是",
"%(user)s is a %(userRole)s": "%(user)s 是一 %(userRole)s",
"To link to a room it must have <a>an address</a>.": "要链接聊天室,它必须有一个 <a>地址</a>。",
"To send events of type <eventType/>, you must be a": "要发送类型为 <eventType/> 的事件,您的级别至少为",
"Members only (since the point in time of selecting this option)": "仅成员(从选中此选项时开始)",
"Members only (since they were invited)": "只有成员(从他们被邀请开始)",
"Members only (since they joined)": "只有成员(从他们加入开始)",
@ -775,14 +775,14 @@
"Community ID": "社区 ID",
"example": "例子",
"This setting cannot be changed later!": "未来此设置将无法修改!",
"Add a Room": "添加一个聊天室",
"Add a User": "添加一个用户",
"Add a Room": "添加聊天室",
"Add a User": "添加用户",
"Unable to accept invite": "无法接受邀请",
"Unable to reject invite": "无法拒绝邀请",
"Leave Community": "退出社区",
"Community Settings": "社区设置",
"Community %(groupId)s not found": "找不到社区 %(groupId)s",
"Your Communities": "的社区",
"Your Communities": "的社区",
"Failed to set direct chat tag": "无法设定私聊标签",
"Failed to remove tag %(tagName)s from room": "移除聊天室标签 %(tagName)s 失败",
"Failed to add tag %(tagName)s to room": "无法为聊天室新增标签 %(tagName)s",
@ -806,10 +806,10 @@
"Key request sent.": "已发送密钥共享请求。",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "从其他设备上 <requestLink>重新请求密钥</requestLink>。",
"You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "如果您是房间中最后一位有权限的用户,在您降低自己的权限等级后将无法撤回此修改,因为你将无法重新获得权限。",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "你将无法撤回此修改,因为您正在将此用户的权限提升至和你相同的级别。",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "您将无法撤回此修改,因为您正在将此用户的滥权等级提升至与你相同。",
"No devices with registered encryption keys": "没有设备有已注册的加密密钥",
"Unmute": "取消静音",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s权限级别 %(powerLevelNumber)s",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s滥权等级 %(powerLevelNumber)s",
"Hide Stickers": "隐藏贴图",
"Show Stickers": "显示贴图",
"%(duration)ss": "%(duration)s 秒",
@ -875,7 +875,7 @@
"%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)s 撤回了他们的邀请",
"%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)s 撤回了他们的邀请共 %(count)s 次",
"%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)s 撤回了他们的邀请",
"Custom of %(powerLevel)s": "",
"Custom of %(powerLevel)s": "%(powerLevel)s 的自定义",
"<a>In reply to</a> <pill>": "<a>回复给</a> <pill>",
"Community IDs cannot be empty.": "社区 ID 不能为空。",
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "社区 ID 只能包含 a-z、0-9 或 “=_-./” 等字符",
@ -904,7 +904,7 @@
"In future this verification process will be more sophisticated.": "未来,此验证过程将更为精致、巧妙一些。",
"We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "我们建议您对每台设备进行验证以保证它们属于其合法所有者,但是您可以在不验证它们的情况下重新发送消息。",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>社区页面的 HTML 代码</h1>\n<p>\n 你可以给社区的新成员们写些长长的社区简介来引导他们,或者放置\n 一些重要的<a href=\"foo\">链接</a>\n</p>\n<p>\n 你甚至可以使用 <img> 标签\n</p>\n",
"Add rooms to the community summary": "将聊天室添加到社区简介",
"Add rooms to the community summary": "将聊天室添加到社区简介",
"Which rooms would you like to add to this summary?": "您想要将哪个聊天室添加到社区简介?",
"Add to summary": "添加到简介",
"Failed to add the following rooms to the summary of %(groupId)s:": "添加以下聊天室到 %(groupId)s 的简介时失败:",
@ -917,7 +917,7 @@
"Featured Users:": "核心用户:",
"Join this community": "加入此社区",
"%(inviter)s has invited you to join this community": "%(inviter)s 邀请您加入此社区",
"Failed to add the following users to the summary of %(groupId)s:": "将下列用户添加到 %(groupId)s 的简介中时失败",
"Failed to add the following users to the summary of %(groupId)s:": "将下列用户添加至 %(groupId)s 的简介中时失败:",
"Failed to remove a user from the summary of %(groupId)s": "从 %(groupId)s 的简介中移除用户时失败",
"You are an administrator of this community": "你是此社区的管理员",
"You are a member of this community": "你是此社区的成员",
@ -931,7 +931,7 @@
"Did you know: you can use communities to filter your Riot.im experience!": "你知道吗:你可以将社区用作过滤器以增强你的 Riot.im 使用体验!",
"Create a new community": "创建新社区",
"Error whilst fetching joined communities": "获取已加入社区列表时出现错误",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "创建社区,将用户与聊天室整合在一起!搭建自定义社区主页以在 Matrix 宇宙之中标出您的私人空间。",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "创建社区,将用户与聊天室整合在一起!搭建自定义社区主页以在 Matrix 宇宙之中标出您的私人空间。",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>显示未信任的设备</showDevicesText> 、 <sendAnywayText>不经信任直接发送</sendAnywayText> 或 <cancelText>取消发送</cancelText>。",
"%(count)s of your messages have not been sent.|one": "您的消息尚未发送。",
"Uploading %(filename)s and %(count)s others|other": "正在上传 %(filename)s 与其他 %(count)s 个文件",
@ -939,7 +939,7 @@
"Uploading %(filename)s and %(count)s others|one": "正在上传 %(filename)s 与其他 %(count)s 个文件",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "隐私对我们而言重要至极,所以我们不会在分析统计服务中收集任何个人信息或者可用于识别身份的数据。",
"Learn more about how we use analytics.": "进一步了解我们如何使用分析统计服务。",
"Please note you are logging into the %(hs)s server, not matrix.org.": "请注意,您正在登录的服务器是 %(hs)s不是 matrix.org。",
"Please note you are logging into the %(hs)s server, not matrix.org.": "请注意,您正在登录 %(hs)s而非 matrix.org。",
"This homeserver doesn't offer any login flows which are supported by this client.": "此主服务器不兼容本客户端支持的任何登录方式。",
"Sign in to get started": "登录以开始使用",
"Unbans user with given id": "按照 ID 解封特定的用户",
@ -949,10 +949,10 @@
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "导出的文件将允许任何可以读取它的人解密任何他们可以看到的加密消息,因此您应该小心以确保其安全。为解决此问题,您应该在下面输入密码以加密导出的数据。只有输入相同的密码才能导入数据。",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "导出文件有密码保护。你需要在此输入密码以解密此文件。",
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "此操作允许您导入之前从另一个 Matrix 客户端中导出的加密密钥文件。导入完成后,您将能够解密那个客户端可以解密的加密消息。",
"Ignores a user, hiding their messages from you": "忽略用户,隐藏他们的消息",
"Ignores a user, hiding their messages from you": "忽略用户,隐藏他们发送的消息",
"Stops ignoring a user, showing their messages going forward": "解除忽略用户,显示他们的消息",
"To return to your account in future you need to set a password": "如果你想再次使用账号,您得为它设置一个密码",
"If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "如果你在 GitHub 提交了一个 bug调试日志可以帮助我们追踪这个问题。 调试日志包含应用程序使用数据,也就包括您的用户名、您访问的房间或社区的 ID 或,以及其他用户的用户名,但不包括聊天记录。",
"To return to your account in future you need to set a password": "如果您想再次使用此账号,就必须它设置一个密码",
"If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "如果你在 GitHub 提交了一个 bug调试日志可以帮助我们追踪这个问题。 调试日志包含应用程序使用数据,也就包括您的用户名、您访问的房间或社区的 ID 或名,以及其他用户的用户名,但不包括聊天记录。",
"Debug Logs Submission": "发送调试日志",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "密码修改成功。在您在其他设备上重新登录之前,其他设备不会收到推送通知",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "尝试加载此房间的时间线的特定时间点,但是无法找到。",
@ -1118,7 +1118,7 @@
"Missing roomId.": "找不到此聊天室 ID 所对应的聊天室。",
"You have been banned from %(roomName)s by %(userName)s.": "您已被 %(userName)s 从聊天室 %(roomName)s 中封禁。",
"You have been banned from this room by %(userName)s.": "您已被 %(userName)s 从此聊天室中封禁。",
"Every page you use in the app": "您在 Riot 中使用的每一个页面",
"Every page you use in the app": "您在 Riot 中使用的所有页面",
"e.g. <CurrentPageURL>": "例如:<CurrentPageURL>",
"Your User Agent": "您的 User Agent",
"Your device resolution": "您设备的分辨率",
@ -1126,7 +1126,7 @@
"At this time it is not possible to reply with a file so this will be sent without being a reply.": "目前无法以文件作为回复的内容,所以此文件将不作为回复,独立发送。",
"Unable to reply": "无法回复",
"At this time it is not possible to reply with an emote.": "目前无法使用表情符号作为回复内容。",
"You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "您将被带到一个第三方网站以便验证您的账号使用 %(integrationsUrl)s 提供的集成。您希望继续吗?",
"You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "您将被带到一个第三方网站以便验证您的账号使用 %(integrationsUrl)s 提供的集成。您希望继续吗?",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "目前机器人检查CAPTCHA在桌面端不可用——请使用 <a>浏览器</a>",
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "无法更新聊天室 %(roomName)s 在社区 “%(groupId)s” 中的可见性。",
"Minimize apps": "最小化小部件",
@ -1178,7 +1178,7 @@
"This homeserver has hit its Monthly Active User limit so some users will not be able to log in. Please <a>contact your service administrator</a> to get this limit increased.": "此主服务器已达到其每月活跃用户数量限制,所以,一些用户将无法登录。若要提高此数量限制,请 <a>联系您的服务提供者</a> 。",
"Warning: This widget might use cookies.": "警告:此小挂件可能会使用 cookies。",
"Failed to remove widget": "移除小挂件失败",
"An error ocurred whilst trying to remove the widget from the room": "尝试从聊天室中移除小部件时发生了一个错误",
"An error ocurred whilst trying to remove the widget from the room": "尝试从聊天室中移除小部件时发生了错误",
"Reload widget": "刷新小挂件",
"Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "您确定要移除(删除)此事件吗?注意,如果删除了聊天室名称或话题的变化,就会撤销此更改。",
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "这将使您的账户永远不再可用。您将不能登录,或使用相同的用户 ID 重新注册。您的账户将退出所有已加入的聊天室,身份服务器上的账户信息也会被删除。<b>此操作是不可逆的。</b>",
@ -1226,5 +1226,47 @@
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "已向 %(emailAddress)s 发送了一封电子邮件。点开邮件中的链接后,请点击下面。",
"This homeserver has hit its Monthly Active User limit": "此主服务器已达到其每月活跃用户数量上限",
"Please contact your service administrator to continue using this service.": "请联系您的服务提供者以继续使用此服务。",
"Try the app first": "先试试 Riot.im 应用吧"
"Try the app first": "先试试 Riot.im 应用吧",
"Registration Required": "需要注册",
"You need to register to do this. Would you like to register now?": "您必须注册以继续。您想现在就注册吗?",
"Forces the current outbound group session in an encrypted room to be discarded": "强制丢弃加密聊天室中的当前出站群组会话",
"Unable to connect to Homeserver. Retrying...": "无法连接至主服务器。正在重试…",
"Sorry, your homeserver is too old to participate in this room.": "对不起,您的主服务器的程序版本过旧以至于无法加入此聊天室。",
"Increase performance by only loading room members on first view": "仅在首次查看时加载聊天室成员以改善性能",
"Mirror local video feed": "镜像本地视频源",
"This room has been replaced and is no longer active.": "此聊天室已被取代,且不再活跃。",
"The conversation continues here.": "对话在这里继续。",
"Upgrade room to version %(ver)s": "将聊天室升级为版本 %(ver)s",
"Internal room ID: ": "内部聊天室 ID ",
"Room version number: ": "聊天室版本号: ",
"There is a known vulnerability affecting this room.": "一个已知的威胁正在影响此聊天室。",
"This room version is vulnerable to malicious modification of room state.": "此版本的聊天室难以抵御对聊天室状态的恶意篡改。",
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "点击这里以升级至最新版本的聊天室,并保证聊天室能受到完整的保护。",
"Only room administrators will see this warning": "此警告仅聊天室管理员可见",
"This room is a continuation of another conversation.": "此聊天室是另一个对话的延续之处。",
"Click here to see older messages.": "点击这里以查看更早的消息。",
"Failed to indicate account erasure": "无法指示帐户删除",
"Failed to upgrade room": "聊天室升级失败",
"The room upgrade could not be completed": "聊天室可能没有完整地升级",
"Upgrade this room to version %(version)s": "升级此聊天室至版本 %(version)s",
"Upgrade Room Version": "更新聊天室版本",
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "升级此聊天室需要关闭当前聊天室并创建一个新的聊天室。为了给聊天室成员提供最佳切换体验,我们将:",
"Create a new room with the same name, description and avatar": "创建一个拥有相同的名称,描述与头像的新聊天室",
"Update any local room aliases to point to the new room": "更新所有本地聊天室别名以使其指向新聊天室",
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "阻止用户在旧聊天室中发言,并发送消息建议用户迁移至新聊天室",
"Put a link back to the old room at the start of the new room so people can see old messages": "在新聊天室的消息开始处发送一条旧聊天室的链接,以便用户查看旧消息",
"Lazy loading members not supported": "不支持延迟加载成员",
"Lazy loading is not supported by your current homeserver.": "您当前使用的主服务器尚不支持延迟加载。",
"Legal": "法律信息",
"Unable to query for supported registration methods": "无法请求支持的注册方式",
"This homeserver has hit its Monthly Active User limit.": "此主服务器已达到其每月活跃用户限制。",
"This homeserver has exceeded one of its resource limits.": "本服务器已达到其使用量限制之一。",
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "本服务器已达到其每月活跃用户限制,<b>部分用户将无法登录</b>。",
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "本主服务器已达到其使用量限制之一,<b>部分用户将无法登录</b>。",
"Please <a>contact your service administrator</a> to continue using this service.": "请 <a>联系您的服务管理员</a> 以继续使用本服务。",
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "您的消息未被发送,因为本主服务器已达到其使用量限制之一。请 <a>联系您的服务管理员</a> 以继续使用本服务。",
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "您的消息未被发送,因为本主服务器已达到其每月活跃用户限制。请 <a>联系您的服务管理员</a> 以继续使用本服务。",
"Please <a>contact your service administrator</a> to continue using the service.": "请 <a>联系您的服务管理员</a> 以继续使用本服务。",
"Please contact your homeserver administrator.": "请 联系您主服务器的管理员。",
"Please <a>contact your service administrator</a> to get this limit increased.": "请 <a>联系您的服务管理员</a> 以增加此限制的额度。"
}

View file

@ -1270,5 +1270,12 @@
"Registration Required": "需要註冊",
"You need to register to do this. Would you like to register now?": "您必須註冊以繼續。您想要現在註冊嗎?",
"Unable to query for supported registration methods": "無法查詢支援的註冊方式",
"Unable to connect to Homeserver. Retrying...": "無法連線到家伺服器。正在重試……"
"Unable to connect to Homeserver. Retrying...": "無法連線到家伺服器。正在重試……",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s 新增了 %(addedAddresses)s 為此聊天室的位置。",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s 新增了 %(addedAddresses)s 為此聊天室的位置。",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s 移除了 %(removedAddresses)s 為此聊天室的位置。",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s 移除了 %(removedAddresses)s 為此聊天室的位置。",
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s 新增了 %(addedAddresses)s 並移除了 %(removedAddresses)s 為此聊天室的位置。",
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s 為此聊天室設定了主要位置 %(address)s。",
"%(senderName)s removed the main address for this room.": "%(senderName)s 移除了此聊天室的主要位置。"
}

View file

@ -120,7 +120,7 @@ class RoomListStore extends Store {
this._generateRoomLists();
}
break;
case 'MatrixActions.Room.selfMembership': {
case 'MatrixActions.Room.myMembership': {
this._generateRoomLists();
}
break;
@ -214,8 +214,6 @@ class RoomListStore extends Store {
}
} else if (membership === "leave") {
lists["im.vector.fake.archived"].push(room);
} else {
console.error("unrecognised membership: " + membership + " - this should never happen");
}
});

View file

@ -74,6 +74,7 @@ describe('RoomList', () => {
// Mock joined member
myMember = new RoomMember(movingRoomId, myUserId);
myMember.membership = 'join';
movingRoom.updateMyMembership('join');
movingRoom.getMember = (userId) => ({
[client.credentials.userId]: myMember,
}[userId]);
@ -81,6 +82,7 @@ describe('RoomList', () => {
otherRoom = createRoom({name: 'Other room'});
myOtherMember = new RoomMember(otherRoom.roomId, myUserId);
myOtherMember.membership = 'join';
otherRoom.updateMyMembership('join');
otherRoom.getMember = (userId) => ({
[client.credentials.userId]: myOtherMember,
}[userId]);