Граф коммитов

20546 Коммитов

Автор SHA1 Сообщение Дата
Ben Schumacher
bb8aabc15e [MM-61765] Fix errcheck issues in server/channels/app/platform/license.go (#30954)
* [MM-61765] Fix errcheck issues in server/channels/app/platform/license.go

- Removed the errcheck exception for license.go from .golangci.yml
- Added proper error handling for RemoveLicense() calls
- Added proper error handling for ReloadConfig() and InvalidateAllCaches() calls
- Updated variable names to avoid conflicts

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* simplify naming

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-05-12 13:41:59 +02:00
Ben Schumacher
4dbff921ba [MM-61499] Fix errcheck issues in server/channels/app/slashcommands/helper_test.go (#30880) 2025-05-12 11:20:14 +02:00
Ibrahim Serdar Acikgoz
d452f4f043 [MM-63661] add access control metrics (#30680) 2025-05-11 22:11:42 +02:00
Agniva De Sarker
509b8e9af7 MM-63130: Move to webHub iteration to be alloc-free (#30792)
We switch to using iterators introduced in Go 1.23
to make iteration alloc-free and fast. And since
element removal is allowed while iterating a map,
this also means we don't need to even copy the slice
any more.

While here, we also address the comment https://github.com/mattermost/mattermost/pull/30178#discussion_r1954862151.
I have simply gone back to using []string as the map
entry rather than a type alias or a redirection with
a struct.

https://mattermost.atlassian.net/browse/MM-63130

```release-note
NONE
```

* Changed back nil to len

```release-note
NONE
```

* fixing unused assignment

```release-note
NONE
```

* add benchmark

```
goos: linux
goarch: amd64
pkg: github.com/mattermost/mattermost/server/v8/channels/app/platform
cpu: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
                               │   old.txt    │               new.txt               │
                               │    sec/op    │   sec/op     vs base                │
HubConnIndexIterator/2_users-8    93.53n ± 1%   38.09n ± 1%  -59.27% (p=0.000 n=10)
HubConnIndexIterator/3_users-8   106.30n ± 0%   38.41n ± 1%  -63.86% (p=0.000 n=10)
HubConnIndexIterator/4_users-8   111.30n ± 1%   38.66n ± 1%  -65.27% (p=0.000 n=10)
geomean                           103.4n        38.39n       -62.89%

                               │  old.txt   │               new.txt                │
                               │    B/op    │    B/op     vs base                  │
HubConnIndexIterator/2_users-8   16.00 ± 0%   24.00 ± 0%  +50.00% (p=0.000 n=10)
HubConnIndexIterator/3_users-8   24.00 ± 0%   24.00 ± 0%        ~ (p=1.000 n=10) ¹
HubConnIndexIterator/4_users-8   32.00 ± 0%   24.00 ± 0%  -25.00% (p=0.000 n=10)
geomean                          23.08        24.00        +4.00%
¹ all samples are equal

                               │  old.txt   │               new.txt               │
                               │ allocs/op  │ allocs/op   vs base                 │
HubConnIndexIterator/2_users-8   1.000 ± 0%   1.000 ± 0%       ~ (p=1.000 n=10) ¹
HubConnIndexIterator/3_users-8   1.000 ± 0%   1.000 ± 0%       ~ (p=1.000 n=10) ¹
HubConnIndexIterator/4_users-8   1.000 ± 0%   1.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                          1.000        1.000       +0.00%
¹ all samples are equal
```

```release-note
NONE
```

* ForChannel test as well

```release-note
NONE
```

* review comments

```release-note
NONE
```

* fix lint errors

```release-note
NONE
```

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-05-11 12:00:12 +05:30
David Krauser
67ab69606a Handle network connectivity changes in websocket (#30788)
This commit introduces listeners for network changes that will:
- Test the websocket if we get an offline event to check if we have disconnected.
- Re-connect the websocket immediately if we get an online event, and we are disconnected.

Additionally when a ping fails, we now immediately call the onclose() callback instead of waiting for the system to trigger it when the broken websocket closes. This allows us to re-connect much more quickly (since we don't have to wait for the broken websocket to get cleaned up by the system).
2025-05-09 15:39:10 -04:00
Maria A Nunez
190b4e7f03 System Console enterprise advanced upsells (#30937)
* First set of texts updated for Enterprise Adv upsells and trial

* Updated upsell message for all tiers

* Linting translation file

* Linting

* Reverting unintended styling changes

* my ide making lint more

* Fix tests

* More default texts updated

* Trial banner title

* Make advantages list translatable

* Text updates

* Fix tests

* More text tweaking

* Linting

* Reodered translations

* Fixed e2e test

* More linting

* Removed incorrect new test

* Fix test typo

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-05-09 13:33:48 -04:00
Ben Schumacher
cd3046773e [MM-61498] Fix errcheck issues in server/channels/app/slashcommands/command_test.go (#30879)
Co-authored-by: Claude <noreply@anthropic.com>
2025-05-09 13:56:35 +02:00
Agniva De Sarker
0ebd3e8085 MM-64209: Optimize completePopulatingCategoryChannelsT for MySQL (#30963)
For our MySQL customers, we have discovered that the query is not
able to choose the right plan by itself without adequate hints.

This is only for MySQL as we have confirmed from multiple customers
that Postgres takes the right index idx_sidebarcategories_userid_teamid
for the sidebarCategories table. And if it doesn't, then a VACUUM ANALYZE
fixes it.

But for MySQL, we have to do two things:
- Pass an index hint to let it use idx_sidebarcategories_userid_teamid.
- Pass an optimizer hint to materialize the sub-query. This is used
to materialize the doesNotHaveSidebarChannel sub-query into a temporary
table, letting MySQL reuse the contents of the table for further processing
in the parent sections of the query.

I have confirmed both locally and in the customer environment
that it gives a clear benefit.

*LOCAL*

OLD:
```
| -> Nested loop antijoin  (cost=2889.85 rows=19767) (actual time=3.355..38.033 rows=15 loops=1)
    -> Nested loop inner join  (cost=66.65 rows=110) (actual time=0.410..1.689 rows=220 loops=1)
        -> Filter: ((Channels.DeleteAt = 0) and (Channels.`Type` in ('O','P')))  (cost=25.25 rows=110) (actual time=0.394..0.886 rows=220 loops=1)
            -> Index lookup on Channels using idx_channels_team_id_display_name (TeamId='team01'), with index condition: (Channels.Id is not null)  (cost=25.25 rows=220) (actual time=0.389..0.793 rows=220 loops=1)
        -> Single-row covering index lookup on ChannelMembers using PRIMARY (ChannelId=Channels.Id, UserId='user000')  (cost=0.28 rows=1) (actual time=0.003..0.003 rows=1 loops=220)
    -> Nested loop inner join  (cost=4967.50 rows=180) (actual time=0.165..0.165 rows=1 loops=220)
        -> Covering index lookup on SidebarChannels using PRIMARY (ChannelId=Channels.Id)  (cost=7.86 rows=180) (actual time=0.055..0.062 rows=13 loops=220)
        -> Filter: ((SidebarCategories.TeamId = 'team01') and (SidebarCategories.UserId = 'user000'))  (cost=44.93 rows=1) (actual time=0.008..0.008 rows=0 loops=2881)
            -> Single-row index lookup on SidebarCategories using PRIMARY (Id=SidebarChannels.CategoryId)  (cost=44.93 rows=1) (actual time=0.006..0.006 rows=1 loops=2881)
 |
```

NEW:
```
 | -> Nested loop antijoin  (cost=5879.73 rows=58021) (actual time=1.544..3.135 rows=15 loops=1)
    -> Nested loop inner join  (cost=66.65 rows=110) (actual time=0.421..1.778 rows=220 loops=1)
        -> Filter: ((Channels.DeleteAt = 0) and (Channels.`Type` in ('O','P')))  (cost=25.25 rows=110) (actual time=0.405..0.945 rows=220 loops=1)
            -> Index lookup on Channels using idx_channels_team_id_display_name (TeamId='team01'), with index condition: (Channels.Id is not null)  (cost=25.25 rows=220) (actual time=0.400..0.859 rows=220 loops=1)
        -> Single-row covering index lookup on ChannelMembers using PRIMARY (ChannelId=Channels.Id, UserId='user000')  (cost=0.28 rows=1) (actual time=0.003..0.004 rows=1 loops=220)
    -> Single-row index lookup on <subquery2> using <auto_distinct_key> (ChannelId=Channels.Id)  (cost=130.37..130.37 rows=1) (actual time=0.006..0.006 rows=1 loops=220)
        -> Materialize with deduplication  (cost=130.35..130.35 rows=527) (actual time=1.118..1.118 rows=205 loops=1)
            -> Filter: (SidebarChannels.ChannelId is not null)  (cost=77.61 rows=527) (actual time=0.059..0.851 rows=523 loops=1)
                -> Nested loop inner join  (cost=77.61 rows=527) (actual time=0.058..0.786 rows=523 loops=1)
                    -> Covering index lookup on SidebarCategories using idx_sidebarcategories_userid_teamid (UserId='user000', TeamId='team01')  (cost=2.81 rows=15) (actual time=0.025..0.031 rows=15 loops=1)
                    -> Covering index lookup on SidebarChannels using idx_sidebarchannels_categoryid (CategoryId=SidebarCategories.Id)  (cost=1.70 rows=35) (actual time=0.032..0.046 rows=35 loops=15)
```

Performance improvement from 38ms to 3ms.

*CUSTOMER ENV* (with sensitive data wiped off)

OLD:
```
| -> Sort: channels.DisplayName  (actual time=512..512 rows=5 loops=1)
    -> Stream results  (cost=3.28 rows=1.44) (actual time=223..512 rows=5 loops=1)
        -> Nested loop antijoin  (cost=3.28 rows=1.44) (actual time=223..512 rows=5 loops=1)
            -> Nested loop inner join  (cost=3.02 rows=0.3) (actual time=0.025..0.0878 rows=5 loops=1)
                -> Covering index lookup on ChannelMembers using idx_channelmembers_user_id_channel_id_last_viewed_at (UserId='')  (cost=0.916 rows=6) (actual time=0.0146..0.023 rows=6 loops=1)
                -> Filter: ((channels.DeleteAt = 0) and (channels.TeamId = '') and (channels.`Type` in ('O','P')))  (cost=0.251 rows=0.05) (actual time=0.00999..0.0102 rows=0.833 loops=6)
                    -> Single-row index lookup on Channels using PRIMARY (Id=channelmembers.ChannelId)  (cost=0.251 rows=1) (actual time=0.00778..0.00785 rows=1 loops=6)
            -> Nested loop inner join  (cost=2.85 rows=4.81) (actual time=102..102 rows=0 loops=5)
                -> Covering index lookup on SidebarChannels using PRIMARY (ChannelId=channelmembers.ChannelId)  (cost=2.01 rows=4.81) (actual time=0.0125..13.8 rows=24134 loops=5)
                -> Filter: ((sidebarcategories.TeamId = '') and (sidebarcategories.UserId = ''))  (cost=1.54 rows=1) (actual time=0.00359..0.00359 rows=0 loops=120671)
                    -> Single-row index lookup on SidebarCategories using PRIMARY (Id=sidebarchannels.CategoryId)  (cost=1.54 rows=1) (actual time=0.00316..0.00319 rows=1 loops=120671)
```

NEW:
```
Here is the output

| -> Sort: channels.DisplayName  (actual time=0.12..0.12 rows=5 loops=1)
    -> Stream results  (cost=3.45 rows=4.01) (actual time=0.0797..0.11 rows=5 loops=1)
        -> Nested loop antijoin  (cost=3.45 rows=4.01) (actual time=0.0769..0.106 rows=5 loops=1)
            -> Nested loop inner join  (cost=3.02 rows=0.3) (actual time=0.0291..0.0555 rows=5 loops=1)
                -> Covering index lookup on ChannelMembers using idx_channelmembers_user_id_channel_id_last_viewed_at (UserId='')  (cost=0.916 rows=6) (actual time=0.0145..0.0162 rows=6 loops=1)
                -> Filter: ((channels.DeleteAt = 0) and (channels.TeamId = '') and (channels.`Type` in ('O','P')))  (cost=0.251 rows=0.05) (actual time=0.00611..0.00619 rows=0.833 loops=6)
                    -> Single-row index lookup on Channels using PRIMARY (Id=channelmembers.ChannelId)  (cost=0.251 rows=1) (actual time=0.0053..0.00534 rows=1 loops=6)
            -> Single-row index lookup on <subquery2> using <auto_distinct_key> (ChannelId=channelmembers.ChannelId)  (cost=7.01..7.01 rows=1) (actual time=0.00956..0.00956 rows=0 loops=5)
                -> Materialize with deduplication  (cost=7..7 rows=13.4) (actual time=0.0451..0.0451 rows=0 loops=1)
                    -> Filter: (sidebarchannels.ChannelId is not null)  (cost=5.66 rows=13.4) (actual time=0.0441..0.0441 rows=0 loops=1)
                        -> Nested loop inner join  (cost=5.66 rows=13.4) (actual time=0.0439..0.0439 rows=0 loops=1)
                            -> Covering index lookup on SidebarCategories using idx_sidebarcategories_userid_teamid (UserId='', TeamId='')  (cost=0.592 rows=3) (actual time=0.0105..0.0134 rows=3 loops=1)
                            -> Covering index lookup on SidebarChannels using idx_sidebarchannels_categoryid (CategoryId=sidebarcategories.Id)  (cost=1.39 rows=4.46) (actual time=0.00999..0.00999 rows=0 loops=3)
```

Performance improvement from 512ms to 0.12ms.

https://mattermost.atlassian.net/browse/MM-64209

```release-note
NONE
```
2025-05-09 09:48:07 +05:30
sabril
3be58f5f34 E2E/Playwright: Upgrade playwright dependencies (#30951)
* upgrade playwright dependencies

* fix test on scheduled messages
2025-05-08 23:39:15 +08:00
Devin Binnie
0058edb806 [MM-62987] Include description on aria-label for last reply time, make link focused when using up/down arrows. (#30837)
* [MM-62987] Include description on aria-label for last reply time, make link focused when using up/down arrows.

* PR feedback

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-05-08 10:50:14 -04:00
Devin Binnie
c33dbe8d37 [MM-63015] Add more descriptive page titles to login/create account/password reset pages (#30857)
* [MM-63015] Add more descriptive page titles to login/create account/password reset pages

* PR feedback

* Fix e2e

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-05-08 10:48:31 -04:00
Devin Binnie
0e806bf8e8 [MM-62971][MM-63017] Search box accessibility fixes (#30910)
* [MM-62971] Add role='button' and focusability to the file suggestion list items

* [MM-63017] Add aria-label to Close button in Search
2025-05-08 10:43:52 -04:00
Devin Binnie
7efb83396b [MM-62974][MM-62984][MM-63016][MM-63025] Various fixes for the Create Team screen (#30905)
* [MM-62974] Focus team name inputs when error occurs

* [MM-62984] Change h5 to label on create team screens

* [MM-63016] Add a page title for the create team page

* [MM-63025] Add role=alert and aria-describedby for error messages on create team page

* Fix i18n
2025-05-07 15:20:22 -04:00
Devin Binnie
ee61301b67 [MM-62986][MM-63011][MM-63013][MM-63014][MM-63018] Various accessibility fixes around login, account creation and MFA setup (#30847)
* [MM-62986] Ensure focus goes back to the inputs after an error for Login/Create Account/MFA

* [MM-63011] Show outline on Mattermost logo link when focused

* [MM-63018] Remove tabindex from the login/signup cards and use <form> element for submit

* [MM-63014] Toggle aria-label when show/hide password is pressed

* [MM-63013] Mention the field name when showing an error message about the password field

* Fix lint

* Update screenshots and fix tests

* Update screenshots and fix tests

* Fix tests

* Update webapp/channels/src/components/mfa/setup/setup.tsx

Co-authored-by: Harrison Healey <harrisonmhealey@gmail.com>

* update screenshots

---------

Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
Co-authored-by: Harrison Healey <harrisonmhealey@gmail.com>
2025-05-07 15:19:33 -04:00
Ben Schumacher
92011a6c75 [MM-29111] Fix errcheck issues in server/channels/app/upload.go (#30678)
Co-authored-by: Claude <noreply@anthropic.com>
2025-05-07 13:40:51 +02:00
Ben Schumacher
bfb15ab179 [MM-61074] Fix errcheck issues in oauth_test.go and web_test.go (#30707)
Co-authored-by: Claude <noreply@anthropic.com>
2025-05-07 12:41:10 +02:00
KIMBOH LOVETTE
b8b3efda48 [GH-25995]_Validate SITE URL in mmctl auth login (#30362) 2025-05-07 12:24:18 +02:00
Guillermo Vayá
5b68afe452 [MM-63837] Bump x/net version to 0.39 (#30843)
* bump x/net version to 0.39

* modules-tidy

* upgrade dependencies for public

* tidy

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-05-07 11:41:31 +02:00
Ben Schumacher
dc2827a63e [MM-28923] Fix errcheck issues in server/channels/app/file.go (#30878)
Co-authored-by: Claude <noreply@anthropic.com>
2025-05-07 10:04:17 +02:00
Ben Schumacher
e10a1309c1 [MM-61774] Fix errcheck issues in server/channels/app/platform/status.go (#30876)
Co-authored-by: Claude <noreply@anthropic.com>
2025-05-07 09:04:22 +02:00
Jesse Hallam
7f1987caec wip (#30941) 2025-05-06 10:01:09 -03:00
unified-ci-app[bot]
c163fb10ac chore: Update NOTICE.txt file with updated dependencies (#30947)
Automatic Merge
2025-05-06 14:28:42 +03:00
Antonis Stamatiou
b0ba67438e fix: Ignore mm deps from Notice file (#30945)
Automatic Merge
2025-05-06 13:28:42 +03:00
dependabot[bot]
7992fffb76 Bump the github-actions-updates group across 1 directory with 5 updates (#30933)
Bumps the github-actions-updates group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [docker/build-push-action](https://github.com/docker/build-push-action) | `6.15.0` | `6.16.0` |
| [github/codeql-action](https://github.com/github/codeql-action) | `3.28.15` | `3.28.17` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `4.2.1` | `4.3.0` |
| [tj-actions/changed-files](https://github.com/tj-actions/changed-files) | `9934ab3fdf63239da75d9e0fbd339c48620c72c4` | `4168bb487d5b82227665ab4ec90b67ce02691741` |
| [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) | `3.8.1` | `3.8.2` |



Updates `docker/build-push-action` from 6.15.0 to 6.16.0
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](471d1dc4e0...14487ce63c)

Updates `github/codeql-action` from 3.28.15 to 3.28.17
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](45775bd823...60168efe1c)

Updates `actions/download-artifact` from 4.2.1 to 4.3.0
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](95815c38cf...d3f86a106a)

Updates `tj-actions/changed-files` from 9934ab3fdf63239da75d9e0fbd339c48620c72c4 to 4168bb487d5b82227665ab4ec90b67ce02691741
- [Release notes](https://github.com/tj-actions/changed-files/releases)
- [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md)
- [Commits](9934ab3fdf...4168bb487d)

Updates `sigstore/cosign-installer` from 3.8.1 to 3.8.2
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](d7d6bc7722...3454372f43)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 6.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: github/codeql-action
  dependency-version: 3.28.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/download-artifact
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: tj-actions/changed-files
  dependency-version: 4168bb487d5b82227665ab4ec90b67ce02691741
  dependency-type: direct:production
  dependency-group: github-actions-updates
- dependency-name: sigstore/cosign-installer
  dependency-version: 3.8.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-06 11:47:15 +03:00
Harshil Sharma
a5e68639c2 Channel banner permissions (#30917)
* Fixed save state panel for channel banner

* Defined default background color

* Updated test

* WIP

* wip

* removed unused param

* Updated tests

* CI

* Fixed mmctl test

* Fixed TestDoAdvancedPermissionsMigration test

* Test update

* lint fix

* lint fix

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-05-06 14:03:35 +05:30
Harshil Sharma
d73222dca9 Channel banner misc fixes (#30907)
* Fixed save state panel for channel banner

* Defined default background color

* Updated test

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-05-06 14:02:41 +05:30
Daniel Espino García
257abbfb0d Fix edit positioning, including its tooltip (#30884) 2025-05-06 09:58:53 +02:00
Martin Mičuda
f66d530b19 Translated using Weblate (Czech)
Currently translated at 98.2% (6075 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/cs/
2025-05-06 08:35:57 +02:00
Martin Mičuda
a67cc4e472 Translated using Weblate (Czech)
Currently translated at 98.2% (6074 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/cs/
2025-05-06 08:35:57 +02:00
master7
2c82dade94 Translated using Weblate (Polish)
Currently translated at 100.0% (6184 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/
2025-05-06 08:35:57 +02:00
Pineoak
dfc10ad4f5 Translated using Weblate (Portuguese (Brazil))
Currently translated at 72.0% (4458 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pt_BR/
2025-05-06 08:35:57 +02:00
Pineoak
a7bbca8724 Translated using Weblate (Portuguese (Brazil))
Currently translated at 71.8% (4446 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pt_BR/
2025-05-06 08:35:57 +02:00
Pineoak
2ef0543ce3 Translated using Weblate (Portuguese (Brazil))
Currently translated at 71.8% (4446 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pt_BR/
2025-05-06 08:35:57 +02:00
Frank Paul Silye
dfd54ba9a8 Translated using Weblate (Norwegian Bokmål)
Currently translated at 78.7% (4869 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nb_NO/
2025-05-06 08:35:57 +02:00
Pineoak
7c3b9cb48f Translated using Weblate (Portuguese (Brazil))
Currently translated at 71.8% (4446 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pt_BR/
2025-05-06 08:35:57 +02:00
Pineoak
3042013d3b Translated using Weblate (Portuguese (Brazil))
Currently translated at 71.8% (4446 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pt_BR/
2025-05-06 08:35:57 +02:00
Pineoak
b535d03fa4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 71.8% (4446 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pt_BR/
2025-05-06 08:35:57 +02:00
Frank Paul Silye
86e25822cf Translated using Weblate (Norwegian Bokmål)
Currently translated at 78.5% (4857 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nb_NO/
2025-05-06 08:35:57 +02:00
Bohdan
a39d9ca007 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (6184 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/uk/
2025-05-06 08:35:57 +02:00
Bohdan
acab46acd8 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (2656 of 2656 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/uk/
2025-05-06 08:35:57 +02:00
Frank Paul Silye
6f8c353203 Translated using Weblate (Norwegian Bokmål)
Currently translated at 78.5% (4855 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nb_NO/
2025-05-06 08:35:57 +02:00
Tom De Moor
4b8284c2b0 Translated using Weblate (Dutch)
Currently translated at 99.9% (6180 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/
2025-05-06 08:35:57 +02:00
Tom De Moor
17f159f0c6 Translated using Weblate (Dutch)
Currently translated at 99.6% (2648 of 2656 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/nl/
2025-05-06 08:35:57 +02:00
MArtin Johnson
7abd3029f6 Translated using Weblate (Swedish)
Currently translated at 99.0% (6125 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/sv/
2025-05-06 08:35:57 +02:00
MArtin Johnson
bfb3208599 Translated using Weblate (Swedish)
Currently translated at 100.0% (2656 of 2656 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/sv/
2025-05-06 08:35:57 +02:00
Serhii Khomiuk
9d1d88f1b2 Translated using Weblate (Ukrainian)
Currently translated at 99.7% (2649 of 2656 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/uk/
2025-05-06 08:35:57 +02:00
Frank Paul Silye
d4ec0ac163 Translated using Weblate (Norwegian Bokmål)
Currently translated at 78.2% (4842 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nb_NO/
2025-05-06 08:35:57 +02:00
Lukáš Mlčůch
ea3f90ef73 Translated using Weblate (Czech)
Currently translated at 100.0% (2656 of 2656 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/cs/
2025-05-06 08:35:57 +02:00
master7
571283fb9f Translated using Weblate (Polish)
Currently translated at 99.6% (6160 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/
2025-05-06 08:35:57 +02:00
Lukáš Mlčůch
ac7ddc3f61 Translated using Weblate (Czech)
Currently translated at 97.9% (6056 of 6184 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/cs/
2025-05-06 08:35:57 +02:00