Merge branch 'develop' into germain-gg/fix-right-panel-member

This commit is contained in:
Germain 2023-08-31 11:37:41 +01:00
commit 870f40575c
97 changed files with 3236 additions and 2489 deletions

View file

@ -897,7 +897,7 @@ const SpaceHierarchy: React.FC<IProps> = ({ space, initialText = "", showRoom, a
className="mx_SpaceHierarchy_list"
onKeyDown={onKeyDownHandler}
role="tree"
aria-label={_t("Space")}
aria-label={_t("common|space")}
>
{results}
</ul>

View file

@ -304,8 +304,8 @@ const SpaceSetupFirstRooms: React.FC<{
const [busy, setBusy] = useState(false);
const [error, setError] = useState("");
const numFields = 3;
const placeholders = [_t("General"), _t("Random"), _t("Support")];
const [roomNames, setRoomName] = useStateArray(numFields, [_t("General"), _t("Random"), ""]);
const placeholders = [_t("General"), _t("common|random"), _t("common|support")];
const [roomNames, setRoomName] = useStateArray(numFields, [_t("General"), _t("common|random"), ""]);
const fields = new Array(numFields).fill(0).map((x, i) => {
const name = "roomName" + i;
return (

View file

@ -62,7 +62,7 @@ export default class PlayPauseButton extends React.PureComponent<IProps> {
<AccessibleTooltipButton
data-testid="play-pause-button"
className={classes}
title={isPlaying ? _t("Pause") : _t("Play")}
title={isPlaying ? _t("action|pause") : _t("action|play")}
onClick={this.onClick}
disabled={isDisabled}
{...restProps}

View file

@ -163,7 +163,7 @@ export default class LoginWithQRFlow extends React.Component<IProps> {
kind="primary"
onClick={this.handleClick(Click.Approve)}
>
{_t("Approve")}
{_t("action|approve")}
</AccessibleButton>
</>
);

View file

@ -536,7 +536,12 @@ export default class RegistrationForm extends React.PureComponent<IProps, IState
public render(): ReactNode {
const registerButton = (
<input className="mx_Login_submit" type="submit" value={_t("Register")} disabled={!this.props.canSubmit} />
<input
className="mx_Login_submit"
type="submit"
value={_t("action|register")}
disabled={!this.props.canSubmit}
/>
);
let emailHelperText: JSX.Element | undefined;

View file

@ -197,7 +197,7 @@ const SpaceContextMenu: React.FC<IProps> = ({ space, hideHeader, onFinished, ...
<IconizedContextMenuOption
data-testid="new-subspace-option"
iconClassName="mx_SpacePanel_iconPlus"
label={_t("Space")}
label={_t("common|space")}
onClick={onNewSubspaceClick}
>
<BetaPill />
@ -254,7 +254,7 @@ const SpaceContextMenu: React.FC<IProps> = ({ space, hideHeader, onFinished, ...
/>
<IconizedContextMenuOption
iconClassName="mx_SpacePanel_iconPreferences"
label={_t("Preferences")}
label={_t("common|preferences")}
onClick={onPreferencesClick}
/>
{devtoolsOption}

View file

@ -217,20 +217,16 @@ export default class BugReportDialog extends React.Component<IProps, IState> {
<BaseDialog
className="mx_BugReportDialog"
onFinished={this.onCancel}
title={_t("Submit debug logs")}
title={_t("bug_reporting|submit_debug_logs")}
contentId="mx_Dialog_content"
>
<div className="mx_Dialog_content" id="mx_Dialog_content">
{warning}
<p>
{_t(
"Debug logs contain application usage data including your username, the IDs or aliases of the rooms you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.",
)}
</p>
<p>{_t("bug_reporting|description")}</p>
<p>
<b>
{_t(
"Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.",
"bug_reporting|before_submitting",
{},
{
a: (sub) => (
@ -248,7 +244,7 @@ export default class BugReportDialog extends React.Component<IProps, IState> {
<div className="mx_BugReportDialog_download">
<AccessibleButton onClick={this.onDownload} kind="link" disabled={this.state.downloadBusy}>
{_t("Download logs")}
{_t("bug_reporting|download_logs")}
</AccessibleButton>
{this.state.downloadProgress && <span>{this.state.downloadProgress} ...</span>}
</div>
@ -256,7 +252,7 @@ export default class BugReportDialog extends React.Component<IProps, IState> {
<Field
type="text"
className="mx_BugReportDialog_field_input"
label={_t("GitHub issue")}
label={_t("bug_reporting|github_issue")}
onChange={this.onIssueUrlChange}
value={this.state.issueUrl}
placeholder="https://github.com/vector-im/element-web/issues/..."
@ -269,15 +265,13 @@ export default class BugReportDialog extends React.Component<IProps, IState> {
rows={5}
onChange={this.onTextChange}
value={this.state.text}
placeholder={_t(
"If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.",
)}
placeholder={_t("bug_reporting|additional_context")}
/>
{progress}
{error}
</div>
<DialogButtons
primaryButton={_t("Send logs")}
primaryButton={_t("bug_reporting|send_logs")}
onPrimaryButtonClick={this.onSubmit}
focus={true}
onCancel={this.onCancel}

View file

@ -86,7 +86,7 @@ const SpacePreferencesDialog: React.FC<IProps> = ({ space, initialTabId, onFinis
className="mx_SpacePreferencesDialog"
hasCancel
onFinished={onFinished}
title={_t("Preferences")}
title={_t("common|preferences")}
fixedWidth={false}
>
<h4>

View file

@ -104,7 +104,7 @@ export default class UserSettingsDialog extends React.Component<IProps, IState>
tabs.push(
new Tab(
UserTab.Preferences,
_td("Preferences"),
_td("common|preferences"),
"mx_UserSettingsDialog_preferencesIcon",
<PreferencesUserSettingsTab closeSettingsFn={this.props.onFinished} />,
"UserSettingsPreferences",

View file

@ -127,7 +127,7 @@ export default class WidgetCapabilitiesPromptDialog extends React.PureComponent<
<div className="text-muted">{_t("This widget would like to:")}</div>
{checkboxRows}
<DialogButtons
primaryButton={_t("Approve")}
primaryButton={_t("action|approve")}
cancelButton={_t("Decline All")}
onPrimaryButtonClick={this.onSubmit}
onCancel={this.onReject}

View file

@ -99,15 +99,12 @@ export default class ErrorBoundary extends React.PureComponent<Props, IState> {
)}
</p>
<p>
{_t(
"If you've submitted a bug via GitHub, debug logs can help us track down the problem. ",
)}
{_t(
"Debug logs contain application usage data including your username, the IDs or aliases of the rooms you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.",
)}
{_t("bug_reporting|introduction")}
&nbsp;
{_t("bug_reporting|description")}
</p>
<AccessibleButton onClick={this.onBugReport} kind="primary">
{_t("Submit debug logs")}
{_t("bug_reporting|submit_debug_logs")}
</AccessibleButton>
</React.Fragment>
);

View file

@ -214,7 +214,7 @@ export default class ReactionsRow extends React.PureComponent<IProps, IState> {
items = items.slice(0, MAX_ITEMS_WHEN_LIMITED);
showAllButton = (
<AccessibleButton kind="link_inline" className="mx_ReactionsRow_showAll" onClick={this.onShowAllClick}>
{_t("Show all")}
{_t("action|show_all")}
</AccessibleButton>
);
}

View file

@ -60,7 +60,7 @@ export function EmojiButton({ addEmoji, menuPosition, className }: IEmojiButtonP
className={computedClassName}
iconClassName="mx_EmojiButton_icon"
onClick={openMenu}
title={_t("Emoji")}
title={_t("common|emoji")}
inputRef={button}
/>

View file

@ -31,8 +31,8 @@ export enum PowerStatus {
}
const PowerLabel: Record<PowerStatus, TranslationKey> = {
[PowerStatus.Admin]: _td("Admin"),
[PowerStatus.Moderator]: _td("Mod"),
[PowerStatus.Admin]: _td("power_level|admin"),
[PowerStatus.Moderator]: _td("power_level|mod"),
};
export type PresenceState = "offline" | "online" | "unavailable";

View file

@ -64,6 +64,7 @@ import { SdkContextClass } from "../../../contexts/SDKContext";
import { VoiceBroadcastInfoState } from "../../../voice-broadcast";
import { createCantStartVoiceMessageBroadcastDialog } from "../dialogs/CantStartVoiceMessageBroadcastDialog";
import { UIFeature } from "../../../settings/UIFeature";
import { formatTimeLeft } from "../../../DateUtils";
let instanceCount = 0;
@ -569,11 +570,7 @@ export class MessageComposer extends React.Component<IProps, IState> {
if (this.state.recordingTimeLeftSeconds) {
const secondsLeft = Math.round(this.state.recordingTimeLeftSeconds);
recordingTooltip = (
<Tooltip
id={this.tooltipId}
label={_t("%(seconds)ss left", { seconds: secondsLeft })}
alignment={Alignment.Top}
/>
<Tooltip id={this.tooltipId} label={formatTimeLeft(secondsLeft)} alignment={Alignment.Top} />
);
}

View file

@ -54,7 +54,7 @@ export default class MessageComposerFormatBar extends React.PureComponent<IProps
return (
<Toolbar className={classes} ref={this.formatBarRef} aria-label={_t("Formatting")}>
<FormatButton
label={_t("Bold")}
label={_t("composer|format_bold")}
onClick={() => this.props.onAction(Formatting.Bold)}
icon="Bold"
shortcut={this.props.shortcuts.bold}
@ -68,13 +68,13 @@ export default class MessageComposerFormatBar extends React.PureComponent<IProps
visible={this.state.visible}
/>
<FormatButton
label={_t("Strikethrough")}
label={_t("composer|format_strikethrough")}
onClick={() => this.props.onAction(Formatting.Strikethrough)}
icon="Strikethrough"
visible={this.state.visible}
/>
<FormatButton
label={_t("Code block")}
label={_t("composer|format_code_block")}
onClick={() => this.props.onAction(Formatting.Code)}
icon="Code"
shortcut={this.props.shortcuts.code}

View file

@ -93,47 +93,47 @@ export function FormattingButtons({ composer, actionStates }: FormattingButtonsP
<div className="mx_FormattingButtons">
<Button
actionState={actionStates.bold}
label={_t("Bold")}
label={_t("composer|format_bold")}
keyCombo={{ ctrlOrCmdKey: true, key: "b" }}
onClick={() => composer.bold()}
icon={<BoldIcon className="mx_FormattingButtons_Icon" />}
/>
<Button
actionState={actionStates.italic}
label={_t("Italic")}
label={_t("composer|format_italic")}
keyCombo={{ ctrlOrCmdKey: true, key: "i" }}
onClick={() => composer.italic()}
icon={<ItalicIcon className="mx_FormattingButtons_Icon" />}
/>
<Button
actionState={actionStates.underline}
label={_t("Underline")}
label={_t("composer|format_underline")}
keyCombo={{ ctrlOrCmdKey: true, key: "u" }}
onClick={() => composer.underline()}
icon={<UnderlineIcon className="mx_FormattingButtons_Icon" />}
/>
<Button
actionState={actionStates.strikeThrough}
label={_t("Strikethrough")}
label={_t("composer|format_strikethrough")}
onClick={() => composer.strikeThrough()}
icon={<StrikeThroughIcon className="mx_FormattingButtons_Icon" />}
/>
<Button
actionState={actionStates.unorderedList}
label={_t("Bulleted list")}
label={_t("composer|format_unordered_list")}
onClick={() => composer.unorderedList()}
icon={<BulletedListIcon className="mx_FormattingButtons_Icon" />}
/>
<Button
actionState={actionStates.orderedList}
label={_t("Numbered list")}
label={_t("composer|format_ordered_list")}
onClick={() => composer.orderedList()}
icon={<NumberedListIcon className="mx_FormattingButtons_Icon" />}
/>
{isInList && (
<Button
actionState={actionStates.indent}
label={_t("Indent increase")}
label={_t("composer|format_increase_indent")}
onClick={() => composer.indent()}
icon={<IndentIcon className="mx_FormattingButtons_Icon" />}
/>
@ -141,7 +141,7 @@ export function FormattingButtons({ composer, actionStates }: FormattingButtonsP
{isInList && (
<Button
actionState={actionStates.unindent}
label={_t("Indent decrease")}
label={_t("composer|format_decrease_indent")}
onClick={() => composer.unindent()}
icon={<UnIndentIcon className="mx_FormattingButtons_Icon" />}
/>
@ -154,20 +154,20 @@ export function FormattingButtons({ composer, actionStates }: FormattingButtonsP
/>
<Button
actionState={actionStates.inlineCode}
label={_t("Code")}
label={_t("composer|format_inline_code")}
keyCombo={{ ctrlOrCmdKey: true, key: "e" }}
onClick={() => composer.inlineCode()}
icon={<InlineCodeIcon className="mx_FormattingButtons_Icon" />}
/>
<Button
actionState={actionStates.codeBlock}
label={_t("Code block")}
label={_t("composer|format_code_block")}
onClick={() => composer.codeBlock()}
icon={<CodeBlockIcon className="mx_FormattingButtons_Icon" />}
/>
<Button
actionState={actionStates.link}
label={_t("Link")}
label={_t("composer|format_link")}
onClick={() => openLinkModal(composer, composerContext, actionStates.link === "reversed")}
icon={<LinkIcon className="mx_FormattingButtons_Icon" />}
/>

View file

@ -247,7 +247,7 @@ export default class SetIdServer extends React.Component<IProps, IState> {
{},
{ idserver: (sub) => <b>{abbreviateUrl(this.state.currentClientIdServer)}</b> },
),
button: _t("Disconnect"),
button: _t("action|disconnect"),
});
if (confirmed) {
this.disconnectIdServer();
@ -404,7 +404,7 @@ export default class SetIdServer extends React.Component<IProps, IState> {
let discoSection;
if (idServerUrl) {
let discoButtonContent: React.ReactNode = _t("Disconnect");
let discoButtonContent: React.ReactNode = _t("action|disconnect");
let discoBodyText = _t(
"Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.",
);
@ -448,7 +448,7 @@ export default class SetIdServer extends React.Component<IProps, IState> {
onClick={this.checkIdServer}
disabled={!this.idServerChangeEnabled()}
>
{_t("Change")}
{_t("action|change")}
</AccessibleButton>
{discoSection}
</form>

View file

@ -139,7 +139,7 @@ export const DeviceDetailHeading: React.FC<Props> = ({ device, saveDeviceName })
className="mx_DeviceDetailHeading_renameCta"
data-testid="device-heading-rename-cta"
>
{_t("Rename")}
{_t("action|rename")}
</AccessibleButton>
</div>
);

View file

@ -160,7 +160,7 @@ const NoResults: React.FC<NoResultsProps> = ({ filter, clearFilter }) => (
<>
&nbsp;
<AccessibleButton kind="link_inline" onClick={clearFilter} data-testid="devices-clear-filter-btn">
{_t("Show all")}
{_t("action|show_all")}
</AccessibleButton>
</>
)
@ -353,7 +353,7 @@ export const FilteredDeviceList = forwardRef(
value={filter || ALL_FILTER_ID}
onOptionChange={onFilterOptionChange}
options={options}
selectedLabel={_t("Show")}
selectedLabel={_t("action|show")}
/>
)}
</FilteredDeviceListHeader>

View file

@ -74,7 +74,7 @@ const SecurityRecommendations: React.FC<Props> = ({ devices, currentDeviceId, go
onClick={() => goToFilteredList(DeviceSecurityVariation.Unverified)}
data-testid="unverified-devices-cta"
>
{_t("View all") + ` (${unverifiedDevicesCount})`}
{_t("action|view_all") + ` (${unverifiedDevicesCount})`}
</AccessibleButton>
</DeviceSecurityCard>
)}
@ -99,7 +99,7 @@ const SecurityRecommendations: React.FC<Props> = ({ devices, currentDeviceId, go
onClick={() => goToFilteredList(DeviceSecurityVariation.Inactive)}
data-testid="inactive-devices-cta"
>
{_t("View all") + ` (${inactiveDevicesCount})`}
{_t("action|view_all") + ` (${inactiveDevicesCount})`}
</AccessibleButton>
</DeviceSecurityCard>
</>

View file

@ -185,7 +185,7 @@ export class EmailAddress extends React.Component<IEmailAddressProps, IEmailAddr
onClick={this.onContinueClick}
disabled={this.state.continueDisabled}
>
{_t("Complete")}
{_t("action|complete")}
</AccessibleButton>
</span>
);
@ -197,7 +197,7 @@ export class EmailAddress extends React.Component<IEmailAddressProps, IEmailAddr
onClick={this.onRevokeClick}
disabled={this.props.disabled}
>
{_t("Revoke")}
{_t("action|revoke")}
</AccessibleButton>
);
} else {

View file

@ -205,7 +205,7 @@ export class PhoneNumber extends React.Component<IPhoneNumberProps, IPhoneNumber
onClick={this.onRevokeClick}
disabled={this.props.disabled}
>
{_t("Revoke")}
{_t("action|revoke")}
</AccessibleButton>
);
} else {

View file

@ -106,7 +106,7 @@ export default function NotificationSettings2(): JSX.Element {
{hasPendingChanges && model !== null && (
<SettingsBanner
icon={<img src={NewAndImprovedIcon} alt="" width={12} />}
action={_t("Proceed")}
action={_t("action|proceed")}
onAction={() => reconcile(model!)}
>
{_t(

View file

@ -94,7 +94,7 @@ const Knock: VFC<{
disabled={!canKick || disabled}
kind="icon_primary_outline"
onClick={() => handleDeny(roomMember.userId)}
title={_t("Deny")}
title={_t("action|deny")}
>
<XIcon width={18} height={18} />
</AccessibleButton>
@ -103,7 +103,7 @@ const Knock: VFC<{
disabled={!canInvite || disabled}
kind="icon_primary"
onClick={() => handleApprove(roomMember.userId)}
title={_t("Approve")}
title={_t("action|approve")}
>
<CheckIcon width={18} height={18} />
</AccessibleButton>

View file

@ -121,7 +121,7 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
}
return (
<SettingsSubsection heading={_t("Legal")}>
<SettingsSubsection heading={_t("common|legal")}>
<SettingsSubsectionText>{legalLinks}</SettingsSubsectionText>
</SettingsSubsection>
);
@ -131,7 +131,7 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
// Note: This is not translated because it is legal text.
// Also, &nbsp; is ugly but necessary.
return (
<SettingsSubsection heading={_t("Credits")}>
<SettingsSubsection heading={_t("common|credits")}>
<SettingsSubsectionText>
<ul>
<li>
@ -274,26 +274,20 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
if (SdkConfig.get().bug_report_endpoint_url) {
bugReportingSection = (
<SettingsSubsection
heading={_t("Bug reporting")}
heading={_t("bug_reporting|title")}
description={
<>
<SettingsSubsectionText>
{_t(
"If you've submitted a bug via GitHub, debug logs can help us track down the problem. ",
)}
</SettingsSubsectionText>
{_t(
"Debug logs contain application usage data including your username, the IDs or aliases of the rooms you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.",
)}
<SettingsSubsectionText>{_t("bug_reporting|introduction")}</SettingsSubsectionText>
{_t("bug_reporting|description")}
</>
}
>
<AccessibleButton onClick={this.onBugReport} kind="primary">
{_t("Submit debug logs")}
{_t("bug_reporting|submit_debug_logs")}
</AccessibleButton>
<SettingsSubsectionText>
{_t(
"To report a Matrix-related security issue, please read the Matrix.org <a>Security Disclosure Policy</a>.",
"bug_reporting|matrix_security_issue",
{},
{
a: (sub) => (
@ -314,7 +308,7 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
<SettingsTab>
<SettingsSection heading={_t("Help & About")}>
{bugReportingSection}
<SettingsSubsection heading={_t("FAQ")} description={faqText} />
<SettingsSubsection heading={_t("common|faq")} description={faqText} />
<SettingsSubsection heading={_t("Versions")}>
<SettingsSubsectionText>
<CopyableText getTextToCopy={this.getVersionTextToCopy}>
@ -355,7 +349,7 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
)}
<SettingsSubsectionText>
<details>
<summary>{_t("Access Token")}</summary>
<summary>{_t("common|access_token")}</summary>
<b>
{_t(
"Your access token gives full access to your account. Do not share it with anyone.",

View file

@ -225,7 +225,7 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState>
onClick={() => this.unsubscribeFromList(list)}
disabled={this.state.busy}
>
{_t("Unsubscribe")}
{_t("action|unsubscribe")}
</AccessibleButton>
&nbsp;
<AccessibleButton
@ -326,7 +326,7 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState>
onClick={this.onSubscribeList}
disabled={this.state.busy}
>
{_t("Subscribe")}
{_t("action|subscribe")}
</AccessibleButton>
</form>
</SettingsSubsection>

View file

@ -145,7 +145,7 @@ export default class PreferencesUserSettingsTab extends React.Component<IProps,
return (
<SettingsTab data-testid="mx_PreferencesUserSettingsTab">
<SettingsSection heading={_t("Preferences")}>
<SettingsSection heading={_t("common|preferences")}>
{roomListSettings.length > 0 && (
<SettingsSubsection heading={_t("Room list")}>
{this.renderGroup(roomListSettings)}
@ -178,7 +178,7 @@ export default class PreferencesUserSettingsTab extends React.Component<IProps,
</SettingsSubsection>
<SettingsSubsection
heading={_t("Presence")}
heading={_t("common|presence")}
description={_t("Share your activity and status with others.")}
>
{this.renderGroup(PreferencesUserSettingsTab.PRESENCE_SETTINGS)}
@ -196,7 +196,7 @@ export default class PreferencesUserSettingsTab extends React.Component<IProps,
{this.renderGroup(PreferencesUserSettingsTab.IMAGES_AND_VIDEOS_SETTINGS)}
</SettingsSubsection>
<SettingsSubsection heading={_t("Timeline")}>
<SettingsSubsection heading={_t("common|timeline")}>
{this.renderGroup(PreferencesUserSettingsTab.TIMELINE_SETTINGS)}
</SettingsSubsection>

View file

@ -317,7 +317,7 @@ export default class SecurityUserSettingsTab extends React.Component<IProps, ISt
});
};
privacySection = (
<SettingsSection heading={_t("Privacy")}>
<SettingsSection heading={_t("common|privacy")}>
<SettingsSubsection
heading={_t("common|analytics")}
description={_t(

View file

@ -169,10 +169,10 @@ export default class VoiceUserSettingsTab extends React.Component<{}, IState> {
speakerDropdown = this.renderDropdown(MediaDeviceKindEnum.AudioOutput, _t("Audio Output")) || (
<p>{_t("No Audio Outputs detected")}</p>
);
microphoneDropdown = this.renderDropdown(MediaDeviceKindEnum.AudioInput, _t("Microphone")) || (
microphoneDropdown = this.renderDropdown(MediaDeviceKindEnum.AudioInput, _t("common|microphone")) || (
<p>{_t("No Microphones detected")}</p>
);
webcamDropdown = this.renderDropdown(MediaDeviceKindEnum.VideoInput, _t("Camera")) || (
webcamDropdown = this.renderDropdown(MediaDeviceKindEnum.VideoInput, _t("common|camera")) || (
<p>{_t("No Webcams detected")}</p>
);
}