Migrate more strings to translation keys (#11665)
This commit is contained in:
parent
de250df520
commit
54c88c57ed
127 changed files with 6797 additions and 5825 deletions
|
@ -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}
|
||||
/>
|
||||
);
|
||||
|
|
|
@ -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"
|
||||
/>
|
||||
);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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))}
|
||||
|
|
|
@ -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 (
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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} />,
|
||||
)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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")}
|
||||
|
|
|
@ -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.")} {encryptionWarning}
|
||||
{_t("widget|cookie_warning")} {encryptionWarning}
|
||||
</div>
|
||||
<div>
|
||||
<AccessibleButton kind="primary_sm" onClick={this.props.onPermissionGranted}>
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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 => {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 }) => {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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 && (
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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")}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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>
|
||||
)}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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<
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
}}
|
||||
>
|
||||
|
|
|
@ -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: () => {
|
||||
|
|
|
@ -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) => (
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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}
|
||||
/>
|
||||
)}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue