Fix double translation issue (#10240
* Fix double translation issue * Remove some redundant string concatenations
This commit is contained in:
parent
a3defa6cf7
commit
12dd799301
21 changed files with 29 additions and 41 deletions
|
@ -164,7 +164,7 @@ describe("Decryption Failure Bar", () => {
|
||||||
cy.contains(".mx_DecryptionFailureBar_button", "Resend key requests").should("not.exist");
|
cy.contains(".mx_DecryptionFailureBar_button", "Resend key requests").should("not.exist");
|
||||||
|
|
||||||
cy.get(".mx_DecryptionFailureBar").percySnapshotElement(
|
cy.get(".mx_DecryptionFailureBar").percySnapshotElement(
|
||||||
"DecryptionFailureBar prompts user to open another device, " + "without Resend Key Requests button",
|
"DecryptionFailureBar prompts user to open another device, without Resend Key Requests button",
|
||||||
{
|
{
|
||||||
widths: [320, 640],
|
widths: [320, 640],
|
||||||
},
|
},
|
||||||
|
|
|
@ -213,8 +213,7 @@ export default class AddThreepid {
|
||||||
[SSOAuthEntry.PHASE_PREAUTH]: {
|
[SSOAuthEntry.PHASE_PREAUTH]: {
|
||||||
title: _t("Use Single Sign On to continue"),
|
title: _t("Use Single Sign On to continue"),
|
||||||
body: _t(
|
body: _t(
|
||||||
"Confirm adding this email address by using " +
|
"Confirm adding this email address by using Single Sign On to prove your identity.",
|
||||||
"Single Sign On to prove your identity.",
|
|
||||||
),
|
),
|
||||||
continueText: _t("Single Sign On"),
|
continueText: _t("Single Sign On"),
|
||||||
continueKind: "primary",
|
continueKind: "primary",
|
||||||
|
@ -333,7 +332,7 @@ export default class AddThreepid {
|
||||||
[SSOAuthEntry.PHASE_PREAUTH]: {
|
[SSOAuthEntry.PHASE_PREAUTH]: {
|
||||||
title: _t("Use Single Sign On to continue"),
|
title: _t("Use Single Sign On to continue"),
|
||||||
body: _t(
|
body: _t(
|
||||||
"Confirm adding this phone number by using " + "Single Sign On to prove your identity.",
|
"Confirm adding this phone number by using Single Sign On to prove your identity.",
|
||||||
),
|
),
|
||||||
continueText: _t("Single Sign On"),
|
continueText: _t("Single Sign On"),
|
||||||
continueKind: "primary",
|
continueKind: "primary",
|
||||||
|
|
|
@ -737,7 +737,7 @@ export default class LegacyCallHandler extends EventEmitter {
|
||||||
);
|
);
|
||||||
if (!stats) {
|
if (!stats) {
|
||||||
logger.debug(
|
logger.debug(
|
||||||
"Call statistics are undefined. The call has " + "probably failed before a peerConn was established",
|
"Call statistics are undefined. The call has probably failed before a peerConn was established",
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,11 +157,9 @@ export default class ManageEventIndexDialog extends React.Component<IProps, ISta
|
||||||
|
|
||||||
const eventIndexingSettings = (
|
const eventIndexingSettings = (
|
||||||
<div>
|
<div>
|
||||||
{_t(
|
{_t("%(brand)s is securely caching encrypted messages locally for them to appear in search results:", {
|
||||||
"%(brand)s is securely caching encrypted messages locally for them " +
|
brand,
|
||||||
"to appear in search results:",
|
})}
|
||||||
{ brand },
|
|
||||||
)}
|
|
||||||
<div className="mx_SettingsTab_subsectionText">
|
<div className="mx_SettingsTab_subsectionText">
|
||||||
{crawlerState}
|
{crawlerState}
|
||||||
<br />
|
<br />
|
||||||
|
|
|
@ -1473,9 +1473,7 @@ class TimelinePanel extends React.Component<IProps, IState> {
|
||||||
"do not have permission to view the message in question.",
|
"do not have permission to view the message in question.",
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
description = _t(
|
description = _t("Tried to load a specific point in this room's timeline, but was unable to find it.");
|
||||||
"Tried to load a specific point in this room's timeline, but was " + "unable to find it.",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Modal.createDialog(ErrorDialog, {
|
Modal.createDialog(ErrorDialog, {
|
||||||
|
|
|
@ -454,7 +454,7 @@ export default class LoginComponent extends React.PureComponent<IProps, IState>
|
||||||
}
|
}
|
||||||
|
|
||||||
let errorText: ReactNode =
|
let errorText: ReactNode =
|
||||||
_t("There was a problem communicating with the homeserver, " + "please try again later.") +
|
_t("There was a problem communicating with the homeserver, please try again later.") +
|
||||||
(errCode ? " (" + errCode + ")" : "");
|
(errCode ? " (" + errCode + ")" : "");
|
||||||
|
|
||||||
if (err instanceof ConnectionError) {
|
if (err instanceof ConnectionError) {
|
||||||
|
|
|
@ -91,7 +91,7 @@ export default class CaptchaForm extends React.Component<ICaptchaFormProps, ICap
|
||||||
const publicKey = this.props.sitePublicKey;
|
const publicKey = this.props.sitePublicKey;
|
||||||
if (!publicKey) {
|
if (!publicKey) {
|
||||||
logger.error("No public key for recaptcha!");
|
logger.error("No public key for recaptcha!");
|
||||||
throw new Error("This server has not supplied enough information for Recaptcha " + "authentication");
|
throw new Error("This server has not supplied enough information for Recaptcha authentication");
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info("Rendering to %s", divId);
|
logger.info("Rendering to %s", divId);
|
||||||
|
|
|
@ -70,7 +70,7 @@ export default class StorageEvictedDialog extends React.Component<IProps> {
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
{_t("Your browser likely removed this data when running low on " + "disk space.")} {logRequest}
|
{_t("Your browser likely removed this data when running low on disk space.")} {logRequest}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<DialogButtons
|
<DialogButtons
|
||||||
|
|
|
@ -405,7 +405,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent<IProps,
|
||||||
<div>
|
<div>
|
||||||
<p>
|
<p>
|
||||||
{_t(
|
{_t(
|
||||||
"<b>Warning</b>: you should only set up key backup " + "from a trusted computer.",
|
"<b>Warning</b>: you should only set up key backup from a trusted computer.",
|
||||||
{},
|
{},
|
||||||
{ b: (sub) => <b>{sub}</b> },
|
{ b: (sub) => <b>{sub}</b> },
|
||||||
)}
|
)}
|
||||||
|
@ -480,7 +480,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent<IProps,
|
||||||
<div>
|
<div>
|
||||||
<p>
|
<p>
|
||||||
{_t(
|
{_t(
|
||||||
"<b>Warning</b>: you should only set up key backup " + "from a trusted computer.",
|
"<b>Warning</b>: you should only set up key backup from a trusted computer.",
|
||||||
{},
|
{},
|
||||||
{ b: (sub) => <b>{sub}</b> },
|
{ b: (sub) => <b>{sub}</b> },
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -93,7 +93,7 @@ class LocationPicker extends React.Component<ILocationPickerProps, IState> {
|
||||||
|
|
||||||
this.map.on("error", (e) => {
|
this.map.on("error", (e) => {
|
||||||
logger.error(
|
logger.error(
|
||||||
"Failed to load map: check map_style_url in config.json " + "has a valid URL and API key",
|
"Failed to load map: check map_style_url in config.json has a valid URL and API key",
|
||||||
e.error,
|
e.error,
|
||||||
);
|
);
|
||||||
this.setState({ error: LocationShareError.MapStyleUrlNotReachable });
|
this.setState({ error: LocationShareError.MapStyleUrlNotReachable });
|
||||||
|
|
|
@ -23,7 +23,7 @@ import { User } from "matrix-js-sdk/src/models/user";
|
||||||
import MatrixClientContext from "../../../contexts/MatrixClientContext";
|
import MatrixClientContext from "../../../contexts/MatrixClientContext";
|
||||||
import RoomContext from "../../../contexts/RoomContext";
|
import RoomContext from "../../../contexts/RoomContext";
|
||||||
import DMRoomMap from "../../../utils/DMRoomMap";
|
import DMRoomMap from "../../../utils/DMRoomMap";
|
||||||
import { _t } from "../../../languageHandler";
|
import { _t, _td } from "../../../languageHandler";
|
||||||
import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton";
|
import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton";
|
||||||
import MiniAvatarUploader, { AVATAR_SIZE } from "../elements/MiniAvatarUploader";
|
import MiniAvatarUploader, { AVATAR_SIZE } from "../elements/MiniAvatarUploader";
|
||||||
import RoomAvatar from "../avatars/RoomAvatar";
|
import RoomAvatar from "../avatars/RoomAvatar";
|
||||||
|
@ -55,11 +55,11 @@ const NewRoomIntro: React.FC = () => {
|
||||||
|
|
||||||
let body: JSX.Element;
|
let body: JSX.Element;
|
||||||
if (dmPartner) {
|
if (dmPartner) {
|
||||||
let introMessage = _t("This is the beginning of your direct message history with <displayName/>.");
|
let introMessage = _td("This is the beginning of your direct message history with <displayName/>.");
|
||||||
let caption: string | undefined;
|
let caption: string | undefined;
|
||||||
|
|
||||||
if (isLocalRoom) {
|
if (isLocalRoom) {
|
||||||
introMessage = _t("Send your first message to invite <displayName/> to chat");
|
introMessage = _td("Send your first message to invite <displayName/> to chat");
|
||||||
} else if (room.getJoinedMemberCount() + room.getInvitedMemberCount() === 2) {
|
} else if (room.getJoinedMemberCount() + room.getInvitedMemberCount() === 2) {
|
||||||
caption = _t("Only the two of you are in this conversation, unless either of you invites anyone to join.");
|
caption = _t("Only the two of you are in this conversation, unless either of you invites anyone to join.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -435,7 +435,7 @@ export default class RoomPreviewBar extends React.Component<IProps, IState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
subTitle = _t(
|
subTitle = _t(
|
||||||
"Link this email with your account in Settings to receive invites " + "directly in %(brand)s.",
|
"Link this email with your account in Settings to receive invites directly in %(brand)s.",
|
||||||
{ brand },
|
{ brand },
|
||||||
);
|
);
|
||||||
primaryActionLabel = _t("Join the discussion");
|
primaryActionLabel = _t("Join the discussion");
|
||||||
|
|
|
@ -177,7 +177,7 @@ export default class EventIndexPanel extends React.Component<{}, IState> {
|
||||||
eventIndexingSettings = (
|
eventIndexingSettings = (
|
||||||
<div>
|
<div>
|
||||||
<div className="mx_SettingsTab_subsectionText">
|
<div className="mx_SettingsTab_subsectionText">
|
||||||
{_t("Securely cache encrypted messages locally for them to " + "appear in search results.")}
|
{_t("Securely cache encrypted messages locally for them to appear in search results.")}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<AccessibleButton kind="primary" disabled={this.state.enabling} onClick={this.onEnable}>
|
<AccessibleButton kind="primary" disabled={this.state.enabling} onClick={this.onEnable}>
|
||||||
|
|
|
@ -183,7 +183,7 @@ export default class SecureBackupPanel extends React.PureComponent<{}, IState> {
|
||||||
Modal.createDialog(QuestionDialog, {
|
Modal.createDialog(QuestionDialog, {
|
||||||
title: _t("Delete Backup"),
|
title: _t("Delete Backup"),
|
||||||
description: _t(
|
description: _t(
|
||||||
"Are you sure? You will lose your encrypted messages if your " + "keys are not backed up properly.",
|
"Are you sure? You will lose your encrypted messages if your keys are not backed up properly.",
|
||||||
),
|
),
|
||||||
button: _t("Delete Backup"),
|
button: _t("Delete Backup"),
|
||||||
danger: true,
|
danger: true,
|
||||||
|
|
|
@ -192,7 +192,7 @@ export default class SetIdServer extends React.Component<IProps, IState> {
|
||||||
const [confirmed] = await this.showServerChangeWarning({
|
const [confirmed] = await this.showServerChangeWarning({
|
||||||
title: _t("Change identity server"),
|
title: _t("Change identity server"),
|
||||||
unboundMessage: _t(
|
unboundMessage: _t(
|
||||||
"Disconnect from the identity server <current /> and " + "connect to <new /> instead?",
|
"Disconnect from the identity server <current /> and connect to <new /> instead?",
|
||||||
{},
|
{},
|
||||||
{
|
{
|
||||||
current: (sub) => <b>{abbreviateUrl(currentClientIdServer)}</b>,
|
current: (sub) => <b>{abbreviateUrl(currentClientIdServer)}</b>,
|
||||||
|
@ -330,7 +330,7 @@ export default class SetIdServer extends React.Component<IProps, IState> {
|
||||||
<div>
|
<div>
|
||||||
<p>
|
<p>
|
||||||
{_t(
|
{_t(
|
||||||
"You are still <b>sharing your personal data</b> on the identity " + "server <idserver />.",
|
"You are still <b>sharing your personal data</b> on the identity server <idserver />.",
|
||||||
{},
|
{},
|
||||||
messageElements,
|
messageElements,
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -223,7 +223,7 @@ export default class EmailAddresses extends React.Component<IProps, IState> {
|
||||||
Modal.createDialog(ErrorDialog, {
|
Modal.createDialog(ErrorDialog, {
|
||||||
title: _t("Your email address hasn't been verified yet"),
|
title: _t("Your email address hasn't been verified yet"),
|
||||||
description: _t(
|
description: _t(
|
||||||
"Click the link in the email you received to verify " + "and then click continue again.",
|
"Click the link in the email you received to verify and then click continue again.",
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -184,7 +184,7 @@ export class EmailAddress extends React.Component<IEmailAddressProps, IEmailAddr
|
||||||
Modal.createDialog(ErrorDialog, {
|
Modal.createDialog(ErrorDialog, {
|
||||||
title: _t("Your email address hasn't been verified yet"),
|
title: _t("Your email address hasn't been verified yet"),
|
||||||
description: _t(
|
description: _t(
|
||||||
"Click the link in the email you received to verify " + "and then click continue again.",
|
"Click the link in the email you received to verify and then click continue again.",
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -15,7 +15,7 @@ limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { sleep } from "matrix-js-sdk/src/utils";
|
import { sleep } from "matrix-js-sdk/src/utils";
|
||||||
import React from "react";
|
import React, { ReactNode } from "react";
|
||||||
import { EventStatus } from "matrix-js-sdk/src/models/event-status";
|
import { EventStatus } from "matrix-js-sdk/src/models/event-status";
|
||||||
import { MatrixEventEvent } from "matrix-js-sdk/src/models/event";
|
import { MatrixEventEvent } from "matrix-js-sdk/src/models/event";
|
||||||
import { Room } from "matrix-js-sdk/src/models/room";
|
import { Room } from "matrix-js-sdk/src/models/room";
|
||||||
|
@ -110,7 +110,7 @@ export async function leaveRoomBehaviour(roomId: string, retry = true, spinner =
|
||||||
|
|
||||||
const errors = Object.entries(results).filter((r) => !!r[1]);
|
const errors = Object.entries(results).filter((r) => !!r[1]);
|
||||||
if (errors.length > 0) {
|
if (errors.length > 0) {
|
||||||
const messages = [];
|
const messages: ReactNode[] = [];
|
||||||
for (const roomErr of errors) {
|
for (const roomErr of errors) {
|
||||||
const err = roomErr[1]; // [0] is the roomId
|
const err = roomErr[1]; // [0] is the roomId
|
||||||
let message = _t("Unexpected server error trying to leave the room");
|
let message = _t("Unexpected server error trying to leave the room");
|
||||||
|
|
|
@ -29,9 +29,7 @@ export function findMapStyleUrl(): string {
|
||||||
const mapStyleUrl = getTileServerWellKnown()?.map_style_url ?? SdkConfig.get().map_style_url;
|
const mapStyleUrl = getTileServerWellKnown()?.map_style_url ?? SdkConfig.get().map_style_url;
|
||||||
|
|
||||||
if (!mapStyleUrl) {
|
if (!mapStyleUrl) {
|
||||||
logger.error(
|
logger.error("'map_style_url' missing from homeserver .well-known area, and missing from from config.json.");
|
||||||
"'map_style_url' missing from homeserver .well-known area, and " + "missing from from config.json.",
|
|
||||||
);
|
|
||||||
throw new Error(LocationShareError.MapStyleUrlNotConfigured);
|
throw new Error(LocationShareError.MapStyleUrlNotConfigured);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,10 +50,7 @@ export const createMap = (interactive: boolean, bodyId: string, onError?: (error
|
||||||
map.addControl(new maplibregl.AttributionControl(), "top-right");
|
map.addControl(new maplibregl.AttributionControl(), "top-right");
|
||||||
|
|
||||||
map.on("error", (e) => {
|
map.on("error", (e) => {
|
||||||
logger.error(
|
logger.error("Failed to load map: check map_style_url in config.json has a valid URL and API key", e.error);
|
||||||
"Failed to load map: check map_style_url in config.json has a " + "valid URL and API key",
|
|
||||||
e.error,
|
|
||||||
);
|
|
||||||
onError?.(new Error(LocationShareError.MapStyleUrlNotReachable));
|
onError?.(new Error(LocationShareError.MapStyleUrlNotReachable));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -567,9 +567,7 @@ describe("EventListSummary", function () {
|
||||||
const summary = wrapper.find(".mx_GenericEventListSummary_summary");
|
const summary = wrapper.find(".mx_GenericEventListSummary_summary");
|
||||||
const summaryText = summary.text();
|
const summaryText = summary.text();
|
||||||
|
|
||||||
expect(summaryText).toBe(
|
expect(summaryText).toBe("user_1 and one other rejected their invitations and had their invitations withdrawn");
|
||||||
"user_1 and one other rejected their invitations and " + "had their invitations withdrawn",
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("handles invitation plurals correctly when there are multiple invites", function () {
|
it("handles invitation plurals correctly when there are multiple invites", function () {
|
||||||
|
|
Loading…
Reference in a new issue