Merge pull request #990 from matrix-org/kegan/translation-marmoset

Translation fixes for everything but src/components
This commit is contained in:
Matthew Hodgson 2017-06-01 21:22:00 +01:00 committed by GitHub
commit 6c56fa3381
20 changed files with 208 additions and 47 deletions

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

@ -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

@ -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

@ -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,8 +523,11 @@
"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",
@ -530,6 +543,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 +551,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 +573,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 +714,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.",