Fix double translation issue (#10240
* Fix double translation issue * Remove some redundant string concatenationspull/28788/head^2
							parent
							
								
									a3defa6cf7
								
							
						
					
					
						commit
						12dd799301
					
				|  | @ -164,7 +164,7 @@ describe("Decryption Failure Bar", () => { | |||
|             cy.contains(".mx_DecryptionFailureBar_button", "Resend key requests").should("not.exist"); | ||||
| 
 | ||||
|             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], | ||||
|                 }, | ||||
|  |  | |||
|  | @ -213,8 +213,7 @@ export default class AddThreepid { | |||
|                             [SSOAuthEntry.PHASE_PREAUTH]: { | ||||
|                                 title: _t("Use Single Sign On to continue"), | ||||
|                                 body: _t( | ||||
|                                     "Confirm adding this email address by using " + | ||||
|                                         "Single Sign On to prove your identity.", | ||||
|                                     "Confirm adding this email address by using Single Sign On to prove your identity.", | ||||
|                                 ), | ||||
|                                 continueText: _t("Single Sign On"), | ||||
|                                 continueKind: "primary", | ||||
|  | @ -333,7 +332,7 @@ export default class AddThreepid { | |||
|                         [SSOAuthEntry.PHASE_PREAUTH]: { | ||||
|                             title: _t("Use Single Sign On to continue"), | ||||
|                             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"), | ||||
|                             continueKind: "primary", | ||||
|  |  | |||
|  | @ -737,7 +737,7 @@ export default class LegacyCallHandler extends EventEmitter { | |||
|         ); | ||||
|         if (!stats) { | ||||
|             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; | ||||
|         } | ||||
|  |  | |||
|  | @ -157,11 +157,9 @@ export default class ManageEventIndexDialog extends React.Component<IProps, ISta | |||
| 
 | ||||
|         const eventIndexingSettings = ( | ||||
|             <div> | ||||
|                 {_t( | ||||
|                     "%(brand)s is securely caching encrypted messages locally for them " + | ||||
|                         "to appear in search results:", | ||||
|                     { brand }, | ||||
|                 )} | ||||
|                 {_t("%(brand)s is securely caching encrypted messages locally for them to appear in search results:", { | ||||
|                     brand, | ||||
|                 })} | ||||
|                 <div className="mx_SettingsTab_subsectionText"> | ||||
|                     {crawlerState} | ||||
|                     <br /> | ||||
|  |  | |||
|  | @ -1473,9 +1473,7 @@ class TimelinePanel extends React.Component<IProps, IState> { | |||
|                         "do not have permission to view the message in question.", | ||||
|                 ); | ||||
|             } else { | ||||
|                 description = _t( | ||||
|                     "Tried to load a specific point in this room's timeline, but was " + "unable to find it.", | ||||
|                 ); | ||||
|                 description = _t("Tried to load a specific point in this room's timeline, but was unable to find it."); | ||||
|             } | ||||
| 
 | ||||
|             Modal.createDialog(ErrorDialog, { | ||||
|  |  | |||
|  | @ -454,7 +454,7 @@ export default class LoginComponent extends React.PureComponent<IProps, IState> | |||
|         } | ||||
| 
 | ||||
|         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 + ")" : ""); | ||||
| 
 | ||||
|         if (err instanceof ConnectionError) { | ||||
|  |  | |||
|  | @ -91,7 +91,7 @@ export default class CaptchaForm extends React.Component<ICaptchaFormProps, ICap | |||
|         const publicKey = this.props.sitePublicKey; | ||||
|         if (!publicKey) { | ||||
|             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); | ||||
|  |  | |||
|  | @ -70,7 +70,7 @@ export default class StorageEvictedDialog extends React.Component<IProps> { | |||
|                         )} | ||||
|                     </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> | ||||
|                 </div> | ||||
|                 <DialogButtons | ||||
|  |  | |||
|  | @ -405,7 +405,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent<IProps, | |||
|                 <div> | ||||
|                     <p> | ||||
|                         {_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> }, | ||||
|                         )} | ||||
|  | @ -480,7 +480,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent<IProps, | |||
|                 <div> | ||||
|                     <p> | ||||
|                         {_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> }, | ||||
|                         )} | ||||
|  |  | |||
|  | @ -93,7 +93,7 @@ class LocationPicker extends React.Component<ILocationPickerProps, IState> { | |||
| 
 | ||||
|             this.map.on("error", (e) => { | ||||
|                 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, | ||||
|                 ); | ||||
|                 this.setState({ error: LocationShareError.MapStyleUrlNotReachable }); | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ import { User } from "matrix-js-sdk/src/models/user"; | |||
| import MatrixClientContext from "../../../contexts/MatrixClientContext"; | ||||
| import RoomContext from "../../../contexts/RoomContext"; | ||||
| import DMRoomMap from "../../../utils/DMRoomMap"; | ||||
| import { _t } from "../../../languageHandler"; | ||||
| import { _t, _td } from "../../../languageHandler"; | ||||
| import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton"; | ||||
| import MiniAvatarUploader, { AVATAR_SIZE } from "../elements/MiniAvatarUploader"; | ||||
| import RoomAvatar from "../avatars/RoomAvatar"; | ||||
|  | @ -55,11 +55,11 @@ const NewRoomIntro: React.FC = () => { | |||
| 
 | ||||
|     let body: JSX.Element; | ||||
|     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; | ||||
| 
 | ||||
|         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) { | ||||
|             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( | ||||
|                     "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 }, | ||||
|                 ); | ||||
|                 primaryActionLabel = _t("Join the discussion"); | ||||
|  |  | |||
|  | @ -177,7 +177,7 @@ export default class EventIndexPanel extends React.Component<{}, IState> { | |||
|             eventIndexingSettings = ( | ||||
|                 <div> | ||||
|                     <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> | ||||
|                         <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, { | ||||
|             title: _t("Delete Backup"), | ||||
|             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"), | ||||
|             danger: true, | ||||
|  |  | |||
|  | @ -192,7 +192,7 @@ export default class SetIdServer extends React.Component<IProps, IState> { | |||
|                     const [confirmed] = await this.showServerChangeWarning({ | ||||
|                         title: _t("Change identity server"), | ||||
|                         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>, | ||||
|  | @ -330,7 +330,7 @@ export default class SetIdServer extends React.Component<IProps, IState> { | |||
|                 <div> | ||||
|                     <p> | ||||
|                         {_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, | ||||
|                         )} | ||||
|  |  | |||
|  | @ -223,7 +223,7 @@ export default class EmailAddresses extends React.Component<IProps, IState> { | |||
|                     Modal.createDialog(ErrorDialog, { | ||||
|                         title: _t("Your email address hasn't been verified yet"), | ||||
|                         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 { | ||||
|  |  | |||
|  | @ -184,7 +184,7 @@ export class EmailAddress extends React.Component<IEmailAddressProps, IEmailAddr | |||
|                 Modal.createDialog(ErrorDialog, { | ||||
|                     title: _t("Your email address hasn't been verified yet"), | ||||
|                     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 { | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ limitations under the License. | |||
| */ | ||||
| 
 | ||||
| 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 { MatrixEventEvent } from "matrix-js-sdk/src/models/event"; | ||||
| 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]); | ||||
|     if (errors.length > 0) { | ||||
|         const messages = []; | ||||
|         const messages: ReactNode[] = []; | ||||
|         for (const roomErr of errors) { | ||||
|             const err = roomErr[1]; // [0] is the roomId
 | ||||
|             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; | ||||
| 
 | ||||
|     if (!mapStyleUrl) { | ||||
|         logger.error( | ||||
|             "'map_style_url' missing from homeserver .well-known area, and " + "missing from from config.json.", | ||||
|         ); | ||||
|         logger.error("'map_style_url' missing from homeserver .well-known area, and missing from from config.json."); | ||||
|         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.on("error", (e) => { | ||||
|             logger.error( | ||||
|                 "Failed to load map: check map_style_url in config.json has a " + "valid URL and API key", | ||||
|                 e.error, | ||||
|             ); | ||||
|             logger.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)); | ||||
|         }); | ||||
| 
 | ||||
|  |  | |||
|  | @ -567,9 +567,7 @@ describe("EventListSummary", function () { | |||
|         const summary = wrapper.find(".mx_GenericEventListSummary_summary"); | ||||
|         const summaryText = summary.text(); | ||||
| 
 | ||||
|         expect(summaryText).toBe( | ||||
|             "user_1 and one other rejected their invitations and " + "had their invitations withdrawn", | ||||
|         ); | ||||
|         expect(summaryText).toBe("user_1 and one other rejected their invitations and had their invitations withdrawn"); | ||||
|     }); | ||||
| 
 | ||||
|     it("handles invitation plurals correctly when there are multiple invites", function () { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Michael Telatyński
						Michael Telatyński