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

This commit is contained in:
RiotTranslate 2017-06-01 21:07:12 +00:00
commit 0fa902c21d
37 changed files with 340 additions and 135 deletions

View file

@ -5,5 +5,6 @@ install:
- npm install - npm install
- (cd node_modules/matrix-js-sdk && npm install) - (cd node_modules/matrix-js-sdk && npm install)
script: script:
- npm run test # don't run the riot tests unless the react-sdk tests pass, otherwise
- ./.travis-test-riot.sh # the output is confusing.
- npm run test && ./.travis-test-riot.sh

View file

@ -177,6 +177,11 @@ module.exports = function (config) {
], ],
}, },
devtool: 'inline-source-map', devtool: 'inline-source-map',
externals: {
// Don't try to bundle electron: leave it as a commonjs dependency
// (the 'commonjs' here means it will output a 'require')
"electron": "commonjs electron",
},
}, },
webpackMiddleware: { webpackMiddleware: {

View file

@ -52,6 +52,15 @@ Guest users can't invite users. Please register to invite.
This room is inaccessible to guests. You may be able to join if you register. This room is inaccessible to guests. You may be able to join if you register.
delete the alias. delete the alias.
remove %(name)s from the directory. remove %(name)s from the directory.
Conference call failed.
Conference calling is in development and may not be reliable.
Guest users can't create new rooms. Please register to create room and start a chat.
Server may be unavailable, overloaded, or you hit a bug.
Server unavailable, overloaded, or something else went wrong.
You are already in a call.
You cannot place VoIP calls in this browser.
You cannot place a call with yourself.
Your email address does not appear to be associated with a Matrix ID on this Homeserver.
EOT EOT
)]; )];
} }

View file

@ -226,7 +226,7 @@ function _onAction(payload) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {
title: _t('Existing Call'), title: _t('Existing Call'),
description: _t('You are already in a call') + '.', description: _t('You are already in a call.'),
}); });
return; // don't allow >1 call to be placed. return; // don't allow >1 call to be placed.
} }
@ -236,7 +236,7 @@ function _onAction(payload) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {
title: _t('VoIP is unsupported'), title: _t('VoIP is unsupported'),
description: _t('You cannot place VoIP calls in this browser') + '.', description: _t('You cannot place VoIP calls in this browser.'),
}); });
return; return;
} }
@ -251,7 +251,7 @@ function _onAction(payload) {
if (members.length <= 1) { if (members.length <= 1) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {
description: _t('You cannot place a call with yourself') + '.', description: _t('You cannot place a call with yourself.'),
}); });
return; return;
} }
@ -284,7 +284,7 @@ function _onAction(payload) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {
title: _t('VoIP is unsupported'), title: _t('VoIP is unsupported'),
description: _t('You cannot place VoIP calls in this browser') + '.', description: _t('You cannot place VoIP calls in this browser.'),
}); });
} }
else if (MatrixClientPeg.get().isRoomEncrypted(payload.room_id)) { else if (MatrixClientPeg.get().isRoomEncrypted(payload.room_id)) {
@ -303,7 +303,7 @@ function _onAction(payload) {
var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
Modal.createDialog(QuestionDialog, { Modal.createDialog(QuestionDialog, {
title: _t('Warning!'), title: _t('Warning!'),
description: _t('Conference calling is in development and may not be reliable') + '.', description: _t('Conference calling is in development and may not be reliable.'),
onFinished: confirm=>{ onFinished: confirm=>{
if (confirm) { if (confirm) {
ConferenceHandler.createNewMatrixCall( ConferenceHandler.createNewMatrixCall(
@ -315,7 +315,7 @@ function _onAction(payload) {
console.error("Conference call failed: " + err); console.error("Conference call failed: " + err);
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {
title: _t('Failed to set up conference call'), title: _t('Failed to set up conference call'),
description: _t('Conference call failed') + '. ' + ((err && err.message) ? err.message : ''), description: _t('Conference call failed.') + ' ' + ((err && err.message) ? err.message : ''),
}); });
}); });
} }

View file

@ -16,6 +16,7 @@ limitations under the License.
*/ */
import Matrix from "matrix-js-sdk"; import Matrix from "matrix-js-sdk";
import { _t } from "./languageHandler";
import q from 'q'; import q from 'q';
import url from 'url'; import url from 'url';
@ -97,9 +98,9 @@ export default class Login {
}; };
}, (error) => { }, (error) => {
if (error.httpStatus === 403) { if (error.httpStatus === 403) {
error.friendlyText = "Guest access is disabled on this Home Server."; error.friendlyText = _t("Guest access is disabled on this Home Server.");
} else { } else {
error.friendlyText = "Failed to register as guest: " + error.data; error.friendlyText = _t("Failed to register as guest:") + ' ' + error.data;
} }
throw error; throw error;
}); });
@ -158,12 +159,12 @@ export default class Login {
}, function(error) { }, function(error) {
if (error.httpStatus == 400 && loginParams.medium) { if (error.httpStatus == 400 && loginParams.medium) {
error.friendlyText = ( error.friendlyText = (
'This Home Server does not support login using email address.' _t('This Home Server does not support login using email address.')
); );
} }
else if (error.httpStatus === 403) { else if (error.httpStatus === 403) {
error.friendlyText = ( error.friendlyText = (
'Incorrect username and/or password.' _t('Incorrect username and/or password.')
); );
if (self._fallbackHsUrl) { if (self._fallbackHsUrl) {
var fbClient = Matrix.createClient({ var fbClient = Matrix.createClient({
@ -187,7 +188,7 @@ export default class Login {
} }
else { else {
error.friendlyText = ( error.friendlyText = (
'There was a problem logging in. (HTTP ' + error.httpStatus + ")" _t("There was a problem logging in.") + ' (HTTP ' + error.httpStatus + ")"
); );
} }
throw error; throw error;

View file

@ -82,7 +82,7 @@ class PasswordReset {
err.message = _t('Failed to verify email address: make sure you clicked the link in the email'); err.message = _t('Failed to verify email address: make sure you clicked the link in the email');
} }
else if (err.httpStatus === 404) { else if (err.httpStatus === 404) {
err.message = _t('Your email address does not appear to be associated with a Matrix ID on this Homeserver') + '.'; err.message = _t('Your email address does not appear to be associated with a Matrix ID on this Homeserver.');
} }
else if (err.httpStatus) { else if (err.httpStatus) {
err.message += ` (Status ${err.httpStatus})`; err.message += ` (Status ${err.httpStatus})`;

View file

@ -186,7 +186,7 @@ const commands = {
if (targetRoomId) { break; } if (targetRoomId) { break; }
} }
if (!targetRoomId) { if (!targetRoomId) {
return reject("Unrecognised room alias: " + roomAlias); return reject(_t("Unrecognised room alias:") + ' ' + roomAlias);
} }
} }
} }
@ -303,14 +303,14 @@ const commands = {
const device = MatrixClientPeg.get().getStoredDevice(userId, deviceId); const device = MatrixClientPeg.get().getStoredDevice(userId, deviceId);
if (!device) { if (!device) {
return reject(`Unknown (user, device) pair: (${userId}, ${deviceId})`); return reject(_t(`Unknown (user, device) pair:`) + ` (${userId}, ${deviceId})`);
} }
if (device.isVerified()) { if (device.isVerified()) {
if (device.getFingerprint() === fingerprint) { if (device.getFingerprint() === fingerprint) {
return reject(`Device already verified!`); return reject(_t(`Device already verified!`));
} else { } else {
return reject(`WARNING: Device already verified, but keys do NOT MATCH!`); return reject(_t(`WARNING: Device already verified, but keys do NOT MATCH!`));
} }
} }
@ -322,12 +322,15 @@ const commands = {
// Tell the user we verified everything! // Tell the user we verified everything!
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
Modal.createDialog(QuestionDialog, { Modal.createDialog(QuestionDialog, {
title: "Verified key", title: _t("Verified key"),
description: ( description: (
<div> <div>
<p> <p>
The signing key you provided matches the signing key you received {
from { userId }'s device { deviceId }. Device marked as verified. _t("The signing key you provided matches the signing key you received " +
"from %(userId)s's device %(deviceId)s. Device marked as verified.",
{userId: userId, deviceId: deviceId})
}
</p> </p>
</div> </div>
), ),
@ -336,9 +339,13 @@ const commands = {
return success(); return success();
} else { } else {
return reject(`WARNING: KEY VERIFICATION FAILED! The signing key for ${userId} and device const fprint = device.getFingerprint();
${deviceId} is "${device.getFingerprint()}" which does not match the provided key return reject(
"${fingerprint}". This could mean your communications are being intercepted!`); _t('WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device' +
' %(deviceId)s is "%(fprint)s" which does not match the provided key' +
' "%(fingerprint)s". This could mean your communications are being intercepted!',
{deviceId: deviceId, fprint: fprint, userId: userId, fingerprint: fingerprint})
);
} }
} }
} }
@ -383,7 +390,7 @@ module.exports = {
if (commands[cmd]) { if (commands[cmd]) {
return commands[cmd].run(roomId, args); return commands[cmd].run(roomId, args);
} else { } else {
return reject("Unrecognised command: " + input); return reject(_t("Unrecognised command:") + ' ' + input);
} }
} }
return null; // not a command return null; // not a command

View file

@ -17,24 +17,26 @@ limitations under the License.
import q from 'q'; import q from 'q';
import MatrixClientPeg from './MatrixClientPeg'; import MatrixClientPeg from './MatrixClientPeg';
import Notifier from './Notifier'; import Notifier from './Notifier';
import { _t } from './languageHandler';
/* /*
* TODO: Make things use this. This is all WIP - see UserSettings.js for usage. * TODO: Make things use this. This is all WIP - see UserSettings.js for usage.
*/ */
/*
* TODO: Find a way to translate the names of LABS_FEATURES. In other words, guarantee that languages were already loaded before building this array.
*/
export default { export default {
LABS_FEATURES: [ LABS_FEATURES: [
{ {
name: "New Composer & Autocomplete", name: "-",
id: 'rich_text_editor', id: 'rich_text_editor',
default: false, default: false,
}, },
], ],
// horrible but it works. The locality makes this somewhat more palatable.
doTranslations: function() {
this.LABS_FEATURES[0].name = _t("New Composer & Autocomplete");
},
loadProfileInfo: function() { loadProfileInfo: function() {
const cli = MatrixClientPeg.get(); const cli = MatrixClientPeg.get();
return cli.getProfileInfo(cli.credentials.userId); return cli.getProfileInfo(cli.credentials.userId);

View file

@ -166,11 +166,11 @@ export default React.createClass({
</div> </div>
</div> </div>
<div className='mx_Dialog_buttons'> <div className='mx_Dialog_buttons'>
<input className='mx_Dialog_primary' type='submit' value='Export' <input className='mx_Dialog_primary' type='submit' value={_t('Export')}
disabled={disableForm} disabled={disableForm}
/> />
<button onClick={this._onCancelClick} disabled={disableForm}> <button onClick={this._onCancelClick} disabled={disableForm}>
Cancel {_t("Cancel")}
</button> </button>
</div> </div>
</form> </form>

View file

@ -164,11 +164,11 @@ export default React.createClass({
</div> </div>
</div> </div>
<div className='mx_Dialog_buttons'> <div className='mx_Dialog_buttons'>
<input className='mx_Dialog_primary' type='submit' value='Import' <input className='mx_Dialog_primary' type='submit' value={_t('Import')}
disabled={!this.state.enableSubmit || disableForm} disabled={!this.state.enableSubmit || disableForm}
/> />
<button onClick={this._onCancelClick} disabled={disableForm}> <button onClick={this._onCancelClick} disabled={disableForm}>
Cancel {_t("Cancel")}
</button> </button>
</div> </div>
</form> </form>

View file

@ -1,3 +1,20 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations 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 React from 'react';
import type {Completion, SelectionRange} from './Autocompleter'; import type {Completion, SelectionRange} from './Autocompleter';

View file

@ -1,3 +1,19 @@
/*
Copyright 2016 Aviral Dasgupta
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.
*/
// @flow // @flow
import type {Component} from 'react'; import type {Component} from 'react';

View file

@ -1,3 +1,20 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations 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 React from 'react';
import { _t } from '../languageHandler'; import { _t } from '../languageHandler';
import AutocompleteProvider from './AutocompleteProvider'; import AutocompleteProvider from './AutocompleteProvider';

View file

@ -1,3 +1,19 @@
/*
Copyright 2016 Aviral Dasgupta
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 React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import classNames from 'classnames'; import classNames from 'classnames';

View file

@ -1,4 +1,22 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations 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 React from 'react';
import { _t } from '../languageHandler';
import AutocompleteProvider from './AutocompleteProvider'; import AutocompleteProvider from './AutocompleteProvider';
import 'whatwg-fetch'; import 'whatwg-fetch';
@ -75,7 +93,7 @@ export default class DuckDuckGoProvider extends AutocompleteProvider {
} }
getName() { getName() {
return '🔍 Results from DuckDuckGo'; return '🔍 ' + _t('Results from DuckDuckGo');
} }
static getInstance(): DuckDuckGoProvider { static getInstance(): DuckDuckGoProvider {

View file

@ -1,3 +1,20 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations 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 React from 'react';
import { _t } from '../languageHandler'; import { _t } from '../languageHandler';
import AutocompleteProvider from './AutocompleteProvider'; import AutocompleteProvider from './AutocompleteProvider';

View file

@ -1,3 +1,20 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations 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 React from 'react';
import { _t } from '../languageHandler'; import { _t } from '../languageHandler';
import AutocompleteProvider from './AutocompleteProvider'; import AutocompleteProvider from './AutocompleteProvider';

View file

@ -1,3 +1,20 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations 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 React from 'react';
import { _t } from '../languageHandler'; import { _t } from '../languageHandler';
import AutocompleteProvider from './AutocompleteProvider'; import AutocompleteProvider from './AutocompleteProvider';

View file

@ -18,6 +18,7 @@ limitations under the License.
import * as Matrix from 'matrix-js-sdk'; import * as Matrix from 'matrix-js-sdk';
import React from 'react'; import React from 'react';
import UserSettingsStore from '../../UserSettingsStore';
import KeyCode from '../../KeyCode'; import KeyCode from '../../KeyCode';
import Notifier from '../../Notifier'; import Notifier from '../../Notifier';
import PageTypes from '../../PageTypes'; import PageTypes from '../../PageTypes';
@ -63,6 +64,13 @@ export default React.createClass({
}; };
}, },
getInitialState: function() {
return {
// use compact timeline view
useCompactLayout: UserSettingsStore.getSyncedSetting('useCompactLayout'),
};
},
componentWillMount: function() { componentWillMount: function() {
// stash the MatrixClient in case we log out before we are unmounted // stash the MatrixClient in case we log out before we are unmounted
this._matrixClient = this.props.matrixClient; this._matrixClient = this.props.matrixClient;
@ -72,10 +80,12 @@ export default React.createClass({
this._scrollStateMap = {}; this._scrollStateMap = {};
document.addEventListener('keydown', this._onKeyDown); document.addEventListener('keydown', this._onKeyDown);
this._matrixClient.on("accountData", this.onAccountData);
}, },
componentWillUnmount: function() { componentWillUnmount: function() {
document.removeEventListener('keydown', this._onKeyDown); document.removeEventListener('keydown', this._onKeyDown);
this._matrixClient.removeListener("accountData", this.onAccountData);
}, },
getScrollStateForRoom: function(roomId) { getScrollStateForRoom: function(roomId) {
@ -89,6 +99,14 @@ export default React.createClass({
return this.refs.roomView.canResetTimeline(); return this.refs.roomView.canResetTimeline();
}, },
onAccountData: function(event) {
if (event.getType() === "im.vector.web.settings") {
this.setState({
useCompactLayout: event.getContent().useCompactLayout
});
}
},
_onKeyDown: function(ev) { _onKeyDown: function(ev) {
/* /*
// Remove this for now as ctrl+alt = alt-gr so this breaks keyboards which rely on alt-gr for numbers // Remove this for now as ctrl+alt = alt-gr so this breaks keyboards which rely on alt-gr for numbers
@ -245,6 +263,9 @@ export default React.createClass({
if (topBar) { if (topBar) {
bodyClasses += ' mx_MatrixChat_toolbarShowing'; bodyClasses += ' mx_MatrixChat_toolbarShowing';
} }
if (this.state.useCompactLayout) {
bodyClasses += ' mx_MatrixChat_useCompactLayout';
}
return ( return (
<div className='mx_MatrixChat_wrapper'> <div className='mx_MatrixChat_wrapper'>

View file

@ -316,7 +316,7 @@ module.exports = React.createClass({
const key = "membereventlistsummary-" + (prevEvent ? mxEv.getId() : "initial"); const key = "membereventlistsummary-" + (prevEvent ? mxEv.getId() : "initial");
if (this._wantsDateSeparator(prevEvent, mxEv.getDate())) { if (this._wantsDateSeparator(prevEvent, mxEv.getDate())) {
let dateSeparator = <li key={ts1+'~'}><DateSeparator key={ts1+'~'} ts={ts1}/></li>; let dateSeparator = <li key={ts1+'~'}><DateSeparator key={ts1+'~'} ts={ts1} showTwelveHour={this.props.isTwelveHour}/></li>;
ret.push(dateSeparator); ret.push(dateSeparator);
} }
@ -458,7 +458,7 @@ module.exports = React.createClass({
// do we need a date separator since the last event? // do we need a date separator since the last event?
if (this._wantsDateSeparator(prevEvent, eventDate)) { if (this._wantsDateSeparator(prevEvent, eventDate)) {
var dateSeparator = <li key={ts1}><DateSeparator key={ts1} ts={ts1}/></li>; var dateSeparator = <li key={ts1}><DateSeparator key={ts1} ts={ts1} showTwelveHour={this.props.isTwelveHour}/></li>;
ret.push(dateSeparator); ret.push(dateSeparator);
continuation = false; continuation = false;
} }

View file

@ -79,11 +79,11 @@ const SETTINGS_LABELS = [
id: 'showTwelveHourTimestamps', id: 'showTwelveHourTimestamps',
label: 'Show timestamps in 12 hour format (e.g. 2:30pm)', label: 'Show timestamps in 12 hour format (e.g. 2:30pm)',
}, },
/*
{ {
id: 'useCompactLayout', id: 'useCompactLayout',
label: 'Use compact timeline layout', label: 'Use compact timeline layout',
}, },
/*
{ {
id: 'useFixedWidthFont', id: 'useFixedWidthFont',
label: 'Use fixed width font', label: 'Use fixed width font',
@ -767,6 +767,7 @@ module.exports = React.createClass({
_renderLabs: function() { _renderLabs: function() {
// default to enabled if undefined // default to enabled if undefined
if (this.props.enableLabs === false) return null; if (this.props.enableLabs === false) return null;
UserSettingsStore.doTranslations();
const features = UserSettingsStore.LABS_FEATURES.map((feature) => ( const features = UserSettingsStore.LABS_FEATURES.map((feature) => (
<div key={feature.id} className="mx_UserSettings_toggle"> <div key={feature.id} className="mx_UserSettings_toggle">

View file

@ -40,14 +40,7 @@ export default class LanguageDropdown extends React.Component {
} }
componentWillMount() { componentWillMount() {
languageHandler.getAllLanguageKeysFromJson().then((langKeys) => { languageHandler.getAllLanguagesFromJson().then((langs) => {
const langs = [];
langKeys.forEach((languageKey) => {
langs.push({
value: languageKey,
label: _t(languageKey)
});
});
langs.sort(function(a, b){ langs.sort(function(a, b){
if(a.label < b.label) return -1; if(a.label < b.label) return -1;
if(a.label > b.label) return 1; if(a.label > b.label) return 1;

View file

@ -506,7 +506,7 @@ export default class MessageComposerInput extends React.Component {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {
title: _t("Server error"), title: _t("Server error"),
description: ((err && err.message) ? err.message : _t("Server unavailable, overloaded, or something else went wrong") + "."), description: ((err && err.message) ? err.message : _t("Server unavailable, overloaded, or something else went wrong.")),
}); });
}); });
} }

View file

@ -316,7 +316,7 @@ export default React.createClass({
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {
title: _t("Server error"), title: _t("Server error"),
description: ((err && err.message) ? err.message : _t("Server unavailable, overloaded, or something else went wrong") + "."), description: ((err && err.message) ? err.message : _t("Server unavailable, overloaded, or something else went wrong.")),
}); });
}); });
} }

View file

@ -45,7 +45,7 @@ function createRoom(opts) {
setTimeout(()=>{ setTimeout(()=>{
Modal.createDialog(NeedToRegisterDialog, { Modal.createDialog(NeedToRegisterDialog, {
title: _t('Please Register'), title: _t('Please Register'),
description: _t('Guest users can\'t create new rooms. Please register to create room and start a chat') + '.' description: _t('Guest users can\'t create new rooms. Please register to create room and start a chat.')
}); });
}, 0); }, 0);
return q(null); return q(null);
@ -106,7 +106,7 @@ function createRoom(opts) {
console.error("Failed to create room " + roomId + " " + err); console.error("Failed to create room " + roomId + " " + err);
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {
title: _t("Failure to create room"), title: _t("Failure to create room"),
description: _t("Server may be unavailable, overloaded, or you hit a bug") + ".", description: _t("Server may be unavailable, overloaded, or you hit a bug."),
}); });
return null; return null;
}); });

View file

@ -227,7 +227,7 @@
"to join the discussion": "um an der Diskussion teilzunehmen", "to join the discussion": "um an der Diskussion teilzunehmen",
"To kick users": "Um Nutzer zu entfernen", "To kick users": "Um Nutzer zu entfernen",
"Admin": "Administrator", "Admin": "Administrator",
"Server may be unavailable, overloaded, or you hit a bug": "Server könnte nicht verfügbar oder überlastet sein oder du bist auf einen Fehler gestoßen", "Server may be unavailable, overloaded, or you hit a bug.": "Server könnte nicht verfügbar oder überlastet sein oder du bist auf einen Fehler gestoßen.",
"Could not connect to the integration server": "Konnte keine Verbindung zum Integrations-Server herstellen", "Could not connect to the integration server": "Konnte keine Verbindung zum Integrations-Server herstellen",
"Disable inline URL previews by default": "URL-Vorschau im Chat standardmäßig deaktivieren", "Disable inline URL previews by default": "URL-Vorschau im Chat standardmäßig deaktivieren",
"Guests can't use labs features. Please register.": "Gäste können keine Labor-Funktionen nutzen. Bitte registrieren.", "Guests can't use labs features. Please register.": "Gäste können keine Labor-Funktionen nutzen. Bitte registrieren.",
@ -280,15 +280,15 @@
"times": "mal", "times": "mal",
"Bulk Options": "Bulk-Optionen", "Bulk Options": "Bulk-Optionen",
"Call Timeout": "Anruf-Timeout", "Call Timeout": "Anruf-Timeout",
"Conference call failed": "Konferenzgespräch fehlgeschlagen", "Conference call failed.": "Konferenzgespräch fehlgeschlagen.",
"Conference calling is in development and may not be reliable": "Konferenzgespräche sind in Entwicklung und evtl. nicht zuverlässig", "Conference calling is in development and may not be reliable.": "Konferenzgespräche sind in Entwicklung und evtl. nicht zuverlässig.",
"Conference calls are not supported in encrypted rooms": "Konferenzgespräche sind in verschlüsselten Räumen nicht unterstützt", "Conference calls are not supported in encrypted rooms": "Konferenzgespräche sind in verschlüsselten Räumen nicht unterstützt",
"Conference calls are not supported in this client": "Konferenzgespräche sind in diesem Client nicht unterstützt", "Conference calls are not supported in this client": "Konferenzgespräche sind in diesem Client nicht unterstützt",
"Existing Call": "Bereits bestehender Anruf", "Existing Call": "Bereits bestehender Anruf",
"Failed to set up conference call": "Konferenzgespräch konnte nicht gestartet werden", "Failed to set up conference call": "Konferenzgespräch konnte nicht gestartet werden",
"Failed to verify email address: make sure you clicked the link in the email": "Verifizierung der E-Mail-Adresse fehlgeschlagen: Bitte stelle sicher, dass du den Link in der E-Mail angeklickt hast", "Failed to verify email address: make sure you clicked the link in the email": "Verifizierung der E-Mail-Adresse fehlgeschlagen: Bitte stelle sicher, dass du den Link in der E-Mail angeklickt hast",
"Failure to create room": "Raumerstellung fehlgeschlagen", "Failure to create room": "Raumerstellung fehlgeschlagen",
"Guest users can't create new rooms. Please register to create room and start a chat": "Gäste können keine neuen Räume erstellen. Bitte registrieren um einen Raum zu erstellen und einen Chat zu starten", "Guest users can't create new rooms. Please register to create room and start a chat.": "Gäste können keine neuen Räume erstellen. Bitte registrieren um einen Raum zu erstellen und einen Chat zu starten.",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot hat keine Berechtigung Benachrichtigungen zu senden - bitte prüfe deine Browser-Einstellungen", "Riot does not have permission to send you notifications - please check your browser settings": "Riot hat keine Berechtigung Benachrichtigungen zu senden - bitte prüfe deine Browser-Einstellungen",
"Riot was not given permission to send notifications - please try again": "Riot hat das Recht nicht bekommen Benachrichtigungen zu senden. Bitte erneut probieren", "Riot was not given permission to send notifications - please try again": "Riot hat das Recht nicht bekommen Benachrichtigungen zu senden. Bitte erneut probieren",
"This email address is already in use": "Diese E-Mail-Adresse wird bereits verwendet", "This email address is already in use": "Diese E-Mail-Adresse wird bereits verwendet",
@ -302,11 +302,11 @@
"Unable to enable Notifications": "Unfähig Benachrichtigungen zu aktivieren", "Unable to enable Notifications": "Unfähig Benachrichtigungen zu aktivieren",
"Upload Failed": "Upload fehlgeschlagen", "Upload Failed": "Upload fehlgeschlagen",
"VoIP is unsupported": "VoIP wird nicht unterstützt", "VoIP is unsupported": "VoIP wird nicht unterstützt",
"You are already in a call": "Du bist bereits bei einem Anruf", "You are already in a call.": "Du bist bereits bei einem Anruf.",
"You cannot place a call with yourself": "Du kannst keinen Anruf mit dir selbst starten", "You cannot place a call with yourself.": "Du kannst keinen Anruf mit dir selbst starten.",
"You cannot place VoIP calls in this browser": "Du kannst kein VoIP-Gespräch in diesem Browser starten", "You cannot place VoIP calls in this browser.": "Du kannst kein VoIP-Gespräch in diesem Browser starten.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Du musst dich erneut anmelden, um Ende-zu-Ende-Verschlüsselungs-Schlüssel für dieses Gerät zu generieren und um den öffentlichen Schlüssel auf deinem Homeserver zu hinterlegen. Dies muss nur einmal durchgeführt werden, bitte entschuldige die Unannehmlichkeiten.", "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Du musst dich erneut anmelden, um Ende-zu-Ende-Verschlüsselungs-Schlüssel für dieses Gerät zu generieren und um den öffentlichen Schlüssel auf deinem Homeserver zu hinterlegen. Dies muss nur einmal durchgeführt werden, bitte entschuldige die Unannehmlichkeiten.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Homeserver verknüpft zu sein", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Homeserver verknüpft zu sein.",
"Sun": "So", "Sun": "So",
"Mon": "Mo", "Mon": "Mo",
"Tue": "Di", "Tue": "Di",
@ -608,7 +608,7 @@
"Server error": "Server-Fehler", "Server error": "Server-Fehler",
"Server may be unavailable, overloaded, or search timed out :(": "Der Server ist entweder nicht verfügbar, überlastet oder die Suche wurde wegen Zeitüberschreitung abgebrochen :(", "Server may be unavailable, overloaded, or search timed out :(": "Der Server ist entweder nicht verfügbar, überlastet oder die Suche wurde wegen Zeitüberschreitung abgebrochen :(",
"Server may be unavailable, overloaded, or the file too big": "Server ist entweder nicht verfügbar, überlastet oder die Datei ist zu groß", "Server may be unavailable, overloaded, or the file too big": "Server ist entweder nicht verfügbar, überlastet oder die Datei ist zu groß",
"Server unavailable, overloaded, or something else went wrong": "Der Server ist entweder nicht verfügbar, überlastet oder es liegt ein anderweitiger Fehler vor", "Server unavailable, overloaded, or something else went wrong.": "Der Server ist entweder nicht verfügbar, überlastet oder es liegt ein anderweitiger Fehler vor.",
"Some of your messages have not been sent": "Einige deiner Nachrichten wurden noch nicht gesendet", "Some of your messages have not been sent": "Einige deiner Nachrichten wurden noch nicht gesendet",
"Submit": "Absenden", "Submit": "Absenden",
"The main address for this room is: %(canonical_alias_section)s": "Die Hauptadresse für diesen Raum ist: %(canonical_alias_section)s", "The main address for this room is: %(canonical_alias_section)s": "Die Hauptadresse für diesen Raum ist: %(canonical_alias_section)s",

View file

@ -192,8 +192,8 @@
"Click to unmute audio": "Click to unmute audio", "Click to unmute audio": "Click to unmute audio",
"Command error": "Command error", "Command error": "Command error",
"Commands": "Commands", "Commands": "Commands",
"Conference call failed": "Conference call failed", "Conference call failed.": "Conference call failed.",
"Conference calling is in development and may not be reliable": "Conference calling is in development and may not be reliable", "Conference calling is in development and may not be reliable.": "Conference calling is in development and may not be reliable.",
"Conference calls are not supported in encrypted rooms": "Conference calls are not supported in encrypted rooms", "Conference calls are not supported in encrypted rooms": "Conference calls are not supported in encrypted rooms",
"Conference calls are not supported in this client": "Conference calls are not supported in this client", "Conference calls are not supported in this client": "Conference calls are not supported in this client",
"Confirm password": "Confirm password", "Confirm password": "Confirm password",
@ -215,6 +215,7 @@
"demote": "demote", "demote": "demote",
"Deops user with given id": "Deops user with given id", "Deops user with given id": "Deops user with given id",
"Default": "Default", "Default": "Default",
"Device already verified!": "Device already verified!",
"Device ID": "Device ID", "Device ID": "Device ID",
"Devices": "Devices", "Devices": "Devices",
"Devices will not yet be able to decrypt history from before they joined the room": "Devices will not yet be able to decrypt history from before they joined the room", "Devices will not yet be able to decrypt history from before they joined the room": "Devices will not yet be able to decrypt history from before they joined the room",
@ -246,6 +247,7 @@
"Error decrypting attachment": "Error decrypting attachment", "Error decrypting attachment": "Error decrypting attachment",
"Event information": "Event information", "Event information": "Event information",
"Existing Call": "Existing Call", "Existing Call": "Existing Call",
"Export": "Export",
"Export E2E room keys": "Export E2E room keys", "Export E2E room keys": "Export E2E room keys",
"Failed to ban user": "Failed to ban user", "Failed to ban user": "Failed to ban user",
"Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?", "Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?",
@ -259,6 +261,7 @@
"Failed to load timeline position": "Failed to load timeline position", "Failed to load timeline position": "Failed to load timeline position",
"Failed to lookup current room": "Failed to lookup current room", "Failed to lookup current room": "Failed to lookup current room",
"Failed to mute user": "Failed to mute user", "Failed to mute user": "Failed to mute user",
"Failed to register as guest:": "Failed to register as guest:",
"Failed to reject invite": "Failed to reject invite", "Failed to reject invite": "Failed to reject invite",
"Failed to reject invitation": "Failed to reject invitation", "Failed to reject invitation": "Failed to reject invitation",
"Failed to save settings": "Failed to save settings", "Failed to save settings": "Failed to save settings",
@ -283,8 +286,9 @@
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.",
"Found a bug?": "Found a bug?", "Found a bug?": "Found a bug?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.",
"Guests can't set avatars. Please register.": "Guests can't set avatars. Please register.", "Guests can't set avatars. Please register.": "Guests can't set avatars. Please register.",
"Guest users can't create new rooms. Please register to create room and start a chat": "Guest users can't create new rooms. Please register to create room and start a chat", "Guest users can't create new rooms. Please register to create room and start a chat.": "Guest users can't create new rooms. Please register to create room and start a chat.",
"Guest users can't upload files. Please register to upload": "Guest users can't upload files. Please register to upload", "Guest users can't upload files. Please register to upload": "Guest users can't upload files. Please register to upload",
"Guests can't use labs features. Please register.": "Guests can't use labs features. Please register.", "Guests can't use labs features. Please register.": "Guests can't use labs features. Please register.",
"Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.", "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.",
@ -296,7 +300,9 @@
"Homeserver is": "Homeserver is", "Homeserver is": "Homeserver is",
"Identity Server is": "Identity Server is", "Identity Server is": "Identity Server is",
"I have verified my email address": "I have verified my email address", "I have verified my email address": "I have verified my email address",
"Import": "Import",
"Import E2E room keys": "Import E2E room keys", "Import E2E room keys": "Import E2E room keys",
"Incorrect username and/or password.": "Incorrect username and/or password.",
"Incorrect verification code": "Incorrect verification code", "Incorrect verification code": "Incorrect verification code",
"Interface Language": "Interface Language", "Interface Language": "Interface Language",
"Invalid alias format": "Invalid alias format", "Invalid alias format": "Invalid alias format",
@ -402,6 +408,7 @@
"Report it": "Report it", "Report it": "Report it",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.",
"restore": "restore", "restore": "restore",
"Results from DuckDuckGo": "Results from DuckDuckGo",
"Return to app": "Return to app", "Return to app": "Return to app",
"Return to login screen": "Return to login screen", "Return to login screen": "Return to login screen",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings", "Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings",
@ -429,8 +436,8 @@
"Server may be unavailable or overloaded": "Server may be unavailable or overloaded", "Server may be unavailable or overloaded": "Server may be unavailable or overloaded",
"Server may be unavailable, overloaded, or search timed out :(": "Server may be unavailable, overloaded, or search timed out :(", "Server may be unavailable, overloaded, or search timed out :(": "Server may be unavailable, overloaded, or search timed out :(",
"Server may be unavailable, overloaded, or the file too big": "Server may be unavailable, overloaded, or the file too big", "Server may be unavailable, overloaded, or the file too big": "Server may be unavailable, overloaded, or the file too big",
"Server may be unavailable, overloaded, or you hit a bug": "Server may be unavailable, overloaded, or you hit a bug", "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
"Server unavailable, overloaded, or something else went wrong": "Server unavailable, overloaded, or something else went wrong", "Server unavailable, overloaded, or something else went wrong.": "Server unavailable, overloaded, or something else went wrong.",
"Session ID": "Session ID", "Session ID": "Session ID",
"%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.", "%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.",
@ -454,6 +461,7 @@
"tag direct chat": "tag direct chat", "tag direct chat": "tag direct chat",
"The default role for new room members is": "The default role for new room members is", "The default role for new room members is": "The default role for new room members is",
"The main address for this room is": "The main address for this room is", "The main address for this room is": "The main address for this room is",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.",
"This action cannot be performed by a guest user. Please register to be able to do this": "This action cannot be performed by a guest user. Please register to be able to do this", "This action cannot be performed by a guest user. Please register to be able to do this": "This action cannot be performed by a guest user. Please register to be able to do this",
"This email address is already in use": "This email address is already in use", "This email address is already in use": "This email address is already in use",
"This email address was not found": "This email address was not found", "This email address was not found": "This email address was not found",
@ -462,6 +470,8 @@
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads",
"The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload",
"The remote side failed to pick up": "The remote side failed to pick up", "The remote side failed to pick up": "The remote side failed to pick up",
"This Home Server does not support login using email address.": "This Home Server does not support login using email address.",
"There was a problem logging in.": "There was a problem logging in.",
"This room has no local addresses": "This room has no local addresses", "This room has no local addresses": "This room has no local addresses",
"This room is not recognised.": "This room is not recognised.", "This room is not recognised.": "This room is not recognised.",
"This room is private or inaccessible to guests. You may be able to join if you register": "This room is private or inaccessible to guests. You may be able to join if you register", "This room is private or inaccessible to guests. You may be able to join if you register": "This room is private or inaccessible to guests. You may be able to join if you register",
@ -513,14 +523,18 @@
"unknown device": "unknown device", "unknown device": "unknown device",
"unknown error code": "unknown error code", "unknown error code": "unknown error code",
"Unknown room %(roomId)s": "Unknown room %(roomId)s", "Unknown room %(roomId)s": "Unknown room %(roomId)s",
"Unknown (user, device) pair:": "Unknown (user, device) pair:",
"unknown": "unknown", "unknown": "unknown",
"Unmute": "Unmute", "Unmute": "Unmute",
"Unrecognised command:": "Unrecognised command:",
"Unrecognised room alias:": "Unrecognised room alias:",
"uploaded a file": "uploaded a file", "uploaded a file": "uploaded a file",
"Upload avatar": "Upload avatar", "Upload avatar": "Upload avatar",
"Upload Failed": "Upload Failed", "Upload Failed": "Upload Failed",
"Upload Files": "Upload Files", "Upload Files": "Upload Files",
"Upload file": "Upload file", "Upload file": "Upload file",
"Usage": "Usage", "Usage": "Usage",
"Use compact timeline layout": "Use compact timeline layout",
"Use with caution": "Use with caution", "Use with caution": "Use with caution",
"User ID": "User ID", "User ID": "User ID",
"User Interface": "User Interface", "User Interface": "User Interface",
@ -530,6 +544,7 @@
"Verification Pending": "Verification Pending", "Verification Pending": "Verification Pending",
"Verification": "Verification", "Verification": "Verification",
"verified": "verified", "verified": "verified",
"Verified key": "Verified key",
"Video call": "Video call", "Video call": "Video call",
"Voice call": "Voice call", "Voice call": "Voice call",
"VoIP conference finished.": "VoIP conference finished.", "VoIP conference finished.": "VoIP conference finished.",
@ -537,17 +552,19 @@
"VoIP is unsupported": "VoIP is unsupported", "VoIP is unsupported": "VoIP is unsupported",
"(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)", "(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)",
"Warning!": "Warning!", "Warning!": "Warning!",
"WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "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!",
"Who can access this room?": "Who can access this room?", "Who can access this room?": "Who can access this room?",
"Who can read history?": "Who can read history?", "Who can read history?": "Who can read history?",
"Who would you like to add to this room?": "Who would you like to add to this room?", "Who would you like to add to this room?": "Who would you like to add to this room?",
"Who would you like to communicate with?": "Who would you like to communicate with?", "Who would you like to communicate with?": "Who would you like to communicate with?",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.",
"Would you like to": "Would you like to", "Would you like to": "Would you like to",
"You are already in a call": "You are already in a call", "You are already in a call.": "You are already in a call.",
"You're not in any rooms yet! Press": "You're not in any rooms yet! Press", "You're not in any rooms yet! Press": "You're not in any rooms yet! Press",
"You are trying to access %(roomName)s": "You are trying to access %(roomName)s", "You are trying to access %(roomName)s": "You are trying to access %(roomName)s",
"You cannot place a call with yourself": "You cannot place a call with yourself", "You cannot place a call with yourself.": "You cannot place a call with yourself.",
"You cannot place VoIP calls in this browser": "You cannot place VoIP calls in this browser", "You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.",
"You do not have permission to post to this room": "You do not have permission to post to this room", "You do not have permission to post to this room": "You do not have permission to post to this room",
"You have been invited to join this room by %(inviterName)s": "You have been invited to join this room by %(inviterName)s", "You have been invited to join this room by %(inviterName)s": "You have been invited to join this room by %(inviterName)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 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",
@ -557,7 +574,7 @@
"You need to be logged in.": "You need to be logged in.", "You need to be logged in.": "You need to be logged in.",
"You need to enter a user name.": "You need to enter a user name.", "You need to enter a user name.": "You need to enter a user name.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.", "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver": "Your email address does not appear to be associated with a Matrix ID on this Homeserver", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.",
"Your password has been reset": "Your password has been reset", "Your password has been reset": "Your password has been reset",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them",
"You seem to be in a call, are you sure you want to quit?": "You seem to be in a call, are you sure you want to quit?", "You seem to be in a call, are you sure you want to quit?": "You seem to be in a call, are you sure you want to quit?",
@ -698,7 +715,6 @@
"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.": "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.", "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.": "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.",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.",
"You must join the room to see its files": "You must join the room to see its files", "You must join the room to see its files": "You must join the room to see its files",
"Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
"Reject all %(invitedRooms)s invites": "Reject all %(invitedRooms)s invites", "Reject all %(invitedRooms)s invites": "Reject all %(invitedRooms)s invites",
"Start new Chat": "Start new Chat", "Start new Chat": "Start new Chat",
"Guest users can't invite users. Please register.": "Guest users can't invite users. Please register.", "Guest users can't invite users. Please register.": "Guest users can't invite users. Please register.",

View file

@ -191,8 +191,8 @@
"Click to unmute audio": "Haz clic para activar sonido de audio", "Click to unmute audio": "Haz clic para activar sonido de audio",
"Command error": "Error de comando", "Command error": "Error de comando",
"Commands": "Comandos", "Commands": "Comandos",
"Conference call failed": "La llamada de conferencia falló", "Conference call failed.": "La llamada de conferencia falló.",
"Conference calling is in development and may not be reliable": "La llamada en conferencia esta en desarrollo y no podría ser segura", "Conference calling is in development and may not be reliable.": "La llamada en conferencia esta en desarrollo y no podría ser segura.",
"Conference calls are not supported in encrypted rooms": "Las llamadas en conferencia no son soportadas en salas encriptadas", "Conference calls are not supported in encrypted rooms": "Las llamadas en conferencia no son soportadas en salas encriptadas",
"Conference calls are not supported in this client": "Las llamadas en conferencia no son soportadas en este navegador", "Conference calls are not supported in this client": "Las llamadas en conferencia no son soportadas en este navegador",
"Confirm password": "Confirmar clave", "Confirm password": "Confirmar clave",
@ -281,7 +281,7 @@
"Found a bug?": "¿Encontraste un error?", "Found a bug?": "¿Encontraste un error?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s a %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s a %(toPowerLevel)s",
"Guests can't set avatars. Please register.": "Invitados no puedes establecer avatares. Por favor regístrate.", "Guests can't set avatars. Please register.": "Invitados no puedes establecer avatares. Por favor regístrate.",
"Guest users can't create new rooms. Please register to create room and start a chat": "Usuarios invitados no pueden crear nuevas salas. Por favor regístrate para crear la sala y iniciar la conversación", "Guest users can't create new rooms. Please register to create room and start a chat.": "Usuarios invitados no pueden crear nuevas salas. Por favor regístrate para crear la sala y iniciar la conversación.",
"Guest users can't upload files. Please register to upload": "Usuarios invitados no puedes subir archivos. Por favor regístrate para subir tus archivos", "Guest users can't upload files. Please register to upload": "Usuarios invitados no puedes subir archivos. Por favor regístrate para subir tus archivos",
"Guests can't use labs features. Please register.": "Invitados no puedes usar las características en desarrollo. Por favor regístrate.", "Guests can't use labs features. Please register.": "Invitados no puedes usar las características en desarrollo. Por favor regístrate.",
"Guests cannot join this room even if explicitly invited.": "Invitados no pueden unirse a esta sala aun cuando han sido invitados explícitamente.", "Guests cannot join this room even if explicitly invited.": "Invitados no pueden unirse a esta sala aun cuando han sido invitados explícitamente.",

View file

@ -232,8 +232,8 @@
"Click to unmute audio": "Cliquer pour rétablir le son", "Click to unmute audio": "Cliquer pour rétablir le son",
"Command error": "Erreur de commande", "Command error": "Erreur de commande",
"Commands": "Commandes", "Commands": "Commandes",
"Conference call failed": "Échec de la conférence", "Conference call failed.": "Échec de la conférence.",
"Conference calling is in development and may not be reliable": "Les appels en conférence sont encore en développement et sont potentiellement peu fiables", "Conference calling is in development and may not be reliable.": "Les appels en conférence sont encore en développement et sont potentiellement peu fiables.",
"Conference calls are not supported in encrypted rooms": "Les appels en conférence ne sont pas supportés dans les salons encryptés", "Conference calls are not supported in encrypted rooms": "Les appels en conférence ne sont pas supportés dans les salons encryptés",
"Conference calls are not supported in this client": "Les appels en conférence ne sont pas supportés avec ce client", "Conference calls are not supported in this client": "Les appels en conférence ne sont pas supportés avec ce client",
"Confirm password": "Confirmer le mot de passe", "Confirm password": "Confirmer le mot de passe",
@ -293,7 +293,7 @@
"For security, this session has been signed out. Please sign in again.": "Par sécurité, la session a expiré. Merci de vous authentifer à nouveau.", "For security, this session has been signed out. Please sign in again.": "Par sécurité, la session a expiré. Merci de vous authentifer à nouveau.",
"Found a bug?": "Trouvé un problème ?", "Found a bug?": "Trouvé un problème ?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s",
"Guest users can't create new rooms. Please register to create room and start a chat": "Les visiteurs ne peuvent créer de nouveaux salons. Merci de vous enregistrer pour commencer une discussion", "Guest users can't create new rooms. Please register to create room and start a chat.": "Les visiteurs ne peuvent créer de nouveaux salons. Merci de vous enregistrer pour commencer une discussion.",
"Guest users can't upload files. Please register to upload": "Les visiteurs ne peuvent telécharger de fichiers. Merci de vous enregistrer pour télécharger", "Guest users can't upload files. Please register to upload": "Les visiteurs ne peuvent telécharger de fichiers. Merci de vous enregistrer pour télécharger",
"had": "avait", "had": "avait",
"Hangup": "Raccrocher", "Hangup": "Raccrocher",
@ -444,8 +444,8 @@
"Server may be unavailable or overloaded": "Le serveur semble être inaccessible ou surchargé", "Server may be unavailable or overloaded": "Le serveur semble être inaccessible ou surchargé",
"Server may be unavailable, overloaded, or search timed out :(": "Le serveur semble être inaccessible, surchargé ou la recherche a expiré :(", "Server may be unavailable, overloaded, or search timed out :(": "Le serveur semble être inaccessible, surchargé ou la recherche a expiré :(",
"Server may be unavailable, overloaded, or the file too big": "Le serveur semble être inaccessible, surchargé ou le fichier trop important", "Server may be unavailable, overloaded, or the file too big": "Le serveur semble être inaccessible, surchargé ou le fichier trop important",
"Server may be unavailable, overloaded, or you hit a bug": "Le serveur semble être inaccessible, surchargé ou vous avez rencontré un problème", "Server may be unavailable, overloaded, or you hit a bug.": "Le serveur semble être inaccessible, surchargé ou vous avez rencontré un problème.",
"Server unavailable, overloaded, or something else went wrong": "Le serveur semble être inaccessible, surchargé ou quelque chose s'est mal passé", "Server unavailable, overloaded, or something else went wrong.": "Le serveur semble être inaccessible, surchargé ou quelque chose s'est mal passé.",
"Session ID": "Identifiant de session", "Session ID": "Identifiant de session",
"%(senderName)s set a profile picture.": "%(senderName)s a défini une photo de profil.", "%(senderName)s set a profile picture.": "%(senderName)s a défini une photo de profil.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s a défini son nom daffichage comme %(displayName)s.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s a défini son nom daffichage comme %(displayName)s.",
@ -556,11 +556,11 @@
"Who would you like to communicate with?": "Avec qui voulez-vous communiquer ?", "Who would you like to communicate with?": "Avec qui voulez-vous communiquer ?",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s a révoqué linvitation de %(targetName)s.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s a révoqué linvitation de %(targetName)s.",
"Would you like to": "Voulez-vous", "Would you like to": "Voulez-vous",
"You are already in a call": "Vous êtes déjà dans un appel", "You are already in a call.": "Vous êtes déjà dans un appel.",
"You're not in any rooms yet! Press": "Vous nêtes dans aucun salon ! Cliquez", "You're not in any rooms yet! Press": "Vous nêtes dans aucun salon ! Cliquez",
"You are trying to access %(roomName)s": "Vous essayez d'accéder à %(roomName)s", "You are trying to access %(roomName)s": "Vous essayez d'accéder à %(roomName)s",
"You cannot place a call with yourself": "Vous ne pouvez pas passer d'appel avec vous-même", "You cannot place a call with yourself.": "Vous ne pouvez pas passer d'appel avec vous-même.",
"You cannot place VoIP calls in this browser": "Vous ne pouvez pas passer d'appel voix dans cet explorateur", "You cannot place VoIP calls in this browser.": "Vous ne pouvez pas passer d'appel voix dans cet explorateur.",
"You do not have permission to post to this room": "Vous navez pas la permission de poster dans ce salon", "You do not have permission to post to this room": "Vous navez pas la permission de poster dans ce salon",
"You have been invited to join this room by %(inviterName)s": "Vous avez été invité à joindre ce salon par %(inviterName)s", "You have been invited to join this room by %(inviterName)s": "Vous avez été invité à joindre ce salon par %(inviterName)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": "Vous avez été déconnecté de tous vos appareils et ne recevrez plus de notifications. Pour réactiver les notificationsm identifiez vous à nouveau sur tous les appareils", "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": "Vous avez été déconnecté de tous vos appareils et ne recevrez plus de notifications. Pour réactiver les notificationsm identifiez vous à nouveau sur tous les appareils",
@ -570,7 +570,7 @@
"You need to be logged in.": "Vous devez être connecté.", "You need to be logged in.": "Vous devez être connecté.",
"You need to enter a user name.": "Vous devez entrer un nom dutilisateur.", "You need to enter a user name.": "Vous devez entrer un nom dutilisateur.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Vous devez vous connecter à nouveau pour générer les clés dencryption pour cet appareil, et soumettre la clé publique à votre homeserver. Cette action ne se reproduira pas; veuillez nous excuser pour la gêne occasionnée.", "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Vous devez vous connecter à nouveau pour générer les clés dencryption pour cet appareil, et soumettre la clé publique à votre homeserver. Cette action ne se reproduira pas; veuillez nous excuser pour la gêne occasionnée.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver": "Votre adresse e-mail ne semble pas associée à un identifiant Matrix sur ce homeserver", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Votre adresse e-mail ne semble pas associée à un identifiant Matrix sur ce homeserver.",
"Your password has been reset": "Votre mot de passe a été réinitialisé", "Your password has been reset": "Votre mot de passe a été réinitialisé",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Votre mot de passe a été mis à jour avec succès. Vous ne recevrez plus de notification sur vos appareils jusquà ce que vous vous identifiez à nouveau", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Votre mot de passe a été mis à jour avec succès. Vous ne recevrez plus de notification sur vos appareils jusquà ce que vous vous identifiez à nouveau",
"You seem to be in a call, are you sure you want to quit?": "Vous semblez avoir un appel en cours, êtes-vous sûr(e) de vouloir quitter ?", "You seem to be in a call, are you sure you want to quit?": "Vous semblez avoir un appel en cours, êtes-vous sûr(e) de vouloir quitter ?",

View file

@ -191,8 +191,8 @@
"Click to unmute audio": "Klik om het dempen van het geluid op te heffen", "Click to unmute audio": "Klik om het dempen van het geluid op te heffen",
"Command error": "Opdracht fout", "Command error": "Opdracht fout",
"Commands": "Opdrachten", "Commands": "Opdrachten",
"Conference call failed": "Conferentie gesprek mislukt", "Conference call failed.": "Conferentie gesprek mislukt.",
"Conference calling is in development and may not be reliable": "Conferentie gesprekken zijn nog in ontwikkelingen en kunnen onbetrouwbaar zijn", "Conference calling is in development and may not be reliable.": "Conferentie gesprekken zijn nog in ontwikkelingen en kunnen onbetrouwbaar zijn.",
"Conference calls are not supported in encrypted rooms": "Conferentie gesprekken worden niet ondersteunt in versleutelde kamers", "Conference calls are not supported in encrypted rooms": "Conferentie gesprekken worden niet ondersteunt in versleutelde kamers",
"Conference calls are not supported in this client": "Conferentie gesprekken worden niet ondersteunt in deze client", "Conference calls are not supported in this client": "Conferentie gesprekken worden niet ondersteunt in deze client",
"Confirm password": "Bevestigen wachtwoord", "Confirm password": "Bevestigen wachtwoord",

View file

@ -188,7 +188,7 @@
"sent an invitation to": "enviou um convite para", "sent an invitation to": "enviou um convite para",
"sent a video": "enviou um vídeo", "sent a video": "enviou um vídeo",
"Server may be unavailable or overloaded": "Servidor pode estar indisponível ou sobrecarregado", "Server may be unavailable or overloaded": "Servidor pode estar indisponível ou sobrecarregado",
"Server may be unavailable, overloaded, or you hit a bug": "Servidor pode estar indisponível, sobrecarregado ou aconteceu um erro de execução", "Server may be unavailable, overloaded, or you hit a bug.": "Servidor pode estar indisponível, sobrecarregado ou aconteceu um erro de execução.",
"Session ID": "Identificador de sessão", "Session ID": "Identificador de sessão",
"set a profile picture": "colocou uma foto de perfil", "set a profile picture": "colocou uma foto de perfil",
"set their display name to": "configurou seu nome para", "set their display name to": "configurou seu nome para",
@ -320,8 +320,8 @@
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s alterou o tópico para \"%(topic)s\".", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s alterou o tópico para \"%(topic)s\".",
"click to reveal": "clique para ver", "click to reveal": "clique para ver",
"Conference call failed": "Chamada de conferência falhou", "Conference call failed.": "Chamada de conferência falhou.",
"Conference calling is in development and may not be reliable": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar", "Conference calling is in development and may not be reliable.": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar.",
"Conference calls are not supported in encrypted rooms": "Chamadas de conferência não são possíveis em salas criptografadas", "Conference calls are not supported in encrypted rooms": "Chamadas de conferência não são possíveis em salas criptografadas",
"Conference calls are not supported in this client": "Chamadas de conferência não são possíveis neste navegador", "Conference calls are not supported in this client": "Chamadas de conferência não são possíveis neste navegador",
"/ddg is not a command": "/ddg não é um comando", "/ddg is not a command": "/ddg não é um comando",
@ -336,7 +336,7 @@
"Failed to verify email address: make sure you clicked the link in the email": "Não foi possível verificar o endereço de email: verifique se você realmente clicou no link que está no seu email", "Failed to verify email address: make sure you clicked the link in the email": "Não foi possível verificar o endereço de email: verifique se você realmente clicou no link que está no seu email",
"Failure to create room": "Não foi possível criar a sala", "Failure to create room": "Não foi possível criar a sala",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s para %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s para %(toPowerLevel)s",
"Guest users can't create new rooms. Please register to create room and start a chat": "Visitantes não podem criar novas salas. Por favor, registre-se para criar uma sala e iniciar uma conversa", "Guest users can't create new rooms. Please register to create room and start a chat.": "Visitantes não podem criar novas salas. Por favor, registre-se para criar uma sala e iniciar uma conversa.",
"%(senderName)s invited %(targetName)s.": "%(senderName)s convidou %(targetName)s.", "%(senderName)s invited %(targetName)s.": "%(senderName)s convidou %(targetName)s.",
"%(displayName)s is typing": "%(displayName)s está escrevendo", "%(displayName)s is typing": "%(displayName)s está escrevendo",
"%(targetName)s joined the room.": "%(targetName)s entrou na sala.", "%(targetName)s joined the room.": "%(targetName)s entrou na sala.",
@ -392,15 +392,15 @@
"Use with caution": "Use com cautela", "Use with caution": "Use com cautela",
"VoIP is unsupported": "Chamada de voz não permitida", "VoIP is unsupported": "Chamada de voz não permitida",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s's.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s's.",
"You are already in a call": "Você já está em uma chamada", "You are already in a call.": "Você já está em uma chamada.",
"You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione", "You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione",
"You are trying to access %(roomName)s": "Você está tentando acessar a sala %(roomName)s", "You are trying to access %(roomName)s": "Você está tentando acessar a sala %(roomName)s",
"You cannot place a call with yourself": "Você não pode iniciar uma chamada", "You cannot place a call with yourself.": "Você não pode iniciar uma chamada.",
"You cannot place VoIP calls in this browser": "Você não pode fazer chamadas de voz neste navegador", "You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.",
"You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.", "You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.",
"You need to be logged in.": "Você tem que estar logado.", "You need to be logged in.": "Você tem que estar logado.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez.", "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver": "O seu endereço de email não parece estar associado a uma conta de usuária/o Matrix neste servidor", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "O seu endereço de email não parece estar associado a uma conta de usuária/o Matrix neste servidor.",
"Set a display name:": "Defina um nome público para você:", "Set a display name:": "Defina um nome público para você:",
"Upload an avatar:": "Envie uma imagem de perfil para identificar você:", "Upload an avatar:": "Envie uma imagem de perfil para identificar você:",
"This server does not support authentication with a phone number.": "Este servidor não permite a autenticação através de números de telefone.", "This server does not support authentication with a phone number.": "Este servidor não permite a autenticação através de números de telefone.",

View file

@ -193,7 +193,7 @@
"sent an invitation to": "enviou um convite para", "sent an invitation to": "enviou um convite para",
"sent a video": "enviou um vídeo", "sent a video": "enviou um vídeo",
"Server may be unavailable or overloaded": "Servidor pode estar indisponível ou sobrecarregado", "Server may be unavailable or overloaded": "Servidor pode estar indisponível ou sobrecarregado",
"Server may be unavailable, overloaded, or you hit a bug": "Servidor pode estar indisponível, sobrecarregado ou aconteceu um erro de execução", "Server may be unavailable, overloaded, or you hit a bug.": "Servidor pode estar indisponível, sobrecarregado ou aconteceu um erro de execução.",
"Session ID": "Identificador de sessão", "Session ID": "Identificador de sessão",
"set a profile picture": "colocou uma foto de perfil", "set a profile picture": "colocou uma foto de perfil",
"set their display name to": "configurou seu nome para", "set their display name to": "configurou seu nome para",
@ -324,8 +324,8 @@
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.",
"click to reveal": "clique para ver", "click to reveal": "clique para ver",
"Conference call failed": "Chamada de conferência falhou", "Conference call failed.": "Chamada de conferência falhou.",
"Conference calling is in development and may not be reliable": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar", "Conference calling is in development and may not be reliable.": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar.",
"Conference calls are not supported in encrypted rooms": "Chamadas de conferência não são possíveis em salas criptografadas", "Conference calls are not supported in encrypted rooms": "Chamadas de conferência não são possíveis em salas criptografadas",
"Conference calls are not supported in this client": "Chamadas de conferência não são possíveis neste navegador", "Conference calls are not supported in this client": "Chamadas de conferência não são possíveis neste navegador",
"/ddg is not a command": "/ddg não é um comando", "/ddg is not a command": "/ddg não é um comando",
@ -340,7 +340,7 @@
"Failed to verify email address: make sure you clicked the link in the email": "Não foi possível verificar o endereço de email: verifique se você realmente clicou no link que está no seu email", "Failed to verify email address: make sure you clicked the link in the email": "Não foi possível verificar o endereço de email: verifique se você realmente clicou no link que está no seu email",
"Failure to create room": "Não foi possível criar a sala", "Failure to create room": "Não foi possível criar a sala",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s para %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s para %(toPowerLevel)s",
"Guest users can't create new rooms. Please register to create room and start a chat": "Visitantes não podem criar novas salas. Por favor, registre-se para criar uma sala e iniciar uma conversa", "Guest users can't create new rooms. Please register to create room and start a chat.": "Visitantes não podem criar novas salas. Por favor, registre-se para criar uma sala e iniciar uma conversa.",
"%(senderName)s invited %(targetName)s.": "%(senderName)s convidou %(targetName)s.", "%(senderName)s invited %(targetName)s.": "%(senderName)s convidou %(targetName)s.",
"%(displayName)s is typing": "%(displayName)s está escrevendo", "%(displayName)s is typing": "%(displayName)s está escrevendo",
"%(targetName)s joined the room.": "%(targetName)s entrou na sala.", "%(targetName)s joined the room.": "%(targetName)s entrou na sala.",
@ -397,15 +397,15 @@
"Use with caution": "Use com cautela", "Use with caution": "Use com cautela",
"VoIP is unsupported": "Chamada de voz não permitida", "VoIP is unsupported": "Chamada de voz não permitida",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.",
"You are already in a call": "Você já está em uma chamada", "You are already in a call.": "Você já está em uma chamada.",
"You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione", "You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione",
"You are trying to access %(roomName)s": "Você está tentando acessar a sala %(roomName)s", "You are trying to access %(roomName)s": "Você está tentando acessar a sala %(roomName)s",
"You cannot place a call with yourself": "Você não pode iniciar uma chamada", "You cannot place a call with yourself.": "Você não pode iniciar uma chamada.",
"You cannot place VoIP calls in this browser": "Você não pode fazer chamadas de voz neste navegador", "You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.",
"You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.", "You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.",
"You need to be logged in.": "Você tem que estar logado.", "You need to be logged in.": "Você tem que estar logado.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez.", "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver": "O seu endereço de email não parece estar associado a uma conta de usuária/o Matrix neste servidor", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "O seu endereço de email não parece estar associado a uma conta de usuária/o Matrix neste servidor.",
"Set a display name:": "Defina um nome público para você:", "Set a display name:": "Defina um nome público para você:",
"Upload an avatar:": "Envie uma imagem de perfil para identificar você:", "Upload an avatar:": "Envie uma imagem de perfil para identificar você:",
"This server does not support authentication with a phone number.": "Este servidor não permite a autenticação através de números de telefone.", "This server does not support authentication with a phone number.": "Este servidor não permite a autenticação através de números de telefone.",
@ -626,7 +626,7 @@
"Server error": "Erro no servidor", "Server error": "Erro no servidor",
"Server may be unavailable, overloaded, or search timed out :(": "O servidor pode estar indisponível, sobrecarregado, ou a busca ultrapassou o tempo limite :(", "Server may be unavailable, overloaded, or search timed out :(": "O servidor pode estar indisponível, sobrecarregado, ou a busca ultrapassou o tempo limite :(",
"Server may be unavailable, overloaded, or the file too big": "O servidor pode estar indisponível, sobrecarregado, ou o arquivo é muito grande", "Server may be unavailable, overloaded, or the file too big": "O servidor pode estar indisponível, sobrecarregado, ou o arquivo é muito grande",
"Server unavailable, overloaded, or something else went wrong": "O servidor pode estar indisponível, sobrecarregado, ou alguma outra coisa não funcionou", "Server unavailable, overloaded, or something else went wrong.": "O servidor pode estar indisponível, sobrecarregado, ou alguma outra coisa não funcionou.",
"Some of your messages have not been sent": "Algumas das suas mensagens não foram enviadas", "Some of your messages have not been sent": "Algumas das suas mensagens não foram enviadas",
"Submit": "Enviar", "Submit": "Enviar",
"The main address for this room is": "O endereço principal desta sala é", "The main address for this room is": "O endereço principal desta sala é",

View file

@ -232,8 +232,8 @@
"%(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.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s имя комнаты измененно на %(roomName)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s имя комнаты измененно на %(roomName)s.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s измененная тема на %(topic)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s измененная тема на %(topic)s.",
"Conference call failed": "Конференц-вызов прервался", "Conference call failed.": "Конференц-вызов прервался.",
"Conference calling is in development and may not be reliable": "Конференц-вызов находится в процессе и может не быть надежным", "Conference calling is in development and may not be reliable.": "Конференц-вызов находится в процессе и может не быть надежным.",
"Conference calls are not supported in encrypted rooms": "Конференц-вызовы не поддерживаются в зашифрованных комнатах", "Conference calls are not supported in encrypted rooms": "Конференц-вызовы не поддерживаются в зашифрованных комнатах",
"Conference calls are not supported in this client": "Конференц-вызовы не поддерживаются в этом клиенте", "Conference calls are not supported in this client": "Конференц-вызовы не поддерживаются в этом клиенте",
"/ddg is not a command": "/ddg не команда", "/ddg is not a command": "/ddg не команда",
@ -247,7 +247,7 @@
"Failed to verify email address: make sure you clicked the link in the email": "Не удалось подтвердить email-адрес: убедитесь что вы щелкнули по ссылке электронной почты", "Failed to verify email address: make sure you clicked the link in the email": "Не удалось подтвердить email-адрес: убедитесь что вы щелкнули по ссылке электронной почты",
"Failure to create room": "Не удалось создать комнату", "Failure to create room": "Не удалось создать комнату",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s из %(fromPowerLevel)s до %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s из %(fromPowerLevel)s до %(toPowerLevel)s",
"Guest users can't create new rooms. Please register to create room and start a chat": "Гостевые пользователи не могут создавать новые комнаты. Зарегистрируйтесь для создания комнаты и чата", "Guest users can't create new rooms. Please register to create room and start a chat.": "Гостевые пользователи не могут создавать новые комнаты. Зарегистрируйтесь для создания комнаты и чата.",
"click to reveal": "нажать для открытия", "click to reveal": "нажать для открытия",
"%(senderName)s invited %(targetName)s.": "%(senderName)s приглашает %(targetName)s.", "%(senderName)s invited %(targetName)s.": "%(senderName)s приглашает %(targetName)s.",
"%(displayName)s is typing": "%(displayName)s вводит текст", "%(displayName)s is typing": "%(displayName)s вводит текст",
@ -359,11 +359,11 @@
"Upload an avatar:": "Загрузить аватар", "Upload an avatar:": "Загрузить аватар",
"You need to be logged in.": "Вы должны быть зарегистрированы", "You need to be logged in.": "Вы должны быть зарегистрированы",
"You need to be able to invite users to do that.": "Вам необходимо пригласить пользователей чтобы сделать это.", "You need to be able to invite users to do that.": "Вам необходимо пригласить пользователей чтобы сделать это.",
"You cannot place VoIP calls in this browser": "Вы не можете сделать вызовы VoIP с этим браузером", "You cannot place VoIP calls in this browser.": "Вы не можете сделать вызовы VoIP с этим браузером.",
"You are already in a call": "Вы уже находитесь в разговоре", "You are already in a call.": "Вы уже находитесь в разговоре.",
"You're not in any rooms yet! Press": "Вы еще не находитесь ни в каких комнатах! Нажать", "You're not in any rooms yet! Press": "Вы еще не находитесь ни в каких комнатах! Нажать",
"You are trying to access %(roomName)s": "Вы пытаетесь получить доступ %(roomName)s", "You are trying to access %(roomName)s": "Вы пытаетесь получить доступ %(roomName)s",
"You cannot place a call with yourself": "Вы не можете позвонить самим себе", "You cannot place a call with yourself.": "Вы не можете позвонить самим себе.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s анулировал %(targetName)s's преглашение.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s анулировал %(targetName)s's преглашение.",
"Sep": "Сен.", "Sep": "Сен.",
"Jan": "Янв.", "Jan": "Янв.",
@ -386,7 +386,7 @@
"Fri": "Пя", "Fri": "Пя",
"Sat": "Сб", "Sat": "Сб",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Вам необходимо снова войти в генерировать сквозное шифрование (е2е) ключей для этого устройства и предоставить публичный ключ Вашему домашнему серверу. Это после выключения; приносим извинения за причиненные неудобства.", "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Вам необходимо снова войти в генерировать сквозное шифрование (е2е) ключей для этого устройства и предоставить публичный ключ Вашему домашнему серверу. Это после выключения; приносим извинения за причиненные неудобства.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver": "Ваш адрес электронной почты, кажется, не связан с Matrix ID на этом Homeserver", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш адрес электронной почты, кажется, не связан с Matrix ID на этом Homeserver.",
"to start a chat with someone": "Начать чат с кем-то", "to start a chat with someone": "Начать чат с кем-то",
"to tag direct chat": "Пометить прямой чат", "to tag direct chat": "Пометить прямой чат",
"To use it, just wait for autocomplete results to load and tab through them.": "Для его использования, просто подождите результатов автозаполнения для загрузки на вкладке и через них.", "To use it, just wait for autocomplete results to load and tab through them.": "Для его использования, просто подождите результатов автозаполнения для загрузки на вкладке и через них.",

View file

@ -30,7 +30,7 @@
"Enable encryption": "启用加密", "Enable encryption": "启用加密",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "不支持加密的客户端将看不到加密的消息", "Encrypted messages will not be visible on clients that do not yet implement encryption": "不支持加密的客户端将看不到加密的消息",
"Encrypted room": "加密聊天室", "Encrypted room": "加密聊天室",
"%(senderName)s ended the call.": "%(senderName)s 结束了通话。", "%(senderName)s ended the call.": "%(senderName)s 结束了通话。.",
"End-to-end encryption information": "端到端加密信息", "End-to-end encryption information": "端到端加密信息",
"End-to-end encryption is in beta and may not be reliable": "端到端加密现为测试版,不一定可靠", "End-to-end encryption is in beta and may not be reliable": "端到端加密现为测试版,不一定可靠",
"Enter Code": "输入代码", "Enter Code": "输入代码",
@ -55,7 +55,7 @@
"Failed to save settings": "保存设置失败", "Failed to save settings": "保存设置失败",
"Failed to send email": "发送邮件失败", "Failed to send email": "发送邮件失败",
"Failed to send request.": "发送请求失败。", "Failed to send request.": "发送请求失败。",
"Failed to set avatar.": "设置头像失败。", "Failed to set avatar.": "设置头像失败。.",
"Failed to set display name": "设置昵称失败", "Failed to set display name": "设置昵称失败",
"Failed to set up conference call": "无法启动群组通话", "Failed to set up conference call": "无法启动群组通话",
"Failed to toggle moderator status": "无法切换管理员权限", "Failed to toggle moderator status": "无法切换管理员权限",
@ -70,15 +70,15 @@
"Filter room members": "过滤聊天室成员", "Filter room members": "过滤聊天室成员",
"Forget room": "忘记聊天室", "Forget room": "忘记聊天室",
"Forgot your password?": "忘记密码?", "Forgot your password?": "忘记密码?",
"For security, this session has been signed out. Please sign in again.": "出于安全考虑,此会话已被注销。请重新登录。", "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 时能解密过去的聊天记录,请导出你的聊天室密钥。", "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 时能解密过去的聊天记录,请导出你的聊天室密钥。",
"Found a bug?": "发现漏洞?", "Found a bug?": "发现漏洞?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 从 %(fromPowerLevel)s 变为 %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 从 %(fromPowerLevel)s 变为 %(toPowerLevel)s",
"Guests can't set avatars. Please register.": "游客不能设置头像。请注册。", "Guests can't set avatars. Please register.": "游客不能设置头像。请注册。.",
"Guest users can't create new rooms. Please register to create room and start a chat": "游客不能创建聊天室。请注册以创建聊天室和聊天", "Guest users can't create new rooms. Please register to create room and start a chat.": "游客不能创建聊天室。请注册以创建聊天室和聊天.",
"Guest users can't upload files. Please register to upload": "游客不能上传文件。请注册以上传文件", "Guest users can't upload files. Please register to upload": "游客不能上传文件。请注册以上传文件",
"Guests can't use labs features. Please register.": "游客不能使用实验性功能。请注册。", "Guests can't use labs features. Please register.": "游客不能使用实验性功能。请注册。.",
"Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主动邀请。", "Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主动邀请。.",
"had": "已经", "had": "已经",
"Hangup": "挂断", "Hangup": "挂断",
"Hide read receipts": "隐藏已读回执", "Hide read receipts": "隐藏已读回执",
@ -95,7 +95,7 @@
"Invalid Email Address": "邮箱地址格式错误", "Invalid Email Address": "邮箱地址格式错误",
"Invalid file%(extra)s": "非法文件%(extra)s", "Invalid file%(extra)s": "非法文件%(extra)s",
"Report it": "报告", "Report it": "报告",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "重设密码会导致所有设备上的端到端加密密钥被重置,使得加密的聊天记录不可读,除非你事先导出密钥,修改密码后再导入。此问题将来会得到改善。", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "重设密码会导致所有设备上的端到端加密密钥被重置,使得加密的聊天记录不可读,除非你事先导出密钥,修改密码后再导入。此问题将来会得到改善。.",
"restore": "恢复", "restore": "恢复",
"Return to app": "返回 App", "Return to app": "返回 App",
"Return to login screen": "返回登录页面", "Return to login screen": "返回登录页面",
@ -117,18 +117,18 @@
"Send Invites": "发送邀请", "Send Invites": "发送邀请",
"Send Reset Email": "发送密码重设邮件", "Send Reset Email": "发送密码重设邮件",
"sent an image": "发了一张图片", "sent an image": "发了一张图片",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s 发了一张图片。", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s 发了一张图片。.",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s 向 %(targetDisplayName)s 发了加入聊天室的邀请。", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s 向 %(targetDisplayName)s 发了加入聊天室的邀请。.",
"sent a video": "发了一个视频", "sent a video": "发了一个视频",
"Server error": "服务器错误", "Server error": "服务器错误",
"Server may be unavailable or overloaded": "服务器可能不可用或者超载", "Server may be unavailable or overloaded": "服务器可能不可用或者超载",
"Server may be unavailable, overloaded, or search timed out :(": "服务器可能不可用、超载,或者搜索超时 :(", "Server may be unavailable, overloaded, or search timed out :(": "服务器可能不可用、超载,或者搜索超时 :(",
"Server may be unavailable, overloaded, or the file too big": "服务器可能不可用、超载,或者文件过大", "Server may be unavailable, overloaded, or the file too big": "服务器可能不可用、超载,或者文件过大",
"Server may be unavailable, overloaded, or you hit a bug": "服务器可能不可用、超载,或者你遇到了一个漏洞", "Server may be unavailable, overloaded, or you hit a bug.": "服务器可能不可用、超载,或者你遇到了一个漏洞.",
"Server unavailable, overloaded, or something else went wrong": "服务器可能不可用、超载,或者其他东西出错了", "Server unavailable, overloaded, or something else went wrong.": "服务器可能不可用、超载,或者其他东西出错了.",
"Session ID": "会话 ID", "Session ID": "会话 ID",
"%(senderName)s set a profile picture.": "%(senderName)s 设置了头像。", "%(senderName)s set a profile picture.": "%(senderName)s 设置了头像。.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s 将昵称改为了 %(displayName)s。", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s 将昵称改为了 %(displayName)s。.",
"Settings": "设置", "Settings": "设置",
"Show panel": "显示侧边栏", "Show panel": "显示侧边栏",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "用12小时制显示时间戳 (如:下午 2:30", "Show timestamps in 12 hour format (e.g. 2:30pm)": "用12小时制显示时间戳 (如:下午 2:30",
@ -183,8 +183,8 @@
"%(names)s and %(lastPerson)s are typing": "%(names)s 和 %(lastPerson)s 正在打字", "%(names)s and %(lastPerson)s are typing": "%(names)s 和 %(lastPerson)s 正在打字",
"%(names)s and %(count)s others are typing": "%(names)s 和另外 %(count)s 个人正在打字", "%(names)s and %(count)s others are typing": "%(names)s 和另外 %(count)s 个人正在打字",
"An email has been sent to": "一封邮件已经被发送到", "An email has been sent to": "一封邮件已经被发送到",
"A new password must be entered.": "一个新的密码必须被输入。", "A new password must be entered.": "一个新的密码必须被输入。.",
"%(senderName)s answered the call.": "%(senderName)s 接了通话。", "%(senderName)s answered the call.": "%(senderName)s 接了通话。.",
"An error has occurred.": "一个错误出现了。", "An error has occurred.": "一个错误出现了。",
"Attachment": "附件", "Attachment": "附件",
"Autoplay GIFs and videos": "自动播放GIF和视频", "Autoplay GIFs and videos": "自动播放GIF和视频",
@ -200,9 +200,9 @@
"Invite new room members": "邀请新的聊天室成员", "Invite new room members": "邀请新的聊天室成员",
"Join Room": "加入聊天室", "Join Room": "加入聊天室",
"joined": "加入了", "joined": "加入了",
"%(targetName)s joined the room.": "%(targetName)s 加入了聊天室。", "%(targetName)s joined the room.": "%(targetName)s 加入了聊天室。.",
"Jump to first unread message.": "跳到第一条未读消息。", "Jump to first unread message.": "跳到第一条未读消息。",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。", "%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.",
"Leave room": "离开聊天室", "Leave room": "离开聊天室",
"Login as guest": "以游客的身份登录", "Login as guest": "以游客的身份登录",
"New password": "新密码" "New password": "新密码"

View file

@ -1,6 +1,6 @@
{ {
"An email has been sent to": "電郵已經發送至", "An email has been sent to": "電郵已經發送至",
"A new password must be entered.": "必須輸入新密碼。", "A new password must be entered.": "必須輸入新密碼。.",
"anyone": "任何人", "anyone": "任何人",
"An error has occurred.": "發生了一個錯誤。", "An error has occurred.": "發生了一個錯誤。",
"Anyone who knows the room's link, apart from guests": "任何知道房間連結的人,但訪客除外", "Anyone who knows the room's link, apart from guests": "任何知道房間連結的人,但訪客除外",
@ -10,7 +10,7 @@
"Are you sure you want to upload the following files?": "您確認要上傳以下文件嗎?", "Are you sure you want to upload the following files?": "您確認要上傳以下文件嗎?",
"Attachment": "附件", "Attachment": "附件",
"Autoplay GIFs and videos": "自動播放GIF和影片", "Autoplay GIFs and videos": "自動播放GIF和影片",
"%(senderName)s banned %(targetName)s.": "%(senderName)s 封禁了 %(targetName)s。", "%(senderName)s banned %(targetName)s.": "%(senderName)s 封禁了 %(targetName)s。.",
"Ban": "封禁", "Ban": "封禁",
"Banned users": "已被封禁的使用者", "Banned users": "已被封禁的使用者",
"Blacklisted": "已列入黑名單", "Blacklisted": "已列入黑名單",
@ -20,5 +20,5 @@
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "當瀏覽器網址列里有 HTTPS URL 時,不能使用 HTTP 連結主伺服器。請採用 HTTPS 或者 <a>允許不安全的腳本</a>", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "當瀏覽器網址列里有 HTTPS URL 時,不能使用 HTTP 連結主伺服器。請採用 HTTPS 或者 <a>允許不安全的腳本</a>",
"Can't load user settings": "無法載入使用者設定", "Can't load user settings": "無法載入使用者設定",
"Change Password": "變更密碼", "Change Password": "變更密碼",
"%(targetName)s left the room.": "%(targetName)s 離開了聊天室。" "%(targetName)s left the room.": "%(targetName)s 離開了聊天室。."
} }

View file

@ -130,10 +130,12 @@ export function setLanguage(preferredLangs) {
} }
} }
if (!langToUse) { if (!langToUse) {
throw new Error("Unable to find an appropriate language"); // Fallback to en_EN if none is found
langToUse = 'en'
console.error("Unable to find an appropriate language");
} }
return getLanguage(i18nFolder + availLangs[langToUse]); return getLanguage(i18nFolder + availLangs[langToUse].fileName);
}).then((langData) => { }).then((langData) => {
counterpart.registerTranslations(langToUse, langData); counterpart.registerTranslations(langToUse, langData);
counterpart.setLocale(langToUse); counterpart.setLocale(langToUse);
@ -142,16 +144,25 @@ export function setLanguage(preferredLangs) {
// Set 'en' as fallback language: // Set 'en' as fallback language:
if (langToUse != "en") { if (langToUse != "en") {
return getLanguage(i18nFolder + availLangs['en']); return getLanguage(i18nFolder + availLangs['en'].fileName);
} }
}).then((langData) => { }).then((langData) => {
if (langData) counterpart.registerTranslations('en', langData); if (langData) counterpart.registerTranslations('en', langData);
}); });
}; };
export function getAllLanguageKeysFromJson() { export function getAllLanguagesFromJson() {
return getLangsJson().then((langs) => { return getLangsJson().then((langsObject) => {
return Object.keys(langs); var langs = [];
for (var langKey in langsObject) {
if (langsObject.hasOwnProperty(langKey)) {
langs.push({
'value': langKey,
'label': langsObject[langKey].label
});
}
}
return langs;
}); });
} }

View file

@ -1,3 +1,6 @@
{ {
"en": "en_EN.json" "en": {
"fileName": "en_EN.json",
"label": "English"
}
} }