Migrate more strings to translation keys (#11665)

This commit is contained in:
Michael Telatynski 2023-09-25 18:12:41 +01:00 committed by GitHub
parent de250df520
commit 54c88c57ed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
127 changed files with 6797 additions and 5825 deletions

View file

@ -477,7 +477,7 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
const viewSourceButton = (
<IconizedContextMenuOption
iconClassName="mx_MessageContextMenu_iconSource"
label={_t("View source")}
label={_t("timeline|context_menu|view_source")}
onClick={this.onViewSourceClick}
/>
);
@ -487,7 +487,7 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
unhidePreviewButton = (
<IconizedContextMenuOption
iconClassName="mx_MessageContextMenu_iconUnhidePreview"
label={_t("Show preview")}
label={_t("timeline|context_menu|show_url_preview")}
onClick={this.onUnhidePreviewClick}
/>
);
@ -546,7 +546,7 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
<IconizedContextMenuOption
iconClassName="mx_MessageContextMenu_iconLink"
onClick={this.closeMenu}
label={_t("Source URL")}
label={_t("timeline|context_menu|external_url")}
element="a"
{
// XXX: Typescript signature for AccessibleButton doesn't work properly for non-inputs like `a`
@ -565,7 +565,7 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
collapseReplyChainButton = (
<IconizedContextMenuOption
iconClassName="mx_MessageContextMenu_iconCollapse"
label={_t("Collapse reply thread")}
label={_t("timeline|context_menu|collapse_reply_thread")}
onClick={this.onCollapseReplyChainClick}
/>
);
@ -577,7 +577,7 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
jumpToRelatedEventButton = (
<IconizedContextMenuOption
iconClassName="mx_MessageContextMenu_jumpToEvent"
label={_t("View related event")}
label={_t("timeline|context_menu|view_related_event")}
onClick={() => this.onJumpToRelatedEventClick(relatedEventId)}
/>
);
@ -588,7 +588,7 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
reportEventButton = (
<IconizedContextMenuOption
iconClassName="mx_MessageContextMenu_iconReport"
label={_t("Report")}
label={_t("timeline|context_menu|report")}
onClick={this.onReportEventClick}
/>
);

View file

@ -83,7 +83,7 @@ const RoomContextMenu: React.FC<IProps> = ({ room, onFinished, ...props }) => {
leaveOption = (
<IconizedContextMenuOption
iconClassName="mx_RoomTile_iconSignOut"
label={_t("Forget")}
label={_t("room|context_menu|forget")}
className="mx_IconizedContextMenu_option_red"
onClick={onForgetRoomClick}
/>
@ -154,7 +154,7 @@ const RoomContextMenu: React.FC<IProps> = ({ room, onFinished, ...props }) => {
PosthogTrackers.trackInteraction("WebRoomHeaderContextMenuFavouriteToggle", e);
}}
active={isFavorite}
label={isFavorite ? _t("Favourited") : _t("Favourite")}
label={isFavorite ? _t("room|context_menu|unfavourite") : _t("room|context_menu|favourite")}
iconClassName="mx_RoomTile_iconStar"
/>
);
@ -182,7 +182,7 @@ const RoomContextMenu: React.FC<IProps> = ({ room, onFinished, ...props }) => {
iconClassName = "mx_RoomTile_iconNotificationsAllMessages";
break;
case RoomNotifState.MentionsOnly:
notificationLabel = _t("Mentions only");
notificationLabel = _t("room|context_menu|mentions_only");
iconClassName = "mx_RoomTile_iconNotificationsMentionsKeywords";
break;
case RoomNotifState.Mute:
@ -206,7 +206,7 @@ const RoomContextMenu: React.FC<IProps> = ({ room, onFinished, ...props }) => {
PosthogTrackers.trackInteraction("WebRoomHeaderContextMenuNotificationsItem", ev);
}}
label={_t("Notifications")}
label={_t("notifications|enable_prompt_toast_title")}
iconClassName={iconClassName}
>
<span className="mx_IconizedContextMenu_sublabel">{notificationLabel}</span>
@ -247,7 +247,7 @@ const RoomContextMenu: React.FC<IProps> = ({ room, onFinished, ...props }) => {
});
onFinished();
}}
label={_t("Copy room link")}
label={_t("room|context_menu|copy_link")}
iconClassName="mx_RoomTile_iconCopyLink"
/>
);

View file

@ -111,7 +111,7 @@ export const RoomGeneralContextMenu: React.FC<RoomGeneralContextMenuProps> = ({
<IconizedContextMenuCheckbox
onClick={wrapHandler((ev) => onTagRoom(ev, DefaultTagID.Favourite), onPostFavoriteClick, true)}
active={isFavorite}
label={isFavorite ? _t("Favourited") : _t("Favourite")}
label={isFavorite ? _t("room|context_menu|unfavourite") : _t("room|context_menu|favourite")}
iconClassName="mx_RoomGeneralContextMenu_iconStar"
/>
);
@ -121,7 +121,7 @@ export const RoomGeneralContextMenu: React.FC<RoomGeneralContextMenuProps> = ({
<IconizedContextMenuCheckbox
onClick={wrapHandler((ev) => onTagRoom(ev, DefaultTagID.LowPriority), onPostLowPriorityClick, true)}
active={isLowPriority}
label={_t("Low Priority")}
label={_t("room|context_menu|low_priority")}
iconClassName="mx_RoomGeneralContextMenu_iconArrowDown"
/>
);
@ -156,7 +156,7 @@ export const RoomGeneralContextMenu: React.FC<RoomGeneralContextMenuProps> = ({
}),
onPostCopyLinkClick,
)}
label={_t("Copy room link")}
label={_t("room|context_menu|copy_link")}
iconClassName="mx_RoomGeneralContextMenu_iconCopyLink"
/>
);
@ -182,7 +182,7 @@ export const RoomGeneralContextMenu: React.FC<RoomGeneralContextMenuProps> = ({
leaveOption = (
<IconizedContextMenuOption
iconClassName="mx_RoomGeneralContextMenu_iconSignOut"
label={_t("Forget Room")}
label={_t("room|context_menu|forget")}
className="mx_IconizedContextMenu_option_red"
onClick={wrapHandler(
() =>
@ -221,7 +221,7 @@ export const RoomGeneralContextMenu: React.FC<RoomGeneralContextMenuProps> = ({
onFinished?.();
}}
active={false}
label={_t("Mark as read")}
label={_t("room|context_menu|mark_read")}
iconClassName="mx_RoomGeneralContextMenu_iconMarkAsRead"
/>
) : null;

View file

@ -52,7 +52,7 @@ export const RoomNotificationContextMenu: React.FC<IProps> = ({ room, onFinished
const defaultOption: JSX.Element = (
<IconizedContextMenuRadio
label={_t("Match default setting")}
label={_t("room|context_menu|notifications_default")}
active={notificationState === RoomNotifState.AllMessages}
iconClassName="mx_RoomNotificationContextMenu_iconBell"
onClick={wrapHandler(() => setNotificationState(RoomNotifState.AllMessages))}
@ -79,7 +79,7 @@ export const RoomNotificationContextMenu: React.FC<IProps> = ({ room, onFinished
const muteOption: JSX.Element = (
<IconizedContextMenuRadio
label={_t("Mute room")}
label={_t("room|context_menu|notifications_mute")}
active={notificationState === RoomNotifState.Mute}
iconClassName="mx_RoomNotificationContextMenu_iconBellCrossed"
onClick={wrapHandler(() => setNotificationState(RoomNotifState.Mute))}

View file

@ -144,7 +144,10 @@ export const WidgetContextMenu: React.FC<IProps> = ({
onFinished();
};
streamAudioStreamButton = (
<IconizedContextMenuOption onClick={onStreamAudioClick} label={_t("Start audio stream")} />
<IconizedContextMenuOption
onClick={onStreamAudioClick}
label={_t("widget|context_menu|start_audio_stream")}
/>
);
}
@ -179,7 +182,9 @@ export const WidgetContextMenu: React.FC<IProps> = ({
onFinished();
};
snapshotButton = <IconizedContextMenuOption onClick={onSnapshotClick} label={_t("Take a picture")} />;
snapshotButton = (
<IconizedContextMenuOption onClick={onSnapshotClick} label={_t("widget|context_menu|screenshot")} />
);
}
let deleteButton: JSX.Element | undefined;
@ -190,11 +195,9 @@ export const WidgetContextMenu: React.FC<IProps> = ({
} else if (roomId) {
// Show delete confirmation dialog
Modal.createDialog(QuestionDialog, {
title: _t("Delete Widget"),
description: _t(
"Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?",
),
button: _t("Delete widget"),
title: _t("widget|context_menu|delete"),
description: _t("widget|context_menu|delete_warning"),
button: _t("widget|context_menu|delete"),
onFinished: (confirmed) => {
if (!confirmed) return;
WidgetUtils.setRoomWidget(cli, roomId, app.id);
@ -208,7 +211,7 @@ export const WidgetContextMenu: React.FC<IProps> = ({
deleteButton = (
<IconizedContextMenuOption
onClick={_onDeleteClick}
label={userWidget ? _t("action|remove") : _t("Remove for everyone")}
label={userWidget ? _t("action|remove") : _t("widget|context_menu|remove")}
/>
);
}
@ -233,7 +236,9 @@ export const WidgetContextMenu: React.FC<IProps> = ({
onFinished();
};
revokeButton = <IconizedContextMenuOption onClick={onRevokeClick} label={_t("Revoke permissions")} />;
revokeButton = (
<IconizedContextMenuOption onClick={onRevokeClick} label={_t("widget|context_menu|revoke")} />
);
}
}
@ -246,7 +251,7 @@ export const WidgetContextMenu: React.FC<IProps> = ({
onFinished();
};
moveLeftButton = <IconizedContextMenuOption onClick={onClick} label={_t("Move left")} />;
moveLeftButton = <IconizedContextMenuOption onClick={onClick} label={_t("widget|context_menu|move_left")} />;
}
let moveRightButton: JSX.Element | undefined;
@ -257,7 +262,7 @@ export const WidgetContextMenu: React.FC<IProps> = ({
onFinished();
};
moveRightButton = <IconizedContextMenuOption onClick={onClick} label={_t("Move right")} />;
moveRightButton = <IconizedContextMenuOption onClick={onClick} label={_t("widget|context_menu|move_right")} />;
}
return (

View file

@ -203,7 +203,7 @@ export default class LogoutDialog extends React.Component<IProps, IState> {
<button onClick={this.onLogoutConfirm}>{_t("I don't want my encrypted messages")}</button>
</DialogButtons>
<details>
<summary>{_t("Advanced")}</summary>
<summary>{_t("common|Advanced")}</summary>
<p>
<button onClick={this.onExportE2eKeysClicked}>{_t("Manually export keys")}</button>
</p>

View file

@ -161,7 +161,7 @@ export default class MessageEditHistoryDialog extends React.PureComponent<IProps
);
} else if (error.errcode) {
// some kind of error from the homeserver
content = <p className="mx_MessageEditHistoryDialog_error">{_t("Something went wrong!")}</p>;
content = <p className="mx_MessageEditHistoryDialog_error">{_t("error|something_went_wrong")}</p>;
} else {
content = (
<p className="mx_MessageEditHistoryDialog_error">

View file

@ -181,7 +181,7 @@ class RoomSettingsDialog extends React.Component<IProps, IState> {
tabs.push(
new Tab(
RoomSettingsTab.Notifications,
_td("Notifications"),
_td("notifications|enable_prompt_toast_title"),
"mx_RoomSettingsDialog_notificationsIcon",
(
<NotificationSettingsTab
@ -218,7 +218,7 @@ class RoomSettingsDialog extends React.Component<IProps, IState> {
tabs.push(
new Tab(
RoomSettingsTab.Advanced,
_td("Advanced"),
_td("common|Advanced"),
"mx_RoomSettingsDialog_warningIcon",
(
<AdvancedRoomSettingsTab

View file

@ -74,7 +74,7 @@ const SpaceSettingsDialog: React.FC<IProps> = ({ matrixClient: cli, space, onFin
SettingsStore.getValue(UIFeature.AdvancedSettings)
? new Tab(
SpaceSettingsTab.Advanced,
_td("Advanced"),
_td("common|Advanced"),
"mx_RoomSettingsDialog_warningIcon",
<AdvancedRoomSettingsTab room={space} closeSettingsFn={onFinished} />,
)

View file

@ -95,7 +95,7 @@ export default class UserSettingsDialog extends React.Component<IProps, IState>
tabs.push(
new Tab(
UserTab.Notifications,
_td("Notifications"),
_td("notifications|enable_prompt_toast_title"),
"mx_UserSettingsDialog_bellIcon",
<NotificationUserSettingsTab />,
"UserSettingsNotifications",
@ -122,7 +122,7 @@ export default class UserSettingsDialog extends React.Component<IProps, IState>
tabs.push(
new Tab(
UserTab.Sidebar,
_td("Sidebar"),
_td("settings|sidebar|title"),
"mx_UserSettingsDialog_sidebarIcon",
<SidebarUserSettingsTab />,
"UserSettingsSidebar",
@ -153,7 +153,7 @@ export default class UserSettingsDialog extends React.Component<IProps, IState>
tabs.push(
new Tab(
UserTab.SessionManager,
_td("Sessions"),
_td("settings|sessions|title"),
"mx_UserSettingsDialog_sessionsIcon",
<SessionManagerTab />,
// don't track with posthog while under construction

View file

@ -63,7 +63,7 @@ export default class SetupEncryptionDialog extends React.Component<IProps, IStat
<BaseDialog
headerImage={this.state.icon}
onFinished={this.props.onFinished}
title={_t("Verify this session")}
title={_t("encryption|verify_toast_title")}
>
<SetupEncryptionBody onFinished={this.props.onFinished} />
</BaseDialog>

View file

@ -934,7 +934,7 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
copyPlaintext(ownInviteLink);
}}
onHideTooltip={() => setInviteLinkCopied(false)}
title={inviteLinkCopied ? _t("Copied!") : _t("action|copy")}
title={inviteLinkCopied ? _t("common|copied") : _t("action|copy")}
>
<span className="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline">
{_t("Copy invite link")}

View file

@ -101,17 +101,17 @@ export default class AppPermission extends React.Component<IProps, IState> {
const warningTooltipText = (
<div>
{_t("Any of the following data may be shared:")}
{_t("analytics|shared_data_heading")}
<ul>
<li>{_t("Your display name")}</li>
<li>{_t("Your profile picture URL")}</li>
<li>{_t("Your user ID")}</li>
<li>{_t("Your device ID")}</li>
<li>{_t("Your theme")}</li>
<li>{_t("Your language")}</li>
<li>{_t("%(brand)s URL", { brand })}</li>
<li>{_t("Room ID")}</li>
<li>{_t("Widget ID")}</li>
<li>{_t("widget|shared_data_name")}</li>
<li>{_t("widget|shared_data_avatar")}</li>
<li>{_t("widget|shared_data_mxid")}</li>
<li>{_t("widget|shared_data_device_id")}</li>
<li>{_t("widget|shared_data_theme")}</li>
<li>{_t("widget|shared_data_lang")}</li>
<li>{_t("widget|shared_data_url", { brand })}</li>
<li>{_t("widget|shared_data_room_id")}</li>
<li>{_t("widget|shared_data_widget_id")}</li>
</ul>
</div>
);
@ -128,22 +128,22 @@ export default class AppPermission extends React.Component<IProps, IState> {
// Due to i18n limitations, we can't dedupe the code for variables in these two messages.
const warning = this.state.isWrapped
? _t(
"Using this widget may share data <helpIcon /> with %(widgetDomain)s & your integration manager.",
"widget|shared_data_warning_im",
{ widgetDomain: this.state.widgetDomain },
{ helpIcon: () => warningTooltip },
)
: _t(
"Using this widget may share data <helpIcon /> with %(widgetDomain)s.",
"widget|shared_data_warning",
{ widgetDomain: this.state.widgetDomain },
{ helpIcon: () => warningTooltip },
);
const encryptionWarning = this.props.isRoomEncrypted ? _t("Widgets do not use message encryption.") : null;
const encryptionWarning = this.props.isRoomEncrypted ? _t("widget|unencrypted_warning") : null;
return (
<div className="mx_AppPermission">
<div className="mx_AppPermission_content">
<div className="mx_AppPermission_content_bolder">{_t("Widget added by")}</div>
<div className="mx_AppPermission_content_bolder">{_t("widget|added_by")}</div>
<div>
{avatar}
<Heading size="4">{displayName}</Heading>
@ -151,7 +151,7 @@ export default class AppPermission extends React.Component<IProps, IState> {
</div>
<div>{warning}</div>
<div>
{_t("This widget may use cookies.")}&nbsp;{encryptionWarning}
{_t("widget|cookie_warning")}&nbsp;{encryptionWarning}
</div>
<div>
<AccessibleButton kind="primary_sm" onClick={this.props.onPermissionGranted}>

View file

@ -629,7 +629,7 @@ export default class AppTile extends React.Component<IProps, IState> {
if (this.sgWidget === null) {
appTileBody = (
<div className={appTileBodyClass} style={appTileBodyStyles}>
<AppWarning errorMsg={_t("Error loading Widget")} />
<AppWarning errorMsg={_t("widget|error_loading")} />
</div>
);
} else if (!this.state.hasPermissionToLoad && this.props.room) {
@ -656,7 +656,7 @@ export default class AppTile extends React.Component<IProps, IState> {
if (this.isMixedContent()) {
appTileBody = (
<div className={appTileBodyClass} style={appTileBodyStyles}>
<AppWarning errorMsg={_t("Error - Mixed content")} />
<AppWarning errorMsg={_t("widget|error_mixed_content")} />
</div>
);
} else {
@ -737,7 +737,7 @@ export default class AppTile extends React.Component<IProps, IState> {
<AccessibleButton
key="toggleMaximised"
className="mx_AppTileMenuBar_widgets_button"
title={isMaximised ? _t("Un-maximise") : _t("action|maximise")}
title={isMaximised ? _t("widget|unmaximise") : _t("action|maximise")}
onClick={this.onToggleMaximisedClick}
>
{isMaximised ? (
@ -776,7 +776,7 @@ export default class AppTile extends React.Component<IProps, IState> {
{this.props.showPopout && !this.state.requiresClient && (
<AccessibleButton
className="mx_AppTileMenuBar_widgets_button"
title={_t("Popout widget")}
title={_t("widget|popout")}
onClick={this.onPopoutWidgetClick}
>
<PopoutIcon className="mx_Icon mx_Icon_12 mx_Icon--stroke" />

View file

@ -37,7 +37,7 @@ const CopyableText: React.FC<IProps> = ({ children, getTextToCopy, border = true
e.preventDefault();
const text = getTextToCopy();
const successful = !!text && (await copyPlaintext(text));
setTooltip(successful ? _t("Copied!") : _t("Failed to copy"));
setTooltip(successful ? _t("common|copied") : _t("error|failed_copy"));
};
const onHideTooltip = (): void => {

View file

@ -154,15 +154,15 @@ export default class DesktopCapturerSourcePicker extends React.Component<PickerI
public render(): React.ReactNode {
const tabs: NonEmptyArray<Tab<TabId>> = [
this.getTab("screen", _td("Share entire screen")),
this.getTab("window", _td("Application window")),
this.getTab("screen", _td("voip|screenshare_monitor")),
this.getTab("window", _td("voip|screenshare_window")),
];
return (
<BaseDialog
className="mx_desktopCapturerSourcePicker"
onFinished={this.onCloseClick}
title={_t("Share content")}
title={_t("voip|screenshare_title")}
>
<TabbedView tabs={tabs} tabLocation={TabLocation.TOP} onChange={this.onTabChange} />
<DialogButtons

View file

@ -123,7 +123,7 @@ export default class ErrorBoundary extends React.PureComponent<Props, IState> {
return (
<div className="mx_ErrorBoundary">
<div className="mx_ErrorBoundary_body">
<h1>{_t("Something went wrong!")}</h1>
<h1>{_t("error|something_went_wrong")}</h1>
{bugReportSection}
{clearCacheButton}
</div>

View file

@ -542,7 +542,7 @@ export default class ImageView extends React.Component<IProps, IState> {
lockProps={{
"onKeyDown": this.onKeyDown,
"role": "dialog",
"aria-label": _t("Image view"),
"aria-label": _t("lightbox|title"),
}}
className="mx_ImageView"
ref={this.focusLock}
@ -555,12 +555,12 @@ export default class ImageView extends React.Component<IProps, IState> {
{zoomInButton}
<AccessibleTooltipButton
className="mx_ImageView_button mx_ImageView_button_rotateCCW"
title={_t("Rotate Left")}
title={_t("lightbox|rotate_left")}
onClick={this.onRotateCounterClockwiseClick}
/>
<AccessibleTooltipButton
className="mx_ImageView_button mx_ImageView_button_rotateCW"
title={_t("Rotate Right")}
title={_t("lightbox|rotate_right")}
onClick={this.onRotateClockwiseClick}
/>
<AccessibleTooltipButton

View file

@ -32,18 +32,14 @@ export const EnableLiveShare: React.FC<Props> = ({ onSubmit }) => {
<div data-testid="location-picker-enable-live-share" className="mx_EnableLiveShare">
<StyledLiveBeaconIcon className="mx_EnableLiveShare_icon" />
<Heading className="mx_EnableLiveShare_heading" size="3">
{_t("Live location sharing")}
{_t("location_sharing|live_enable_heading")}
</Heading>
<p className="mx_EnableLiveShare_description">
{_t(
"Please note: this is a labs feature using a temporary implementation. This means you will not be able to delete your location history, and advanced users will be able to see your location history even after you stop sharing your live location with this room.",
)}
</p>
<p className="mx_EnableLiveShare_description">{_t("location_sharing|live_enable_description")}</p>
<LabelledToggleSwitch
data-testid="enable-live-share-toggle"
value={isEnabled}
onChange={setEnabled}
label={_t("Enable live location sharing")}
label={_t("location_sharing|live_toggle_label")}
/>
<AccessibleButton
data-testid="enable-live-share-submit"

View file

@ -35,7 +35,7 @@ interface Props {
}
const getLabel = (durationMs: number): string => {
return _t("Share for %(duration)s", { duration: formatDuration(durationMs) });
return _t("location_sharing|live_share_button", { duration: formatDuration(durationMs) });
};
const LiveDurationDropdown: React.FC<Props> = ({ timeout, onChange }) => {

View file

@ -224,7 +224,11 @@ class LocationPicker extends React.Component<ILocationPickerProps, IState> {
{this.props.shareType === LocationShareType.Pin && (
<div className="mx_LocationPicker_pinText">
<span>{this.state.position ? _t("Click to move the pin") : _t("Click to drop a pin")}</span>
<span>
{this.state.position
? _t("location_sharing|click_move_pin")
: _t("location_sharing|click_drop_pin")}
</span>
</div>
)}
<div className="mx_LocationPicker_footer">
@ -241,7 +245,7 @@ class LocationPicker extends React.Component<ILocationPickerProps, IState> {
disabled={!this.state.position}
onClick={this.onOk}
>
{_t("Share location")}
{_t("location_sharing|share_button")}
</AccessibleButton>
</form>
</div>

View file

@ -196,7 +196,7 @@ export default class TextualBody extends React.Component<IBodyProps, IState> {
const { close } = ContextMenu.createMenu(GenericTextContextMenu, {
...toRightOf(buttonRect, 0),
chevronFace: ChevronFace.None,
message: successful ? _t("Copied!") : _t("Failed to copy"),
message: successful ? _t("common|copied") : _t("error|failed_copy"),
});
button.onmouseleave = close;
};

View file

@ -288,7 +288,7 @@ export default class LegacyRoomHeaderButtons extends HeaderButtons<IProps> {
<HeaderButton
key="notifsButton"
name="notifsButton"
title={_t("Notifications")}
title={_t("notifications|enable_prompt_toast_title")}
isHighlighted={this.isPhase(RightPanelPhases.NotificationPanel)}
onClick={this.onNotificationsClicked}
isUnread={this.globalNotificationState.color === NotificationColor.Red}

View file

@ -131,7 +131,7 @@ const MessageComposerButtons: React.FC<IProps> = (props: IProps) => {
<AccessibleTooltipButton
className={moreOptionsClasses}
onClick={props.toggleButtonMenu}
title={_t("More options")}
title={_t("quick_settings|sidebar_settings")}
/>
)}
{props.isMenuOpen && (

View file

@ -203,14 +203,14 @@ export default function RoomHeader({ room }: { room: Room }): JSX.Element {
</IconButton>
</Tooltip>
{notificationsEnabled && (
<Tooltip label={_t("Notifications")}>
<Tooltip label={_t("notifications|enable_prompt_toast_title")}>
<IconButton
indicator={notificationColorToIndicator(globalNotificationState.color)}
onClick={(evt) => {
evt.stopPropagation();
RightPanelStore.instance.showOrHidePanel(RightPanelPhases.NotificationPanel);
}}
aria-label={_t("Notifications")}
aria-label={_t("notifications|enable_prompt_toast_title")}
>
<NotificationsIcon />
</IconButton>

View file

@ -184,33 +184,31 @@ export default class CrossSigningPanel extends React.PureComponent<{}, IState> {
} else if (!homeserverSupportsCrossSigning) {
summarisedStatus = (
<SettingsSubsectionText data-testid="summarised-status">
{_t("Your homeserver does not support cross-signing.")}
{_t("encryption|cross_signing_unsupported")}
</SettingsSubsectionText>
);
} else if (crossSigningReady && crossSigningPrivateKeysInStorage) {
summarisedStatus = (
<SettingsSubsectionText data-testid="summarised-status">
{_t("Cross-signing is ready for use.")}
{_t("encryption|cross_signing_ready")}
</SettingsSubsectionText>
);
} else if (crossSigningReady && !crossSigningPrivateKeysInStorage) {
summarisedStatus = (
<SettingsSubsectionText data-testid="summarised-status">
{_t("Cross-signing is ready but keys are not backed up.")}
{_t("encryption|cross_signing_ready_no_backup")}
</SettingsSubsectionText>
);
} else if (crossSigningPrivateKeysInStorage) {
summarisedStatus = (
<SettingsSubsectionText data-testid="summarised-status">
{_t(
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.",
)}
{_t("encryption|cross_signing_untrusted")}
</SettingsSubsectionText>
);
} else {
summarisedStatus = (
<SettingsSubsectionText data-testid="summarised-status">
{_t("Cross-signing is not set up.")}
{_t("encryption|cross_signing_not_ready")}
</SettingsSubsectionText>
);
}
@ -232,9 +230,9 @@ export default class CrossSigningPanel extends React.PureComponent<{}, IState> {
// TODO: determine how better to expose this to users in addition to prompts at login/toast
if (!keysExistEverywhere && homeserverSupportsCrossSigning) {
let buttonCaption = _t("Set up Secure Backup");
let buttonCaption = _t("encryption|set_up_toast_title");
if (crossSigningPrivateKeysInStorage) {
buttonCaption = _t("Verify this session");
buttonCaption = _t("encryption|verify_toast_title");
}
actions.push(
<AccessibleButton key="setup" kind="primary" onClick={this.onBootstrapClick}>
@ -260,7 +258,7 @@ export default class CrossSigningPanel extends React.PureComponent<{}, IState> {
<>
{summarisedStatus}
<details>
<summary>{_t("Advanced")}</summary>
<summary>{_t("common|Advanced")}</summary>
<table className="mx_CrossSigningPanel_statusList">
<tr>
<th scope="row">{_t("settings|security|cross_signing_public_keys")}</th>

View file

@ -42,7 +42,7 @@ export default class CryptographyPanel extends React.Component<IProps, IState> {
const deviceId = client.deviceId;
let identityKey = client.getDeviceEd25519Key();
if (!identityKey) {
identityKey = _t("<not supported>");
identityKey = _t("encryption|not_supported");
} else {
identityKey = FormattingUtils.formatCryptoKey(identityKey);
}

View file

@ -29,9 +29,7 @@ const E2eAdvancedPanel: React.FC = () => {
<SettingsSubsection heading={_t("settings|security|encryption_section")}>
<SettingsFlag name={SETTING_MANUALLY_VERIFY_ALL_SESSIONS} level={SettingLevel.DEVICE} />
<SettingsSubsectionText>
{_t(
"Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.",
)}
{_t("settings|security|encryption_individual_verification_mode")}
</SettingsSubsectionText>
</SettingsSubsection>
);

View file

@ -148,16 +148,13 @@ export default class EventIndexPanel extends React.Component<{}, IState> {
eventIndexingSettings = (
<>
<SettingsSubsectionText>
{_t(
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.",
{
size: formatBytes(this.state.eventIndexSize, 0),
// This drives the singular / plural string
// selection for "room" / "rooms" only.
count: this.state.roomCount,
rooms: formatCountLong(this.state.roomCount),
},
)}
{_t("settings|security|message_search_enabled", {
size: formatBytes(this.state.eventIndexSize, 0),
// This drives the singular / plural string
// selection for "room" / "rooms" only.
count: this.state.roomCount,
rooms: formatCountLong(this.state.roomCount),
})}
</SettingsSubsectionText>
<AccessibleButton kind="primary" onClick={this.onManage}>
{_t("action|manage")}
@ -167,9 +164,7 @@ export default class EventIndexPanel extends React.Component<{}, IState> {
} else if (!this.state.eventIndexingEnabled && EventIndexPeg.supportIsInstalled()) {
eventIndexingSettings = (
<>
<SettingsSubsectionText>
{_t("Securely cache encrypted messages locally for them to appear in search results.")}
</SettingsSubsectionText>
<SettingsSubsectionText>{_t("settings|security|message_search_disabled")}</SettingsSubsectionText>
<div>
<AccessibleButton kind="primary" disabled={this.state.enabling} onClick={this.onEnable}>
{_t("action|enable")}
@ -187,7 +182,7 @@ export default class EventIndexPanel extends React.Component<{}, IState> {
eventIndexingSettings = (
<SettingsSubsectionText>
{_t(
"%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with <nativeLink>search components added</nativeLink>.",
"settings|security|message_search_unsupported",
{
brand,
},
@ -205,7 +200,7 @@ export default class EventIndexPanel extends React.Component<{}, IState> {
eventIndexingSettings = (
<SettingsSubsectionText>
{_t(
"%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use <desktopLink>%(brand)s Desktop</desktopLink> for encrypted messages to appear in search results.",
"settings|security|message_search_unsupported_web",
{
brand,
},
@ -227,12 +222,12 @@ export default class EventIndexPanel extends React.Component<{}, IState> {
eventIndexingSettings = (
<>
<SettingsSubsectionText>
{this.state.enabling ? <InlineSpinner /> : _t("Message search initialisation failed")}
{this.state.enabling ? <InlineSpinner /> : _t("settings|security|message_search_failed")}
</SettingsSubsectionText>
{EventIndexPeg.error && (
<SettingsSubsectionText>
<details>
<summary>{_t("Advanced")}</summary>
<summary>{_t("common|Advanced")}</summary>
<code>
{EventIndexPeg.error instanceof Error
? EventIndexPeg.error.message

View file

@ -397,7 +397,7 @@ export default class SecureBackupPanel extends React.PureComponent<{}, IState> {
</SettingsSubsectionText>
{statusDescription}
<details>
<summary>{_t("Advanced")}</summary>
<summary>{_t("common|Advanced")}</summary>
<table className="mx_SecureBackupPanel_statusList">
<tr>
<th scope="row">{_t("Backup key stored:")}</th>

View file

@ -55,7 +55,7 @@ const FilteredDeviceListHeader: React.FC<Props> = ({
<span className="mx_FilteredDeviceListHeader_label">
{selectedDeviceCount > 0
? _t("settings|sessions|n_sessions_selected", { count: selectedDeviceCount })
: _t("Sessions")}
: _t("settings|sessions|title")}
</span>
{children}
</div>

View file

@ -119,7 +119,7 @@ export default function NotificationSettings2(): JSX.Element {
)}
</SettingsBanner>
)}
<SettingsSection heading={_t("Notifications")}>
<SettingsSection heading={_t("notifications|enable_prompt_toast_title")}>
<div className="mx_SettingsSubsection_content mx_NotificationSettings2_flags">
<LabelledToggleSwitch
label={_t("settings|notifications|enable_notifications_account")}

View file

@ -155,7 +155,7 @@ export default class AdvancedRoomSettingsTab extends React.Component<IProps, ISt
return (
<SettingsTab>
<SettingsSection heading={_t("Advanced")}>
<SettingsSection heading={_t("common|Advanced")}>
<SettingsSubsection heading={room.isSpaceRoom() ? _t("Space information") : _t("Room information")}>
<div>
<span>{_t("room_settings|advanced|room_id")}</span>

View file

@ -171,7 +171,7 @@ export default class NotificationsSettingsTab extends React.Component<IProps, IS
return (
<SettingsTab>
<SettingsSection heading={_t("Notifications")}>
<SettingsSection heading={_t("notifications|enable_prompt_toast_title")}>
<div className="mx_NotificationSettingsTab_notificationsSection">
<StyledRadioGroup
name="roomNotificationSetting"

View file

@ -322,7 +322,7 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
</SettingsSubsection>
{this.renderLegal()}
{this.renderCredits()}
<SettingsSubsection heading={_t("Advanced")}>
<SettingsSubsection heading={_t("common|Advanced")}>
<SettingsSubsectionText>
{_t(
"setting|help_about|homeserver",

View file

@ -33,7 +33,7 @@ export default class NotificationUserSettingsTab extends React.Component {
{newNotificationSettingsEnabled ? (
<NotificationSettings2 />
) : (
<SettingsSection heading={_t("Notifications")}>
<SettingsSection heading={_t("notifications|enable_prompt_toast_title")}>
<Notifications />
</SettingsSection>
)}

View file

@ -252,21 +252,21 @@ export default class SecurityUserSettingsTab extends React.Component<IProps, ISt
}
return (
<SettingsSubsection heading={_t("Bulk options")}>
<SettingsSubsection heading={_t("settings|security|bulk_options_section")}>
<div className="mx_SecurityUserSettingsTab_bulkOptions">
<AccessibleButton
onClick={this.onAcceptAllInvitesClicked}
kind="primary"
disabled={this.state.managingInvites}
>
{_t("Accept all %(invitedRooms)s invites", { invitedRooms: invitedRoomIds.size })}
{_t("settings|security|bulk_options_accept_all_invites", { invitedRooms: invitedRoomIds.size })}
</AccessibleButton>
<AccessibleButton
onClick={this.onRejectAllInvitesClicked}
kind="danger"
disabled={this.state.managingInvites}
>
{_t("Reject all %(invitedRooms)s invites", { invitedRooms: invitedRoomIds.size })}
{_t("settings|security|bulk_options_reject_all_invites", { invitedRooms: invitedRoomIds.size })}
</AccessibleButton>
{this.state.managingInvites ? <InlineSpinner /> : <div />}
</div>
@ -282,7 +282,7 @@ export default class SecurityUserSettingsTab extends React.Component<IProps, ISt
);
const eventIndex = (
<SettingsSubsection heading={_t("Message search")}>
<SettingsSubsection heading={_t("settings|security|message_search_section")}>
<EventIndexPanel />
</SettingsSubsection>
);
@ -331,7 +331,7 @@ export default class SecurityUserSettingsTab extends React.Component<IProps, ISt
<SettingsFlag name="pseudonymousAnalyticsOptIn" level={SettingLevel.ACCOUNT} />
)}
</SettingsSubsection>
<SettingsSubsection heading={_t("Sessions")}>
<SettingsSubsection heading={_t("settings|sessions|title")}>
<SettingsFlag name="deviceClientInformationOptIn" level={SettingLevel.ACCOUNT} />
</SettingsSubsection>
</SettingsSection>
@ -346,7 +346,7 @@ export default class SecurityUserSettingsTab extends React.Component<IProps, ISt
// only show the section if there's something to show
if (ignoreUsersPanel || invitesPanel || e2ePanel) {
advancedSection = (
<SettingsSection heading={_t("Advanced")}>
<SettingsSection heading={_t("common|Advanced")}>
{ignoreUsersPanel}
{invitesPanel}
{e2ePanel}

View file

@ -48,7 +48,7 @@ const confirmSignOut = async (sessionsToSignOutCount: number): Promise<boolean>
description: (
<div>
<p>
{_t("Are you sure you want to sign out of %(count)s sessions?", {
{_t("settings|sessions|sign_out_confirm_description", {
count: sessionsToSignOutCount,
})}
</p>
@ -275,7 +275,7 @@ const SessionManagerTab: React.FC = () => {
return (
<SettingsTab>
<SettingsSection heading={_t("Sessions")}>
<SettingsSection heading={_t("settings|sessions|title")}>
<SecurityRecommendations
devices={devices}
goToFilteredList={onGoToFilteredList}

View file

@ -64,9 +64,9 @@ const SidebarUserSettingsTab: React.FC = () => {
return (
<SettingsTab>
<SettingsSection heading={_t("Sidebar")}>
<SettingsSection heading={_t("settings|sidebar|title")}>
<SettingsSubsection
heading={_t("Spaces to show")}
heading={_t("settings|sidebar|metaspaces_subsection")}
description={_t(
"Spaces are ways to group rooms and people. Alongside the spaces you're in, you can use some pre-built ones too.",
)}
@ -82,7 +82,7 @@ const SidebarUserSettingsTab: React.FC = () => {
{_t("common|home")}
</SettingsSubsectionText>
<SettingsSubsectionText>
{_t("Home is useful for getting an overview of everything.")}
{_t("settings|sidebar|metaspaces_home_description")}
</SettingsSubsectionText>
</StyledCheckbox>
@ -95,7 +95,7 @@ const SidebarUserSettingsTab: React.FC = () => {
>
<SettingsSubsectionText>{_t("Show all rooms")}</SettingsSubsectionText>
<SettingsSubsectionText>
{_t("Show all your rooms in Home, even if they're in a space.")}
{_t("settings|sidebar|metaspaces_home_all_rooms")}
</SettingsSubsectionText>
</StyledCheckbox>
@ -109,7 +109,7 @@ const SidebarUserSettingsTab: React.FC = () => {
{_t("common|favourites")}
</SettingsSubsectionText>
<SettingsSubsectionText>
{_t("Group all your favourite rooms and people in one place.")}
{_t("settings|sidebar|metaspaces_favourites_description")}
</SettingsSubsectionText>
</StyledCheckbox>
@ -122,7 +122,9 @@ const SidebarUserSettingsTab: React.FC = () => {
<MembersIcon />
{_t("common|people")}
</SettingsSubsectionText>
<SettingsSubsectionText>{_t("Group all your people in one place.")}</SettingsSubsectionText>
<SettingsSubsectionText>
{_t("settings|sidebar|metaspaces_people_description")}
</SettingsSubsectionText>
</StyledCheckbox>
<StyledCheckbox
@ -132,10 +134,10 @@ const SidebarUserSettingsTab: React.FC = () => {
>
<SettingsSubsectionText>
<HashCircleIcon />
{_t("Rooms outside of a space")}
{_t("settings|sidebar|metaspaces_orphans")}
</SettingsSubsectionText>
<SettingsSubsectionText>
{_t("Group all your rooms that aren't part of a space in one place.")}
{_t("settings|sidebar|metaspaces_orphans_description")}
</SettingsSubsectionText>
</StyledCheckbox>
</SettingsSubsection>

View file

@ -200,7 +200,7 @@ export default class VoiceUserSettingsTab extends React.Component<{}, IState> {
</SettingsSubsection>
</SettingsSection>
<SettingsSection heading={_t("Advanced")}>
<SettingsSection heading={_t("common|Advanced")}>
<SettingsSubsection heading={_t("Voice processing")}>
<LabelledToggleSwitch
value={this.state.audioNoiseSuppression}

View file

@ -58,7 +58,7 @@ const QuickSettingsButton: React.FC<{
managed={false}
focusLock={true}
>
<h2>{_t("Quick settings")}</h2>
<h2>{_t("quick_settings|title")}</h2>
<AccessibleButton
onClick={() => {
@ -67,7 +67,7 @@ const QuickSettingsButton: React.FC<{
}}
kind="primary_outline"
>
{_t("All settings")}
{_t("quick_settings|all_settings")}
</AccessibleButton>
{currentRoomId && developerModeEnabled && (
@ -90,7 +90,7 @@ const QuickSettingsButton: React.FC<{
<h4 className="mx_QuickSettingsButton_pinToSidebarHeading">
<PinUprightIcon className="mx_QuickSettingsButton_icon" />
{_t("Pin to sidebar")}
{_t("quick_settings|metaspace_section")}
</h4>
<StyledCheckbox
@ -120,7 +120,7 @@ const QuickSettingsButton: React.FC<{
}}
>
<EllipsisIcon className="mx_QuickSettingsButton_icon" />
{_t("More options")}
{_t("quick_settings|sidebar_settings")}
</AccessibleButton>
<QuickThemeSwitcher requestClose={closeMenu} />
@ -133,7 +133,7 @@ const QuickSettingsButton: React.FC<{
<AccessibleTooltipButton
className={classNames("mx_QuickSettingsButton", { expanded: !isPanelCollapsed })}
onClick={openMenu}
title={_t("Quick settings")}
title={_t("quick_settings|title")}
inputRef={handle}
forceHide={!isPanelCollapsed}
aria-expanded={!isPanelCollapsed}

View file

@ -45,7 +45,7 @@ const QuickThemeSwitcher: React.FC<Props> = ({ requestClose }) => {
const themeOptions = [
{
id: MATCH_SYSTEM_THEME_ID,
name: _t("Match system"),
name: _t("theme|match_system"),
},
...orderedThemes,
];
@ -85,7 +85,7 @@ const QuickThemeSwitcher: React.FC<Props> = ({ requestClose }) => {
id="mx_QuickSettingsButton_themePickerDropdown"
onOptionChange={onOptionChange}
value={selectedTheme}
label={_t("Space selection")}
label={_t("common|theme")}
>
{
themeOptions.map((theme) => <div key={theme.id}>{theme.name}</div>) as NonEmptyArray<

View file

@ -67,7 +67,7 @@ export const SpaceAvatar: React.FC<Pick<IProps, "avatarUrl" | "avatarDisabled" |
}}
kind="link"
className="mx_SpaceBasicSettings_avatar_remove"
aria-label={_t("Delete avatar")}
aria-label={_t("room_settings|delete_avatar_label")}
>
{_t("action|delete")}
</AccessibleButton>
@ -84,7 +84,7 @@ export const SpaceAvatar: React.FC<Pick<IProps, "avatarUrl" | "avatarDisabled" |
<AccessibleButton
onClick={() => avatarUploadRef.current?.click()}
kind="link"
aria-label={_t("Upload avatar")}
aria-label={_t("room_settings|upload_avatar_label")}
>
{_t("action|upload")}
</AccessibleButton>

View file

@ -33,7 +33,7 @@ interface IProps {
}
const SpacePublicShare: React.FC<IProps> = ({ space, onFinished }) => {
const [copiedText, setCopiedText] = useState(_t("Click to copy"));
const [copiedText, setCopiedText] = useState(_t("action|click_to_copy"));
return (
<div className="mx_SpacePublicShare">
@ -43,12 +43,12 @@ const SpacePublicShare: React.FC<IProps> = ({ space, onFinished }) => {
const permalinkCreator = new RoomPermalinkCreator(space);
permalinkCreator.load();
const success = await copyPlaintext(permalinkCreator.forShareableRoom());
const text = success ? _t("Copied!") : _t("Failed to copy");
const text = success ? _t("common|copied") : _t("error|failed_copy");
setCopiedText(text);
await sleep(5000);
if (copiedText === text) {
// if the text hasn't changed by another click then clear it after some time
setCopiedText(_t("Click to copy"));
setCopiedText(_t("action|click_to_copy"));
}
}}
>

View file

@ -87,7 +87,7 @@ export default class InlineTermsAgreement extends React.Component<IProps, IState
for (let i = 0; i < this.state.policies.length; i++) {
const policy = this.state.policies[i];
const introText = _t(
"Accept <policyLink /> to continue:",
"terms|inline_intro_text",
{},
{
policyLink: () => {

View file

@ -31,7 +31,7 @@ export default class NonUrgentEchoFailureToast extends React.PureComponent {
<div className="mx_NonUrgentEchoFailureToast">
<span className="mx_NonUrgentEchoFailureToast_icon" />
{_t(
"Your server isn't responding to some <a>requests</a>.",
"error|non_urgent_echo_failure_toast",
{},
{
a: (sub) => (

View file

@ -158,7 +158,7 @@ export default class VerificationRequestToast extends React.PureComponent<IProps
if (request.isSelfVerification) {
if (this.state.device) {
description = this.state.device.displayName;
detail = _t("%(deviceId)s from %(ip)s", {
detail = _t("encryption|verification|request_toast_detail", {
deviceId: this.state.device.deviceId,
ip: this.state.ip,
});
@ -179,13 +179,13 @@ export default class VerificationRequestToast extends React.PureComponent<IProps
const declineLabel =
this.state.counter === 0
? _t("action|ignore")
: _t("Ignore (%(counter)s)", { counter: this.state.counter });
: _t("encryption|verification|request_toast_decline_counter", { counter: this.state.counter });
return (
<GenericToast
description={description}
detail={detail}
acceptLabel={_t("Verify Session")}
acceptLabel={_t("encryption|verification|request_toast_accept")}
onAccept={this.accept}
rejectLabel={declineLabel}
onReject={this.cancel}

View file

@ -304,8 +304,8 @@ export default class LegacyCallViewButtons extends React.Component<IProps, IStat
<LegacyCallViewToggleButton
state={this.props.buttonsState.sidebarShown}
className="mx_LegacyCallViewButtons_button_sidebar"
onLabel={_t("Hide sidebar")}
offLabel={_t("Show sidebar")}
onLabel={_t("voip|hide_sidebar_button")}
offLabel={_t("voip|show_sidebar_button")}
onClick={this.props.handlers.onToggleSidebarClick}
/>
)}
@ -315,7 +315,7 @@ export default class LegacyCallViewButtons extends React.Component<IProps, IStat
onClick={this.onMoreClick}
inputRef={this.contextMenuButton}
isExpanded={this.state.showMoreMenu}
title={_t("More")}
title={_t("voip|more_button")}
alignment={Alignment.Top}
/>
)}