diff --git a/.github/workflows/cypress.yaml b/.github/workflows/cypress.yaml index d2df5a26ca1..89ab7724d56 100644 --- a/.github/workflows/cypress.yaml +++ b/.github/workflows/cypress.yaml @@ -163,7 +163,7 @@ jobs: echo "CYPRESS_RUST_CRYPTO=1" >> "$GITHUB_ENV" - name: Run Cypress tests - uses: cypress-io/github-action@fa88e4afe551e64c8827a4b9e379afc63d8f691a + uses: cypress-io/github-action@2558ee6af05072a19de2ce92cb68b38616132726 with: working-directory: matrix-react-sdk # The built-in Electron runner seems to grind to a halt trying to run the tests, so use chrome. diff --git a/.github/workflows/i18n_check.yml b/.github/workflows/i18n_check.yml index a9ff110c275..39b57028f82 100644 --- a/.github/workflows/i18n_check.yml +++ b/.github/workflows/i18n_check.yml @@ -12,7 +12,7 @@ jobs: - name: "Get modified files" id: changed_files if: github.event_name == 'pull_request' && github.event.pull_request.user.login != 'RiotTranslateBot' && github.event.pull_request.user.login != 't3chguy' - uses: tj-actions/changed-files@1c26215f3fbd51eba03bc199e5cbabdfc3584ce3 # v38 + uses: tj-actions/changed-files@48566bbcc22ceb7c5809ebdd27377309f2c3de8c # v39 with: files: | src/i18n/strings/* diff --git a/.github/workflows/notify-element-web.yml b/.github/workflows/notify-element-web.yml index 39a252034c3..9f88c61e8a1 100644 --- a/.github/workflows/notify-element-web.yml +++ b/.github/workflows/notify-element-web.yml @@ -12,7 +12,7 @@ jobs: if: github.repository == 'matrix-org/matrix-react-sdk' steps: - name: Notify element-web repo that a new SDK build is on develop - uses: peter-evans/repository-dispatch@26b39ed245ab8f31526069329e112ab2fb224588 # v2 + uses: peter-evans/repository-dispatch@bf47d102fdb849e755b0b0023ea3e81a44b6f570 # v2 with: token: ${{ secrets.ELEMENT_BOT_TOKEN }} repository: vector-im/element-web diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 59906c5a748..d1b569ccfa3 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -2205,6 +2205,7 @@ export class RoomView extends React.Component { knocked={myMembership === "knock" || this.state.knocked} onSubmitAskToJoin={this.onSubmitAskToJoin} onCancelAskToJoin={this.onCancelAskToJoin} + onForgetClick={this.onForgetClick} /> diff --git a/src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx b/src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx index 9e2372545c6..3b09adbb526 100644 --- a/src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx +++ b/src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx @@ -51,7 +51,7 @@ export const AnalyticsLearnMoreDialog: React.FC = ({ const privacyPolicyLink = privacyPolicyUrl ? ( {_t( - "You can read all our terms here", + "analytics|privacy_policy", {}, { PrivacyPolicyUrl: (sub) => { @@ -71,33 +71,18 @@ export const AnalyticsLearnMoreDialog: React.FC = ({
- {_t( - "Help us identify issues and improve %(analyticsOwner)s by sharing anonymous usage data. To understand how people use multiple devices, we'll generate a random identifier, shared by your devices.", - { analyticsOwner }, - )} + {_t("analytics|pseudonymous_usage_data", { analyticsOwner })}
    -
  • - {_t( - "We don't record or profile any account data", - {}, - { Bold: (sub) => {sub} }, - )} -
  • -
  • - {_t( - "We don't share information with third parties", - {}, - { Bold: (sub) => {sub} }, - )} -
  • -
  • {_t("You can turn this off anytime in settings")}
  • +
  • {_t("analytics|bullet_1", {}, { Bold: (sub) => {sub} })}
  • +
  • {_t("analytics|bullet_2", {}, { Bold: (sub) => {sub} })}
  • +
  • {_t("analytics|disable_prompt")}
{privacyPolicyLink}
diff --git a/src/components/views/dialogs/SessionRestoreErrorDialog.tsx b/src/components/views/dialogs/SessionRestoreErrorDialog.tsx index 27e8965f6f6..7893e271dba 100644 --- a/src/components/views/dialogs/SessionRestoreErrorDialog.tsx +++ b/src/components/views/dialogs/SessionRestoreErrorDialog.tsx @@ -67,7 +67,7 @@ export default class SessionRestoreErrorDialog extends React.Component { if (SdkConfig.get().bug_report_endpoint_url) { dialogButtons = ( - {_t("Identity server")} + {_t("common|identity_server")}
({host})
); case SERVICE_TYPES.IM: return (
- {_t("Integration manager")} + {_t("common|integration_manager")}
({host})
); diff --git a/src/components/views/elements/ErrorBoundary.tsx b/src/components/views/elements/ErrorBoundary.tsx index 4a24d22f98e..81584a51451 100644 --- a/src/components/views/elements/ErrorBoundary.tsx +++ b/src/components/views/elements/ErrorBoundary.tsx @@ -85,7 +85,7 @@ export default class ErrorBoundary extends React.PureComponent {

{_t( - "Please create a new issue on GitHub so that we can investigate this bug.", + "bug_reporting|create_new_issue", {}, { newIssueLink: (sub) => { diff --git a/src/components/views/elements/EventListSummary.tsx b/src/components/views/elements/EventListSummary.tsx index e0279a7c9c6..9ed1345a0b0 100644 --- a/src/components/views/elements/EventListSummary.tsx +++ b/src/components/views/elements/EventListSummary.tsx @@ -133,7 +133,7 @@ export default class EventListSummary extends React.Component< const desc = formatCommaSeparatedList(descs); - return _t("%(nameList)s %(transitionList)s", { nameList, transitionList: desc }); + return _t("timeline|summary|format", { nameList, transitionList: desc }); }); if (!summaries) { @@ -250,101 +250,101 @@ export default class EventListSummary extends React.Component< case TransitionType.Joined: res = userCount > 1 - ? _t("%(severalUsers)sjoined %(count)s times", { severalUsers: "", count }) - : _t("%(oneUser)sjoined %(count)s times", { oneUser: "", count }); + ? _t("timeline|summary|joined_multiple", { severalUsers: "", count }) + : _t("timeline|summary|joined", { oneUser: "", count }); break; case TransitionType.Left: res = userCount > 1 - ? _t("%(severalUsers)sleft %(count)s times", { severalUsers: "", count }) - : _t("%(oneUser)sleft %(count)s times", { oneUser: "", count }); + ? _t("timeline|summary|left_multiple", { severalUsers: "", count }) + : _t("timeline|summary|left", { oneUser: "", count }); break; case TransitionType.JoinedAndLeft: res = userCount > 1 - ? _t("%(severalUsers)sjoined and left %(count)s times", { severalUsers: "", count }) - : _t("%(oneUser)sjoined and left %(count)s times", { oneUser: "", count }); + ? _t("timeline|summary|joined_and_left_multiple", { severalUsers: "", count }) + : _t("timeline|summary|joined_and_left", { oneUser: "", count }); break; case TransitionType.LeftAndJoined: res = userCount > 1 - ? _t("%(severalUsers)sleft and rejoined %(count)s times", { severalUsers: "", count }) - : _t("%(oneUser)sleft and rejoined %(count)s times", { oneUser: "", count }); + ? _t("timeline|summary|rejoined_multiple", { severalUsers: "", count }) + : _t("timeline|summary|rejoined", { oneUser: "", count }); break; case TransitionType.InviteReject: res = userCount > 1 - ? _t("%(severalUsers)srejected their invitations %(count)s times", { + ? _t("timeline|summary|rejected_invite_multiple", { severalUsers: "", count, }) - : _t("%(oneUser)srejected their invitation %(count)s times", { oneUser: "", count }); + : _t("timeline|summary|rejected_invite", { oneUser: "", count }); break; case TransitionType.InviteWithdrawal: res = userCount > 1 - ? _t("%(severalUsers)shad their invitations withdrawn %(count)s times", { + ? _t("timeline|summary|invite_withdrawn_multiple", { severalUsers: "", count, }) - : _t("%(oneUser)shad their invitation withdrawn %(count)s times", { oneUser: "", count }); + : _t("timeline|summary|invite_withdrawn", { oneUser: "", count }); break; case TransitionType.Invited: res = userCount > 1 - ? _t("were invited %(count)s times", { count }) - : _t("was invited %(count)s times", { count }); + ? _t("timeline|summary|invited_multiple", { count }) + : _t("timeline|summary|invited", { count }); break; case TransitionType.Banned: res = userCount > 1 - ? _t("were banned %(count)s times", { count }) - : _t("was banned %(count)s times", { count }); + ? _t("timeline|summary|banned_multiple", { count }) + : _t("timeline|summary|banned", { count }); break; case TransitionType.Unbanned: res = userCount > 1 - ? _t("were unbanned %(count)s times", { count }) - : _t("was unbanned %(count)s times", { count }); + ? _t("timeline|summary|unbanned_multiple", { count }) + : _t("timeline|summary|unbanned", { count }); break; case TransitionType.Kicked: res = userCount > 1 - ? _t("were removed %(count)s times", { count }) - : _t("was removed %(count)s times", { count }); + ? _t("timeline|summary|kicked_multiple", { count }) + : _t("timeline|summary|kicked", { count }); break; case TransitionType.ChangedName: res = userCount > 1 - ? _t("%(severalUsers)schanged their name %(count)s times", { severalUsers: "", count }) - : _t("%(oneUser)schanged their name %(count)s times", { oneUser: "", count }); + ? _t("timeline|summary|changed_name_multiple", { severalUsers: "", count }) + : _t("timeline|summary|changed_name", { oneUser: "", count }); break; case TransitionType.ChangedAvatar: res = userCount > 1 - ? _t("%(severalUsers)schanged their profile picture %(count)s times", { + ? _t("timeline|summary|changed_avatar_multiple", { severalUsers: "", count, }) - : _t("%(oneUser)schanged their profile picture %(count)s times", { oneUser: "", count }); + : _t("timeline|summary|changed_avatar", { oneUser: "", count }); break; case TransitionType.NoChange: res = userCount > 1 - ? _t("%(severalUsers)smade no changes %(count)s times", { severalUsers: "", count }) - : _t("%(oneUser)smade no changes %(count)s times", { oneUser: "", count }); + ? _t("timeline|summary|no_change_multiple", { severalUsers: "", count }) + : _t("timeline|summary|no_change", { oneUser: "", count }); break; case TransitionType.ServerAcl: res = userCount > 1 - ? _t("%(severalUsers)schanged the server ACLs %(count)s times", { severalUsers: "", count }) - : _t("%(oneUser)schanged the server ACLs %(count)s times", { oneUser: "", count }); + ? _t("timeline|summary|server_acls_multiple", { severalUsers: "", count }) + : _t("timeline|summary|server_acls", { oneUser: "", count }); break; case TransitionType.ChangedPins: res = userCount > 1 ? _t( - "%(severalUsers)schanged the pinned messages for the room %(count)s times", + "timeline|summary|pinned_events_multiple", { severalUsers: "", count }, { a: (sub) => ( @@ -355,7 +355,7 @@ export default class EventListSummary extends React.Component< }, ) : _t( - "%(oneUser)schanged the pinned messages for the room %(count)s times", + "timeline|summary|pinned_events", { oneUser: "", count }, { a: (sub) => ( @@ -369,14 +369,14 @@ export default class EventListSummary extends React.Component< case TransitionType.MessageRemoved: res = userCount > 1 - ? _t("%(severalUsers)sremoved a message %(count)s times", { severalUsers: "", count }) - : _t("%(oneUser)sremoved a message %(count)s times", { oneUser: "", count }); + ? _t("timeline|summary|redacted_multiple", { severalUsers: "", count }) + : _t("timeline|summary|redacted", { oneUser: "", count }); break; case TransitionType.HiddenEvent: res = userCount > 1 - ? _t("%(severalUsers)ssent %(count)s hidden messages", { severalUsers: "", count }) - : _t("%(oneUser)ssent %(count)s hidden messages", { oneUser: "", count }); + ? _t("timeline|summary|hidden_event_multiple", { severalUsers: "", count }) + : _t("timeline|summary|hidden_event", { oneUser: "", count }); break; } diff --git a/src/components/views/emojipicker/EmojiPicker.tsx b/src/components/views/emojipicker/EmojiPicker.tsx index 51b3b777964..7d1956c8159 100644 --- a/src/components/views/emojipicker/EmojiPicker.tsx +++ b/src/components/views/emojipicker/EmojiPicker.tsx @@ -87,63 +87,63 @@ class EmojiPicker extends React.Component { this.categories = [ { id: "recent", - name: _t("Frequently Used"), + name: _t("emoji|category_frequently_used"), enabled: this.recentlyUsed.length > 0, visible: this.recentlyUsed.length > 0, ref: React.createRef(), }, { id: "people", - name: _t("Smileys & People"), + name: _t("emoji|category_smileys_people"), enabled: true, visible: true, ref: React.createRef(), }, { id: "nature", - name: _t("Animals & Nature"), + name: _t("emoji|category_animals_nature"), enabled: true, visible: false, ref: React.createRef(), }, { id: "foods", - name: _t("Food & Drink"), + name: _t("emoji|category_food_drink"), enabled: true, visible: false, ref: React.createRef(), }, { id: "activity", - name: _t("Activities"), + name: _t("emoji|category_activities"), enabled: true, visible: false, ref: React.createRef(), }, { id: "places", - name: _t("Travel & Places"), + name: _t("emoji|category_travel_places"), enabled: true, visible: false, ref: React.createRef(), }, { id: "objects", - name: _t("Objects"), + name: _t("emoji|category_objects"), enabled: true, visible: false, ref: React.createRef(), }, { id: "symbols", - name: _t("Symbols"), + name: _t("emoji|category_symbols"), enabled: true, visible: false, ref: React.createRef(), }, { id: "flags", - name: _t("Flags"), + name: _t("emoji|category_flags"), enabled: true, visible: false, ref: React.createRef(), diff --git a/src/components/views/emojipicker/Header.tsx b/src/components/views/emojipicker/Header.tsx index c3643f6e2a9..27638bae1ad 100644 --- a/src/components/views/emojipicker/Header.tsx +++ b/src/components/views/emojipicker/Header.tsx @@ -95,7 +95,7 @@ class Header extends React.PureComponent {