}
{ this.renderRegisterComponent() }
{ goBack }
{ signIn }
diff --git a/src/components/views/auth/ModularServerConfig.js b/src/components/views/auth/ModularServerConfig.js
deleted file mode 100644
index 28fd16379d..0000000000
--- a/src/components/views/auth/ModularServerConfig.js
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
-Copyright 2019 New Vector Ltd
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-import React from 'react';
-import * as sdk from '../../../index';
-import { _t } from '../../../languageHandler';
-import {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils";
-import SdkConfig from "../../../SdkConfig";
-import AutoDiscoveryUtils from "../../../utils/AutoDiscoveryUtils";
-import * as ServerType from '../../views/auth/ServerTypeSelector';
-import ServerConfig from "./ServerConfig";
-
-const MODULAR_URL = 'https://element.io/matrix-services' +
- '?utm_source=element-web&utm_medium=web&utm_campaign=element-web-authentication';
-
-// TODO: TravisR - Can this extend ServerConfig for most things?
-
-/*
- * Configure the Modular server name.
- *
- * This is a variant of ServerConfig with only the HS field and different body
- * text that is specific to the Modular case.
- */
-export default class ModularServerConfig extends ServerConfig {
- static propTypes = ServerConfig.propTypes;
-
- async validateAndApplyServer(hsUrl, isUrl) {
- // Always try and use the defaults first
- const defaultConfig: ValidatedServerConfig = SdkConfig.get()["validated_server_config"];
- if (defaultConfig.hsUrl === hsUrl && defaultConfig.isUrl === isUrl) {
- this.setState({busy: false, errorText: ""});
- this.props.onServerConfigChange(defaultConfig);
- return defaultConfig;
- }
-
- this.setState({
- hsUrl,
- isUrl,
- busy: true,
- errorText: "",
- });
-
- try {
- const result = await AutoDiscoveryUtils.validateServerConfigWithStaticUrls(hsUrl, isUrl);
- this.setState({busy: false, errorText: ""});
- this.props.onServerConfigChange(result);
- return result;
- } catch (e) {
- console.error(e);
- let message = _t("Unable to validate homeserver/identity server");
- if (e.translatedMessage) {
- message = e.translatedMessage;
- }
- this.setState({
- busy: false,
- errorText: message,
- });
-
- return null;
- }
- }
-
- async validateServer() {
- // TODO: Do we want to support .well-known lookups here?
- // If for some reason someone enters "matrix.org" for a URL, we could do a lookup to
- // find their homeserver without demanding they use "https://matrix.org"
- return this.validateAndApplyServer(this.state.hsUrl, ServerType.TYPES.PREMIUM.identityServerUrl);
- }
-
- render() {
- const Field = sdk.getComponent('elements.Field');
- const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
-
- const submitButton = this.props.submitText
- ? {this.props.submitText}
- : null;
-
- return (
-
-
{_t("Your server")}
- {_t(
- "Enter the location of your Element Matrix Services homeserver. It may use your own " +
- "domain name or be a subdomain of element.io.",
- {}, {
- a: sub =>
- {sub}
- ,
- },
- )}
-
-
- );
- }
-}
diff --git a/src/components/views/auth/ServerConfig.js b/src/components/views/auth/ServerConfig.js
deleted file mode 100644
index 448616af15..0000000000
--- a/src/components/views/auth/ServerConfig.js
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
-Copyright 2015, 2016 OpenMarket Ltd
-Copyright 2019 New Vector Ltd
-Copyright 2019 The Matrix.org Foundation C.I.C.
-
-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 PropTypes from 'prop-types';
-import Modal from '../../../Modal';
-import * as sdk from '../../../index';
-import { _t } from '../../../languageHandler';
-import {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils";
-import AutoDiscoveryUtils from "../../../utils/AutoDiscoveryUtils";
-import SdkConfig from "../../../SdkConfig";
-import CountlyAnalytics from "../../../CountlyAnalytics";
-
-/*
- * A pure UI component which displays the HS and IS to use.
- */
-
-export default class ServerConfig extends React.PureComponent {
- static propTypes = {
- onServerConfigChange: PropTypes.func.isRequired,
-
- // The current configuration that the user is expecting to change.
- serverConfig: PropTypes.instanceOf(ValidatedServerConfig).isRequired,
-
- delayTimeMs: PropTypes.number, // time to wait before invoking onChanged
-
- // Called after the component calls onServerConfigChange
- onAfterSubmit: PropTypes.func,
-
- // Optional text for the submit button. If falsey, no button will be shown.
- submitText: PropTypes.string,
-
- // Optional class for the submit button. Only applies if the submit button
- // is to be rendered.
- submitClass: PropTypes.string,
- };
-
- static defaultProps = {
- onServerConfigChange: function() {},
- delayTimeMs: 0,
- };
-
- constructor(props) {
- super(props);
-
- this.state = {
- busy: false,
- errorText: "",
- hsUrl: props.serverConfig.hsUrl,
- isUrl: props.serverConfig.isUrl,
- };
-
- CountlyAnalytics.instance.track("onboarding_custom_server");
- }
-
- // TODO: [REACT-WARNING] Replace with appropriate lifecycle event
- UNSAFE_componentWillReceiveProps(newProps) { // eslint-disable-line camelcase
- if (newProps.serverConfig.hsUrl === this.state.hsUrl &&
- newProps.serverConfig.isUrl === this.state.isUrl) return;
-
- this.validateAndApplyServer(newProps.serverConfig.hsUrl, newProps.serverConfig.isUrl);
- }
-
- async validateServer() {
- // TODO: Do we want to support .well-known lookups here?
- // If for some reason someone enters "matrix.org" for a URL, we could do a lookup to
- // find their homeserver without demanding they use "https://matrix.org"
- const result = this.validateAndApplyServer(this.state.hsUrl, this.state.isUrl);
- if (!result) {
- return result;
- }
-
- return result;
- }
-
- async validateAndApplyServer(hsUrl, isUrl) {
- // Always try and use the defaults first
- const defaultConfig: ValidatedServerConfig = SdkConfig.get()["validated_server_config"];
- if (defaultConfig.hsUrl === hsUrl && defaultConfig.isUrl === isUrl) {
- this.setState({
- hsUrl: defaultConfig.hsUrl,
- isUrl: defaultConfig.isUrl,
- busy: false,
- errorText: "",
- });
- this.props.onServerConfigChange(defaultConfig);
- return defaultConfig;
- }
-
- this.setState({
- hsUrl,
- isUrl,
- busy: true,
- errorText: "",
- });
-
- try {
- const result = await AutoDiscoveryUtils.validateServerConfigWithStaticUrls(hsUrl, isUrl);
- this.setState({busy: false, errorText: ""});
- this.props.onServerConfigChange(result);
- return result;
- } catch (e) {
- console.error(e);
-
- const stateForError = AutoDiscoveryUtils.authComponentStateForError(e);
- if (!stateForError.isFatalError) {
- this.setState({
- busy: false,
- });
- // carry on anyway
- const result = await AutoDiscoveryUtils.validateServerConfigWithStaticUrls(hsUrl, isUrl, true);
- this.props.onServerConfigChange(result);
- return result;
- } else {
- let message = _t("Unable to validate homeserver/identity server");
- if (e.translatedMessage) {
- message = e.translatedMessage;
- }
- this.setState({
- busy: false,
- errorText: message,
- });
-
- return null;
- }
- }
- }
-
- onHomeserverBlur = (ev) => {
- this._hsTimeoutId = this._waitThenInvoke(this._hsTimeoutId, () => {
- this.validateServer();
- });
- };
-
- onHomeserverChange = (ev) => {
- const hsUrl = ev.target.value;
- this.setState({ hsUrl });
- };
-
- onSubmit = async (ev) => {
- ev.preventDefault();
- ev.stopPropagation();
- const result = await this.validateServer();
- if (!result) return; // Do not continue.
-
- if (this.props.onAfterSubmit) {
- this.props.onAfterSubmit();
- }
- };
-
- _waitThenInvoke(existingTimeoutId, fn) {
- if (existingTimeoutId) {
- clearTimeout(existingTimeoutId);
- }
- return setTimeout(fn.bind(this), this.props.delayTimeMs);
- }
-
- showHelpPopup = () => {
- const CustomServerDialog = sdk.getComponent('auth.CustomServerDialog');
- Modal.createTrackedDialog('Custom Server Dialog', '', CustomServerDialog);
- };
-
- _renderHomeserverSection() {
- const Field = sdk.getComponent('elements.Field');
- return
;
- }
-
- render() {
- const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
-
- const errorText = this.state.errorText
- ? {this.state.errorText}
- : null;
-
- const submitButton = this.props.submitText
- ? {this.props.submitText}
- : null;
-
- return (
-
- );
- }
-}
diff --git a/src/components/views/auth/ServerTypeSelector.js b/src/components/views/auth/ServerTypeSelector.js
deleted file mode 100644
index 71e7ac7f0e..0000000000
--- a/src/components/views/auth/ServerTypeSelector.js
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
-Copyright 2019 New Vector Ltd
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-import React from 'react';
-import PropTypes from 'prop-types';
-import { _t } from '../../../languageHandler';
-import * as sdk from '../../../index';
-import classnames from 'classnames';
-import {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils";
-import {makeType} from "../../../utils/TypeUtils";
-
-const MODULAR_URL = 'https://element.io/matrix-services' +
- '?utm_source=element-web&utm_medium=web&utm_campaign=element-web-authentication';
-
-export const FREE = 'Free';
-export const PREMIUM = 'Premium';
-export const ADVANCED = 'Advanced';
-
-export const TYPES = {
- FREE: {
- id: FREE,
- label: () => _t('Free'),
- logo: () => ,
- description: () => _t('Join millions for free on the largest public server'),
- serverConfig: makeType(ValidatedServerConfig, {
- hsUrl: "https://matrix-client.matrix.org",
- hsName: "matrix.org",
- hsNameIsDifferent: false,
- isUrl: "https://vector.im",
- }),
- },
- PREMIUM: {
- id: PREMIUM,
- label: () => _t('Premium'),
- logo: () => ,
- description: () => _t('Premium hosting for organisations Learn more', {}, {
- a: sub =>
- {sub}
- ,
- }),
- identityServerUrl: "https://vector.im",
- },
- ADVANCED: {
- id: ADVANCED,
- label: () => _t('Advanced'),
- logo: () =>
-
- {_t('Other')}
-
,
- description: () => _t('Find other public servers or use a custom server'),
- },
-};
-
-export function getTypeFromServerConfig(config) {
- const {hsUrl} = config;
- if (!hsUrl) {
- return null;
- } else if (hsUrl === TYPES.FREE.serverConfig.hsUrl) {
- return FREE;
- } else if (new URL(hsUrl).hostname.endsWith('.modular.im')) {
- // This is an unlikely case to reach, as Modular defaults to hiding the
- // server type selector.
- return PREMIUM;
- } else {
- return ADVANCED;
- }
-}
-
-export default class ServerTypeSelector extends React.PureComponent {
- static propTypes = {
- // The default selected type.
- selected: PropTypes.string,
- // Handler called when the selected type changes.
- onChange: PropTypes.func.isRequired,
- };
-
- constructor(props) {
- super(props);
-
- const {
- selected,
- } = props;
-
- this.state = {
- selected,
- };
- }
-
- updateSelectedType(type) {
- if (this.state.selected === type) {
- return;
- }
- this.setState({
- selected: type,
- });
- if (this.props.onChange) {
- this.props.onChange(type);
- }
- }
-
- onClick = (e) => {
- e.stopPropagation();
- const type = e.currentTarget.dataset.id;
- this.updateSelectedType(type);
- };
-
- render() {
- const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
-
- const serverTypes = [];
- for (const type of Object.values(TYPES)) {
- const { id, label, logo, description } = type;
- const classes = classnames(
- "mx_ServerTypeSelector_type",
- `mx_ServerTypeSelector_type_${id}`,
- {
- "mx_ServerTypeSelector_type_selected": id === this.state.selected,
- },
- );
-
- serverTypes.push(
-
- {label()}
-
-
-
- {logo()}
-
-
- {description()}
-
-
-
);
- }
-
- return
- {serverTypes}
-
;
- }
-}
diff --git a/src/components/views/auth/SignInToText.js b/src/components/views/auth/SignInToText.js
deleted file mode 100644
index 7564096b7d..0000000000
--- a/src/components/views/auth/SignInToText.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
-Copyright 2019 The Matrix.org Foundation C.I.C.
-
-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 {_t} from "../../../languageHandler";
-import * as sdk from "../../../index";
-import PropTypes from "prop-types";
-import {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils";
-
-export default class SignInToText extends React.PureComponent {
- static propTypes = {
- serverConfig: PropTypes.instanceOf(ValidatedServerConfig).isRequired,
- onEditServerDetailsClick: PropTypes.func,
- };
-
- render() {
- let signInToText = _t('Sign in to your Matrix account on %(serverName)s', {
- serverName: this.props.serverConfig.hsName,
- });
- if (this.props.serverConfig.hsNameIsDifferent) {
- const TextWithTooltip = sdk.getComponent("elements.TextWithTooltip");
-
- signInToText = _t('Sign in to your Matrix account on ', {}, {
- 'underlinedServerName': () => {
- return
- {this.props.serverConfig.hsName}
- ;
- },
- });
- }
-
- let editLink = null;
- if (this.props.onEditServerDetailsClick) {
- editLink =
- {_t('Change')}
- ;
- }
-
- return
- {signInToText}
- {editLink}
-
;
- }
-}
diff --git a/src/components/views/dialogs/ServerPickerDialog.tsx b/src/components/views/dialogs/ServerPickerDialog.tsx
new file mode 100644
index 0000000000..8d3ea29be9
--- /dev/null
+++ b/src/components/views/dialogs/ServerPickerDialog.tsx
@@ -0,0 +1,203 @@
+/*
+Copyright 2020 The Matrix.org Foundation C.I.C.
+
+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, {createRef} from 'react';
+
+import AutoDiscoveryUtils, {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils";
+import BaseDialog from './BaseDialog';
+import { _t } from '../../../languageHandler';
+import AccessibleButton from "../elements/AccessibleButton";
+import SdkConfig from "../../../SdkConfig";
+import Field from "../elements/Field";
+import StyledRadioButton from "../elements/StyledRadioButton";
+import TextWithTooltip from "../elements/TextWithTooltip";
+import withValidation, {IFieldState} from "../elements/Validation";
+
+interface IProps {
+ title?: string;
+ serverConfig: ValidatedServerConfig;
+ onFinished(config?: ValidatedServerConfig): void;
+}
+
+interface IState {
+ defaultChosen: boolean;
+ otherHomeserver: string;
+}
+
+export default class ServerPickerDialog extends React.PureComponent {
+ private readonly defaultServer: ValidatedServerConfig;
+ private readonly fieldRef = createRef();
+ private validatedConf: ValidatedServerConfig;
+
+ constructor(props) {
+ super(props);
+
+ const config = SdkConfig.get();
+ this.defaultServer = config["validated_server_config"] as ValidatedServerConfig;
+ this.state = {
+ defaultChosen: this.props.serverConfig.isDefault,
+ otherHomeserver: this.props.serverConfig.isDefault ? "" : this.props.serverConfig.hsUrl,
+ };
+ }
+
+ private onDefaultChosen = () => {
+ this.setState({ defaultChosen: true });
+ };
+
+ private onOtherChosen = () => {
+ this.setState({ defaultChosen: false });
+ };
+
+ private onHomeserverChange = (ev) => {
+ this.setState({ otherHomeserver: ev.target.value });
+ };
+
+ // TODO: Do we want to support .well-known lookups here?
+ // If for some reason someone enters "matrix.org" for a URL, we could do a lookup to
+ // find their homeserver without demanding they use "https://matrix.org"
+ private validate = withValidation({
+ deriveData: async ({ value: hsUrl }) => {
+ // Always try and use the defaults first
+ const defaultConfig: ValidatedServerConfig = SdkConfig.get()["validated_server_config"];
+ if (defaultConfig.hsUrl === hsUrl) return {};
+
+ try {
+ this.validatedConf = await AutoDiscoveryUtils.validateServerConfigWithStaticUrls(hsUrl);
+ return {};
+ } catch (e) {
+ console.error(e);
+
+ const stateForError = AutoDiscoveryUtils.authComponentStateForError(e);
+ if (!stateForError.isFatalError) {
+ // carry on anyway
+ this.validatedConf = await AutoDiscoveryUtils.validateServerConfigWithStaticUrls(hsUrl, null, true);
+ return {};
+ } else {
+ let error = _t("Unable to validate homeserver/identity server");
+ if (e.translatedMessage) {
+ error = e.translatedMessage;
+ }
+ return { error };
+ }
+ }
+ },
+ rules: [
+ {
+ key: "required",
+ test: ({ value, allowEmpty }) => allowEmpty || !!value,
+ invalid: () => _t("Specify a homeserver"),
+ }, {
+ key: "valid",
+ test: async function({ value }, { error }) {
+ if (!value) return true;
+ return !error;
+ },
+ invalid: function({ error }) {
+ return error;
+ },
+ },
+ ],
+ });
+
+ private onHomeserverValidate = (fieldState: IFieldState) => this.validate(fieldState);
+
+ private onSubmit = async (ev) => {
+ ev.preventDefault();
+
+ const valid = await this.fieldRef.current.validate({ allowEmpty: false });
+
+ if (!valid) {
+ this.fieldRef.current.focus();
+ this.fieldRef.current.validate({ allowEmpty: false, focused: true });
+ return;
+ }
+
+ this.props.onFinished(this.validatedConf); // TODO verify this even works
+ };
+
+ public render() {
+ let text;
+ if (this.defaultServer.hsName === "matrix.org") {
+ text = _t("Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.");
+ }
+
+ let defaultServerName = this.defaultServer.hsName;
+ if (this.defaultServer.hsNameIsDifferent) {
+ defaultServerName = (
+
+ {this.defaultServer.hsName}
+
+ );
+ }
+
+ return
+
+ ;
+ }
+}
diff --git a/src/components/views/elements/ServerPicker.tsx b/src/components/views/elements/ServerPicker.tsx
new file mode 100644
index 0000000000..95ad9030b2
--- /dev/null
+++ b/src/components/views/elements/ServerPicker.tsx
@@ -0,0 +1,94 @@
+/*
+Copyright 2020 The Matrix.org Foundation C.I.C.
+
+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 AccessibleButton from "./AccessibleButton";
+import {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils";
+import {_t} from "../../../languageHandler";
+import TextWithTooltip from "./TextWithTooltip";
+import SdkConfig from "../../../SdkConfig";
+import Modal from "../../../Modal";
+import ServerPickerDialog from "../dialogs/ServerPickerDialog";
+import InfoDialog from "../dialogs/InfoDialog";
+
+interface IProps {
+ title?: string;
+ dialogTitle?: string;
+ serverConfig: ValidatedServerConfig;
+ onServerConfigChange?(config: ValidatedServerConfig): void;
+}
+
+const showPickerDialog = (
+ title: string,
+ serverConfig: ValidatedServerConfig,
+ onFinished: (config: ValidatedServerConfig) => void,
+) => {
+ Modal.createTrackedDialog("Server Picker", "", ServerPickerDialog, { title, serverConfig, onFinished });
+};
+
+const onHelpClick = () => {
+ Modal.createTrackedDialog('Custom Server Dialog', '', InfoDialog, {
+ // TODO
+ title: _t("Server Options"),
+ description: _t("You can use the custom server options to sign into other Matrix servers by specifying " +
+ "a different homeserver URL. This allows you to use Element with an existing Matrix account on " +
+ "a different homeserver."),
+ button: _t("Dismiss"),
+ hasCloseButton: false,
+ fixedWidth: false,
+ }, "mx_ServerPicker_helpDialog");
+};
+
+const ServerPicker = ({ title, dialogTitle, serverConfig, onServerConfigChange }: IProps) => {
+ let editBtn;
+ if (!SdkConfig.get()["disable_custom_urls"] && onServerConfigChange) {
+ const onClick = () => {
+ showPickerDialog(dialogTitle, serverConfig, (config?: ValidatedServerConfig) => {
+ if (config) {
+ onServerConfigChange(config);
+ }
+ });
+ };
+ editBtn =
+ {_t("Edit")}
+ ;
+ }
+
+ let serverName = serverConfig.hsName;
+ if (serverConfig.hsNameIsDifferent) {
+ serverName =
+ {serverConfig.hsName}
+ ;
+ }
+
+ let desc;
+ if (serverConfig.hsName === "matrix.org") {
+ desc =
+ {_t("Join millions for free on the largest public server")}
+ ;
+ }
+
+ return
+
{title || _t("Homeserver")}
+
+ {serverName}
+ { editBtn }
+ { desc }
+
+}
+
+export default ServerPicker;
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index f45f4c60cd..04556b10ef 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -1887,6 +1887,10 @@
"This address is available to use": "This address is available to use",
"This address is already in use": "This address is already in use",
"Room directory": "Room directory",
+ "Server Options": "Server Options",
+ "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.",
+ "Join millions for free on the largest public server": "Join millions for free on the largest public server",
+ "Homeserver": "Homeserver",
"Continue with %(provider)s": "Continue with %(provider)s",
"Sign in with single sign-on": "Sign in with single sign-on",
"And %(count)s more...|other": "And %(count)s more...",
@@ -2143,6 +2147,15 @@
"A connection error occurred while trying to contact the server.": "A connection error occurred while trying to contact the server.",
"The server is not configured to indicate what the problem is (CORS).": "The server is not configured to indicate what the problem is (CORS).",
"Recent changes that have not yet been received": "Recent changes that have not yet been received",
+ "Unable to validate homeserver/identity server": "Unable to validate homeserver/identity server",
+ "Specify a homeserver": "Specify a homeserver",
+ "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.",
+ "Sign into your homeserver": "Sign into your homeserver",
+ "We call the places you where you can host your account ‘homeservers’.": "We call the places you where you can host your account ‘homeservers’.",
+ "Other homeserver": "Other homeserver",
+ "Use your preferred Matrix homeserver if you have one, or host your own.": "Use your preferred Matrix homeserver if you have one, or host your own.",
+ "Learn more": "Learn more",
+ "About homeservers": "About homeservers",
"Sign out and remove encryption keys?": "Sign out and remove encryption keys?",
"Clear Storage and Sign Out": "Clear Storage and Sign Out",
"Send Logs": "Send Logs",
@@ -2286,9 +2299,6 @@
"Code": "Code",
"Submit": "Submit",
"Start authentication": "Start authentication",
- "Unable to validate homeserver/identity server": "Unable to validate homeserver/identity server",
- "Enter the location of your Element Matrix Services homeserver. It may use your own domain name or be a subdomain of element.io.": "Enter the location of your Element Matrix Services homeserver. It may use your own domain name or be a subdomain of element.io.",
- "Server Name": "Server Name",
"Enter password": "Enter password",
"Nice, strong password!": "Nice, strong password!",
"Password is allowed, but unsafe": "Password is allowed, but unsafe",
@@ -2296,14 +2306,13 @@
"Enter username": "Enter username",
"Enter email address": "Enter email address",
"Enter phone number": "Enter phone number",
- "Doesn't look like a valid phone number": "Doesn't look like a valid phone number",
+ "That phone number doesn't look quite right, please check and try again": "That phone number doesn't look quite right, please check and try again",
"Email": "Email",
"Username": "Username",
"Phone": "Phone",
"Forgot password?": "Forgot password?",
"Sign in with": "Sign in with",
"Sign in": "Sign in",
- "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "No identity server is configured so you cannot add an email address in order to reset your password in the future.",
"Use an email address to recover your account": "Use an email address to recover your account",
"Enter email address (required on this homeserver)": "Enter email address (required on this homeserver)",
"Passwords don't match": "Passwords don't match",
@@ -2317,16 +2326,7 @@
"Use email to optionally be discoverable by existing contacts.": "Use email to optionally be discoverable by existing contacts.",
"Enter your custom homeserver URL What does this mean?": "Enter your custom homeserver URL What does this mean?",
"Homeserver URL": "Homeserver URL",
- "Enter your custom identity server URL What does this mean?": "Enter your custom identity server URL What does this mean?",
- "Identity Server URL": "Identity Server URL",
"Other servers": "Other servers",
- "Free": "Free",
- "Join millions for free on the largest public server": "Join millions for free on the largest public server",
- "Premium": "Premium",
- "Premium hosting for organisations Learn more": "Premium hosting for organisations Learn more",
- "Find other public servers or use a custom server": "Find other public servers or use a custom server",
- "Sign in to your Matrix account on %(serverName)s": "Sign in to your Matrix account on %(serverName)s",
- "Sign in to your Matrix account on ": "Sign in to your Matrix account on ",
"Sign in with SSO": "Sign in with SSO",
"Couldn't load page": "Couldn't load page",
"You must register to use this functionality": "You must register to use this functionality",
@@ -2480,12 +2480,9 @@
"A new password must be entered.": "A new password must be entered.",
"New passwords must match each other.": "New passwords must match each other.",
"Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.",
- "Your Matrix account on %(serverName)s": "Your Matrix account on %(serverName)s",
- "Your Matrix account on ": "Your Matrix account on ",
- "No identity server is configured: add one in server settings to reset your password.": "No identity server is configured: add one in server settings to reset your password.",
- "Sign in instead": "Sign in instead",
"A verification email will be sent to your inbox to confirm setting your new password.": "A verification email will be sent to your inbox to confirm setting your new password.",
"Send Reset Email": "Send Reset Email",
+ "Sign in instead": "Sign in instead",
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.",
"I have verified my email address": "I have verified my email address",
"Your password has been reset.": "Your password has been reset.",
@@ -2507,7 +2504,7 @@
"Please note you are logging into the %(hs)s server, not matrix.org.": "Please note you are logging into the %(hs)s server, not matrix.org.",
"Failed to perform homeserver discovery": "Failed to perform homeserver discovery",
"This homeserver doesn't offer any login flows which are supported by this client.": "This homeserver doesn't offer any login flows which are supported by this client.",
- "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.",
+ "There was a problem communicating with the homeserver, please try again later.": "There was a problem communicating with the homeserver, please try again later.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.",
"Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.",
"Syncing...": "Syncing...",
@@ -2517,6 +2514,9 @@
"Unable to query for supported registration methods.": "Unable to query for supported registration methods.",
"Registration has been disabled on this homeserver.": "Registration has been disabled on this homeserver.",
"This server does not support authentication with a phone number.": "This server does not support authentication with a phone number.",
+ "That username already exists, please try another.": "That username already exists, please try another.",
+ "Host account on": "Host account on",
+ "Decide where your account is hosted": "Decide where your account is hosted",
"Continue with": "Continue with",
"Or": "Or",
"Already have an account? Sign in here": "Already have an account? Sign in here",
@@ -2525,8 +2525,6 @@
"Log in to your new account.": "Log in to your new account.",
"You can now close this window or log in to your new account.": "You can now close this window or log in to your new account.",
"Registration Successful": "Registration Successful",
- "Create your Matrix account on %(serverName)s": "Create your Matrix account on %(serverName)s",
- "Create your Matrix account on ": "Create your Matrix account on ",
"Create account": "Create account",
"Use Recovery Key or Passphrase": "Use Recovery Key or Passphrase",
"Use Recovery Key": "Use Recovery Key",