summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/channel.go4
-rw-r--r--api/channel_test.go2
-rw-r--r--api/user.go3
-rw-r--r--api/web_conn.go8
-rw-r--r--api/web_hub.go7
-rw-r--r--api/webhook.go2
-rw-r--r--api/websocket_router.go1
-rw-r--r--i18n/de.json122
-rw-r--r--i18n/en.json20
-rw-r--r--i18n/es.json60
-rw-r--r--i18n/fr.json132
-rw-r--r--i18n/ja.json62
-rw-r--r--i18n/ko.json60
-rw-r--r--i18n/nl.json60
-rw-r--r--i18n/pt-BR.json78
-rw-r--r--i18n/ru.json64
-rw-r--r--i18n/zh_CN.json64
-rw-r--r--i18n/zh_TW.json66
-rw-r--r--model/version.go1
-rw-r--r--store/sql_channel_store.go26
-rw-r--r--store/sql_status_store.go2
-rw-r--r--store/sql_upgrade.go38
-rw-r--r--store/sql_user_store.go20
-rw-r--r--store/store.go2
-rw-r--r--web/web.go4
-rw-r--r--webapp/actions/global_actions.jsx24
-rw-r--r--webapp/actions/post_actions.jsx2
-rw-r--r--webapp/actions/websocket_actions.jsx49
-rw-r--r--webapp/client/websocket_client.jsx11
-rw-r--r--webapp/components/admin_console/admin_team_members_dropdown.jsx1
-rw-r--r--webapp/components/logged_in.jsx2
-rw-r--r--webapp/components/member_list_team.jsx11
-rw-r--r--webapp/components/more_direct_channels.jsx12
-rw-r--r--webapp/components/navbar.jsx10
-rw-r--r--webapp/components/needs_team.jsx2
-rw-r--r--webapp/components/post_view/components/post_list.jsx14
-rw-r--r--webapp/components/search_bar.jsx3
-rw-r--r--webapp/components/sidebar.jsx4
-rw-r--r--webapp/components/suggestion/suggestion_box.jsx13
-rw-r--r--webapp/components/user_settings/user_settings_security.jsx3
-rw-r--r--webapp/i18n/de.json36
-rw-r--r--webapp/i18n/en.json2
-rw-r--r--webapp/i18n/es.json20
-rw-r--r--webapp/i18n/fr.json238
-rw-r--r--webapp/i18n/i18n.jsx12
-rw-r--r--webapp/i18n/ja.json42
-rw-r--r--webapp/i18n/ko.json12
-rw-r--r--webapp/i18n/nl.json12
-rw-r--r--webapp/i18n/pt-BR.json52
-rw-r--r--webapp/i18n/ru.json46
-rw-r--r--webapp/i18n/zh_CN.json18
-rw-r--r--webapp/i18n/zh_TW.json22
-rw-r--r--webapp/routes/route_team.jsx4
-rw-r--r--webapp/sass/components/_modal.scss42
-rw-r--r--webapp/sass/responsive/_mobile.scss95
-rw-r--r--webapp/stores/channel_store.jsx17
-rw-r--r--webapp/stores/suggestion_store.jsx8
-rw-r--r--webapp/utils/async_client.jsx82
-rw-r--r--webapp/utils/constants.jsx1
-rw-r--r--webapp/utils/utils.jsx10
60 files changed, 1171 insertions, 669 deletions
diff --git a/api/channel.go b/api/channel.go
index 2232786fd..ea39ee398 100644
--- a/api/channel.go
+++ b/api/channel.go
@@ -77,7 +77,7 @@ func createChannel(c *Context, w http.ResponseWriter, r *http.Request) {
if channel.TeamId == c.TeamId {
// Get total number of channels on current team
- if result := <-Srv.Store.Channel().GetChannels(channel.TeamId, c.Session.UserId); result.Err != nil {
+ if result := <-Srv.Store.Channel().GetTeamChannels(channel.TeamId); result.Err != nil {
c.Err = model.NewLocAppError("createChannel", "api.channel.get_channels.error", nil, result.Err.Message)
return
} else {
@@ -1176,6 +1176,8 @@ func updateNotifyProps(c *Context, w http.ResponseWriter, r *http.Request) {
c.Err = result.Err
return
} else {
+ InvalidateCacheForUser(userId)
+
// return the updated notify properties including any unchanged ones
w.Write([]byte(model.MapToJson(member.NotifyProps)))
}
diff --git a/api/channel_test.go b/api/channel_test.go
index d05cd495b..4b0ce9509 100644
--- a/api/channel_test.go
+++ b/api/channel_test.go
@@ -378,6 +378,8 @@ func TestUpdateChannelHeader(t *testing.T) {
upChannel1 = result.Data.(*model.Channel)
}
+ time.Sleep(100 * time.Millisecond)
+
r1 := Client.Must(Client.GetPosts(channel1.Id, 0, 1, "")).Data.(*model.PostList)
if len(r1.Order) != 1 {
t.Fatal("Header update system message was not found")
diff --git a/api/user.go b/api/user.go
index b961aa609..e78b5be03 100644
--- a/api/user.go
+++ b/api/user.go
@@ -1398,6 +1398,8 @@ func updateUser(c *Context, w http.ResponseWriter, r *http.Request) {
go sendEmailChangeUsername(c, rusers[1].Username, rusers[0].Username, rusers[0].Email, c.GetSiteURL())
}
+ InvalidateCacheForUser(user.Id)
+
updatedUser := rusers[0]
updatedUser = sanitizeProfile(c, updatedUser)
@@ -1955,6 +1957,7 @@ func updateUserNotify(c *Context, w http.ResponseWriter, r *http.Request) {
return
} else {
c.LogAuditWithUserId(user.Id, "")
+ InvalidateCacheForUser(user.Id)
ruser := result.Data.([2]*model.User)[0]
options := utils.Cfg.GetSanitizeOptions()
diff --git a/api/web_conn.go b/api/web_conn.go
index 52b5ba9de..c906b7c95 100644
--- a/api/web_conn.go
+++ b/api/web_conn.go
@@ -8,6 +8,7 @@ import (
"time"
"github.com/mattermost/platform/model"
+ "github.com/mattermost/platform/utils"
l4g "github.com/alecthomas/log4go"
"github.com/gorilla/websocket"
@@ -142,6 +143,13 @@ func (webCon *WebConn) isAuthenticated() bool {
return webCon.SessionToken != ""
}
+func (webCon *WebConn) SendHello() {
+ msg := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_HELLO, "", "", webCon.UserId, nil)
+ msg.Add("server_version", fmt.Sprintf("%v.%v.%v", model.CurrentVersion, model.BuildNumber, utils.CfgHash))
+ msg.DoPreComputeJson()
+ webCon.Send <- msg
+}
+
func (webCon *WebConn) ShouldSendEvent(msg *model.WebSocketEvent) bool {
// IMPORTANT: Do not send event if WebConn does not have a session
if !webCon.isAuthenticated() {
diff --git a/api/web_hub.go b/api/web_hub.go
index e59521879..b607703f2 100644
--- a/api/web_hub.go
+++ b/api/web_hub.go
@@ -112,6 +112,7 @@ func InvalidateCacheForUser(userId string) {
func InvalidateCacheForUserSkipClusterSend(userId string) {
Srv.Store.Channel().InvalidateAllChannelMembersForUser(userId)
+ Srv.Store.User().InvalidateProfilesInChannelCacheByUser(userId)
GetHubForUserId(userId).InvalidateUser(userId)
}
@@ -119,9 +120,9 @@ func InvalidateCacheForUserSkipClusterSend(userId string) {
func (h *Hub) Register(webConn *WebConn) {
h.register <- webConn
- msg := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_HELLO, "", "", webConn.UserId, nil)
- msg.Add("server_version", fmt.Sprintf("%v.%v.%v", model.CurrentVersion, model.BuildNumber, utils.CfgHash))
- go Publish(msg)
+ if webConn.isAuthenticated() {
+ webConn.SendHello()
+ }
}
func (h *Hub) Unregister(webConn *WebConn) {
diff --git a/api/webhook.go b/api/webhook.go
index 2daac03f2..dce739239 100644
--- a/api/webhook.go
+++ b/api/webhook.go
@@ -443,6 +443,8 @@ func incomingWebhook(c *Context, w http.ResponseWriter, r *http.Request) {
return
} else {
channel = newChanResult.Data.(*model.Channel)
+ InvalidateCacheForUser(directUserId)
+ InvalidateCacheForUser(hook.UserId)
}
} else if result.Err != nil {
c.Err = model.NewLocAppError("incomingWebhook", "web.incoming_webhook.channel.app_error", nil, "err="+result.Err.Message)
diff --git a/api/websocket_router.go b/api/websocket_router.go
index bdbd9f4d9..504e434b7 100644
--- a/api/websocket_router.go
+++ b/api/websocket_router.go
@@ -57,6 +57,7 @@ func (wr *WebSocketRouter) ServeWebSocket(conn *WebConn, r *model.WebSocketReque
resp := model.NewWebSocketResponse(model.STATUS_OK, r.Seq, nil)
resp.DoPreComputeJson()
conn.Send <- resp
+ conn.SendHello()
}
return
diff --git a/i18n/de.json b/i18n/de.json
index a3cb2494a..d221ecb3b 100644
--- a/i18n/de.json
+++ b/i18n/de.json
@@ -205,7 +205,7 @@
},
{
"id": "api.channel.create_channel.max_channel_limit.app_error",
- "translation": "Cannot create more than {{.MaxChannelsPerTeam}} channels for current team"
+ "translation": "Es können nicht mehr als {{.MaxChannelsPerTeam}} Kanäle für das aktuelle Team erstellt werden"
},
{
"id": "api.channel.create_default_channels.off_topic",
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### Mitteilungen\n\nAlt+[Klick auf eine Nachricht]: Eine Nachricht als älteste ungelesene Nachricht im aktuellen Kanal setzen\nEsc: Alle Mitteilungen im aktuellen Kanal als gelesen markieren\nStrg+Hoch (in leerem Eingabefeld): Vorherige Mitteilung oder Slash Befehl anzeigen\nStrg+Runter (in leerem Eingabefeld): Nächste Mitteilung oder Slash Befehl anzeigen\nHoch (in leerem Eingabefeld): Die letzte Nachricht im aktuellen Kanal bearbeiten\n@[Zeichen]+Tab: @Benutzername beginnend mit [Zeichen] vervollständigen\n:[Zeichen]+Tab: Emoji beginnend mit [Zeichen] vervollständigen\n\n"
+ "translation": "#### Mitteilungen\n\nEsc: Alle Mitteilungen im aktuellen Kanal als gelesen markieren\nStrg+Hoch (in leerem Eingabefeld): Vorherige Mitteilung oder Slash Befehl anzeigen\nStrg+Runter (in leerem Eingabefeld): Nächste Mitteilung oder Slash Befehl anzeigen\nHoch (in leerem Eingabefeld): Die letzte Nachricht im aktuellen Kanal bearbeiten\n@[Zeichen]+Tab: @Benutzername beginnend mit [Zeichen] vervollständigen\n#[Zeichen]+Tab: Kanal beginnend mit [Zeichen] vervollständigen\n:[Zeichen]+Tab: Emoji beginnend mit [Zeichen] vervollständigen\n\\\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### Nachrichten\n\nAlt+[Klick auf eine Nachricht]: Eine Nachricht als älteste ungelesene Nachricht im aktuellen Kanal setzen\nEsc: Alle Mitteilungen im aktuellen Kanal als gelesen markieren\nCmd+Hoch (in leerem Eingabefeld): Vorherige Mitteilung oder Slash Befehl anzeigen\nCmd+Runter (in leerem Eingabefeld): Nächste Mitteilung oder Slash Befehl anzeigen\nHoch (in leerem Eingabefeld): Ihre letzte Nachricht im aktuellen Kanal bearbeiten\n@[Zeichen]+Tab: @Benutzername beginnend mit [Zeichen] vervollständigen\n:[Zeichen]+Tab: Emoji beginnend mit [Zeichen] vervollständigen\n\n"
+ "translation": "#### Nachrichten\n\nEsc: Alle Mitteilungen im aktuellen Kanal als gelesen markieren\nCmd+Hoch (in leerem Eingabefeld): Vorherige Mitteilung oder Slash Befehl anzeigen\nCmd+Runter (in leerem Eingabefeld): Nächste Mitteilung oder Slash Befehl anzeigen\nHoch (in leerem Eingabefeld): Ihre letzte Nachricht im aktuellen Kanal bearbeiten\n@[Zeichen]+Tab: @Benutzername beginnend mit [Zeichen] vervollständigen\n#[Zeichen]+Tab: Kanal beginnend mit [Zeichen] vervollständigen\n:[Zeichen]+Tab: Emoji beginnend mit [Zeichen] vervollständigen\n\n "
},
{
"id": "api.command_shortcuts.name",
@@ -883,59 +883,59 @@
},
{
"id": "api.file.migrate_filenames_to_file_infos.channel.app_error",
- "translation": "Unable to get channel when migrating post to use FileInfos, post_id=%v, channel_id=%v, err=%v"
+ "translation": "Während der Migration der Nachricht zur Verwendung von FileInfos konnte der Kanal nicht abgerufen werden, post_id=%v, channel_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.file_not_found.warn",
- "translation": "Unable to find file when migrating post to use FileInfos, post_id=%v, filename=%v, path=%v, err=%v"
+ "translation": "Während der Migration der Nachricht zur Verwendung von FileInfos konnte die Datei nicht gefunden werden, post_id=%v, filename=%v, path=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.get_file_infos_again.warn",
- "translation": "Unable to get FileInfos for post after migratio, post_id=%v, err=%v"
+ "translation": "Die FileInfos für die Nachricht konnten nach der Migration nicht abgerufen werden, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.get_post_again.warn",
- "translation": "Unable to get post when migrating to use FileInfos, post_id=%v, err=%v"
+ "translation": "Während der Migration zur Verwendung von FileInfos konnte die Nachricht abgerufen werdne, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.info.app_error",
- "translation": "Unable to fully decode file info when migrating post to use FileInfos, post_id=%v, filename=%v, err=%v"
+ "translation": "Während der Migration der Nachricht zur Verwendung von FileInfos konnten die Dateiinformationen nicht vollständig dekodiert werden, post_id=%v, filename=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.migrating_post.debug",
- "translation": "Migrating post to use FileInfos, post_id=%v, err=%v"
+ "translation": "Migriere Nachricht zur Verwendung von FileInfos, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.mismatched_filename.warn",
- "translation": "Found an unusual filename when migrating post to use FileInfos, post_id=%v, channel_id=%v, user_id=%v, filename=%v"
+ "translation": "Es wurde ein ungewöhnlicher Dateiname bei der Migration der Nachricht zur Verwendung von FileInfos gefunden, post_id=%v, channel_id=%v, user_id=%v, filename=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.no_filenames.warn",
- "translation": "Unable to migrate post to use FileInfos with an empty Filenames field, post_id=%v"
+ "translation": "Konnte Nachricht nicht zur Verwendung von FileInfos mit einem leeren Dateinamensfeld migrieren, post_id=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.not_migrating_post.debug",
- "translation": "Post already migrated to use FileInfos, post_id=%v, err=%v"
+ "translation": "Nachricht wurde bereits zur Verwendung von FileInfos migriert, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.save_file_info.warn",
- "translation": "Unable to save post when migrating post to use FileInfos, post_id=%v, file_id=%v, path=%v, err=%v"
+ "translation": "Während der Migration der Nachricht zur Verwendung von FileInfos konnte die Nachricht nicht gespeichert werden, post_id=%v, file_id=%v, path=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.save_post.warn",
- "translation": "Unable to save file info when migrating post to use FileInfos, post_id=%v, file_id=%v, filename=%v, err=%v"
+ "translation": "Während der Migration der Nachricht zur Verwendung von FileInfos konnten die Dateiinformationen nicht gespeichert werden, post_id=%v, file_id=%v, filename=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.team_id.app_error",
- "translation": "Unable to find team for FileInfos, post_id=%v, filenames=%v"
+ "translation": "Konnte Team für FileInfos nicht finden, post_id=%v, filenames=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.teams.app_error",
- "translation": "Unable to get teams when migrating post to use FileInfos, post_id=%v, err=%v"
+ "translation": "Während der Migration der Nachricht zur Verwendung von FileInfos konnten die Teams nicht abgerufen werden, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.unexpected_filename.error",
- "translation": "Unable to decipher filename when migrating post to use FileInfos, post_id=%v, filename=%v"
+ "translation": "Während der Migration der Nachricht zur Verwendung von FileInfos konnte der Dateiname nicht entziffert werden, post_id=%v, filename=%v"
},
{
"id": "api.file.move_file.configured.app_error",
@@ -1263,7 +1263,7 @@
},
{
"id": "api.post.delete_post_files.app_error.warn",
- "translation": "Encountered error when deleting files for post, post_id=%v, err=%v"
+ "translation": "Es trat ein Fehler beim Löschen von Dateien für die Nachricht auf, post_id=%v, err=%v"
},
{
"id": "api.post.get_message_for_notification.files_sent",
@@ -1274,7 +1274,7 @@
},
{
"id": "api.post.get_message_for_notification.get_files.error",
- "translation": "Encountered error when getting files for notification message, post_id=%v, err=%v"
+ "translation": "Es trat ein Fehler beim Abruf der Dateien für die Benachrichtigung auf, post_id=%v, err=%v"
},
{
"id": "api.post.get_message_for_notification.images_sent",
@@ -1361,7 +1361,7 @@
},
{
"id": "api.post.send_notifications_and_forget.files.error",
- "translation": "Failed to get files for post notification post_id=%v, err=%v"
+ "translation": "Die Dateien für die Benachrichtigung konnten nicht abgerufen werden post_id=%v, err=%v"
},
{
"id": "api.post.send_notifications_and_forget.get_teams.error",
@@ -1493,7 +1493,7 @@
},
{
"id": "api.server.start_server.rate_limiting_memory_store",
- "translation": "Unable to initialize rate limiting memory store. Check MemoryStoreSize config setting."
+ "translation": "Konnte Rate Limiting Memory Store nicht initialisieren. Prüfen Sie die MemoryStoreSize Konfigurationseinstellung."
},
{
"id": "api.server.start_server.rate_limiting_rate_limiter",
@@ -1520,6 +1520,14 @@
"translation": "Stoppe Server..."
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Slack Bot/Integration Nachrichten Import Benutzer: E-Mail, Passwort: {{.Email}}, {{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "Konnte Slack Bot/Integration Nachrichten Import Benutzer nicht importieren: {{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n Kanäle hinzugefügt \r\n"
},
@@ -1533,7 +1541,7 @@
},
{
"id": "api.slackimport.slack_add_channels.import_failed.warn",
- "translation": "Slack Importer: Failed to import channel: %s"
+ "translation": "Slack Importer: Kanal konnte nicht importiert werden: %s"
},
{
"id": "api.slackimport.slack_add_channels.merge",
@@ -1548,6 +1556,10 @@
"translation": "Slack Bot Beiträge wurden noch nicht importiert"
},
{
+ "id": "api.slackimport.slack_add_posts.bot_user_no_exists.warn",
+ "translation": "Slack Importer: Bot Nachrichten werden nicht importiert da der bot-importing Benutzer nicht existiert."
+ },
+ {
"id": "api.slackimport.slack_add_posts.msg_no_comment.debug",
"translation": "Dateikommentar undefiniert"
},
@@ -1556,24 +1568,28 @@
"translation": "Nachricht ohne Benutzer"
},
{
+ "id": "api.slackimport.slack_add_posts.no_bot_id.warn",
+ "translation": "Slack Importer: Bot Nachrichten werden nicht importiert da das BotId Feld fehlt."
+ },
+ {
"id": "api.slackimport.slack_add_posts.unsupported.warn",
"translation": "Nicht unterstützter Nachrichtentyp: %v, %v"
},
{
"id": "api.slackimport.slack_add_posts.upload_file_not_found.warn",
- "translation": "No file found in Slack export for file upload message with file ID {{.FileId}}"
+ "translation": "Es konnte keine Datei einer Datei Mitteilung im Slack Export mit der Datei ID {{.FileId}} gefunden werden"
},
{
"id": "api.slackimport.slack_add_posts.upload_file_not_in_json.warn",
- "translation": "Cannot import file for upload post with no \"file\" section present in export."
+ "translation": "Kann Datei nicht importieren wenn kein \"file\" Bereich im Export existiert."
},
{
"id": "api.slackimport.slack_add_posts.upload_file_open_failed.warn",
- "translation": "Could not open the upload file with ID {{.FileId}} in the export archive with error: {{.Error}}"
+ "translation": "Die Datei mit der ID {{.FileId}} kann nicht aus dem Export Archiv geöffnet werden: {{.Error}}"
},
{
"id": "api.slackimport.slack_add_posts.upload_file_upload_failed.warn",
- "translation": "Uploading the file for upload message with file ID {{.FileId}} failed with error: {{.Error}}"
+ "translation": "Hochladen der Datei für Dateinachricht mit der ID {{.FileId}} ist mit folgendem Fehler fehlgeschlagen: {{.Error}}"
},
{
"id": "api.slackimport.slack_add_posts.user_no_exists.debug",
@@ -1612,6 +1628,10 @@
"translation": "Konnte Regex Match für @Erwähnung für Slack Benutzer {{.UserID}} {{.Username}} nicht erstellen"
},
{
+ "id": "api.slackimport.slack_deactivate_bot_user.failed_to_deactivate",
+ "translation": "Slack Importer: Konnte bot-importing Benutzer nicht deaktivieren."
+ },
+ {
"id": "api.slackimport.slack_import.log",
"translation": "Mattermost Slack Import Log\r\n"
},
@@ -1652,6 +1672,22 @@
"translation": "Fehler beim Verarbeiten einiger Slach Nachrichten. Import könnte trotzdem funktionieren."
},
{
+ "id": "api.slackimport.slack_sanitise_channel_properties.display_name_too_long.warn",
+ "translation": "Slack Importer: Kanal {{.ChannelName}} hat einen zu langen Anzeigenamen. Er wird beim Import gekürzt."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.header_too_long.warn",
+ "translation": "Slack Importer: Kanal {{.ChannelName}} hat eine zu lange Überschrift. Sie wird beim Import gekürzt."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.name_too_long.warn",
+ "translation": "Slack Importer: Kanal {{.ChannelName}} hat einen zu langen Namen. Er wird beim Import gekürzt."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.purpose_too_long.warn",
+ "translation": "Slack Importer: Kanal {{.ChannelName}} hat einen zu langen Zweck. Er wird beim Import gekürzt."
+ },
+ {
"id": "api.status.init.debug",
"translation": "Initialisieren Status-Api-Routen"
},
@@ -2409,11 +2445,11 @@
},
{
"id": "api.web_hub.start.starting.debug",
- "translation": "Starting %v websocket hubs"
+ "translation": "Starte %v Websocket Hubs"
},
{
"id": "api.web_hub.start.stopping.debug",
- "translation": "stopping websocket hub connections"
+ "translation": "Beende Websocket Hub Verbindungen"
},
{
"id": "api.web_socket.connect.error",
@@ -2508,12 +2544,16 @@
"translation": "Die Berechtigungen für die Erneuerung des Webhooks-Tokens sind ungeeignet"
},
{
+ "id": "api.webrtc.disabled.app_error",
+ "translation": "WebRTC ist auf diesem Server nicht aktiviert."
+ },
+ {
"id": "api.webrtc.init.debug",
"translation": "Initialisiere WebRTC-API-Routen"
},
{
- "id": "api.webrtc.not_available.app_error",
- "translation": "WebRTC ist auf diesem Server nicht verfügbar."
+ "id": "api.webrtc.register_token.app_error",
+ "translation": "Es trat ein Fehler auf beim Versuch, den WebRTC-Token zu registrieren"
},
{
"id": "api.websocket_handler.invalid_param.app_error",
@@ -2804,18 +2844,6 @@
"translation": "Konnte existierenden SAML User nicht aktualisieren. Erlaube login trotzdem. err=%v"
},
{
- "id": "ent.webrtc.disabled.app_error",
- "translation": "WebRTC ist auf diesem Server nicht aktiviert."
- },
- {
- "id": "ent.webrtc.license_disable.app_error",
- "translation": "Ihre Lizenz beinhaltet keine Unterstützung für Mattermost WebRTC"
- },
- {
- "id": "ent.webrtc.register_token.app_error",
- "translation": "Es trat ein Fehler auf beim Versuch, den WebRTC-Token zu registrieren"
- },
- {
"id": "error.generic.link_message",
"translation": "Gehe zurück zu Mattermost"
},
@@ -3269,7 +3297,7 @@
},
{
"id": "model.config.is_valid.max_channels.app_error",
- "translation": "Ungültige maximale Anzahl an Benutzers pro Team in Teameinstellungen. Muss eine positive Zahl sein."
+ "translation": "Ungültige maximale Anzahl an Kanälen pro Team in Teameinstellungen. Muss eine positive Zahl sein."
},
{
"id": "model.config.is_valid.max_file_size.app_error",
@@ -3629,7 +3657,7 @@
},
{
"id": "model.team.is_valid.characters.app_error",
- "translation": "Name muss 2 oder mehr Kleinbuchstaben haben"
+ "translation": "Name muss aus 2 oder mehr Kleinbuchstaben bestehen"
},
{
"id": "model.team.is_valid.company.app_error",
@@ -4645,7 +4673,7 @@
},
{
"id": "store.sql_team.get_member_count.app_error",
- "translation": "Wir konnten die Kanal Mitglieder nicht finden"
+ "translation": "Die Kanalmitglieder konnten nicht gezählt werden"
},
{
"id": "store.sql_team.get_members.app_error",
@@ -4653,7 +4681,7 @@
},
{
"id": "store.sql_team.get_members_by_ids.app_error",
- "translation": "Wir konnten die Kanal Mitglieder nicht finden"
+ "translation": "Die Teammitglieder konnten nicht abgerufen werden"
},
{
"id": "store.sql_team.get_teams_for_email.app_error",
@@ -4745,7 +4773,7 @@
},
{
"id": "store.sql_user.get_recently_active_users.app_error",
- "translation": "We encountered an error while finding the recently active users"
+ "translation": "Es trat ein Fehler beim Abrufen der zuletzt aktiven Benutzer auf"
},
{
"id": "store.sql_user.get_sysadmin_profiles.app_error",
diff --git a/i18n/en.json b/i18n/en.json
index ef321e113..f8163557b 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### Messages\n\nESC: Mark all messages in the current channel as read\nCTRL+UP (in empty input field): Reprint the previous message or slash command you entered\nCTRL+DOWN (in empty input field): Reprint the next message or slash command you entered\nUP (in empty input field): Edit your last message in the current channel\n@[character]+TAB: Autocomplete @username beginning with [character]\n#[character]+TAB: Autocomplete channel beginning with [character]\n:[character]+TAB: Autocomplete emoji beginning with [character]\n\n"
+ "translation": "#### Messages\n\nESC: Mark all messages in the current channel as read\nCTRL+UP (in empty input field): Reprint the previous message or slash command you entered\nCTRL+DOWN (in empty input field): Reprint the next message or slash command you entered\nUP (in empty input field): Edit your last message in the current channel\n@[character]+TAB: Autocomplete @username beginning with [character]\n~[character]+TAB: Autocomplete channel beginning with [character]\n:[character]+TAB: Autocomplete emoji beginning with [character]\n\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### Messages\n\nESC: Mark all messages in the current channel as read\nCMD+UP (in empty input field): Reprint the previous message or slash command you entered\nCMD+DOWN (in empty input field): Reprint the next message or slash command you entered\nUP (in empty input field): Edit your last message in the current channel\n@[character]+TAB: Autocomplete @username beginning with [character]\n#[character]+TAB: Autocomplete channel beginning with [character]\n:[character]+TAB: Autocomplete emoji beginning with [character]\n\n"
+ "translation": "#### Messages\n\nESC: Mark all messages in the current channel as read\nCMD+UP (in empty input field): Reprint the previous message or slash command you entered\nCMD+DOWN (in empty input field): Reprint the next message or slash command you entered\nUP (in empty input field): Edit your last message in the current channel\n@[character]+TAB: Autocomplete @username beginning with [character]\n~[character]+TAB: Autocomplete channel beginning with [character]\n:[character]+TAB: Autocomplete emoji beginning with [character]\n\n"
},
{
"id": "api.command_shortcuts.name",
@@ -1520,6 +1520,14 @@
"translation": "Stopping Server..."
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Slack Bot/Integration Posts Import User: Email, Password: {{.Email}}, {{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "Unable to import Slack Bot/Integration Posts Import User: {{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n Channels Added \r\n"
},
@@ -1608,14 +1616,6 @@
"translation": "Unable to import user: {{.Username}}\r\n"
},
{
- "id": "api.slackimport.slack_add_bot_user.email_pwd",
- "translation": "Slack Bot/Integration Posts Import User: Email, Password: {{.Email}}, {{.Password}}\r\n"
- },
- {
- "id": "api.slackimport.slack_add_bot_user.unable_import",
- "translation": "Unable to import Slack Bot/Integration Posts Import User: {{.Username}}\r\n"
- },
- {
"id": "api.slackimport.slack_convert_channel_mentions.compile_regexp_failed.warn",
"translation": "Failed to compile the !channel matching regular expression for Slack channel {{.ChannelID}} {{.ChannelName}}"
},
diff --git a/i18n/es.json b/i18n/es.json
index dfc00198e..7b63c2664 100644
--- a/i18n/es.json
+++ b/i18n/es.json
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### Mensajes\n\nALT+[clic en un mensaje]: Marca el mensaje como el último mensaje leído en el canal actual\nESC: Marca todos los mensajes como leídos en el canal actual\nCMD+ARRIBA (con el cuadro de texto vacío): Reimprime el último mensaje o comando de barra que ingresaste\nCMD+ABAJO (con el cuadro de texto vacío): Reimprime el siguiente mensaje o comando de barra que ingresaste\nARRIBA (con el cuadro de texto vacío): Edita tu último mensaje en el canal en el que te encuentras\n@[carácter]+TAB: Auto completa @nombre que comience por [carácter]\n:[carácter]+TAB: Auto completa el emoji que comience por [carácter]\n\n"
+ "translation": "#### Mensajes\n\nESC: Marca todos los mensajes como leídos en el canal actual\nCTRL+ARRIBA (con el cuadro de texto vacío): Reimprime el último mensaje o comando de barra que ingresaste\nCTRL+ABAJO (con el cuadro de texto vacío): Reimprime el siguiente mensaje o comando de barra que ingresaste\nARRIBA (con el cuadro de texto vacío): Edita tu último mensaje en el canal en el que te encuentras\n@[carácter]+TAB: Auto completa @nombre que comience por [carácter]\n~[carácter]+TAB: Autocompleta el canal que comience por [carácter]\n:[carácter]+TAB: Auto completa el emoji que comience por [carácter]\n\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### Mensajes\n\nALT+[clic en un mensaje]: Marca el mensaje como el último mensaje leído en el canal actual\nESC: Marca todos los mensajes como leídos en el canal actual\nCMD+ARRIBA (con el cuadro de texto vacío): Reimprime el último mensaje o comando de barra que ingresaste\nCMD+ABAJO (con el cuadro de texto vacío): Reimprime el siguiente mensaje o comando de barra que ingresaste\nARRIBA (con el cuadro de texto vacío): Edita tu último mensaje en el canal en el que te encuentras\n@[carácter]+TAB: Auto completa @nombre que comience por [carácter]\n:[carácter]+TAB: Auto completa el emoji que comience por [carácter]\n\n"
+ "translation": "#### Mensajes\n\nESC: Marca todos los mensajes como leídos en el canal actual\nCMD+ARRIBA (con el cuadro de texto vacío): Reimprime el último mensaje o comando de barra que ingresaste\nCMD+ABAJO (con el cuadro de texto vacío): Reimprime el siguiente mensaje o comando de barra que ingresaste\nARRIBA (con el cuadro de texto vacío): Edita tu último mensaje en el canal en el que te encuentras\n@[carácter]+TAB: Auto completa @nombre que comience por [carácter]\n~[carácter]+TAB: Autocompleta el canal que comience por [carácter]\n:[carácter]+TAB: Auto completa el emoji que comience por [carácter]\n\n"
},
{
"id": "api.command_shortcuts.name",
@@ -1520,6 +1520,14 @@
"translation": "Deteniendo el Servidor..."
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Usuario de Slack Bot/Integración para Importar Mensajes: Email, Contraseña: {{.Email}}, {{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "No se pudo importar los mensajes del usuario importado Slack Bot/Integración: {{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n Canales agregados \r\n"
},
@@ -1548,6 +1556,10 @@
"translation": "Mensajes del Bot de Slack no han sido importados todavía"
},
{
+ "id": "api.slackimport.slack_add_posts.bot_user_no_exists.warn",
+ "translation": "Importador de Slack: No se importan los mensajes de bot porque el usuario bot-importing no existe."
+ },
+ {
"id": "api.slackimport.slack_add_posts.msg_no_comment.debug",
"translation": "Comentario de archivo indefinido"
},
@@ -1556,6 +1568,10 @@
"translation": "Mensaje sin usuario"
},
{
+ "id": "api.slackimport.slack_add_posts.no_bot_id.warn",
+ "translation": "Importador de Slack: No se importan los mensajes de bot porque falta el campo BotId."
+ },
+ {
"id": "api.slackimport.slack_add_posts.unsupported.warn",
"translation": "Tipo de mensaje no soportado: %v, %v"
},
@@ -1612,6 +1628,10 @@
"translation": "No se pudo compilar la coincidencia de la @mención con expresión regular para el usuario de Slack {{.UserID}} {{.Username}}"
},
{
+ "id": "api.slackimport.slack_deactivate_bot_user.failed_to_deactivate",
+ "translation": "Importador de Slack: Falla al desactivar el usuario bot-importing."
+ },
+ {
"id": "api.slackimport.slack_import.log",
"translation": "Mattermost Registros de importación de Slack\r\n"
},
@@ -1652,6 +1672,22 @@
"translation": "Error en el análisis de los mensajes de slack. Importación puede que funcione de todos modos."
},
{
+ "id": "api.slackimport.slack_sanitise_channel_properties.display_name_too_long.warn",
+ "translation": "Importador de Slack: El canal: {{.ChannelName}} tiene un nombre que es demasiado largo. Se truncará cuando sea importado."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.header_too_long.warn",
+ "translation": "Importador de Slack: El canal: {{.ChannelName}} tiene una cabecera, que es demasiado larga. Se truncará cuando sea importado."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.name_too_long.warn",
+ "translation": "Importador de Slack: El canal: {{.ChannelName}} tiene un nombre que es demasiado largo. Se truncará cuando sea importado."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.purpose_too_long.warn",
+ "translation": "Importador de Slack: El canal: {{.ChannelName}} tiene una propósito que es demasiado largo. Se truncará cuando sea importado."
+ },
+ {
"id": "api.status.init.debug",
"translation": "Inicializando rutas del API para los estatus"
},
@@ -2508,12 +2544,16 @@
"translation": "Permisos inapropiados para regenerar un token para el Webhook saliente"
},
{
+ "id": "api.webrtc.disabled.app_error",
+ "translation": "WebRTC no está habilitado en este servidor."
+ },
+ {
"id": "api.webrtc.init.debug",
"translation": "Inicializando rutas del API para WebRTC"
},
{
- "id": "api.webrtc.not_available.app_error",
- "translation": "WebRTC no está disponible en este servidor."
+ "id": "api.webrtc.register_token.app_error",
+ "translation": "Hemos encontrado un error al intentar registrar el Token de WebRTC"
},
{
"id": "api.websocket_handler.invalid_param.app_error",
@@ -2804,18 +2844,6 @@
"translation": "No se puede actualizar el usuario SAML existente. Se Permite el inicio de sesión de todos modos. err=%v"
},
{
- "id": "ent.webrtc.disabled.app_error",
- "translation": "WebRTC no está habilitado en este servidor."
- },
- {
- "id": "ent.webrtc.license_disable.app_error",
- "translation": "Tu licencia no admite el uso de Mattermost WebRTC"
- },
- {
- "id": "ent.webrtc.register_token.app_error",
- "translation": "Hemos encontrado un error al intentar registrar el Token de WebRTC"
- },
- {
"id": "error.generic.link_message",
"translation": "Volver a Mattermost"
},
diff --git a/i18n/fr.json b/i18n/fr.json
index 9c0b99f7f..9c92c7da9 100644
--- a/i18n/fr.json
+++ b/i18n/fr.json
@@ -137,7 +137,7 @@
},
{
"id": "api.api.init.parsing_templates.error",
- "translation": "Impossible d'analyser les gabarits du serveur %v"
+ "translation": "Impossible d'analyser les modèles du serveur %v"
},
{
"id": "api.api.render.error",
@@ -165,7 +165,7 @@
},
{
"id": "api.channel.add_user.to.channel.failed.app_error",
- "translation": "Échec de l'ajout utilisateur"
+ "translation": "Impossible d'ajouter l'utilisateur au canal"
},
{
"id": "api.channel.add_user.to.channel.failed.deleted.app_error",
@@ -205,7 +205,7 @@
},
{
"id": "api.channel.create_channel.max_channel_limit.app_error",
- "translation": "Cannot create more than {{.MaxChannelsPerTeam}} channels for current team"
+ "translation": "Impossible de créer plus de {{.MaxChannelsPerTeam}} canaux pour l'équipe actuelle"
},
{
"id": "api.channel.create_default_channels.off_topic",
@@ -233,11 +233,11 @@
},
{
"id": "api.channel.delete_channel.failed_post.error",
- "translation": "Échec de l'envoi du message archivé %v"
+ "translation": "Impossible d'envoyer le message archivé %v"
},
{
"id": "api.channel.delete_channel.failed_send.app_error",
- "translation": "Échec de l'envoi du message archivé"
+ "translation": "Impossible d'envoyer le message archivé"
},
{
"id": "api.channel.delete_channel.incoming_webhook.error",
@@ -309,7 +309,7 @@
},
{
"id": "api.channel.post_update_channel_header_message_and_forget.retrieve_user.error",
- "translation": "Échec du chargement de l'utilisateur lors de l'enregistrement de la mise à jour de l'entête du canal %v"
+ "translation": "Impossible de récupérer l'utilisateur lors de l'enregistrement d'un nouveau message de canal %v"
},
{
"id": "api.channel.post_update_channel_header_message_and_forget.updated_from",
@@ -321,7 +321,7 @@
},
{
"id": "api.channel.post_user_add_remove_message_and_forget.error",
- "translation": "Échec de l'envoi du message joindre/quitter %v"
+ "translation": "Impossible d'envoyer le message joindre/quitter %v"
},
{
"id": "api.channel.remove_member.permissions.app_error",
@@ -337,7 +337,7 @@
},
{
"id": "api.channel.remove_member.user.app_error",
- "translation": "Impossible de trouver l'utilisateur à ajouter"
+ "translation": "Impossible de trouver l'utilisateur à supprimer"
},
{
"id": "api.channel.remove_user_from_channel.deleted.app_error",
@@ -461,7 +461,7 @@
},
{
"id": "api.command_echo.create.app_error",
- "translation": "Impossible de créer /echo post, err=%v"
+ "translation": "Impossible de créer le message /echo, err=%v"
},
{
"id": "api.command_echo.delay.app_error",
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### Messages\n\nALT+[clic sur un message]: Définit un message comme le plus vieux message non lu du canal courant\nESC: Marque tous mes messages du canal courant comme lus\nCTRL+HAUT (dans un champ d'édition vide): Affiche à nouveau le message ou la commande slash précédents que vous avez saisis\nCTRL+BAS (dans un champ d'édition vide): Affiche à nouveau le message ou la commande slash suivants que vous avez saisis\nHAUT (dans un champ d'édition vide): Édite le dernier message que vous avez saisi dans le canal courant\n@[caractère]+TAB: Complète automatiquement le @nom d'utilisateur commençant par [caractère]\n:[caractère]+TAB: Complète automatiquement l'émoticône commençant par [caractère]\n\n"
+ "translation": "#### Messages\n\nESC : Marque tous les messages du canal actuel comme lus\nCTRL+HAUT (dans un champ de saisie vide) : Affiche le message précédent ou la commande slash précédemment saisis\nCTRL+BAS (dans un champ de saisie vide): Affiche le message suivant ou la commande slash que vous avez précédemment saisis\nHAUT (dans un champ de saisie vide): Édite votre dernier message du canal actuel\n@[caractère]+TAB: Complète automatiquement le nom d'@utilisateur commençant par [caractère]\n#[caractère]+TAB: Complète automatiquement le nom de canal commençant par [caractère]\n:[caractère]+TAB: Complète automatiquement l'émoticône commençant par [caractère]\n\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### Messages\n\nALT+[clic sur un message]: Définit un message comme le plus vieux message non lu du canal courant\nESC: Marque tous mes messages du canal courant comme lus\nCMD+HAUT (dans un champ d'édition vide): Affiche à nouveau le message ou la commande slash précédents que vous avez saisis\nCMD+BAS (dans un champ d'édition vide): Affiche à nouveau le message ou la commande slash suivants que vous avez saisis\nHAUT (dans un champ d'édition vide): Édite le dernier message que vous avez saisi dans le canal courant\n@[caractère]+TAB: Complète automatiquement le @nom d'utilisateur commençant par [caractère]\n:[caractère]+TAB: Complète automatiquement l'émoticône commençant par [caractère]\n\n"
+ "translation": "#### Messages\n\nESC : Marque tous les messages du canal actuel comme lus\nCTRL+HAUT (dans un champ de saisie vide) : Affiche le message précédent ou la commande slash précédemment saisis\nCTRL+BAS (dans un champ de saisie vide): Affiche le message suivant ou la commande slash que vous avez précédemment saisis\nHAUT (dans un champ de saisie vide): Édite votre dernier message du canal actuel\n@[caractère]+TAB: Complète automatiquement le nom d'@utilisateur commençant par [caractère]\n#[caractère]+TAB: Complète automatiquement le nom de canal commençant par [caractère]\n:[caractère]+TAB: Complète automatiquement l'émoticône commençant par [caractère]\n\n"
},
{
"id": "api.command_shortcuts.name",
@@ -677,7 +677,7 @@
},
{
"id": "api.context.last_activity_at.error",
- "translation": "Échec de la mise à jour de LastActivityAt pour user_id=%v et session_id=%v, err=%v"
+ "translation": "Impossible de mettre à jour le LastActivityAt de user_id=%v et session_id=%v, err=%v"
},
{
"id": "api.context.log.error",
@@ -752,7 +752,7 @@
},
{
"id": "api.email_batching.send_batched_email_notification.send.app_error",
- "translation": "Echec de l'envoi du courriel groupé à %v: %v"
+ "translation": "Impossible d'envoyer le courriel groupé à %v: %v"
},
{
"id": "api.email_batching.send_batched_email_notification.subject",
@@ -891,11 +891,11 @@
},
{
"id": "api.file.migrate_filenames_to_file_infos.get_file_infos_again.warn",
- "translation": "Unable to get FileInfos for post after migratio, post_id=%v, err=%v"
+ "translation": "Impossible de récupérer le FileInfos du message après la migration, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.get_post_again.warn",
- "translation": "Impossible de récupérer les équipes lorsque le message est en cours de migration vers FileInfos, post_id=%v, err=%v"
+ "translation": "Impossible de récupérer le message lors de la migration vers FileInfos, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.info.app_error",
@@ -903,7 +903,7 @@
},
{
"id": "api.file.migrate_filenames_to_file_infos.migrating_post.debug",
- "translation": "Migrating post to use FileInfos, post_id=%v, err=%v"
+ "translation": "Migration du message vers FileInfos en cours, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.mismatched_filename.warn",
@@ -915,11 +915,11 @@
},
{
"id": "api.file.migrate_filenames_to_file_infos.not_migrating_post.debug",
- "translation": "Post already migrated to use FileInfos, post_id=%v, err=%v"
+ "translation": "Le message a déjà migré vers FileInfos, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.save_file_info.warn",
- "translation": "Impossible de trouver le fichier lorsque le message est en cours de migration vers FileInfos, post_id=%v, channel_id=%v, path=%v, err=%v"
+ "translation": "Impossible de sauvegarder le message lorsque celui-ci est en cours de migration vers FileInfos, post_id=%v, file_id=%v, path=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.save_post.warn",
@@ -1285,7 +1285,7 @@
},
{
"id": "api.post.get_out_of_channel_mentions.regex.error",
- "translation": "Échec de la compilation @mention regex user_id=%v, err=%v"
+ "translation": "Impossible de compiler la regex de @mention user_id=%v, err=%v"
},
{
"id": "api.post.get_post.permissions.app_error",
@@ -1297,11 +1297,11 @@
},
{
"id": "api.post.handle_post_events_and_forget.members.error",
- "translation": "Échec de la récupération des membres du canal channel_id=%v err=%v"
+ "translation": "Impossible de récupérer les membres du canal channel_id=%v err=%v"
},
{
"id": "api.post.handle_post_events_and_forget.profiles.error",
- "translation": "Échec de la récupération des profils utilisateurs team_id=%v, err=%v"
+ "translation": "Impossible de récupérer les profils utilisateurs team_id=%v, err=%v"
},
{
"id": "api.post.handle_post_events_and_forget.team.error",
@@ -1313,7 +1313,7 @@
},
{
"id": "api.post.handle_webhook_events_and_forget.create_post.error",
- "translation": "Échec de la création du message de réponse , err=%v"
+ "translation": "Impossible de créer le message de réponse, err=%v"
},
{
"id": "api.post.handle_webhook_events_and_forget.event_post.error",
@@ -1493,11 +1493,11 @@
},
{
"id": "api.server.start_server.rate_limiting_memory_store",
- "translation": "Unable to initialize rate limiting memory store. Check MemoryStoreSize config setting."
+ "translation": "Impossible d'initialiser la limite d'utilisation de mémoire. Veuillez vérifier la valeur MemoryStoreSize dans les paramètres de configuration."
},
{
"id": "api.server.start_server.rate_limiting_rate_limiter",
- "translation": "Impossible d'initialiser la limite du taux."
+ "translation": "Impossible d'initialiser le taux de limite d'appel sur l'API."
},
{
"id": "api.server.start_server.starting.critical",
@@ -1520,6 +1520,14 @@
"translation": "Arrêt du serveur..."
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Importation de l'utilisateur pour le Bot Slack/messages d'intégration : adresse email, mot de passe : {{.Email}}, {{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "Impossible d'importer l'utilisateur pour le Bot Slack/messages d'intégration : {{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n Canaux ajoutés \r\n"
},
@@ -1533,7 +1541,7 @@
},
{
"id": "api.slackimport.slack_add_channels.import_failed.warn",
- "translation": "Slack Importer: Failed to import channel: %s"
+ "translation": "Importateur Slack : Impossible d'importer le canal: %s"
},
{
"id": "api.slackimport.slack_add_channels.merge",
@@ -1548,32 +1556,40 @@
"translation": "Les messages du bot Slack ne sont pas encore importés"
},
{
+ "id": "api.slackimport.slack_add_posts.bot_user_no_exists.warn",
+ "translation": "Importateur Slack : Impossible d'importer le message du bot car un utilisateur pour le bot n'existe pas"
+ },
+ {
"id": "api.slackimport.slack_add_posts.msg_no_comment.debug",
- "translation": "File comment undefined"
+ "translation": "Commentaire de fichier non défini"
},
{
"id": "api.slackimport.slack_add_posts.msg_no_usr.debug",
"translation": "Message sans utilisateur"
},
{
+ "id": "api.slackimport.slack_add_posts.no_bot_id.warn",
+ "translation": "Importateur Slack : Impossible d'importer le message du bot car le champ BodId est absent"
+ },
+ {
"id": "api.slackimport.slack_add_posts.unsupported.warn",
"translation": "Type de message non supporté : %v, %v"
},
{
"id": "api.slackimport.slack_add_posts.upload_file_not_found.warn",
- "translation": "No file found in Slack export for file upload message with file ID {{.FileId}}"
+ "translation": "Aucun fichier trouvé dans l'export du message Slack contenant le fichier envoyé portant l'ID {{.FileId}}"
},
{
"id": "api.slackimport.slack_add_posts.upload_file_not_in_json.warn",
- "translation": "Cannot import file for upload post with no \"file\" section present in export."
+ "translation": "Impossible d'importer le fichier car l'exportation de Slack ne comporte pas de section 'file'"
},
{
"id": "api.slackimport.slack_add_posts.upload_file_open_failed.warn",
- "translation": "Could not open the upload file with ID {{.FileId}} in the export archive with error: {{.Error}}"
+ "translation": "Impossible d'ouvrir le fichier portant l'ID {{.FileId}} provenant de l'exportation de Slack car l'erreur suivante s'est produite : {{.Error}}"
},
{
"id": "api.slackimport.slack_add_posts.upload_file_upload_failed.warn",
- "translation": "Uploading the file for upload message with file ID {{.FileId}} failed with error: {{.Error}}"
+ "translation": "L'envoi du message comprenant le fichier ayant l'ID {{.FileId}} a échoué avec l'erreur : {{.Error}}"
},
{
"id": "api.slackimport.slack_add_posts.user_no_exists.debug",
@@ -1612,6 +1628,10 @@
"translation": "Échec de la compilation de la @mention correspondant à l'expression régulière pour l'utilisateur Slack {{.UserID}} {{.Username}}"
},
{
+ "id": "api.slackimport.slack_deactivate_bot_user.failed_to_deactivate",
+ "translation": "Importateur Slack : Impossible de désactiver l'utilisateur dédié au bot"
+ },
+ {
"id": "api.slackimport.slack_import.log",
"translation": "Journal import Slack Mattermost\r\n"
},
@@ -1652,6 +1672,22 @@
"translation": "Erreur lors de la lecture de certains messages slack. L'importation peut toutefois quand même fonctionner."
},
{
+ "id": "api.slackimport.slack_sanitise_channel_properties.display_name_too_long.warn",
+ "translation": "Importateur Slack : Le nom d'affichage du canal {{.ChannelName}} est trop long. Il sera tronqué lors de l'import."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.header_too_long.warn",
+ "translation": "Importateur Slack : L'entête du canal {{.ChannelName}} est trop long. Il sera tronqué lors de l'import."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.name_too_long.warn",
+ "translation": "Importateur Slack : Le nom du canal {{.ChannelName}} est trop long. Il sera tronqué lors de l'import."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.purpose_too_long.warn",
+ "translation": "Importateur Slack : La description du canal {{.ChannelName}} est trop longue. Elle sera tronquée lors de l'import."
+ },
+ {
"id": "api.status.init.debug",
"translation": "Initialisation des routes de l'api des messages"
},
@@ -2409,11 +2445,11 @@
},
{
"id": "api.web_hub.start.starting.debug",
- "translation": "Starting %v websocket hubs"
+ "translation": "Lancement de %v concentrateurs websocket"
},
{
"id": "api.web_hub.start.stopping.debug",
- "translation": "stopping websocket hub connections"
+ "translation": "Arrêt des connexions des concentrateurs websocket"
},
{
"id": "api.web_socket.connect.error",
@@ -2508,12 +2544,16 @@
"translation": "Droits insuffisants pour regénérer le jeton du webhook sortant"
},
{
+ "id": "api.webrtc.disabled.app_error",
+ "translation": "WebRTC n'est pas activé sur ce serveur."
+ },
+ {
"id": "api.webrtc.init.debug",
"translation": "Initialisation des routes de l'api WebRTC"
},
{
- "id": "api.webrtc.not_available.app_error",
- "translation": "WebRTC n'est pas disponible sur ce serveur."
+ "id": "api.webrtc.register_token.app_error",
+ "translation": "Une erreur s'est produite lors de l'enregistrement du jeton WebRTC"
},
{
"id": "api.websocket_handler.invalid_param.app_error",
@@ -2804,18 +2844,6 @@
"translation": "Impossible de mettre à jour l'utilisateur SAML. Connexion autorisée malgré tout. err=%v"
},
{
- "id": "ent.webrtc.disabled.app_error",
- "translation": "WebRTC n'est pas activé sur ce serveur."
- },
- {
- "id": "ent.webrtc.license_disable.app_error",
- "translation": "Votre licence ne supporte pas l'utilisation de Mattermost WebRTC"
- },
- {
- "id": "ent.webrtc.register_token.app_error",
- "translation": "Une erreur s'est produite lors de l'enregistrement du jeton WebRTC"
- },
- {
"id": "error.generic.link_message",
"translation": "Retourner sur Mattermost"
},
@@ -3269,7 +3297,7 @@
},
{
"id": "model.config.is_valid.max_channels.app_error",
- "translation": "Nombre maximum d'utilisateurs par équipe invalide dans les paramètres d'équipes. Doit être un entier positif."
+ "translation": "Le nombre maximum de canaux par équipe défini dans les paramètres d'équipe est invalide. Doit être un entier positif."
},
{
"id": "model.config.is_valid.max_file_size.app_error",
@@ -3629,7 +3657,7 @@
},
{
"id": "model.team.is_valid.characters.app_error",
- "translation": "Le nom doit être composé d'au moins 2 caractères alphanumériques en minuscules."
+ "translation": "Le nom doit être composé d'au moins 2 caractères alphanumériques minuscules"
},
{
"id": "model.team.is_valid.company.app_error",
@@ -4645,7 +4673,7 @@
},
{
"id": "store.sql_team.get_member_count.app_error",
- "translation": "Nous ne pouvons pas obtenir les membres de l'équipe"
+ "translation": "Impossible de récupérer le nombre de membres de l'équipe"
},
{
"id": "store.sql_team.get_members.app_error",
@@ -4653,7 +4681,7 @@
},
{
"id": "store.sql_team.get_members_by_ids.app_error",
- "translation": "Nous ne pouvons pas obtenir les membres de l'équipe"
+ "translation": "Impossible de récupérer les membres de l'équipe"
},
{
"id": "store.sql_team.get_teams_for_email.app_error",
@@ -4745,7 +4773,7 @@
},
{
"id": "store.sql_user.get_recently_active_users.app_error",
- "translation": "We encountered an error while finding the recently active users"
+ "translation": "Une erreur s'est produite lors de la recherche des utilisateurs récemment actifs"
},
{
"id": "store.sql_user.get_sysadmin_profiles.app_error",
@@ -4801,7 +4829,7 @@
},
{
"id": "store.sql_user.save.member_count.app_error",
- "translation": "Échec lors de l'obtention du nombre de membres de l'équipe courante"
+ "translation": "Impossible de récupérer le nombre de membres de l'équipe actuelle"
},
{
"id": "store.sql_user.save.username_exists.app_error",
diff --git a/i18n/ja.json b/i18n/ja.json
index 6a2868f2c..cfb389ca1 100644
--- a/i18n/ja.json
+++ b/i18n/ja.json
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### メッセージ\n\nAlt+[メッセージ上でクリック]: 現在のチャンネルで、そのメッセージを最古の未読のメッセージにする\nESC: 現在のチャンネルの全てのメッセージを既読にする\nCTRL+UP (空白の入力欄で): 一つ前に入力したメッセージやスラッシュコマンドを呼び出す\nCTRL+DOWN (空白の入力欄で): 一つ次に入力したメッセージやスラッシュコマンドを呼び出す\nUP (空白の入力欄で): 現在のチャンネルの最新のメッセージを修正する\n@[文字]+TAB: [文字]で始まる@usernameを自動補完する\n:[文字]+TAB: [文字]で始まる絵文字を自動補完する\n\n"
+ "translation": "#### メッセージ\n\nESC: 現在のチャンネルの全てのメッセージを既読にする\nCTRL+UP (空白の入力欄で): 一つ前に入力したメッセージやスラッシュコマンドを呼び出す\nCTRL+DOWN (空白の入力欄で): 一つ次に入力したメッセージやスラッシュコマンドを呼び出す\nUP (空白の入力欄で): 現在のチャンネルの最新のメッセージを修正する\n@[文字]+TAB: [文字]で始まる@usernameを自動補完する\n#[文字]+TAB: [文字]で始まるチャンネルを自動補完する\n:[文字]+TAB: [文字]で始まる絵文字を自動補完する\n\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### メッセージ\n\nAlt+[メッセージ上でクリック]: 現在のチャンネルで、そのメッセージを最古の未読のメッセージにする\nESC: 現在のチャンネルの全てのメッセージを既読にする\nCMD+UP (空白の入力欄で): 一つ前に入力したメッセージやスラッシュコマンドを呼び出す\nCMD+DOWN (空白の入力欄で): 一つ次に入力したメッセージやスラッシュコマンドを呼び出す\nUP (空白の入力欄で): 現在のチャンネルの最新のメッセージを修正する\n@[文字]+TAB: [文字]で始まる@usernameを自動補完する\n:[文字]+TAB: [文字]で始まる絵文字を自動補完する\n\n"
+ "translation": "#### メッセージ\n\nESC: 現在のチャンネルの全てのメッセージを既読にする\nCMD+UP (空白の入力欄で): 一つ前に入力したメッセージやスラッシュコマンドを呼び出す\nCMD+DOWN (空白の入力欄で): 一つ次に入力したメッセージやスラッシュコマンドを呼び出す\nUP (空白の入力欄で): 現在のチャンネルの最新のメッセージを修正する\n@[文字]+TAB: [文字]で始まる@usernameを自動補完する\n#[文字]+TAB: [文字]で始まるチャンネルを自動補完する\n:[文字]+TAB: [文字]で始まる絵文字を自動補完する\n\n"
},
{
"id": "api.command_shortcuts.name",
@@ -1520,6 +1520,14 @@
"translation": "サーバーを停止しています…"
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Slack Bot/Integration投稿インポートユーザー: 電子メール, パスワード: {{.Email}}, {{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "Slack Bot/Integration投稿インポートユーザーをインポートできませんでした: {{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n チャンネルが追加されました \r\n"
},
@@ -1533,7 +1541,7 @@
},
{
"id": "api.slackimport.slack_add_channels.import_failed.warn",
- "translation": "Slack Importer: Failed to import channel: %s"
+ "translation": "Slack Importer: チャンネルをインポートできませんでした: %s"
},
{
"id": "api.slackimport.slack_add_channels.merge",
@@ -1548,6 +1556,10 @@
"translation": "Slack botの投稿はまだインポートされていません"
},
{
+ "id": "api.slackimport.slack_add_posts.bot_user_no_exists.warn",
+ "translation": "Slack Importer: botインポートユーザーが存在しないためbotメッセージをインポートしませんでした。"
+ },
+ {
"id": "api.slackimport.slack_add_posts.msg_no_comment.debug",
"translation": "ファイルコメントが定義されていません"
},
@@ -1556,6 +1568,10 @@
"translation": "ユーザーなしのメッセージ"
},
{
+ "id": "api.slackimport.slack_add_posts.no_bot_id.warn",
+ "translation": "Slack Importer: 項目BotIdが欠けていたためbotメッセージをインポートしませんでした。"
+ },
+ {
"id": "api.slackimport.slack_add_posts.unsupported.warn",
"translation": "サポートされていない投稿の形式: %v, %v"
},
@@ -1612,6 +1628,10 @@
"translation": "Slackユーザー{{.UserID}} {{.Username}}の@mensionに一致する正規表現のコンパイルに失敗しました。"
},
{
+ "id": "api.slackimport.slack_deactivate_bot_user.failed_to_deactivate",
+ "translation": "Slack Importer: botインポートユーザーを非活性にできませんでした。"
+ },
+ {
"id": "api.slackimport.slack_import.log",
"translation": "Mattermost Slackインポートログ\r\n"
},
@@ -1652,6 +1672,22 @@
"translation": "Slackの投稿を読み込み中にエラーが発生しました。しかしインポートは継続できます。"
},
{
+ "id": "api.slackimport.slack_sanitise_channel_properties.display_name_too_long.warn",
+ "translation": "Slack Importer: チャンネル {{.ChannelName}} の表示名が長すぎます。インポートの際に切り詰められます。"
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.header_too_long.warn",
+ "translation": "Slack Importer: チャンネル {{.ChannelName}}のヘッダーが長すぎます。インポートの際に切り詰められます。"
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.name_too_long.warn",
+ "translation": "Slack Importer: チャンネル {{.ChannelName}}の名前が長すぎます。インポートの際に切り詰められます。"
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.purpose_too_long.warn",
+ "translation": "Slack Importer: チャンネル {{.ChannelName}}の目的が長すぎます。インポートの際に切り詰められます。"
+ },
+ {
"id": "api.status.init.debug",
"translation": "状態APIルートを初期化しています"
},
@@ -2508,12 +2544,16 @@
"translation": "外向きのウェブフックトークンを再生成するのに十分な権限が付与されていません"
},
{
+ "id": "api.webrtc.disabled.app_error",
+ "translation": "WebRTCはこのサーバーでは有効化されていません。"
+ },
+ {
"id": "api.webrtc.init.debug",
"translation": "WebRTC APIルートを初期化しています"
},
{
- "id": "api.webrtc.not_available.app_error",
- "translation": "WebRTCはこのサーバーでは利用できません。"
+ "id": "api.webrtc.register_token.app_error",
+ "translation": "WebRTCトークンを登録する際にエラーが発生しました"
},
{
"id": "api.websocket_handler.invalid_param.app_error",
@@ -2804,18 +2844,6 @@
"translation": "既存のSAMLユーザーをアップデートすることはできません。ログインは有効です。err=%v"
},
{
- "id": "ent.webrtc.disabled.app_error",
- "translation": "WebRTCはこのサーバーでは有効化されていません。"
- },
- {
- "id": "ent.webrtc.license_disable.app_error",
- "translation": "あなたのライセンスではMattermost WebRTCを使うことはできません"
- },
- {
- "id": "ent.webrtc.register_token.app_error",
- "translation": "WebRTCトークンを登録する際にエラーが発生しました"
- },
- {
"id": "error.generic.link_message",
"translation": "Mattermostに戻る"
},
diff --git a/i18n/ko.json b/i18n/ko.json
index 939bb7ba2..bd639520a 100644
--- a/i18n/ko.json
+++ b/i18n/ko.json
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### Messages\n\nALT+[click on a message]: 현재 채널에서 가장 오래 읽지 않은 매세지로 설정합니다. \nESC: 현재 채널의 모든 메세지를 읽은 상태로 표시합니다.\nCTRL+UP (in empty input field): 이전 메세지나 입력한 슬래쉬 명령어를 다시 표시합니다.\nCTRL+DOWN (in empty input field): 다음 메세지나 입력한 슬래쉬 명령을 다시 표시합니다.\nUP (in empty input field): 현재 채널의 당신의 마지막 메세지를 수정합니다.\n@[character]+TAB: [character]로 시작하는 @유저명을 자동완성합니다.\n:[character]+TAB: [character]로 시작하는 emoji를 자동 완성합니다.\n\n"
+ "translation": "#### Messages\n\nESC: Mark all messages in the current channel as read\nCTRL+UP (in empty input field): Reprint the previous message or slash command you entered\nCTRL+DOWN (in empty input field): Reprint the next message or slash command you entered\nUP (in empty input field): Edit your last message in the current channel\n@[character]+TAB: Autocomplete @username beginning with [character]\n~[character]+TAB: Autocomplete channel beginning with [character]\n:[character]+TAB: Autocomplete emoji beginning with [character]\n\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### Messages\n\nALT+[click on a message]: 현재 채널에서 가장 오래 읽지 않은 매세지로 설정합니다\nESC: 현재 채널의 모든 메세지를 읽은 상태로 표시합니다\nCMD+UP (in empty input field): 이전 메세지나 입력한 슬래쉬 명령어를 다시 표시합니다.\nCMD+DOWN (in empty input field): 이전 메세지나 입력한 슬래쉬 명령어를 다시 표시합니다.\nUP (in empty input field): 현재 채널의 당신의 마지막 메세지를 수정합니다.\n@[character]+TAB: 현재 채널의 당신의 마지막 메세지를 수정합니다.\n:[character]+TAB: 현재 채널의 당신의 마지막 메세지를 수정합니다.\n\n"
+ "translation": "#### Messages\n\nESC: Mark all messages in the current channel as read\nCMD+UP (in empty input field): Reprint the previous message or slash command you entered\nCMD+DOWN (in empty input field): Reprint the next message or slash command you entered\nUP (in empty input field): Edit your last message in the current channel\n@[character]+TAB: Autocomplete @username beginning with [character]\n~[character]+TAB: Autocomplete channel beginning with [character]\n:[character]+TAB: Autocomplete emoji beginning with [character]\n\n"
},
{
"id": "api.command_shortcuts.name",
@@ -1520,6 +1520,14 @@
"translation": "서버를 정지하는 중..."
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Slack Bot/Integration Posts Import User: Email, Password: {{.Email}}, {{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "Unable to import Slack Bot/Integration Posts Import User: {{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n 채널 추가됨 \r\n"
},
@@ -1548,6 +1556,10 @@
"translation": "Slack bot posts are not imported yet"
},
{
+ "id": "api.slackimport.slack_add_posts.bot_user_no_exists.warn",
+ "translation": "Slack Importer: Not importing bot message as the bot-importing user does not exist."
+ },
+ {
"id": "api.slackimport.slack_add_posts.msg_no_comment.debug",
"translation": "파일 코멘트가 정의되지 않았습니다."
},
@@ -1556,6 +1568,10 @@
"translation": "작성자 없는 메시지"
},
{
+ "id": "api.slackimport.slack_add_posts.no_bot_id.warn",
+ "translation": "Slack Importer: Not importing bot message due to lack of BotId field."
+ },
+ {
"id": "api.slackimport.slack_add_posts.unsupported.warn",
"translation": "지원되지 않는 글 형식: %v, %v"
},
@@ -1612,6 +1628,10 @@
"translation": "Failed to compile the @mention matching regular expression for Slack user {{.UserID}} {{.Username}}"
},
{
+ "id": "api.slackimport.slack_deactivate_bot_user.failed_to_deactivate",
+ "translation": "Slack Importer: Failed to deactivate the bot-importing user."
+ },
+ {
"id": "api.slackimport.slack_import.log",
"translation": "Slack에서 가져오기 Log\r\n"
},
@@ -1652,6 +1672,22 @@
"translation": "슬랙 글 파싱 중 오류가 발생했습니다. 가져오기는 계속 진행됩니다."
},
{
+ "id": "api.slackimport.slack_sanitise_channel_properties.display_name_too_long.warn",
+ "translation": "Slack Importer: Channel {{.ChannelName}} has a display name which is too long. It will be truncated when imported."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.header_too_long.warn",
+ "translation": "Slack Importer: Channel {{.ChannelName}} has a header which is too long. It will be truncated when imported."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.name_too_long.warn",
+ "translation": "Slack Importer: Channel {{.ChannelName}} has a name which is too long. It will be truncated when imported."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.purpose_too_long.warn",
+ "translation": "Slack Importer: Channel {{.ChannelName}} has a purpose which is too long. It will be truncated when imported."
+ },
+ {
"id": "api.status.init.debug",
"translation": "상태 API 루트를 초기화 중"
},
@@ -2508,12 +2544,16 @@
"translation": "Outgoing webhook 토큰을 재생성할 권한이 없습니다"
},
{
+ "id": "api.webrtc.disabled.app_error",
+ "translation": "이 서버에서 WebRTC를 사용할 수 없습니다."
+ },
+ {
"id": "api.webrtc.init.debug",
"translation": "WebRTC API 경로 초기화 중"
},
{
- "id": "api.webrtc.not_available.app_error",
- "translation": "이 서버에서 WebRTC는 사용할 수 없습니다."
+ "id": "api.webrtc.register_token.app_error",
+ "translation": "WebRTC 토큰 등록 중에 에러가 발생하였습니다."
},
{
"id": "api.websocket_handler.invalid_param.app_error",
@@ -2804,18 +2844,6 @@
"translation": "Unable to update existing SAML user. Allowing login anyway. err=%v"
},
{
- "id": "ent.webrtc.disabled.app_error",
- "translation": "이 서버에서 WebRTC를 사용할 수 없습니다."
- },
- {
- "id": "ent.webrtc.license_disable.app_error",
- "translation": "당신의 라이센스는 Mattermost의 WebRTC 사용을 지원하지 않습니다."
- },
- {
- "id": "ent.webrtc.register_token.app_error",
- "translation": "WebRTC 토큰 등록 중에 에러가 발생하였습니다."
- },
- {
"id": "error.generic.link_message",
"translation": "Mattermost로 돌아가기"
},
diff --git a/i18n/nl.json b/i18n/nl.json
index d70200e8b..982f99ebe 100644
--- a/i18n/nl.json
+++ b/i18n/nl.json
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### Berichten\n\nALT+[klik op een bericht]: Markeer bericht als oudste ongelezen bericht in het huidige kanaal\nESC: Markeer alle berichten in het huidige kanaal als gelezen\nCTRL+UP (in een leeg invoer veld): Herhaal het vorige bericht of slash commando U heeft gegeven\nCTRL+DOWN (in een leeg invoer veld): Herhaal het volgende bericht of slash commando U heeft gegeven\nUP (in een leeg invoer veld): Bewerk jouw laatste bericht in het huidige kanaal\n@[karakter]+TAB: Autocomplete @gebruikersnaam begint met [karakter]\n:[karakter]+TAB: Autocomplete emoji begint met [karakter]\n\n"
+ "translation": "#### Messages\n\nESC: Mark all messages in the current channel as read\nCTRL+UP (in empty input field): Reprint the previous message or slash command you entered\nCTRL+DOWN (in empty input field): Reprint the next message or slash command you entered\nUP (in empty input field): Edit your last message in the current channel\n@[character]+TAB: Autocomplete @username beginning with [character]\n~[character]+TAB: Autocomplete channel beginning with [character]\n:[character]+TAB: Autocomplete emoji beginning with [character]\n\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### Berichten\n\nALT+[klik op een bericht]: Markeer bericht als oudste ongelezen bericht in het huidige kanaal\nESC: Markeer alle berichten in het huidige kanaal als gelezen\nCTRL+UP (in een leeg invoer veld): Herhaal het vorige bericht of slash commando U heeft gegeven\nCTRL+DOWN (in een leeg invoer veld): Herhaal het volgende bericht of slash commando U heeft gegeven\nUP (in een leeg invoer veld): Bewerk jouw laatste bericht in het huidige kanaal\n@[karakter]+TAB: Autocomplete @gebruikersnaam begint met [karakter]\n:[karakter]+TAB: Autocomplete emoji begint met [karakter]\n\n"
+ "translation": "#### Messages\n\nESC: Mark all messages in the current channel as read\nCMD+UP (in empty input field): Reprint the previous message or slash command you entered\nCMD+DOWN (in empty input field): Reprint the next message or slash command you entered\nUP (in empty input field): Edit your last message in the current channel\n@[character]+TAB: Autocomplete @username beginning with [character]\n~[character]+TAB: Autocomplete channel beginning with [character]\n:[character]+TAB: Autocomplete emoji beginning with [character]\n\n"
},
{
"id": "api.command_shortcuts.name",
@@ -1520,6 +1520,14 @@
"translation": "Server wordt gestopt..."
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Slack Bot/Integration Posts Import User: Email, Password: {{.Email}}, {{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "Unable to import Slack Bot/Integration Posts Import User: {{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n Kanalen Toegevoegd \r\n"
},
@@ -1548,6 +1556,10 @@
"translation": "Slack bot posts zijn nog niet geimporteerd"
},
{
+ "id": "api.slackimport.slack_add_posts.bot_user_no_exists.warn",
+ "translation": "Slack Importer: Not importing bot message as the bot-importing user does not exist."
+ },
+ {
"id": "api.slackimport.slack_add_posts.msg_no_comment.debug",
"translation": "File comment undefined"
},
@@ -1556,6 +1568,10 @@
"translation": "Bericht zonder gebruiker"
},
{
+ "id": "api.slackimport.slack_add_posts.no_bot_id.warn",
+ "translation": "Slack Importer: Not importing bot message due to lack of BotId field."
+ },
+ {
"id": "api.slackimport.slack_add_posts.unsupported.warn",
"translation": "Niet ondersteund bericht type: %v, %v"
},
@@ -1612,6 +1628,10 @@
"translation": "Mislukt om de @vermelding te maken met reguliere expressie voor Slack gebruiker {{.UserID}} {{.Username}}"
},
{
+ "id": "api.slackimport.slack_deactivate_bot_user.failed_to_deactivate",
+ "translation": "Slack Importer: Failed to deactivate the bot-importing user."
+ },
+ {
"id": "api.slackimport.slack_import.log",
"translation": "Mattermost Slack importeer log\r\n"
},
@@ -1652,6 +1672,22 @@
"translation": "Error parsing some slack posts. Import may work anyway."
},
{
+ "id": "api.slackimport.slack_sanitise_channel_properties.display_name_too_long.warn",
+ "translation": "Slack Importer: Channel {{.ChannelName}} has a display name which is too long. It will be truncated when imported."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.header_too_long.warn",
+ "translation": "Slack Importer: Channel {{.ChannelName}} has a header which is too long. It will be truncated when imported."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.name_too_long.warn",
+ "translation": "Slack Importer: Channel {{.ChannelName}} has a name which is too long. It will be truncated when imported."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.purpose_too_long.warn",
+ "translation": "Slack Importer: Channel {{.ChannelName}} has a purpose which is too long. It will be truncated when imported."
+ },
+ {
"id": "api.status.init.debug",
"translation": "Het initialiseren van status api routes"
},
@@ -2508,12 +2544,16 @@
"translation": "Ongeldige rechten om tokens voor uitgaande webhooks opnieuw te genereren"
},
{
+ "id": "api.webrtc.disabled.app_error",
+ "translation": "WebRTC is niet ingeschakeld op deze server."
+ },
+ {
"id": "api.webrtc.init.debug",
"translation": "Initialisatie van de WebRTC api routes"
},
{
- "id": "api.webrtc.not_available.app_error",
- "translation": "WebRTC is niet beschikbaar op deze server."
+ "id": "api.webrtc.register_token.app_error",
+ "translation": "We encountered an error trying to register the WebRTC Token"
},
{
"id": "api.websocket_handler.invalid_param.app_error",
@@ -2804,18 +2844,6 @@
"translation": "Kon bestaande SAML gebruiker niet bijwerken. Inloggen toch toestaan. err=%v"
},
{
- "id": "ent.webrtc.disabled.app_error",
- "translation": "WebRTC is niet ingeschakeld op deze server."
- },
- {
- "id": "ent.webrtc.license_disable.app_error",
- "translation": "Jouw licentie ondersteund geen gebruik van Mattermost WebRTC"
- },
- {
- "id": "ent.webrtc.register_token.app_error",
- "translation": "We encountered an error trying to register the WebRTC Token"
- },
- {
"id": "error.generic.link_message",
"translation": "Ga terug naar Mattermost"
},
diff --git a/i18n/pt-BR.json b/i18n/pt-BR.json
index 568e2f2cb..e6ec2bc51 100644
--- a/i18n/pt-BR.json
+++ b/i18n/pt-BR.json
@@ -329,7 +329,7 @@
},
{
"id": "api.channel.remove_member.removed",
- "translation": "%v foi removido do canal"
+ "translation": "%v foi removido do canal."
},
{
"id": "api.channel.remove_member.unable.app_error",
@@ -609,11 +609,11 @@
},
{
"id": "api.command_shortcuts.browser",
- "translation": "#### Comandos Nativos do Navegador\n\nALT+LEFT: Canal anterior no seu histórico\nALT+RIGHT: Próximo canal no seu histórico\nCTRL+PLUS: Aumenta o tamanho da fonte (zoom in)\nCTRL+MINUS: Diminui o tamanho da fonte (zoom out)\nSHIFT+UP (no campo de entrada): Seleciona o texto até a linha anterior\nSHIFT+DOWN (no campo de entrada): Seleciona o texto até a próxima linha\nSHIFT+ENTER (no campo de entrada): Cria nova linha\n"
+ "translation": "#### Comandos Nativos do Navegador\n\nALT+ESQUERDA: Canal anterior no seu histórico\nALT+DIREITA: Próximo canal no seu histórico\nCTRL+MAIS: Aumenta o tamanho da fonte (zoom in)\nCTRL+MENOS: Diminui o tamanho da fonte (zoom out)\nSHIFT+CIMA (no campo de entrada): Seleciona o texto até a linha anterior\nSHIFT+BAIXO (no campo de entrada): Seleciona o texto até a próxima linha\nSHIFT+ENTER (no campo de entrada): Cria nova linha\n"
},
{
"id": "api.command_shortcuts.browser_mac",
- "translation": "#### Comandos Nativos do Navegador\n\nCMD+[: Canal anterior no seu histórico\nCMD+]: Próximo canal no seu histórico\nCMD+PLUS: Aumenta o tamanho da fonte (zoom in)\nCMD+MINUS: Diminui o tamanho da fonte (zoom out)\nSHIFT+UP (no campo de entrada): Seleciona o texto até a linha anterior\nSHIFT+DOWN (no campo de entrada): Seleciona o texto até a próxima linha\nSHIFT+ENTER (no campo de entrada): Cria nova linha\n"
+ "translation": "#### Comandos Nativos do Navegador\n\nCMD+[: Canal anterior no seu histórico\nCMD+]: Próximo canal no seu histórico\nCMD+MAIS: Aumenta o tamanho da fonte (zoom in)\nCMD+MENOS: Diminui o tamanho da fonte (zoom out)\nSHIFT+CIMA (no campo de entrada): Seleciona o texto até a linha anterior\nSHIFT+BAIXO (no campo de entrada): Seleciona o texto até a próxima linha\nSHIFT+ENTER (no campo de entrada): Cria nova linha\n"
},
{
"id": "api.command_shortcuts.desc",
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### Mensagens\n\nALT+[clique na mensagem]: Define a mensagem como a mensagem mais velha não lida no canal atual\nESC: Marca todas as mensagens do canal atual como lida\nCTRL+UP (campo de entrada vazio): Reimprimi a mensagem anterior ou comando slash digitado\nCTRL+DOWN (campo de entrada vazio): Reimprimi a próxima mensagem ou comando slash digitado\nUP (campo de entrada vazio): Editar sua última mensagem no canal atual\n@[caracter]+TAB: Autocompleta @usuário começando com [caracter]\n:[caracter]+TAB: Autocompleta o emoji começando com [caracter]\n\n"
+ "translation": "#### Mensagens\n\nESC: Marcar todas as mensagens do canal atual como lidas\nCTRL+CIMA (no campo de entrada vazio): Mostra a última mensagem ou comando digitado\nCTRL+BAIXO (no campo de entrada vazio): Mostra a próxima mensagem ou comando digitado\nCIMA (no campo de entrada vazio): Edita sua última mensagem no canal atual\n@[caracter]+TAB: Autocompleta @usuário começado com [caracter]\n#[caracter]+TAB: Autocompleta canal começado com [caracter]\n:[caracter]+TAB: Autocompleta emoji começado com [caracter]\n\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### Mensagens\n\nALT+[clique na mensagem]: Define a mensagem como a mensagem mais velha não lida no canal atual\nESC: Marca todas as mensagens do canal atual como lida\nCMD+UP (campo de entrada vazio): Reimprimi a mensagem anterior ou comando slash digitado\nCMD+DOWN (campo de entrada vazio): Reimprimi a próxima mensagem ou comando slash digitado\nUP (campo de entrada vazio): Editar sua última mensagem no canal atual\n@[caracter]+TAB: Autocompleta @usuário começando com [caracter]\n:[caracter]+TAB: Autocompleta o emoji começando com [caracter]\n\n"
+ "translation": "#### Mensagens\n\nESC: Marcar todas as mensagens do canal atual como lidas\nCMD+CIMA (no campo vazio de entrada): Mostra a última mensagem ou comando digitado\nCMD+BAIXO (no campo vazio de entrada): Mostra a próxima mensagem ou comando digitado\nCIMA (no campo vazio de entrada): Edita sua última mensagem no canal atual\n@[caracter]+TAB: Autocompleta @usuário começado com [caracter]\n#[caracter]+TAB: Autocompleta channel começado com [caracter]\n:[caracter]+TAB: Autocompleta emoji começado com [caracter]\n\n"
},
{
"id": "api.command_shortcuts.name",
@@ -641,11 +641,11 @@
},
{
"id": "api.command_shortcuts.nav",
- "translation": "### Atalhos do Teclado\n\n#### Navegação\n\nALT+UP: Canal ou mensagem direta anterior na barra lateral esquerda\nALT+DOWN: Próximo canal ou mensagem direta na barra lateral esquerda\nALT+SHIFT+UP: Canal anterior ou mensagem direta na barra lateral esquerda com mensagens não lidas\nALT+SHIFT+DOWN: Próximo canal ou mensagem direta na barra lateral esquerda com mensagens não lidas\nCTRL+K: Abra uma janela de troca rápida de canal\nCTRL+SHIFT+A: Abre as configurações de conta\nCTRL+SHIFT+M: Abre as menções recentes\n\n"
+ "translation": "### Atalhos do Teclado\n\n#### Navegação\n\nALT+CIMA: Canal ou mensagem direta anterior na barra lateral esquerda\nALT+BAIXO: Próximo canal ou mensagem direta na barra lateral esquerda\nALT+SHIFT+CIMA: Canal anterior ou mensagem direta na barra lateral esquerda com mensagens não lidas\nALT+SHIFT+BAIXO: Próximo canal ou mensagem direta na barra lateral esquerda com mensagens não lidas\nCTRL+K: Abra uma janela de troca rápida de canal\nCTRL+SHIFT+A: Abre as configurações de conta\nCTRL+SHIFT+M: Abre as menções recentes\n\n"
},
{
"id": "api.command_shortcuts.nav_mac",
- "translation": "### Atalhos do Teclado\n\n#### Navegação\n\nALT+UP: Canal ou mensagem direta anterior na barra lateral esquerda\nALT+DOWN: Próximo canal ou mensagem direta na barra lateral esquerda\nALT+SHIFT+UP: Canal anterior ou mensagem direta na barra lateral esquerda com mensagens não lidas\nALT+SHIFT+DOWN: Próximo canal ou mensagem direta na barra lateral esquerda com mensagens não lidas\nCMD+K: Abra uma janela de troca rápida de canal\nCMD+SHIFT+A: Abre as configurações de conta\nCMD+SHIFT+M: Abre as menções recentes\n\n"
+ "translation": "### Atalhos do Teclado\n\n#### Navegação\n\nALT+CIMA: Canal ou mensagem direta anterior na barra lateral esquerda\nALT+BAIXO: Próximo canal ou mensagem direta na barra lateral esquerda\nALT+SHIFT+CIMA: Canal anterior ou mensagem direta na barra lateral esquerda com mensagens não lidas\nALT+SHIFT+BAIXO: Próximo canal ou mensagem direta na barra lateral esquerda com mensagens não lidas\nCMD+K: Abra uma janela de troca rápida de canal\nCMD+SHIFT+A: Abre as configurações de conta\nCMD+SHIFT+M: Abre as menções recentes\n\n"
},
{
"id": "api.command_shrug.desc",
@@ -763,7 +763,7 @@
},
{
"id": "api.email_batching.send_batched_email_notification.user.app_error",
- "translation": "Não foi possível encontrar o o destinatário para a notificação de e mail em lote"
+ "translation": "Não foi possível encontrar o destinatário para a notificação de email em lote"
},
{
"id": "api.email_batching.start.starting",
@@ -1520,6 +1520,14 @@
"translation": "Parando o Servidor..."
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Slack Bot/Integração Importar Posts Usuário: Email, Senha: {{.Email}}, {{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "Não foi possível importar Slack Bot/Integração Importar Posts Usuário: {{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n Canal Adicionado \r\n"
},
@@ -1533,7 +1541,7 @@
},
{
"id": "api.slackimport.slack_add_channels.import_failed.warn",
- "translation": "Slack Importer: Failed to import channel: %s"
+ "translation": "Slack Importer: Falha ao importar o canal: %s"
},
{
"id": "api.slackimport.slack_add_channels.merge",
@@ -1548,6 +1556,10 @@
"translation": "Slack bot posts não foram importados ainda"
},
{
+ "id": "api.slackimport.slack_add_posts.bot_user_no_exists.warn",
+ "translation": "Slack Importer: Não importado mensagens do bot usuário bot-importing não existe."
+ },
+ {
"id": "api.slackimport.slack_add_posts.msg_no_comment.debug",
"translation": "Comentário do arquivo indefinido"
},
@@ -1556,6 +1568,10 @@
"translation": "Mensagem sem usuário"
},
{
+ "id": "api.slackimport.slack_add_posts.no_bot_id.warn",
+ "translation": "Slack Importer: Não importado mensagens do bot devido a falta do campo Botid."
+ },
+ {
"id": "api.slackimport.slack_add_posts.unsupported.warn",
"translation": "Tipo de post não suportado: %v, %v"
},
@@ -1612,6 +1628,10 @@
"translation": "Falha ao compilar a @menção correspondendo a expressão regular para o usuário Slack {{.UserID}} {{.Username}}"
},
{
+ "id": "api.slackimport.slack_deactivate_bot_user.failed_to_deactivate",
+ "translation": "Slack Importer: Falha ao desativar o usuário bot-importing."
+ },
+ {
"id": "api.slackimport.slack_import.log",
"translation": "Mattermost Log de Importação Slack\r\n"
},
@@ -1652,6 +1672,22 @@
"translation": "Erro ao analisar algumas postagens do slack. Importação deve funcionar de qualquer maneira."
},
{
+ "id": "api.slackimport.slack_sanitise_channel_properties.display_name_too_long.warn",
+ "translation": "Slack Importer: Canal {{.ChannelName}} tem um nome de exibição muito grande. Será truncado quando importado."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.header_too_long.warn",
+ "translation": "Slack Importer: Canal {{.ChannelName}} tem um cabeçalho que é muito grande. Será truncado quando importado."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.name_too_long.warn",
+ "translation": "Slack Importer: Canal {{.ChannelName}} tem um nome muito grande. Será truncado quando importado."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.purpose_too_long.warn",
+ "translation": "Slack Importer: Canal {{.ChannelName}} tem um propósito muito grande. Será truncado quando importado."
+ },
+ {
"id": "api.status.init.debug",
"translation": "Inicializando status api routes"
},
@@ -1741,11 +1777,11 @@
},
{
"id": "api.team.invite_members.restricted_system_admin.app_error",
- "translation": "Convite a novos usuários para uma equipe está restrito para o Administrador do Sistema"
+ "translation": "Convite a novos usuários para uma equipe está restrito para o Administrador do Sistema."
},
{
"id": "api.team.invite_members.restricted_team_admin.app_error",
- "translation": "Convite a novos usuários para uma equipe está restrito para o Administrador do Sistema e Equipe"
+ "translation": "Convite a novos usuários para uma equipe está restrito para o Administrador do Sistema e Equipe."
},
{
"id": "api.team.invite_members.send.error",
@@ -2508,12 +2544,16 @@
"translation": "Permissões inadequadas para re-gerar o token do webhook de saída"
},
{
+ "id": "api.webrtc.disabled.app_error",
+ "translation": "WebRTC não está ativo neste servidor."
+ },
+ {
"id": "api.webrtc.init.debug",
"translation": "Inicializando WebRTC api routes"
},
{
- "id": "api.webrtc.not_available.app_error",
- "translation": "WebRTC não está disponível neste servidor."
+ "id": "api.webrtc.register_token.app_error",
+ "translation": "Encontrado um erro ao tentar registrar o Token WebRTC"
},
{
"id": "api.websocket_handler.invalid_param.app_error",
@@ -2804,18 +2844,6 @@
"translation": "Não é possível atualizar o usuário SAML existente. Permitindo o login de qualquer maneira. err=%v"
},
{
- "id": "ent.webrtc.disabled.app_error",
- "translation": "WebRTC não está ativo neste servidor."
- },
- {
- "id": "ent.webrtc.license_disable.app_error",
- "translation": "Sua licença não suporta usar Mattermost WebRTC"
- },
- {
- "id": "ent.webrtc.register_token.app_error",
- "translation": "Encontrado um erro ao tentar registrar o Token WebRTC"
- },
- {
"id": "error.generic.link_message",
"translation": "Voltar ao Mattermost"
},
diff --git a/i18n/ru.json b/i18n/ru.json
index 092e51f01..aee7f9e1a 100644
--- a/i18n/ru.json
+++ b/i18n/ru.json
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### Сообщения\n\nALT+[клик на сообщение]: Установить сообщение, в текущем канале, как непрочитанное\nESC: Отметить все сообщения в текущем канале как прочитанные\nCMD+UP (в пустом поле ввода): Восстановить предыдущее введенное сообщение или команду\nCMD+DOWN (в пустом поле ввода): Восстановить следующее введенное сообщение или команду\nUP (в пустом поле ввода): Править свое последнее сообщение в текущем канале\n@[character]+TAB: Дополнить имя пользователя @username начинающееся с [character]\n:[character]+TAB: Дополнить эмодзи начинающийся с [character]\n\n"
+ "translation": "#### Messages\n\nESC: Mark all messages in the current channel as read\nCTRL+UP (in empty input field): Reprint the previous message or slash command you entered\nCTRL+DOWN (in empty input field): Reprint the next message or slash command you entered\nUP (in empty input field): Edit your last message in the current channel\n@[character]+TAB: Autocomplete @username beginning with [character]\n~[character]+TAB: Autocomplete channel beginning with [character]\n:[character]+TAB: Autocomplete emoji beginning with [character]\n\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### Сообщения\n\nALT+[click on a message]: Установить сообщение, в текущем канале, как непрочитанное\nESC: Отметить все сообщения в текущем канале как прочитанные\nCMD+UP (в пустом поле ввода): Восстановить предыдущее введенное сообщение или команду\nCMD+DOWN (в пустом поле ввода): Восстановить следующее введенное сообщение или команду\nUP (в пустом поле ввода): Править свое последнее сообщение в текущем канале\n@[character]+TAB: Дополнить имя пользователя @username начинающееся с [character]\n:[character]+TAB: Дополнить эмодзи начинающийся с [character]\n\n"
+ "translation": "#### Messages\n\nESC: Mark all messages in the current channel as read\nCMD+UP (in empty input field): Reprint the previous message or slash command you entered\nCMD+DOWN (in empty input field): Reprint the next message or slash command you entered\nUP (in empty input field): Edit your last message in the current channel\n@[character]+TAB: Autocomplete @username beginning with [character]\n~[character]+TAB: Autocomplete channel beginning with [character]\n:[character]+TAB: Autocomplete emoji beginning with [character]\n\n"
},
{
"id": "api.command_shortcuts.name",
@@ -891,7 +891,7 @@
},
{
"id": "api.file.migrate_filenames_to_file_infos.get_file_infos_again.warn",
- "translation": "Невозможно получить FileInfos из сообщения после миграции, post_id=%v, err=%v"
+ "translation": "Невозможно получить информацию о файлах из сообщения после миграции, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.get_post_again.warn",
@@ -1520,6 +1520,14 @@
"translation": "Остановка сервера..."
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Slack Bot/Integration Posts Import User: Email, Password: {{.Email}}, {{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "Unable to import Slack Bot/Integration Posts Import User: {{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n Каналы добавлены \r\n"
},
@@ -1533,7 +1541,7 @@
},
{
"id": "api.slackimport.slack_add_channels.import_failed.warn",
- "translation": "Slack Importer: Failed to import channel: %s"
+ "translation": "Slack Импортер: не удалось импортировать канал: %s"
},
{
"id": "api.slackimport.slack_add_channels.merge",
@@ -1548,6 +1556,10 @@
"translation": "Посты Slack-бота еще не импортированы"
},
{
+ "id": "api.slackimport.slack_add_posts.bot_user_no_exists.warn",
+ "translation": "Slack Importer: Not importing bot message as the bot-importing user does not exist."
+ },
+ {
"id": "api.slackimport.slack_add_posts.msg_no_comment.debug",
"translation": "Комментарий к файлу неопределен"
},
@@ -1556,6 +1568,10 @@
"translation": "Сообщение без участия пользователя"
},
{
+ "id": "api.slackimport.slack_add_posts.no_bot_id.warn",
+ "translation": "Slack Importer: Not importing bot message due to lack of BotId field."
+ },
+ {
"id": "api.slackimport.slack_add_posts.unsupported.warn",
"translation": "Неподдерживаемый тип сообщения: %v, %v"
},
@@ -1612,6 +1628,10 @@
"translation": "Не удалось составить @упоминание, соответствующее регулярному выражению, для пользователя Slack {{.UserID}} {{.Username}}"
},
{
+ "id": "api.slackimport.slack_deactivate_bot_user.failed_to_deactivate",
+ "translation": "Slack Importer: Failed to deactivate the bot-importing user."
+ },
+ {
"id": "api.slackimport.slack_import.log",
"translation": "Лог импорта Mattermost Slack\r\n"
},
@@ -1652,6 +1672,22 @@
"translation": "Ошибка разбора некоторых постов slack. Несмотря на это, импорт может быть выполнен."
},
{
+ "id": "api.slackimport.slack_sanitise_channel_properties.display_name_too_long.warn",
+ "translation": "Менеджер импорта Slack: Канал {{.ChannelName}} имеет слишком длинное имя. Оно будет укорочено при импорте."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.header_too_long.warn",
+ "translation": "Менеджер импорта Slack: Канал {{.ChannelName}} имеет слишком длинный заголовок. Он будет укорочен при импорте."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.name_too_long.warn",
+ "translation": "Менеджер импорта Slack: Канал {{.ChannelName}} имеет слишком длинное имя. Оно будет укорочено при импорте."
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.purpose_too_long.warn",
+ "translation": "Менеджер импорта Slack: Канал {{.ChannelName}} имеет слишком длинное имя. Оно будет укорочено при импорте."
+ },
+ {
"id": "api.status.init.debug",
"translation": "Инициализация API"
},
@@ -2508,12 +2544,16 @@
"translation": "Несоответствующие права для генерации нового токена для исходящего вебхука"
},
{
+ "id": "api.webrtc.disabled.app_error",
+ "translation": "WebRTC не доступен на этом сервере."
+ },
+ {
"id": "api.webrtc.init.debug",
"translation": "Инициализация API WebRTC"
},
{
- "id": "api.webrtc.not_available.app_error",
- "translation": "WebRTC недоступен на этом сервере."
+ "id": "api.webrtc.register_token.app_error",
+ "translation": "Мы столкнулись с неожиданной ошибкой при попытке зарегистрировать токен WebRTC"
},
{
"id": "api.websocket_handler.invalid_param.app_error",
@@ -2804,18 +2844,6 @@
"translation": "Невозможно обновить существующего пользователя SAML. Несмотря на это, вход разрешен. err=%v"
},
{
- "id": "ent.webrtc.disabled.app_error",
- "translation": "WebRTC не включен на этом сервере."
- },
- {
- "id": "ent.webrtc.license_disable.app_error",
- "translation": "Ваша лицензия не поддерживает использование Mattermost WebRTC"
- },
- {
- "id": "ent.webrtc.register_token.app_error",
- "translation": "Мы столкнулись с неожиданной ошибкой при попытке зарегистрировать WebRTC Токен"
- },
- {
"id": "error.generic.link_message",
"translation": "Вернуться к Mattermost"
},
diff --git a/i18n/zh_CN.json b/i18n/zh_CN.json
index 0f6bc3370..0fd75134e 100644
--- a/i18n/zh_CN.json
+++ b/i18n/zh_CN.json
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### 消息\n\nALT+[点击信息]:设信息为您在本频道最早未读信息\nESC:标此频道所有消息为已读\nCMD +向上键 (在空输入框):重输入您上个输入的消息或斜杠命令\nCMD +向下键 (在空输入框):重输入您下个输入的消息或斜杠命令\n向上键 (在空输入框):编辑你在本频道发的上一条消息\n@[字]+TAB:自动完成以[字]开头的 @用户名\n:[字]+TAB: 自动完成以[字]开头的表情符\n\n"
+ "translation": "#### 消息\n\nESC:标当前频道所有消息为已读\nCTRL+向上键 (在空输入栏):重用您输入的上一条消息或斜杠命令\nCTRL+向下键 (在空输入栏):重用您输入的下一条消息或斜杠命令\n向上键 (在空输入栏):修改您当前频道的上一条消息\n@[字符]+TAB:自动完成以[字符]开头的 @用户名\n#[字符]+TAB:自动完成以[字符]开头的频道\n:[字符]+TAB:自动完成以[字符]开头的表情符\n\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### 消息\n\nALT+[点击信息]:设信息为您在本频道最早未读信息\nESC:标此频道所有消息为已读\nCMD +向上键 (在空输入框):重输入您上个输入的消息或斜杠命令\nCMD +向下键 (在空输入框):重输入您下个输入的消息或斜杠命令\n向上键 (在空输入框):编辑你在本频道发的上一条消息\n@[字]+TAB:自动完成以[字]开头的 @用户名\n:[字]+TAB: 自动完成以[字]开头的表情符\n\n"
+ "translation": "#### 消息\n\nESC:标当前频道所有消息为已读\nCMD+向上键 (在空输入栏):重用您输入的上一条消息或斜杠命令\nCMD+向下键 (在空输入栏):重用您输入的下一条消息或斜杠命令\n向上键 (在空输入栏):修改您当前频道的上一条消息\n@[字符]+TAB:自动完成以[字符]开头的 @用户名\n#[字符]+TAB:自动完成以[字符]开头的频道\n:[字符]+TAB:自动完成以[字符]开头的表情符\n\n"
},
{
"id": "api.command_shortcuts.name",
@@ -891,7 +891,7 @@
},
{
"id": "api.file.migrate_filenames_to_file_infos.get_file_infos_again.warn",
- "translation": "转移数据后未能获取 FileInfos, post_id=%v, err=%v"
+ "translation": "转移数据后未能获取消息 FileInfos, post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.get_post_again.warn",
@@ -1520,6 +1520,14 @@
"translation": "正在停止服务..."
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Slack 机器人/整合消息导入用户:邮箱地址,密码: {{.Email}}, {{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "无法导入 Slack 机器人/整合消息导入用户:{{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n 频道已添加 \r\n"
},
@@ -1533,7 +1541,7 @@
},
{
"id": "api.slackimport.slack_add_channels.import_failed.warn",
- "translation": "Slack Importer: Failed to import channel: %s"
+ "translation": "Slack 导入:导入频道失败:%s"
},
{
"id": "api.slackimport.slack_add_channels.merge",
@@ -1548,6 +1556,10 @@
"translation": "Slack 机器人的信息未被导入"
},
{
+ "id": "api.slackimport.slack_add_posts.bot_user_no_exists.warn",
+ "translation": "Slack 导入:未导入机器人消息因为机器人导入用户不存在。"
+ },
+ {
"id": "api.slackimport.slack_add_posts.msg_no_comment.debug",
"translation": "文件评论未定义"
},
@@ -1556,6 +1568,10 @@
"translation": "未知用户消息"
},
{
+ "id": "api.slackimport.slack_add_posts.no_bot_id.warn",
+ "translation": "Slack 导入:未导入机器人消息因为缺少 BotId 字段。"
+ },
+ {
"id": "api.slackimport.slack_add_posts.unsupported.warn",
"translation": "不支持的邮件类型: %v, %v"
},
@@ -1612,6 +1628,10 @@
"translation": "给 Slack 用户 {{.UserID}} {{.Username}} 编译 @提及 正规表达式时失败"
},
{
+ "id": "api.slackimport.slack_deactivate_bot_user.failed_to_deactivate",
+ "translation": "Slack 导入:停用机器人导入用户失败。"
+ },
+ {
"id": "api.slackimport.slack_import.log",
"translation": "Mattermost Slack 导入日志 \r\n"
},
@@ -1652,6 +1672,22 @@
"translation": "解析 slack 消息时出错。导入可能仍然可用。"
},
{
+ "id": "api.slackimport.slack_sanitise_channel_properties.display_name_too_long.warn",
+ "translation": "Slack 导入:频道 {{.ChannelName}} 的显示名过长。导入时会被截断。"
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.header_too_long.warn",
+ "translation": "Slack 导入:频道 {{.ChannelName}} 的标题过长。导入时会被截断。"
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.name_too_long.warn",
+ "translation": "Slack 导入:频道 {{.ChannelName}} 的名称过长。导入时会被截断。"
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.purpose_too_long.warn",
+ "translation": "Slack 导入:频道 {{.ChannelName}} 的作用过长。导入时会被截断。"
+ },
+ {
"id": "api.status.init.debug",
"translation": "初始化状态 API 路由"
},
@@ -2508,12 +2544,16 @@
"translation": "没有权限重新生成传出webhook令牌"
},
{
+ "id": "api.webrtc.disabled.app_error",
+ "translation": "WebRTC 未在本服务器开启。"
+ },
+ {
"id": "api.webrtc.init.debug",
"translation": "初始化 WebRTC api 路由中"
},
{
- "id": "api.webrtc.not_available.app_error",
- "translation": "WebRTC 在本服务器不可用。"
+ "id": "api.webrtc.register_token.app_error",
+ "translation": "我们在注册 WebRTC 令牌时遇到个错误"
},
{
"id": "api.websocket_handler.invalid_param.app_error",
@@ -2804,18 +2844,6 @@
"translation": "无法更新现有SAML用户。仍允许登入。err=%v"
},
{
- "id": "ent.webrtc.disabled.app_error",
- "translation": "WebRTC 未在本服务器开启。"
- },
- {
- "id": "ent.webrtc.license_disable.app_error",
- "translation": "您的许可证不支持使用 Mattermost WebRTC"
- },
- {
- "id": "ent.webrtc.register_token.app_error",
- "translation": "我们在注册 WebRTC 令牌时遇到个错误"
- },
- {
"id": "error.generic.link_message",
"translation": "返回到 Mattermost"
},
diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json
index 97efb1ae8..e0eca19da 100644
--- a/i18n/zh_TW.json
+++ b/i18n/zh_TW.json
@@ -629,11 +629,11 @@
},
{
"id": "api.command_shortcuts.msgs",
- "translation": "#### 訊息\n\nALT+[按訊息]:設定訊息為目前頻道中最舊的未讀訊息\nESC:將當前頻道所有訊息設為已讀\nCMD+UP (在空的輸入欄):顯示上一個您輸入的訊息或是斜線命令\nCMD+DOWN (在空的輸入欄):顯示下一個您輸入的訊息或是斜線命令\nUP (在空的輸入欄):編輯當前頻道您的上一個訊息\n@[文字]+TAB:自動完成以[文字]起始的@使用者帳號\n:[文字]+TAB:自動完成以[文字]起始的顏文字\n\n"
+ "translation": "#### 訊息\n\nESC:將當前頻道所有訊息設為已讀\nCTRL+UP (在空的輸入欄):顯示上一個您輸入的訊息或是斜線命令\nCTRL+DOWN (在空的輸入欄):顯示下一個您輸入的訊息或是斜線命令\nUP (在空的輸入欄):編輯當前頻道您的上一個訊息\n@[文字]+TAB:自動完成以[文字]起始的@使用者帳號\n#[文字]+TAB:自動完成以[文字]起始的頻道\n:[文字]+TAB:自動完成以[文字]起始的顏文字\n\n"
},
{
"id": "api.command_shortcuts.msgs_mac",
- "translation": "#### 訊息\n\nALT+[按訊息]:設定訊息為目前頻道中最舊的未讀訊息\nESC:將當前頻道所有訊息設為已讀\nCMD+UP (在空的輸入欄):顯示上一個您輸入的訊息或是斜線命令\nCMD+DOWN (在空的輸入欄):顯示下一個您輸入的訊息或是斜線命令\nUP (在空的輸入欄):編輯當前頻道您的上一個訊息\n@[文字]+TAB:自動完成以[文字]起始的@使用者帳號\n:[文字]+TAB:自動完成以[文字]起始的顏文字\n\n"
+ "translation": "#### 訊息\n\nESC:將當前頻道所有訊息設為已讀\nCMD+UP (在空的輸入欄):顯示上一個您輸入的訊息或是斜線命令\nCMD+DOWN (在空的輸入欄):顯示下一個您輸入的訊息或是斜線命令\nUP (在空的輸入欄):編輯當前頻道您的上一個訊息\n@[文字]+TAB:自動完成以[文字]起始的@使用者帳號\n#[文字]+TAB:自動完成以[文字]起始的頻道\n:[文字]+TAB:自動完成以[文字]起始的顏文字\n\n"
},
{
"id": "api.command_shortcuts.name",
@@ -891,7 +891,7 @@
},
{
"id": "api.file.migrate_filenames_to_file_infos.get_file_infos_again.warn",
- "translation": "轉移成使用 FileInfos 後無法取得文章的 FileInfos 頻道:post_id=%v, err=%v"
+ "translation": "轉移成使用 FileInfos 後無法取得文章的 FileInfos:post_id=%v, err=%v"
},
{
"id": "api.file.migrate_filenames_to_file_infos.get_post_again.warn",
@@ -1520,6 +1520,14 @@
"translation": "正在停止伺服器..."
},
{
+ "id": "api.slackimport.slack_add_bot_user.email_pwd",
+ "translation": "Slack 機器人/外部整合發文匯入使用者:電子郵件,密碼:{{.Email}},{{.Password}}\r\n"
+ },
+ {
+ "id": "api.slackimport.slack_add_bot_user.unable_import",
+ "translation": "無法匯入Slack 機器人/外部整合發文匯入使用者:{{.Username}}\r\n"
+ },
+ {
"id": "api.slackimport.slack_add_channels.added",
"translation": "\r\n 頻道已加入 \r\n"
},
@@ -1533,7 +1541,7 @@
},
{
"id": "api.slackimport.slack_add_channels.import_failed.warn",
- "translation": "Slack Importer: Failed to import channel: %s"
+ "translation": "Slack 匯入:無法匯入頻道:%s"
},
{
"id": "api.slackimport.slack_add_channels.merge",
@@ -1548,6 +1556,10 @@
"translation": "Slack 機器人的訊息還未被匯入"
},
{
+ "id": "api.slackimport.slack_add_posts.bot_user_no_exists.warn",
+ "translation": "Slack 匯入:由於匯入機器人使用者不存在,將不匯入機器人訊息。"
+ },
+ {
"id": "api.slackimport.slack_add_posts.msg_no_comment.debug",
"translation": "檔案註解未定義"
},
@@ -1556,6 +1568,10 @@
"translation": "訊息沒有使用者"
},
{
+ "id": "api.slackimport.slack_add_posts.no_bot_id.warn",
+ "translation": "Slack 匯入:BotId 欄位缺失,將不匯入機器人訊息。"
+ },
+ {
"id": "api.slackimport.slack_add_posts.unsupported.warn",
"translation": "不支援的文章類型: %v, %v"
},
@@ -1612,6 +1628,10 @@
"translation": "無法為 Slack 使用者 {{.UserID}} {{.Username}} 編譯匹配@提及的正規表示式"
},
{
+ "id": "api.slackimport.slack_deactivate_bot_user.failed_to_deactivate",
+ "translation": "Slack 匯入:無法停用匯入機器人使用者。"
+ },
+ {
"id": "api.slackimport.slack_import.log",
"translation": "Mattermost Slack 匯入記錄\r\n"
},
@@ -1652,6 +1672,22 @@
"translation": "解析 Slack 訊息時發生錯誤。匯入功能有可能照樣運作。"
},
{
+ "id": "api.slackimport.slack_sanitise_channel_properties.display_name_too_long.warn",
+ "translation": "Slack 匯入:頻道 {{.ChannelName}} 的顯示名稱過長,將會在匯入時被截短。"
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.header_too_long.warn",
+ "translation": "Slack 匯入:頻道 {{.ChannelName}} 的標題過長,將會在匯入時被截短。"
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.name_too_long.warn",
+ "translation": "Slack 匯入:頻道 {{.ChannelName}} 的名字過長,將會在匯入時被截短。"
+ },
+ {
+ "id": "api.slackimport.slack_sanitise_channel_properties.purpose_too_long.warn",
+ "translation": "Slack 匯入:頻道 {{.ChannelName}} 的用途過長,將會在匯入時被截短。"
+ },
+ {
"id": "api.status.init.debug",
"translation": "正在初始化狀態 API 路徑"
},
@@ -2508,12 +2544,16 @@
"translation": "沒有適當的權限重新產生傳出的 Webhook Token"
},
{
+ "id": "api.webrtc.disabled.app_error",
+ "translation": "此伺服器未啟用 WebRTC。"
+ },
+ {
"id": "api.webrtc.init.debug",
"translation": "正在初始化 WebRTC API 路徑"
},
{
- "id": "api.webrtc.not_available.app_error",
- "translation": "此伺服器不支援 WebRTC。"
+ "id": "api.webrtc.register_token.app_error",
+ "translation": "嘗試註冊 WebRTC Token時發生錯誤"
},
{
"id": "api.websocket_handler.invalid_param.app_error",
@@ -2804,18 +2844,6 @@
"translation": "無法更新現有的 SAML 使用者。總之先允許登入。err=%v"
},
{
- "id": "ent.webrtc.disabled.app_error",
- "translation": "此伺服器未啟用 WebRTC。"
- },
- {
- "id": "ent.webrtc.license_disable.app_error",
- "translation": "授權不支援 Mattermost WebRTC"
- },
- {
- "id": "ent.webrtc.register_token.app_error",
- "translation": "嘗試註冊 WebRTC Token時發生錯誤"
- },
- {
"id": "error.generic.link_message",
"translation": "回到 Mattermost"
},
@@ -3269,7 +3297,7 @@
},
{
"id": "model.config.is_valid.max_channels.app_error",
- "translation": "團隊設定中的單一團隊最高使頻道數無效。必須為正數。"
+ "translation": "團隊設定中的單一團隊最高頻道數無效。必須為正數。"
},
{
"id": "model.config.is_valid.max_file_size.app_error",
diff --git a/model/version.go b/model/version.go
index 6a0072cd6..9d9d8fc1e 100644
--- a/model/version.go
+++ b/model/version.go
@@ -13,6 +13,7 @@ import (
// It should be maitained in chronological order with most current
// release at the front of the list.
var versions = []string{
+ "3.5.0",
"3.4.0",
"3.3.0",
"3.2.0",
diff --git a/store/sql_channel_store.go b/store/sql_channel_store.go
index 5107a0bd8..aadeed7c3 100644
--- a/store/sql_channel_store.go
+++ b/store/sql_channel_store.go
@@ -464,6 +464,32 @@ func (s SqlChannelStore) GetChannelCounts(teamId string, userId string) StoreCha
return storeChannel
}
+func (s SqlChannelStore) GetTeamChannels(teamId string) StoreChannel {
+ storeChannel := make(StoreChannel, 1)
+
+ go func() {
+ result := StoreResult{}
+
+ data := &model.ChannelList{}
+ _, err := s.GetReplica().Select(data, "SELECT * FROM Channels WHERE TeamId = :TeamId And Type != 'D' ORDER BY DisplayName", map[string]interface{}{"TeamId": teamId})
+
+ if err != nil {
+ result.Err = model.NewLocAppError("SqlChannelStore.GetChannels", "store.sql_channel.get_channels.get.app_error", nil, "teamId="+teamId+", err="+err.Error())
+ } else {
+ if len(*data) == 0 {
+ result.Err = model.NewLocAppError("SqlChannelStore.GetChannels", "store.sql_channel.get_channels.not_found.app_error", nil, "teamId="+teamId)
+ } else {
+ result.Data = data
+ }
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
func (s SqlChannelStore) GetByName(teamId string, name string) StoreChannel {
storeChannel := make(StoreChannel, 1)
diff --git a/store/sql_status_store.go b/store/sql_status_store.go
index 7b9fdea5d..49a38a5c9 100644
--- a/store/sql_status_store.go
+++ b/store/sql_status_store.go
@@ -190,7 +190,7 @@ func (s SqlStatusStore) ResetAll() StoreChannel {
go func() {
result := StoreResult{}
- if _, err := s.GetMaster().Exec("UPDATE Status SET Status = :Status WHERE Manual = 0", map[string]interface{}{"Status": model.STATUS_OFFLINE}); err != nil {
+ if _, err := s.GetMaster().Exec("UPDATE Status SET Status = :Status WHERE Manual = false", map[string]interface{}{"Status": model.STATUS_OFFLINE}); err != nil {
result.Err = model.NewLocAppError("SqlStatusStore.ResetAll", "store.sql_status.reset_all.app_error", nil, "")
}
diff --git a/store/sql_upgrade.go b/store/sql_upgrade.go
index 824d0c3f0..992fac189 100644
--- a/store/sql_upgrade.go
+++ b/store/sql_upgrade.go
@@ -189,28 +189,24 @@ func UpgradeDatabaseToVersion34(sqlStore *SqlStore) {
}
func UpgradeDatabaseToVersion35(sqlStore *SqlStore) {
- //if shouldPerformUpgrade(sqlStore, VERSION_3_4_0, VERSION_3_5_0) {
-
- sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user' WHERE Roles = ''")
- sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user system_admin' WHERE Roles = 'system_admin'")
- sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user' WHERE Roles = ''")
- sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user team_admin' WHERE Roles = 'admin'")
- sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user' WHERE Roles = ''")
- sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user channel_admin' WHERE Roles = 'admin'")
+ if shouldPerformUpgrade(sqlStore, VERSION_3_4_0, VERSION_3_5_0) {
+ sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user' WHERE Roles = ''")
+ sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user system_admin' WHERE Roles = 'system_admin'")
+ sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user' WHERE Roles = ''")
+ sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user team_admin' WHERE Roles = 'admin'")
+ sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user' WHERE Roles = ''")
+ sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user channel_admin' WHERE Roles = 'admin'")
+
+ // The rest of the migration from Filenames -> FileIds is done lazily in api.GetFileInfosForPost
+ sqlStore.CreateColumnIfNotExists("Posts", "FileIds", "varchar(150)", "varchar(150)", "[]")
+
+ // Increase maximum length of the Channel table Purpose column.
+ if sqlStore.GetMaxLengthOfColumnIfExists("Channels", "Purpose") != "250" {
+ sqlStore.AlterColumnTypeIfExists("Channels", "Purpose", "varchar(250)", "varchar(250)")
+ }
- // The rest of the migration from Filenames -> FileIds is done lazily in api.GetFileInfosForPost
- sqlStore.CreateColumnIfNotExists("Posts", "FileIds", "varchar(150)", "varchar(150)", "[]")
+ sqlStore.Session().RemoveAllSessions()
- // Increase maximum length of the Channel table Purpose column.
- if sqlStore.GetMaxLengthOfColumnIfExists("Channels", "Purpose") != "250" {
- sqlStore.AlterColumnTypeIfExists("Channels", "Purpose", "varchar(250)", "varchar(250)")
+ saveSchemaVersion(sqlStore, VERSION_3_5_0)
}
-
- // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- // UNCOMMENT WHEN WE DO RELEASE
- // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- //sqlStore.Session().RemoveAllSessions()
-
- //saveSchemaVersion(sqlStore, VERSION_3_5_0)
- //}
}
diff --git a/store/sql_user_store.go b/store/sql_user_store.go
index 836a502fc..aa3bb4380 100644
--- a/store/sql_user_store.go
+++ b/store/sql_user_store.go
@@ -555,6 +555,19 @@ func (us SqlUserStore) GetProfiles(teamId string, offset int, limit int) StoreCh
return storeChannel
}
+func (us SqlUserStore) InvalidateProfilesInChannelCacheByUser(userId string) {
+ keys := profilesInChannelCache.Keys()
+
+ for _, key := range keys {
+ if cacheItem, ok := profilesInChannelCache.Get(key); ok {
+ userMap := cacheItem.(map[string]*model.User)
+ if _, userInCache := userMap[userId]; userInCache {
+ profilesInChannelCache.Remove(key)
+ }
+ }
+ }
+}
+
func (us SqlUserStore) InvalidateProfilesInChannelCache(channelId string) {
profilesInChannelCache.Remove(channelId)
}
@@ -1029,10 +1042,11 @@ func (us SqlUserStore) AnalyticsUniqueUserCount(teamId string) StoreChannel {
go func() {
result := StoreResult{}
- query := "SELECT COUNT(DISTINCT Email) FROM Users"
-
+ query := ""
if len(teamId) > 0 {
- query += ", TeamMembers WHERE TeamMembers.TeamId = :TeamId AND Users.Id = TeamMembers.UserId"
+ query = "SELECT COUNT(DISTINCT Users.Email) From Users, TeamMembers WHERE TeamMembers.TeamId = :TeamId AND Users.Id = TeamMembers.UserId AND TeamMembers.DeleteAt = 0 AND Users.DeleteAt = 0"
+ } else {
+ query = "SELECT COUNT(DISTINCT Email) FROM Users WHERE DeleteAt = 0"
}
v, err := us.GetReplica().SelectInt(query, map[string]interface{}{"TeamId": teamId})
diff --git a/store/store.go b/store/store.go
index b3d87da38..d0790263a 100644
--- a/store/store.go
+++ b/store/store.go
@@ -92,6 +92,7 @@ type ChannelStore interface {
GetChannels(teamId string, userId string) StoreChannel
GetMoreChannels(teamId string, userId string) StoreChannel
GetChannelCounts(teamId string, userId string) StoreChannel
+ GetTeamChannels(teamId string) StoreChannel
GetAll(teamId string) StoreChannel
GetForPost(postId string) StoreChannel
SaveMember(member *model.ChannelMember) StoreChannel
@@ -142,6 +143,7 @@ type UserStore interface {
UpdateMfaActive(userId string, active bool) StoreChannel
Get(id string) StoreChannel
GetAll() StoreChannel
+ InvalidateProfilesInChannelCacheByUser(userId string)
InvalidateProfilesInChannelCache(channelId string)
GetProfilesInChannel(channelId string, offset int, limit int, allowFromCache bool) StoreChannel
GetProfilesNotInChannel(teamId string, channelId string, offset int, limit int) StoreChannel
diff --git a/web/web.go b/web/web.go
index 2d41081ae..228a1219a 100644
--- a/web/web.go
+++ b/web/web.go
@@ -52,7 +52,6 @@ func CheckBrowserCompatability(c *api.Context, r *http.Request) bool {
version := strings.Split(browser, "/")
if strings.HasPrefix(bname, version[0]) && strings.HasPrefix(bversion, version[1]) {
- c.Err = model.NewLocAppError("CheckBrowserCompatability", "web.check_browser_compatibility.app_error", nil, "")
return false
}
}
@@ -63,6 +62,9 @@ func CheckBrowserCompatability(c *api.Context, r *http.Request) bool {
func root(c *api.Context, w http.ResponseWriter, r *http.Request) {
if !CheckBrowserCompatability(c, r) {
+ w.Header().Set("Cache-Control", "no-store")
+ w.WriteHeader(http.StatusBadRequest)
+ w.Write([]byte(c.T("web.check_browser_compatibility.app_error")))
return
}
diff --git a/webapp/actions/global_actions.jsx b/webapp/actions/global_actions.jsx
index 6a63b5630..f7c4c455c 100644
--- a/webapp/actions/global_actions.jsx
+++ b/webapp/actions/global_actions.jsx
@@ -43,16 +43,20 @@ export function emitChannelClickEvent(channel) {
);
}
function switchToChannel(chan) {
- AsyncClient.getChannelStats(chan.id, true);
- AsyncClient.updateLastViewedAt(chan.id);
- loadPosts(chan.id);
- trackPage();
-
- AppDispatcher.handleViewAction({
- type: ActionTypes.CLICK_CHANNEL,
- name: chan.name,
- id: chan.id,
- prev: ChannelStore.getCurrentId()
+ const getMyChannelMembersPromise = AsyncClient.getChannelMember(chan.id, UserStore.getCurrentId());
+
+ getMyChannelMembersPromise.then(() => {
+ AsyncClient.getChannelStats(chan.id, true);
+ AsyncClient.updateLastViewedAt(chan.id);
+ loadPosts(chan.id);
+ trackPage();
+
+ AppDispatcher.handleViewAction({
+ type: ActionTypes.CLICK_CHANNEL,
+ name: chan.name,
+ id: chan.id,
+ prev: ChannelStore.getCurrentId()
+ });
});
}
diff --git a/webapp/actions/post_actions.jsx b/webapp/actions/post_actions.jsx
index c2cc211b7..9599a9a77 100644
--- a/webapp/actions/post_actions.jsx
+++ b/webapp/actions/post_actions.jsx
@@ -232,7 +232,7 @@ export function loadPostsAfter(postId, offset, numPost, isPost) {
);
}
-function loadProfilesForPosts(posts) {
+export function loadProfilesForPosts(posts) {
const profilesToLoad = {};
for (const pid in posts) {
if (!posts.hasOwnProperty(pid)) {
diff --git a/webapp/actions/websocket_actions.jsx b/webapp/actions/websocket_actions.jsx
index 431922b0d..36c6cbdc9 100644
--- a/webapp/actions/websocket_actions.jsx
+++ b/webapp/actions/websocket_actions.jsx
@@ -30,34 +30,37 @@ import {browserHistory} from 'react-router/es6';
const MAX_WEBSOCKET_FAILS = 7;
export function initialize() {
- if (window.WebSocket) {
- let connUrl = Utils.getSiteURL();
+ if (!window.WebSocket) {
+ console.log('Browser does not support websocket'); //eslint-disable-line no-console
+ return;
+ }
- // replace the protocol with a websocket one
- if (connUrl.startsWith('https:')) {
- connUrl = connUrl.replace(/^https:/, 'wss:');
- } else {
- connUrl = connUrl.replace(/^http:/, 'ws:');
- }
+ let connUrl = Utils.getSiteURL();
- // append a port number if one isn't already specified
- if (!(/:\d+$/).test(connUrl)) {
- if (connUrl.startsWith('wss:')) {
- connUrl += ':' + global.window.mm_config.WebsocketSecurePort;
- } else {
- connUrl += ':' + global.window.mm_config.WebsocketPort;
- }
+ // replace the protocol with a websocket one
+ if (connUrl.startsWith('https:')) {
+ connUrl = connUrl.replace(/^https:/, 'wss:');
+ } else {
+ connUrl = connUrl.replace(/^http:/, 'ws:');
+ }
+
+ // append a port number if one isn't already specified
+ if (!(/:\d+$/).test(connUrl)) {
+ if (connUrl.startsWith('wss:')) {
+ connUrl += ':' + global.window.mm_config.WebsocketSecurePort;
+ } else {
+ connUrl += ':' + global.window.mm_config.WebsocketPort;
}
+ }
- // append the websocket api path
- connUrl += Client.getUsersRoute() + '/websocket';
+ // append the websocket api path
+ connUrl += Client.getUsersRoute() + '/websocket';
- WebSocketClient.setEventCallback(handleEvent);
- WebSocketClient.setFirstConnectCallback(handleFirstConnect);
- WebSocketClient.setReconnectCallback(handleReconnect);
- WebSocketClient.setCloseCallback(handleClose);
- WebSocketClient.initialize(connUrl);
- }
+ WebSocketClient.setEventCallback(handleEvent);
+ WebSocketClient.setFirstConnectCallback(handleFirstConnect);
+ WebSocketClient.setReconnectCallback(handleReconnect);
+ WebSocketClient.setCloseCallback(handleClose);
+ WebSocketClient.initialize(connUrl);
}
export function close() {
diff --git a/webapp/client/websocket_client.jsx b/webapp/client/websocket_client.jsx
index 760c62b59..35be5c3df 100644
--- a/webapp/client/websocket_client.jsx
+++ b/webapp/client/websocket_client.jsx
@@ -8,6 +8,7 @@ const MAX_WEBSOCKET_RETRY_TIME = 300000; // 5 mins
export default class WebSocketClient {
constructor() {
this.conn = null;
+ this.connectionUrl = null;
this.sequence = 1;
this.connectFailCount = 0;
this.eventCallback = null;
@@ -18,16 +19,22 @@ export default class WebSocketClient {
this.closeCallback = null;
}
- initialize(connectionUrl, token) {
+ initialize(connectionUrl = this.connectionUrl, token) {
if (this.conn) {
return;
}
+ if (connectionUrl == null) {
+ console.log('websocket must have connection url'); //eslint-disable-line no-console
+ return;
+ }
+
if (this.connectFailCount === 0) {
console.log('websocket connecting to ' + connectionUrl); //eslint-disable-line no-console
}
this.conn = new WebSocket(connectionUrl);
+ this.connectionUrl = connectionUrl;
this.conn.onopen = () => {
if (token) {
@@ -150,7 +157,7 @@ export default class WebSocketClient {
if (this.conn && this.conn.readyState === WebSocket.OPEN) {
this.conn.send(JSON.stringify(msg));
- } else if (!this.conn || this.conn.readyState === WebSocket.Closed) {
+ } else if (!this.conn || this.conn.readyState === WebSocket.CLOSED) {
this.conn = null;
this.initialize();
}
diff --git a/webapp/components/admin_console/admin_team_members_dropdown.jsx b/webapp/components/admin_console/admin_team_members_dropdown.jsx
index dffc0573a..0331e6c4e 100644
--- a/webapp/components/admin_console/admin_team_members_dropdown.jsx
+++ b/webapp/components/admin_console/admin_team_members_dropdown.jsx
@@ -81,6 +81,7 @@ export default class AdminTeamMembersDropdown extends React.Component {
this.props.teamMember.team_id,
this.props.user.id,
() => {
+ AsyncClient.getTeamStats(this.props.teamMember.team_id);
UserStore.removeProfileFromTeam(this.props.teamMember.team_id, this.props.user.id);
UserStore.emitInTeamChange();
},
diff --git a/webapp/components/logged_in.jsx b/webapp/components/logged_in.jsx
index 824e7b91d..4e7df0392 100644
--- a/webapp/components/logged_in.jsx
+++ b/webapp/components/logged_in.jsx
@@ -105,7 +105,7 @@ export default class LoggedIn extends React.Component {
}
componentDidMount() {
- // Initalize websocket
+ // Initialize websocket
WebSocketActions.initialize();
// Listen for user
diff --git a/webapp/components/member_list_team.jsx b/webapp/components/member_list_team.jsx
index d899bb8a4..a48283b96 100644
--- a/webapp/components/member_list_team.jsx
+++ b/webapp/components/member_list_team.jsx
@@ -32,6 +32,7 @@ export default class MemberListTeam extends React.Component {
teamMembers: Object.assign([], TeamStore.getMembersInTeam()),
total: stats.total_member_count,
search: false,
+ term: '',
loading: true
};
}
@@ -39,7 +40,7 @@ export default class MemberListTeam extends React.Component {
componentDidMount() {
UserStore.addInTeamChangeListener(this.onChange);
UserStore.addStatusesChangeListener(this.onChange);
- TeamStore.addChangeListener(this.onChange);
+ TeamStore.addChangeListener(this.onChange.bind(null, true));
TeamStore.addStatsChangeListener(this.onStatsChange);
loadProfilesAndTeamMembers(0, Constants.PROFILE_CHUNK_SIZE, TeamStore.getCurrentId(), this.loadComplete);
@@ -60,6 +61,9 @@ export default class MemberListTeam extends React.Component {
onChange(force) {
if (this.state.search && !force) {
return;
+ } else if (this.state.search) {
+ this.search(this.state.term);
+ return;
}
this.setState({users: UserStore.getProfileListInTeam(), teamMembers: Object.assign([], TeamStore.getMembersInTeam())});
@@ -76,8 +80,7 @@ export default class MemberListTeam extends React.Component {
search(term) {
if (term === '') {
- this.onChange(true);
- this.setState({search: false});
+ this.setState({search: false, term, users: UserStore.getProfileListInTeam(), teamMembers: Object.assign([], TeamStore.getMembersInTeam())});
return;
}
@@ -86,7 +89,7 @@ export default class MemberListTeam extends React.Component {
TeamStore.getCurrentId(),
{},
(users) => {
- this.setState({loading: true, search: true, users});
+ this.setState({loading: true, search: true, users, term, teamMembers: Object.assign([], TeamStore.getMembersInTeam())});
loadTeamMembersForProfilesList(users, TeamStore.getCurrentId(), this.loadComplete);
}
);
diff --git a/webapp/components/more_direct_channels.jsx b/webapp/components/more_direct_channels.jsx
index f672cb617..50ab5224a 100644
--- a/webapp/components/more_direct_channels.jsx
+++ b/webapp/components/more_direct_channels.jsx
@@ -38,6 +38,7 @@ export default class MoreDirectChannels extends React.Component {
users: null,
loadingDMChannel: -1,
listType: 'team',
+ show: true,
search: false
};
}
@@ -60,15 +61,17 @@ export default class MoreDirectChannels extends React.Component {
}
handleHide() {
- if (this.props.onModalDismissed) {
- this.props.onModalDismissed();
- }
+ this.setState({show: false});
}
handleExit() {
if (this.exitToDirectChannel) {
browserHistory.push(this.exitToDirectChannel);
}
+
+ if (this.props.onModalDismissed) {
+ this.props.onModalDismissed();
+ }
}
handleShowDirectChannel(teammate, e) {
@@ -220,7 +223,7 @@ export default class MoreDirectChannels extends React.Component {
return (
<Modal
dialogClassName='more-modal more-direct-channels'
- show={this.props.show}
+ show={this.state.show}
onHide={this.handleHide}
onExited={this.handleExit}
>
@@ -262,6 +265,5 @@ export default class MoreDirectChannels extends React.Component {
}
MoreDirectChannels.propTypes = {
- show: React.PropTypes.bool.isRequired,
onModalDismissed: React.PropTypes.func
};
diff --git a/webapp/components/navbar.jsx b/webapp/components/navbar.jsx
index 9721ddee1..d71fec945 100644
--- a/webapp/components/navbar.jsx
+++ b/webapp/components/navbar.jsx
@@ -546,6 +546,12 @@ export default class Navbar extends React.Component {
{deleteChannelOption}
{leaveChannelOption}
{toggleFavoriteOption}
+ <div
+ className='close visible-xs-block'
+ onClick={() => this.refs.headerOverlay.hide()}
+ >
+ {'×'}
+ </div>
</ul>
</div>
</div>
@@ -671,7 +677,7 @@ export default class Navbar extends React.Component {
options={{singleline: true, mentionHighlight: false}}
/>
<div
- className='close__icon visible-xs-block'
+ className='close visible-xs-block'
onClick={() => this.refs.headerOverlay.hide()}
>
{'×'}
@@ -721,7 +727,7 @@ export default class Navbar extends React.Component {
/>
</div>
<div
- className='close__icon visible-xs-block'
+ className='close visible-xs-block'
onClick={() => this.refs.headerOverlay.hide()}
>
{'×'}
diff --git a/webapp/components/needs_team.jsx b/webapp/components/needs_team.jsx
index e210fcbee..014d6c93e 100644
--- a/webapp/components/needs_team.jsx
+++ b/webapp/components/needs_team.jsx
@@ -81,7 +81,6 @@ export default class NeedsTeam extends React.Component {
if (tutorialStep <= TutorialSteps.INTRO_SCREENS) {
browserHistory.push(TeamStore.getCurrentTeamRelativeUrl() + '/tutorial');
}
- stopPeriodicStatusUpdates();
}
componentDidMount() {
@@ -132,6 +131,7 @@ export default class NeedsTeam extends React.Component {
if (UserAgent.isIosSafari()) {
iNoBounce.disable();
}
+ stopPeriodicStatusUpdates();
}
render() {
diff --git a/webapp/components/post_view/components/post_list.jsx b/webapp/components/post_view/components/post_list.jsx
index 1142197c6..a0cfb208e 100644
--- a/webapp/components/post_view/components/post_list.jsx
+++ b/webapp/components/post_view/components/post_list.jsx
@@ -264,6 +264,7 @@ export default class PostList extends React.Component {
let commentCount = 0;
let isCommentMention = false;
+ let shouldHighlightThreads = false;
let commentRootId;
if (parentPost) {
commentRootId = post.root_id;
@@ -271,9 +272,14 @@ export default class PostList extends React.Component {
commentRootId = post.id;
}
- for (const postId in posts) {
- if (posts[postId].root_id === commentRootId) {
- commentCount += 1;
+ if (commentRootId) {
+ for (const postId in posts) {
+ if (posts[postId].root_id === commentRootId) {
+ commentCount += 1;
+ if (posts[postId].user_id === userId) {
+ shouldHighlightThreads = true;
+ }
+ }
}
}
@@ -281,7 +287,7 @@ export default class PostList extends React.Component {
const commentsNotifyLevel = this.props.currentUser.notify_props.comments || 'never';
const notCurrentUser = post.user_id !== userId || (post.props && post.props.from_webhook);
if (notCurrentUser) {
- if (commentsNotifyLevel === 'any') {
+ if (commentsNotifyLevel === 'any' && (posts[commentRootId].user_id === userId || shouldHighlightThreads)) {
isCommentMention = true;
} else if (commentsNotifyLevel === 'root' && posts[commentRootId].user_id === userId) {
isCommentMention = true;
diff --git a/webapp/components/search_bar.jsx b/webapp/components/search_bar.jsx
index 5cc0e7c23..3ddc192d9 100644
--- a/webapp/components/search_bar.jsx
+++ b/webapp/components/search_bar.jsx
@@ -13,6 +13,7 @@ import SearchSuggestionList from './suggestion/search_suggestion_list.jsx';
import SearchUserProvider from './suggestion/search_user_provider.jsx';
import * as Utils from 'utils/utils.jsx';
import Constants from 'utils/constants.jsx';
+import {loadProfilesForPosts} from 'actions/post_actions.jsx';
import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
@@ -129,6 +130,8 @@ export default class SearchBar extends React.Component {
results: data,
is_mention_search: isMentionSearch
});
+
+ loadProfilesForPosts(data.posts);
},
(err) => {
this.setState({isSearching: false});
diff --git a/webapp/components/sidebar.jsx b/webapp/components/sidebar.jsx
index 626ac2866..5c6645833 100644
--- a/webapp/components/sidebar.jsx
+++ b/webapp/components/sidebar.jsx
@@ -19,7 +19,6 @@ import * as AsyncClient from 'utils/async_client.jsx';
import * as Utils from 'utils/utils.jsx';
import * as ChannelUtils from 'utils/channel_utils.jsx';
import * as ChannelActions from 'actions/channel_actions.jsx';
-import {loadProfilesAndTeamMembersForDMSidebar} from 'actions/user_actions.jsx';
import Constants from 'utils/constants.jsx';
@@ -125,9 +124,6 @@ export default class Sidebar extends React.Component {
document.addEventListener('keydown', this.navigateChannelShortcut);
document.addEventListener('keydown', this.navigateUnreadChannelShortcut);
-
- loadProfilesAndTeamMembersForDMSidebar();
- AsyncClient.getMyChannelMembers();
}
shouldComponentUpdate(nextProps, nextState) {
diff --git a/webapp/components/suggestion/suggestion_box.jsx b/webapp/components/suggestion/suggestion_box.jsx
index 464e57ef2..eeae5ba28 100644
--- a/webapp/components/suggestion/suggestion_box.jsx
+++ b/webapp/components/suggestion/suggestion_box.jsx
@@ -2,7 +2,6 @@
// See License.txt for license information.
import $ from 'jquery';
-import ReactDOM from 'react-dom';
import Constants from 'utils/constants.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
@@ -37,6 +36,13 @@ export default class SuggestionBox extends React.Component {
SuggestionStore.addPretextChangedListener(this.suggestionId, this.handlePretextChanged);
}
+ componentWillReceiveProps(nextProps) {
+ // Clear any suggestions when the SuggestionBox is cleared
+ if (nextProps.value === '' && this.props.value !== nextProps.value) {
+ GlobalActions.emitClearSuggestions(this.suggestionId);
+ }
+ }
+
componentWillUnmount() {
SuggestionStore.removeCompleteWordListener(this.suggestionId, this.handleCompleteWord);
SuggestionStore.removePretextChangedListener(this.suggestionId, this.handlePretextChanged);
@@ -64,7 +70,7 @@ export default class SuggestionBox extends React.Component {
return;
}
- const container = $(ReactDOM.findDOMNode(this));
+ const container = $(this.refs.container);
if (!(container.is(e.target) || container.has(e.target).length > 0)) {
// We can't just use blur for this because it fires and hides the children before
@@ -198,7 +204,7 @@ export default class SuggestionBox extends React.Component {
const SuggestionListComponent = listComponent;
return (
- <div>
+ <div ref='container'>
{textbox}
<SuggestionListComponent
suggestionId={this.suggestionId}
@@ -239,6 +245,5 @@ SuggestionBox.propTypes = {
// explicitly name any input event handlers we override and need to manually call
onChange: React.PropTypes.func,
- onBlur: React.PropTypes.func,
onKeyDown: React.PropTypes.func
};
diff --git a/webapp/components/user_settings/user_settings_security.jsx b/webapp/components/user_settings/user_settings_security.jsx
index 617acb7f5..0cee3dfca 100644
--- a/webapp/components/user_settings/user_settings_security.jsx
+++ b/webapp/components/user_settings/user_settings_security.jsx
@@ -928,8 +928,9 @@ export default class SecurityTab extends React.Component {
numMethods = config.EnableLdap === 'true' ? numMethods + 1 : numMethods;
numMethods = config.EnableSaml === 'true' ? numMethods + 1 : numMethods;
+ // If there are other sign-in methods and either email is enabled or the user's account is email, then allow switching
let signInSection;
- if (config.EnableSignUpWithEmail === 'true' && numMethods > 0) {
+ if ((config.EnableSignUpWithEmail === 'true' || user.auth_service === '') && numMethods > 0) {
signInSection = this.createSignInSection();
}
diff --git a/webapp/i18n/de.json b/webapp/i18n/de.json
index 439f0e68b..706afc55e 100644
--- a/webapp/i18n/de.json
+++ b/webapp/i18n/de.json
@@ -532,7 +532,7 @@
"admin.rate.httpHeaderDescription": "Wenn ausgefüllt, wird der Begrenzer an dem spezifizierten HTTP Header unterschieden (z.B. NGINX auf \"X-Real-IP\" stellen, bei Amazon ELB auf \"X-Forwarded-For\" stellen).",
"admin.rate.httpHeaderExample": "z.B.: \"X-Real-IP\", \"X-Forwarded-For\"",
"admin.rate.httpHeaderTitle": "Mittels HTTP Header drosseln",
- "admin.rate.maxBurst": "Maximum Burst Size:",
+ "admin.rate.maxBurst": "Maximale Burst-Size:",
"admin.rate.maxBurstDescription": "Maximale Anzahl von erlaubten Aufrufen nachdem das Query Limit pro Sekunde erreicht ist.",
"admin.rate.maxBurstExample": "z.B.: \"100\"",
"admin.rate.memoryDescription": "Die maximale Anzahl an verbundenen Benutzer-Sitzungen, festgelegt durch die Einstellungen \"Mittels Absender-Adresse drosseln\" bzw. \"Mittels HTTP Header drosseln\".",
@@ -648,7 +648,7 @@
"admin.service.integrationAdmin": "Verwaltung der Integrationen auf Admins beschränken:",
"admin.service.integrationAdminDesc": "Wenn wahr, können Webhooks und Slash-Befehle nur durch Team- und Systemadministratoren erstellt, bearbeitet oder betrachtet werden. OAuth 2.0 Anwendungen nur durch Systemadministratoren. Integrationen stehen allen Benutzern zur Verfügung nachdem ein Systemadministrator sie erstellt hat.",
"admin.service.listenAddress": "Empfangs-Adresse:",
- "admin.service.listenDescription": "The address and port to which to bind and listen. Specifying \":8065\" will bind to all network interfaces. Specifying \"127.0.0.1:8065\" will only bind to the network interface having that IP address. If you choose a port of a lower level (called \"system ports\" or \"well-known ports\", in the range of 0-1023), you must have permissions to bind to that port. On Linux you can use: \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" to allow Mattermost to bind to well-known ports.",
+ "admin.service.listenDescription": "Die Adresse und Port an die gebunden und gehört wird. Bei Angabe von \":8065\" wird an alle Netzwerkkarten gebunden. Bei Angabe von \"127.0.0.1:8065\" wird nur an die Netzwerkkarte mit der IP Adresse gebunden. Wenn Sie einen Port eines niedrigen Levels wählen (auch \"System Ports\" oder \"Well Known Ports\" im Bereich 0-1023), müssen Sie Berechtigungen für das Binden an den Port haben. Auf Linux können Sie \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" verwenden um Mattermost das Binden an Well Known Ports zu erlauben.",
"admin.service.listenExample": "z.B.: \":8065\"",
"admin.service.mfaDesc": "Wenn wahr erhalten Nutzer die Möglichkeit Multi-Faktor-Authentifizierung zu ihren Zugängen hinzuzufügen. Sie benötigen ein Smartphone und eine Authenticator App wie beispielsweise den Google Authenticator.",
"admin.service.mfaTitle": "Multi-Faktor Authentifizierung einschalten:",
@@ -777,9 +777,9 @@
"admin.team.chooseImage": "Neues Bild wählen",
"admin.team.dirDesc": "Wenn wahr werden Teams, welche im Team Verzeichnis angezeigt werden sollen, auf der Hauptseite dargestellt anstatt ein neues Team zu erstellen.",
"admin.team.dirTitle": "Team Verzeichnis aktivieren: ",
- "admin.team.maxChannelsDescription": "Maximale Anzahl an Benutzern pro Team, inklusive Aktive und Inaktive Benutzer.",
+ "admin.team.maxChannelsDescription": "Maximale Anzahl an Kanälen pro Team, inklusive aktiven und gelöschten Kanälen.",
"admin.team.maxChannelsExample": "z.B.: \"100\"",
- "admin.team.maxChannelsTitle": "Max Channels Per Team:",
+ "admin.team.maxChannelsTitle": "Maximal Kanäle pro Team:",
"admin.team.maxUsersDescription": "Maximale Anzahl an Benutzern pro Team, inklusive Aktive und Inaktive Benutzer.",
"admin.team.maxUsersExample": "z.B.: \"25\"",
"admin.team.maxUsersTitle": "Max Benutzer pro Team:",
@@ -840,7 +840,7 @@
"admin.webrtc.gatewayAdminUrlDescription": "Geben Sie https://<mattermost-webrtc-gateway-url>:<port>/admin ein. Stellen Sie sicher, dass Sie HTTP oder HTTPS abhängig von ihrer Server-Konfiguration verwenden. Mattermost WebRTC verwendet diese URL, um zum Verbindungsaufbau gültige Token für jeden Teilnehmer zu erhalten.",
"admin.webrtc.gatewayAdminUrlExample": "z.B.: \"https://webrtc.mattermost.com:7089/admin\"",
"admin.webrtc.gatewayAdminUrlTitle": "Gateway Admin URL:",
- "admin.webrtc.gatewayWebsocketUrlDescription": "Enter wss://<mattermost-webrtc-gateway-url>:<port>. Make sure you use WS or WSS in your URL depending on your server configuration. This is the websocket used to signal and establish communication between the peers.",
+ "admin.webrtc.gatewayWebsocketUrlDescription": "Geben Sie wss://<mattermost-webrtc-gateway-url>:<port> ein. Stellen Sie sicher das Sie WS oder WSS ind Ihrer URL entsprechend Ihrer Serverkonfiguration verwenden. Dies ist das Websocket welches für die Signalisierung und dem Verbindungsaufbau zwischen den Peers verwendet wird.",
"admin.webrtc.gatewayWebsocketUrlExample": "z.B.: \"wss://webrtc.mattermost.com:8189\"",
"admin.webrtc.gatewayWebsocketUrlTitle": "Gateway Websocket URL:",
"admin.webrtc.stunUriDescription": "Geben Sie ihre STUN URI als stun:<ihre-stun-url>:<port> ein. STUN ist ein standardisiertes Netzwerkprotokoll, das einem Endgerät dabei hilft, seine öffentliche IP-Adresse zu erhalten, wenn es sich hinter einem NAT befindet.",
@@ -879,14 +879,14 @@
"analytics.system.totalFilePosts": "Beiträge mit Dateien",
"analytics.system.totalHashtagPosts": "Beiträge mit Hashtags",
"analytics.system.totalIncomingWebhooks": "Eingehende Webhooks",
- "analytics.system.totalMasterDbConnections": "Master DB Conns",
+ "analytics.system.totalMasterDbConnections": "Master DB Verbindungen",
"analytics.system.totalOutgoingWebhooks": "Ausgehende Webhooks",
"analytics.system.totalPosts": "Beiträge Gesamt",
- "analytics.system.totalReadDbConnections": "Replica DB Conns",
+ "analytics.system.totalReadDbConnections": "Replica DB Verbindungen",
"analytics.system.totalSessions": "Sitzungen Gesamt",
"analytics.system.totalTeams": "Teams Gesamt",
"analytics.system.totalUsers": "Benutzer Gesamt",
- "analytics.system.totalWebsockets": "Websocket Conns",
+ "analytics.system.totalWebsockets": "Websocket Verbindungen",
"analytics.team.activeUsers": "Aktive Benutzer mit Beiträgen",
"analytics.team.newlyCreated": "Neu erstellte Benutzer",
"analytics.team.privateGroups": "Private Gruppen",
@@ -980,9 +980,9 @@
"channel_flow.handleTooShort": "Kanal-URL muss zwei oder mehr alphanumerische Zeichen enthalten",
"channel_flow.invalidName": "Ungültiger Kanal Name",
"channel_flow.set_url_title": "Setze {term} URL",
- "channel_header.addToFavorites": "Add to Favorites",
+ "channel_header.addToFavorites": "Zu Favoriten hinzufügen",
"channel_header.channel": "Kanal",
- "channel_header.channelHeader": "Kanalüberschrift festlegen...",
+ "channel_header.channelHeader": "Bearbeite Kanaltitel",
"channel_header.delete": "Lösche {term}...",
"channel_header.flagged": "Markierte Nachrichten",
"channel_header.group": "Gruppe",
@@ -990,10 +990,10 @@
"channel_header.manageMembers": "Mitglieder verwalten",
"channel_header.notificationPreferences": "Benachrichtigungseinstellungen",
"channel_header.recentMentions": "Letzte Erwähnungen",
- "channel_header.removeFromFavorites": "Remove from Favorites",
- "channel_header.rename": "Benenne {term} um...",
- "channel_header.setHeader": "Setze {term} Überschrift...",
- "channel_header.setPurpose": "Setze {term} Zweck...",
+ "channel_header.removeFromFavorites": "Aus Favoriten entfernen",
+ "channel_header.rename": "Benenne {term} um",
+ "channel_header.setHeader": "Bearbeite {term} Titel",
+ "channel_header.setPurpose": "Bearbeite {term} Zweck",
"channel_header.viewInfo": "Info anzeigen",
"channel_header.viewMembers": "Zeige Mitglieder",
"channel_header.webrtc.call": "Videoanruf starten",
@@ -1134,7 +1134,7 @@
"delete_channel.confirm": "Bestätige LÖSCHUNG des Kanals",
"delete_channel.del": "Löschen",
"delete_channel.group": "Gruppe",
- "delete_channel.question": "Sind Sie sich sicher den/die {term} {display_name} zu löschen?",
+ "delete_channel.question": "Dieser Kanal und sein Inhalt wird aus dem Team gelöscht und ist dann für alle Nutzer nicht mehr verfügbar. Sind Sie sich sicher, dass Sie den {term}{display_name} löschen möchten?",
"delete_post.cancel": "Abbrechen",
"delete_post.comment": "Kommentar",
"delete_post.confirm": "Bestätige Löschung von {term}",
@@ -1641,6 +1641,7 @@
"sidebar.createChannel": "Neuen Kanal erstellen",
"sidebar.createGroup": "Neue Gruppe erstellen",
"sidebar.direct": "Direktnachricht",
+ "sidebar.favorite": "Favoriten",
"sidebar.more": "Mehr",
"sidebar.moreElips": "Mehr...",
"sidebar.otherMembers": "Außerhalb dieses Teams",
@@ -1914,12 +1915,13 @@
"user.settings.languages.change": "Interface Sprache ändern",
"user.settings.languages.promote": "Auswählen welche Sprache Mattermost im Benutzerinterface anzeigt.<br /><br />Möchten Sie mit der Übersetzung helfen? Treten Sie dem <a href='http://translate.mattermost.com/' target='_blank'>Mattermost Translation Server</a> bei um beizusteuern.",
"user.settings.mfa.add": "MFA zu Ihrem Account hinzufügen",
- "user.settings.mfa.addHelp": "Sie könnten einen zusätzlichen Token zu Ihrem Passwort anfordern, um sich an Mattermost anmelden zu können.<br/><br/>Zur Aktivierung laden Sie den Google Authenticator bei <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> oder <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a> passend zu Ihrem Smartphone herunter, um dann<br/><br/>1. Auf <strong>MFA zu Ihrem Account hinzufügen</strong> zu klicken.<br/>2. Scannen Sie mit Google Authenticator den QR-Code.<br/>3. Geben Sie den von Google Authenticator generierten Token ein und klicken Sie auf <strong>Speichern</strong>.<br/><br/>Bei der Anmeldung werden Sie neben den üblichen Anmeldeinformationen auch nach einem Token aus Google Authenticator gefragt.",
- "user.settings.mfa.addHelpQr": "Bitte scannen die den QR-Code mit der Google Authenticator App auf Ihrem Smartphone und geben Sie den Token ein.",
+ "user.settings.mfa.addHelp": "Sie könnten einen Smartphone-basierten Token zusätzlich zu Ihrem Passwort anfordern, um sich an Mattermost anmelden zu können.<br/><br/>Zur Aktivierung laden Sie den Google Authenticator bei <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> oder <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2'>Google Play</a> passend zu Ihrem Smartphone herunter, um dann<br/><br/>1. Auf <strong>MFA zu Ihrem Account hinzufügen</strong> zu klicken.<br/>2. Scannen Sie mit Google Authenticator den QR-Code.<br/>3. Geben Sie den von Google Authenticator generierten Token ein und klicken Sie auf <strong>Speichern</strong>.<br/><br/>Bei der Anmeldung werden Sie neben den üblichen Anmeldeinformationen auch nach einem Token aus Google Authenticator gefragt.",
+ "user.settings.mfa.addHelpQr": "Bitte Scannen Sie den QR Code mit der Google Authenticator App auf Ihrem Smartphone und fügen den durch die App generierten Token hier ein. Sollte es Ihnen nicht möglich sein den Code zu scannen, können Sie den Schlüssel manuell eingeben.",
"user.settings.mfa.enterToken": "Token (nur Ziffern)",
"user.settings.mfa.qrCode": "QR-Code",
"user.settings.mfa.remove": "MFA von Ihrem Zugang entfernen",
"user.settings.mfa.removeHelp": "Entfernen des MFA multi-factor authentication bedeutet das Sie nicht länger einen zusätzlichen Zugangs-Token für die Anmeldung benötigen.",
+ "user.settings.mfa.secret": "Schlüssel:",
"user.settings.mfa.title": "Multi-Faktor Authentifizierung einschalten",
"user.settings.modal.advanced": "Erweitert",
"user.settings.modal.confirmBtns": "Ja, verwerfen",
diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json
index 6cacc67e8..466861847 100644
--- a/webapp/i18n/en.json
+++ b/webapp/i18n/en.json
@@ -990,10 +990,10 @@
"channel_header.manageMembers": "Manage Members",
"channel_header.notificationPreferences": "Notification Preferences",
"channel_header.recentMentions": "Recent Mentions",
+ "channel_header.removeFromFavorites": "Remove from Favorites",
"channel_header.rename": "Rename {term}",
"channel_header.setHeader": "Edit {term} Header",
"channel_header.setPurpose": "Edit {term} Purpose",
- "channel_header.removeFromFavorites": "Remove from Favorites",
"channel_header.viewInfo": "View Info",
"channel_header.viewMembers": "View Members",
"channel_header.webrtc.call": "Start Video Call",
diff --git a/webapp/i18n/es.json b/webapp/i18n/es.json
index 754294992..6028890ca 100644
--- a/webapp/i18n/es.json
+++ b/webapp/i18n/es.json
@@ -206,7 +206,7 @@
"admin.connectionSecurityTest": "Probar Conexión",
"admin.connectionSecurityTitle": "Seguridad de Conexión:",
"admin.connectionSecurityTls": "TLS",
- "admin.connectionSecurityTlsDescription": "Cifra la comnicación entre Mattermost y tu servidor.",
+ "admin.connectionSecurityTlsDescription": "Cifra la comunicación entre Mattermost y tu servidor.",
"admin.customization.androidAppDownloadLinkDesc": "Agrega un enlace para descargar la aplicación para Android. Los usuarios que tienen acceso al sitio en un navegador de web móvil serán presentados con una página que les da la opción de descargar la aplicación. Deja este campo en blanco para evitar que la página aparezca.",
"admin.customization.androidAppDownloadLinkTitle": "Enlace de Descarga de la Aplicación para Android:",
"admin.customization.appDownloadLinkDesc": "Agrega un vínculo a una página de descarga de las aplicaciones de Mattermost. Cuando un enlace está presente la opción \"Descargar Aplicaciones de Mattermost\" aparecerá en el Menú Principal para que los usuarios puedan encontrar la página de descarga. Deja este campo en blanco para ocultar la opción desde el Menú Principal.",
@@ -982,8 +982,8 @@
"channel_flow.set_url_title": "Asignar URL de {term}",
"channel_header.addToFavorites": "Añadir a favoritos",
"channel_header.channel": "Canal",
- "channel_header.channelHeader": "Asignar Encabezado del Canal...",
- "channel_header.delete": "Borrar {term}...",
+ "channel_header.channelHeader": "Editar encabezado del canal",
+ "channel_header.delete": "Borrar {term}",
"channel_header.flagged": "Mensajes Marcados",
"channel_header.group": "Grupo",
"channel_header.leave": "Abandonar {term}",
@@ -991,9 +991,9 @@
"channel_header.notificationPreferences": "Preferencias de Notificación",
"channel_header.recentMentions": "Menciones recientes",
"channel_header.removeFromFavorites": "Quitar de favoritos",
- "channel_header.rename": "Renombrar {term}...",
- "channel_header.setHeader": "Encabezado del {term}...",
- "channel_header.setPurpose": "Propósito del {term}...",
+ "channel_header.rename": "Renombrar {term}",
+ "channel_header.setHeader": "Editar encabezado del {term}",
+ "channel_header.setPurpose": "Editar el propósito del {term}",
"channel_header.viewInfo": "Ver Info",
"channel_header.viewMembers": "Ver Miembros",
"channel_header.webrtc.call": "Iniciar llamada de vídeo",
@@ -1134,7 +1134,7 @@
"delete_channel.confirm": "Confirmar BORRAR Canal",
"delete_channel.del": "Borrar",
"delete_channel.group": "grupo",
- "delete_channel.question": "¿Estás seguro de querer borrar el {display_name} {term}?",
+ "delete_channel.question": "Se eliminará el canal del equipo y hará que su contenido sea inaccesible para todos los usuarios. ¿Está usted seguro de que quiere eliminar el {term} {display_name}?",
"delete_post.cancel": "Cancelar",
"delete_post.comment": "Comentario",
"delete_post.confirm": "Confirmar Eliminación del {term}",
@@ -1641,6 +1641,7 @@
"sidebar.createChannel": "Crear un nuevo canal",
"sidebar.createGroup": "Crear un nuevo grupo",
"sidebar.direct": "Mensajes Directos",
+ "sidebar.favorite": "Favoritos",
"sidebar.more": "Más",
"sidebar.moreElips": "Más...",
"sidebar.otherMembers": "Fuera de este equipo",
@@ -1914,12 +1915,13 @@
"user.settings.languages.change": "Cambia el idioma con el que se muestra la intefaz de usuario",
"user.settings.languages.promote": "Selecciona en que idioma se mostrará la interfaz de usuario de Mattermost.<br /><br />¿Te gustaría ayudar con las traducciones? Únete al <a href='http://translate.mattermost.com/' target='_blank'>Servidor de Traducciones de Mattermost</a> para contribuir.",
"user.settings.mfa.add": "Agrega MFA a tu cuenta",
- "user.settings.mfa.addHelp": "Puedes requerir de un smartphone basado en token, además de la contraseña para iniciar sesión en Mattermost.<br/><br/>Para habilitarlo, descarga Google Authenticator de <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> o <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a> al teléfono, luego<br/><br/>1. Haz clic en <strong>Agregar MFA a su cuenta</strong> en el botón de arriba.<br/>2. Utiliza Google Authenticator para escanear el código QR que aparece.<br/>3. Escribe el código generado por Google Authenticator y haz clic en <strong>Guardar</strong>.<br/><br/>Al iniciar la sesión, se pedirá que introduzcas un token de Google Authenticator, además de tus credenciales.",
- "user.settings.mfa.addHelpQr": "Por favor escanea el código QR con la app de Google Authenticator en tu teléfono inteligente e ingresa el token provisto por la app.",
+ "user.settings.mfa.addHelp": "Necesitarás un teléfono inteligente, además de la contraseña para iniciar sesión en Mattermost.<br/><br/>Para habilitarlo, descarga Google Authenticator de <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> o <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a> al teléfono, luego<br/><br/>1. Haz clic en <strong>Agregar MFA a tu cuenta</strong> en el botón de arriba.<br/>2. Utiliza Google Authenticator para escanear el código QR que aparece o ingresar manualmente la clave secreta.<br/>3. Escribe el código generado por Google Authenticator y haz clic en <strong>Guardar</strong>.<br/><br/>Al iniciar la sesión, se pedirá que introduzcas un token de Google Authenticator, además de tus credenciales.",
+ "user.settings.mfa.addHelpQr": "Por favor escanea el código QR con la aplicación Google Authenticator en tu teléfono inteligente e ingresa el token proporcionado por la aplicación. Si no puede escanear el código, puedes ingresar manualmente la clave secreta suministrada.",
"user.settings.mfa.enterToken": "Token",
"user.settings.mfa.qrCode": "Código QR",
"user.settings.mfa.remove": "Remover MFA de tu cuenta",
"user.settings.mfa.removeHelp": "Al remover la autenticación de múltples factores hará que tu cuenta sea vulnerable a ataques.",
+ "user.settings.mfa.secret": "Clave Secreta:",
"user.settings.mfa.title": "Habilitar Autenticación de Múltiples Factores:",
"user.settings.modal.advanced": "Avanzada",
"user.settings.modal.confirmBtns": "Sí, Descartar",
diff --git a/webapp/i18n/fr.json b/webapp/i18n/fr.json
index 5a388c59f..8cdb8c4c9 100644
--- a/webapp/i18n/fr.json
+++ b/webapp/i18n/fr.json
@@ -8,10 +8,10 @@
"about.enterpriseEditione1": "Édition Entreprise",
"about.hash": "Clé de compilation :",
"about.hashee": "Clé de compilation EE :",
- "about.licensed": "Clé de licence :",
+ "about.licensed": "Licence accordée à :",
"about.number": "Numéro de compilation :",
"about.teamEditionLearn": "Rejoignez la communauté Mattermost à : ",
- "about.teamEditionSt": "Toute la communication de votre équipe à un endroit, accessible de partout.",
+ "about.teamEditionSt": "Toute la communication de votre équipe en un seul endroit, consultable instantanément et accessible de partout.",
"about.teamEditiont0": "Édition Team",
"about.teamEditiont1": "Édition Entreprise",
"about.title": "À propos de Mattermost",
@@ -148,10 +148,10 @@
"admin.cluster.enableDescription": "Si activé, Mattermost sera lancé en mode Haute Disponibilité. Consultez la <a href=\"http://docs.mattermost.com/deployment/cluster.html\" target=\"_blank\">documentation</a> pour en apprendre davantage sur la configuration de la Haute Disponibilité pour Mattermost.",
"admin.cluster.enableTitle": "Activer le mode Haute Disponibilité",
"admin.cluster.interNodeListenAddressDesc": "L'adresse écoutée par le serveur pour communiquer avec d'autres serveurs.",
- "admin.cluster.interNodeListenAddressEx": "E.g.: \":8075\"",
+ "admin.cluster.interNodeListenAddressEx": "Ex. : \":8075\"",
"admin.cluster.interNodeListenAddressTitle": "Adresse d'écoute de la communication entre noeuds :",
"admin.cluster.interNodeUrlsDesc": "Les URLs internes/privées de tous les serveurs Mattermost, séparés par des virgules",
- "admin.cluster.interNodeUrlsEx": "Exemple: \"http://10.10.10.30, http://10.10.10.31\"",
+ "admin.cluster.interNodeUrlsEx": "Ex. : \"http://10.10.10.30, http://10.10.10.31\"",
"admin.cluster.interNodeUrlsTitle": "URLs de communication entre noeuds :",
"admin.cluster.loadedFrom": "Le fichier de configuration a été chargé par le noeud ID {clusterId}. Veuillez vous référer au guide de résolution des problèmes de notre <a href=\"http://docs.mattermost.com/deployment/cluster.html\" target=\"_blank\">documentation</a> si vous accédez à la Console Système à partir d'un répartiteur de charge et que vous rencontrez des problèmes.",
"admin.cluster.noteDescription": "Changer les propriétés de cette section requiert un redémarrage du serveur avant de prendre effet. Lorsque le mode Haute Disponibilité est activé, la Console Système est mise en lecture-seule et ne peut être changée que par le fichier de configuration.",
@@ -164,7 +164,7 @@
"admin.cluster.status_table.url": "URL de communication entre noeuds",
"admin.cluster.status_table.version": "Version",
"admin.compliance.directoryDescription": "Répertoire des rapports de conformité. Si non spécifié : ./data/ .",
- "admin.compliance.directoryExample": "E.g.: \"./data/\"",
+ "admin.compliance.directoryExample": "Ex. : \"./data/\"",
"admin.compliance.directoryTitle": "Répertoire du rapport de conformité :",
"admin.compliance.enableDailyDesc": "Si activé, Mattermost générera un rapport de conformité quotidien",
"admin.compliance.enableDailyTitle": "Activer le rapport quotidien :",
@@ -244,7 +244,7 @@
"admin.email.fullPushNotification": "Envoyer un extrait du message complet",
"admin.email.genericPushNotification": "Envoyer une description générale avec les noms des utilisateurs et des canaux",
"admin.email.inviteSaltDescription": "Clé de salage de 32 caractères ajouté aux courriels d'invitation. Générée aléatoirement lors de l'installation. Cliquez sur \"Regénérer\" pour créer une nouvelle clé de salage.",
- "admin.email.inviteSaltExample": "Exemple : \"bjlSR4QqkXFBr7TP4oDzlfZmcNuH9Yo\"",
+ "admin.email.inviteSaltExample": "Ex. : \"bjlSR4QqkXFBr7TP4oDzlfZmcNuH9Yo\"",
"admin.email.inviteSaltTitle": "Clé de salage des courriels d'invitation :",
"admin.email.mhpns": "La connexion à iOS et aux applications Android est cryptée",
"admin.email.mhpnsHelp": "Télécharger <a href=\"https://itunes.apple.com/us/app/mattermost/id984966508?mt=8\" target=\"_blank\">L'application IOS Mattermost</a> depuis iTunes. Télécharger <a href=\"https://play.google.com/store/apps/details?id=com.mattermost.mattermost&hl=en\" target=\"_blank\">L'application Android Mattermost</a> depuis Google Play. Apprenez en plus sur <a href=\"http://docs.mattermost.com/deployment/push.html#hosted-push-notifications-service-hpns\" target=\"_blank\">HPNS</a>.",
@@ -262,7 +262,7 @@
"admin.email.notificationsDescription": "En général, activé en production. Si activé, Mattermost essaye d'envoyer des notifications par courrier électronique. Les développeurs peuvent en revanche désactiver cette option pour gagner du temps.<br />Activer cette option retire la bannière \"Mode découverte\" (cela nécessite de se déconnecter puis se re-connecter après avoir activé l'option).",
"admin.email.notificationsTitle": "Envoyer des notifications par courriel : ",
"admin.email.passwordSaltDescription": "Clé de salage de 32 caractères utilisé pour générer la clé de réinitialisation du mot de passe. Générée aléatoirement à l'installation. Cliquez sur \"re-générer\" pour créer une nouvelle clé de salage.",
- "admin.email.passwordSaltExample": "Exemple : \"bjlSR4QqkXFBr7TP4oDzlfZmcNuH9Yo\"",
+ "admin.email.passwordSaltExample": "Ex. : \"bjlSR4QqkXFBr7TP4oDzlfZmcNuH9Yo\"",
"admin.email.passwordSaltTitle": "Clé de salage de réinitialisation du mot de passe :",
"admin.email.pushContentDesc": "Choisir \"Envoyer une description générale avec les noms des utilisateurs et des canaux\" permet aux notifications push d'envoyer des messages sans détail, en incluant juste les noms d'utilisateurs et de canaux.<br /><br />Choisir \"Envoyer un extrait du message complet\" envoie des extraits des messages qui déclenchent les notifications, et peuvent inclure des informations confidentielles visibles sur le terminal des utilisateurs notifiés. Si votre serveur de notifications Push est en dehors de votre pare-feu, il est HAUTEMENT RECOMMANDÉ d'utiliser cette option uniquement avec le protocole \"https\".",
"admin.email.pushContentTitle": "Contenu des notifications push :",
@@ -310,7 +310,7 @@
"admin.general.policy.permissionsSystemAdmin": "Administrateurs système",
"admin.general.policy.restrictPrivateChannelManagementDescription": "Choisir qui peut créer, supprimer, renommer et définir l'en-tête ou la description pour les groupes privés.",
"admin.general.policy.restrictPrivateChannelManagementTitle": "Autoriser la gestion des groupes privés pour :",
- "admin.general.policy.restrictPublicChannelManagementDescription": "Choisir qui peut créer, supprimer, renommer et définir l'en-tête ou la description pour les canaux publiques.",
+ "admin.general.policy.restrictPublicChannelManagementDescription": "Choisir qui peut créer, supprimer, renommer et définir l'en-tête ou la description des canaux publics.",
"admin.general.policy.restrictPublicChannelManagementTitle": "Autoriser la gestion des canaux publics pour :",
"admin.general.policy.teamInviteDescription": "Choisir qui peut inviter d'autres personnes à une équipe en utilisant <b>Inviter un nouveau membre</b> pour inviter de nouveaux utilisateurs par courrier électronique, ou l'option <b>Obtenir un lien d'invitation d'équipe</b> du menu principal. Si l'option <b>Obtenir un lien d'invitation d'équipe</b> est utilisée pour partager un lien, vous pouvez faire expirer le code d'invitation depuis <b>Configuration de l'équipe</b> > <b>Code d'invitation</b> une fois que les utilisateurs désirés ont rejoint l'équipe.",
"admin.general.policy.teamInviteTitle": "Autoriser l'envoi d'invitation depuis :",
@@ -319,64 +319,64 @@
"admin.gitab.clientSecretDescription": "Récupérez cette information depuis les instructions ci-dessus pour vous connecter à GitLab.",
"admin.gitlab.EnableHtmlDesc": "<ol><li>Connectez vous à votre compte GitLab et allez dans les réglages de votre profil, puis dans \"Applications\".</li><li>Saisissez les URLs de redirection \"<your-mattermost-url>/login/gitlab/complete\" (exemple: http://localhost:8065/login/gitlab/complete) et \"<your-mattermost-url>/signup/gitlab/complete\". </li><li>Puis utilisez les champs \"Secret\" et \"Id\" de GitLab pour compléter les options ci-dessous.</li><li>Complétez les URL de fin de parcours (Endpoint) ci-dessous. </li></ol>",
"admin.gitlab.authDescription": "Saisissez https://<your-gitlab-url>/oauth/authorize (par exemple https://exemple.com:3000/oauth/authorize). Vérifiez si vous utilisez HTTP ou HTTPS que votre URL est correctement saisie.",
- "admin.gitlab.authExample": "Exemple \"https://<your-gitlab-url>/oauth/authorize\"",
+ "admin.gitlab.authExample": "Ex. : \"https://<your-gitlab-url>/oauth/authorize\"",
"admin.gitlab.authTitle": "URL d'authentification (auth endpoint) :",
"admin.gitlab.clientIdDescription": "Récupérez cette information depuis les instructions ci-dessus pour vous connecter à GitLab",
- "admin.gitlab.clientIdExample": "Exemple : \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"",
+ "admin.gitlab.clientIdExample": "Ex. : \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"",
"admin.gitlab.clientIdTitle": "ID d'application :",
- "admin.gitlab.clientSecretExample": "Exemple : \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"",
+ "admin.gitlab.clientSecretExample": "Ex. : \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"",
"admin.gitlab.clientSecretTitle": "Clé secrète de l'application :",
"admin.gitlab.enableDescription": "Si activé, Mattermost autorise la création d'une équipe et l'inscription avec le service OAuth de GitLab.",
"admin.gitlab.enableTitle": "Activer l'authentification par GitLab : ",
"admin.gitlab.settingsTitle": "Configuration de GitLab",
"admin.gitlab.tokenDescription": "Saisissez https://<your-gitlab-url>/oauth/token. Veillez à saisir HTTP ou HTTPS dans l'URL suivant votre configuration.",
- "admin.gitlab.tokenExample": "Exemple \"https://<your-gitlab-url>/oauth/token\"",
+ "admin.gitlab.tokenExample": "Ex. : \"https://<your-gitlab-url>/oauth/token\"",
"admin.gitlab.tokenTitle": "URL du jeton (token endpoint) :",
"admin.gitlab.userDescription": "Saisissez https://<your-gitlab-url>/api/v3/user. Veillez à saisir HTTP ou HTTPS dans l'URL suivant votre configuration.",
- "admin.gitlab.userExample": "Exemple \"https://<your-gitlab-url>/api/v3/user\"",
+ "admin.gitlab.userExample": "Ex. : \"https://<your-gitlab-url>/api/v3/user\"",
"admin.gitlab.userTitle": "URL de l'API (User API endpoint) :",
"admin.google.EnableHtmlDesc": "<ol><li><a href='https://accounts.google.com/login'>Conectez-vous</a> à votre compte Google.</li><li>Allez à <a href='https://console.developers.google.com'>https://console.developers.google.com</a>, cliquez sur <strong>Credentials</strong> dans la barre latérale de gauche et saisissez \"Mattermost - votre-nom-d-entreprise\" comme <strong>Project Name</strong>, puis cliquez sur <strong>Create</strong>.</li><li>Cliquez sur l'entête <strong>OAuth consent screen</strong> et saisissez \"Mattermost\" comme <strong>Product name shown to users</strong>, puis cliquez sur <strong>Save</strong>.</li><li>Sous l'entête <strong>Credentials</strong>, cliquez <strong>Create credentials</strong>, choisissez <strong>OAuth client ID</strong> et sélectionnez <strong>Web Application</strong>.</li><li>Dans <strong>Restrictions</strong> et <strong>Authorized redirect URIs</strong> saisissez <strong>votre-url-mattermost/signup/google/complete</strong> (exemple: http://localhost:8065/signup/google/complete). Cliquez sur <strong>Create</strong>.</li><li>Collez le <strong>Client ID</strong> et le <strong>Client Secret</strong> dans les champs ci-dessous, puis cliquez sur <strong>Save</strong>.</li><li>Enfin, allez dans <a href='https://console.developers.google.com/apis/api/plus/overview'>Google+ API</a> et cliquez sur <strong>Enable</strong>. Ceci peut prendre plusieurs minutes pour se propager dans les systèmes de Google.</li></ol>",
"admin.google.authTitle": "URL d'authentification (auth endpoint) :",
"admin.google.clientIdDescription": "Le Client ID que vous avez reçu lorsque vous avez enregistré l'application avec Google.",
- "admin.google.clientIdExample": "Exemple : \"7602141235235-url0fhs1mayfasbmop5qlfns8dh4.apps.googleusercontent.com\"",
+ "admin.google.clientIdExample": "Ex. : \"7602141235235-url0fhs1mayfasbmop5qlfns8dh4.apps.googleusercontent.com\"",
"admin.google.clientIdTitle": "ID Client :",
"admin.google.clientSecretDescription": "Le Client Secret que vous avez reçu lorsque vous avez enregistré l'application avec Google.",
- "admin.google.clientSecretExample": "Exemple : \"H8sz0Az-dDs2p15-7QzD231\"",
+ "admin.google.clientSecretExample": "Ex. : \"H8sz0Az-dDs2p15-7QzD231\"",
"admin.google.clientSecretTitle": "Secret client :",
"admin.google.tokenTitle": "URL du jeton (token endpoint) :",
"admin.google.userTitle": "URL de l'API (User API endpoint) :",
"admin.image.amazonS3BucketDescription": "Nom de votre bucket S3 dans AWS.",
- "admin.image.amazonS3BucketExample": "Exemple : \"mattermost-media\"",
+ "admin.image.amazonS3BucketExample": "Ex. : \"mattermost-media\"",
"admin.image.amazonS3BucketTitle": "Bucket S3 Amazon :",
"admin.image.amazonS3IdDescription": "Demandez cette information à votre administrateur AWS.",
- "admin.image.amazonS3IdExample": "Exemple : \"AKIADTOVBGERKLCBV\"",
+ "admin.image.amazonS3IdExample": "Ex. : \"AKIADTOVBGERKLCBV\"",
"admin.image.amazonS3IdTitle": "Access Key ID d'Amazon S3 :",
"admin.image.amazonS3RegionDescription": "Région AWS dans laquelle votre bucket S3 est hébergé.",
- "admin.image.amazonS3RegionExample": "Exemple : \"us-east-1\"",
+ "admin.image.amazonS3RegionExample": "Ex. : \"us-east-1\"",
"admin.image.amazonS3RegionTitle": "Région AWS S3 :",
"admin.image.amazonS3SecretDescription": "Demandez cette information à votre administrateur AWS.",
- "admin.image.amazonS3SecretExample": "Exemple : \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"",
+ "admin.image.amazonS3SecretExample": "Ex. : \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"",
"admin.image.amazonS3SecretTitle": "Secret Access Key d'Amazon S3 :",
"admin.image.localDescription": "Répertoire où écrire les fichiers et les images. Si vide : \"./data/\".",
- "admin.image.localExample": "E.g.: \"./data/\"",
+ "admin.image.localExample": "Ex. : \"./data/\"",
"admin.image.localTitle": "Répertoire de stockage local :",
"admin.image.maxFileSizeDescription": "Taille maximum des pièce jointes en Mo. Attention : vérifiez que la mémoire du serveur puisse supporter votre saisie. Les gros fichiers augmentent les risques de crash serveur de de téléchargement échoués à cause des erreurs réseau.",
"admin.image.maxFileSizeExample": "50",
"admin.image.maxFileSizeTitle": "Taille de fichier maximum :",
"admin.image.previewHeightDescription": "Hauteur maxi de l'aperçu d'image (\"0\" pour taille automatique). Mettre cette valeur à jour change la manière dont les aperçus d'image seront générés par la suite, mais ne modifie pas les aperçus déjà générés.",
- "admin.image.previewHeightExample": "E.g.: \"0\"",
+ "admin.image.previewHeightExample": "Ex. : \"0\"",
"admin.image.previewHeightTitle": "Hauteur d'aperçu d'image :",
"admin.image.previewWidthDescription": "Largeur maximale de l'aperçu d'image. Mettre cette valeur à jour change la manière dont les aperçus d'image seront générés par la suite, mais ne modifie pas les aperçus déjà générés.",
- "admin.image.previewWidthExample": "E.g.: \"1024\"",
+ "admin.image.previewWidthExample": "Ex. : \"1024\"",
"admin.image.previewWidthTitle": "Largeur d'aperçu d'image :",
"admin.image.profileHeightDescription": "Hauteur de la photo de profil",
- "admin.image.profileHeightExample": "E.g.: \"0\"",
+ "admin.image.profileHeightExample": "Ex. : \"0\"",
"admin.image.profileHeightTitle": "Hauteur de photo de profil :",
"admin.image.profileWidthDescription": "Largeur de la photo de profil.",
- "admin.image.profileWidthExample": "E.g.: \"1024\"",
+ "admin.image.profileWidthExample": "Ex. : \"1024\"",
"admin.image.profileWidthTitle": "Largeur de photo de profil :",
"admin.image.publicLinkDescription": "Clé de salage de 32 caractères ajoutée aux courriels d'invitation. Générée aléatoirement lors de l'installation. Cliquez sur \"Regénérer\" pour créer une nouvelle clé de salage.",
- "admin.image.publicLinkExample": "Exemple : \"gxHVDcKUyP2y1eiyW8S8na1UYQAfq6J6\"",
+ "admin.image.publicLinkExample": "Ex. : \"gxHVDcKUyP2y1eiyW8S8na1UYQAfq6J6\"",
"admin.image.publicLinkTitle": "Clé de salage publique :",
"admin.image.shareDescription": "Permettre aux utilisateurs de partager des liens et images publics.",
"admin.image.shareTitle": "Activer les liens publics pour les fichiers : ",
@@ -385,54 +385,54 @@
"admin.image.storeLocal": "Disque local",
"admin.image.storeTitle": "Système de stockage des fichiers :",
"admin.image.thumbHeightDescription": "Hauteur des miniatures générées pour les images envoyées. Changer cette valeur modifie la façon dont les miniatures apparaîtront dans le futur, mais ne modifie pas les images créées précédemment.",
- "admin.image.thumbHeightExample": "E.g.: \"100\"",
+ "admin.image.thumbHeightExample": "Ex. : \"100\"",
"admin.image.thumbHeightTitle": "Hauteur des miniatures de pièces jointes :",
"admin.image.thumbWidthDescription": "Largeur des miniatures générées pour les images envoyées. Changer cette valeur modifie la façon dont les miniatures apparaîtront dans le futur, mais ne modifie pas les images créées précédemment.",
- "admin.image.thumbWidthExample": "E.g.: \"120\"",
+ "admin.image.thumbWidthExample": "Ex. : \"120\"",
"admin.image.thumbWidthTitle": "Largeur des miniatures de pièces jointes :",
"admin.integrations.custom": "Intégrations personnalisées",
"admin.integrations.external": "Services externes",
"admin.integrations.webrtc": "Mattermost WebRTC",
"admin.ldap.baseDesc": "Le DN de base est le Distinguished Name à partir du quel Mattermost doit rechercher les utilisateurs dans l'arborescence LDAP.",
- "admin.ldap.baseEx": "Exemple : \"ou=Unit Name, dc=example, dc=com\"",
+ "admin.ldap.baseEx": "Ex. : \"ou=Unit Name,dc=corp,dc=example,dc=com\"",
"admin.ldap.baseTitle": "DN de base :",
"admin.ldap.bindPwdDesc": "Mot de passe de l'utilisateur LDAP utilisé pour rechercher les autres utilisateurs.",
"admin.ldap.bindPwdTitle": "Mot de passe de l'utilisateur de recherche :",
"admin.ldap.bindUserDesc": "Nom de l'utilisateur LDAP utilisé pour rechercher les autres utilisateurs. Il peut s'agir d'un utilisateur créé spécifiquement pour Mattermost, et disposant de droits restreints à l'arborescence LDAP concernée par Mattermoste.",
"admin.ldap.bindUserTitle": "Nom d'utilisateur pour la recherche :",
"admin.ldap.emailAttrDesc": "Attribut du serveur LDAP utilisé pour le champ \"adresse électronique\" dans Mattermost.",
- "admin.ldap.emailAttrEx": "Exemple : \"mail\" ou \"userPrincipalName\"",
+ "admin.ldap.emailAttrEx": "Ex. : \"mail\" ou \"userPrincipalName\"",
"admin.ldap.emailAttrTitle": "Attribut \"adresse électronique\" :",
"admin.ldap.enableDesc": "Si activé, Mattermost permet de s'authentifier avec le serveur LDAP",
"admin.ldap.enableTitle": "Activer la connexion avec LDAP :",
"admin.ldap.firstnameAttrDesc": "(Optionnel) L'attribut dans le serveur AD/LDAP qui sera utilisé pour les prénoms des utilisateurs de Mattermost. Lorsque défini, les utilisateurs ne pourront pas éditer leur prénom étant donné qu'il est alors synchronisé avec le serveur LDAP. Lorsque laissé vide, les utilisateurs peuvent définir leur propre prénom dans les paramètres du compte.",
- "admin.ldap.firstnameAttrEx": "Exemple : \"givenName\"",
+ "admin.ldap.firstnameAttrEx": "Ex. : \"givenName\"",
"admin.ldap.firstnameAttrTitle": "Attribut prénom",
"admin.ldap.idAttrDesc": "Attribut du serveur LDAP utilisé comme identifiant unique d'utilisateur dans Mattermost. Cela doit être un attribut dont la valeur ne change pas, tel que le username ou un uid. Si cette valeur change dans l'annuaire LDAP, un nouveau compte Mattermost sera créé avec l'ancien utilisateur. Il s'agit de la valeur à saisir dans le champ \"Utilisateur LDAP\" de la page de connexion. Normalement cet attribut est le même que celui du \"nom d'utilisateur\" ci-dessus. Si votre équipe utilise domain\\username pour se connecter à d'autres services avec LDAP, vous pouvez utiliser domain\\username pour rester cohérent.",
- "admin.ldap.idAttrEx": "Exemple : \"sAMAccountName\"",
+ "admin.ldap.idAttrEx": "Ex. : \"sAMAccountName\"",
"admin.ldap.idAttrTitle": "Attribut id : ",
"admin.ldap.lastnameAttrDesc": "(Optionnel) L'attribut dans le serveur AD/LDAP qui sera utilisé pour les noms de famille des utilisateurs de Mattermost. Lorsque défini, les utilisateurs ne pourront pas éditer leur nom de famille étant donné qu'il est alors synchronisé avec le serveur LDAP. Lorsque laissé vide, les utilisateurs peuvent définir leur propre nom de famille dans les paramètres du compte.",
- "admin.ldap.lastnameAttrEx": "E.g.: \"sn\"",
+ "admin.ldap.lastnameAttrEx": "Ex. : \"sn\"",
"admin.ldap.lastnameAttrTitle": "Attribut \"nom de famille\" :",
"admin.ldap.ldap_test_button": "Test d'AD/LDAP",
"admin.ldap.loginNameDesc": "L’espace texte réservé apparaît dans le champ de connexion sur la page de connexion. Par défaut \"LDAP Nom d'utilisateur\".",
- "admin.ldap.loginNameEx": "Exemple : \"LDAP nom d’utilisateur\".",
+ "admin.ldap.loginNameEx": "Ex. : \"AD/LDAP nom d’utilisateur\"",
"admin.ldap.loginNameTitle": "Champ de connexion :",
- "admin.ldap.maxPageSizeEx": "E.g.: \"2000\"",
+ "admin.ldap.maxPageSizeEx": "Ex. : \"2000\"",
"admin.ldap.maxPageSizeHelpText": "Le nombre maximum d'utilisateurs que le serveur Mattermost va récupérer du serveur AD/LDAP en une seule demande. 0 pour illimité.",
"admin.ldap.maxPageSizeTitle": "Taille de page maximum",
"admin.ldap.nicknameAttrDesc": "(Optionnel) L'attribut dans le serveur AD/LDAP qui sera utilisé pour les surnoms des utilisateurs de Mattermost. Lorsque défini, les utilisateurs ne pourront pas éditer leur surnoms étant donné qu'il est alors synchronisé avec le serveur LDAP. Lorsque laissé vide, les utilisateurs peuvent définir leur propre surnom dans les paramètres du compte.",
- "admin.ldap.nicknameAttrEx": "Exemple : \"surnom\"",
+ "admin.ldap.nicknameAttrEx": "Ex. : \"surnom\"",
"admin.ldap.nicknameAttrTitle": "Attribut \"nom d'utilisateur\" :",
"admin.ldap.noLicense": "<h4 class=\"banner__heading\">Note :</h4><p>LDAP est une fonctionnalitée de l'édition d’Enterprise. Votre licence actuelle ne permet pas d'utiliser LDAP. Voir <a href=\"http://mattermost.com\" target=\"_blank\">ici</a> pour plus d'informations et tarifs sur l'édition d’Enterprise.</p>",
"admin.ldap.portDesc": "Le port utilisé par Mattermost pour vous connecter au serveur LDAP. Par défaut : 389.",
- "admin.ldap.portEx": "E.g.: \"389\"",
+ "admin.ldap.portEx": "Ex. : \"389\"",
"admin.ldap.portTitle": "Port du serveur LDAP :",
"admin.ldap.queryDesc": "Valeur du délai d'attente pour les requêtes au serveur AD/LDAP. Augmentez cette valeur si vous rencontrez des erreurs liées à un serveur AD/LDAP trop lent.",
- "admin.ldap.queryEx": "E.g.: \"60\"",
+ "admin.ldap.queryEx": "Ex. : \"60\"",
"admin.ldap.queryTitle": "Délai d'attente (en secondes) :",
"admin.ldap.serverDesc": "Nom DNS ou adresse IP du serveur LDAP.",
- "admin.ldap.serverEx": "Exemple : \"10.0.0.23\"",
+ "admin.ldap.serverEx": "Ex. : \"10.0.0.23\"",
"admin.ldap.serverTitle": "Serveur LDAP :",
"admin.ldap.skipCertificateVerification": "Passer la vérification",
"admin.ldap.skipCertificateVerificationDesc": "Saute l'étape de vérification des certificats pour les connexions TLS ou STARTTLS . Non recommandé pour les environnements de production où TLS est nécessaire. Pour tester seulement.",
@@ -448,7 +448,7 @@
"admin.ldap.userFilterDisc": "Entrez éventuellement un filtre LDAP à utiliser lors de la recherche d'objets utilisateur. Seuls les utilisateurs sélectionnés par la requête seront en mesure d'accéder à Mattermost . Pour Active Directory, la requête pour filtrer les utilisateurs désactivés est (&(objectCategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2))).",
"admin.ldap.userFilterEx": "Exemple : \"(objectClass=utilisateur)\"",
"admin.ldap.userFilterTitle": "Filtre utilisateur :",
- "admin.ldap.usernameAttrEx": "Exemple : \"sAMAccountName\"",
+ "admin.ldap.usernameAttrEx": "Ex. : \"sAMAccountName\"",
"admin.ldap.usernameAttrTitle": "Attribut \"nom d'utilisateur\" :",
"admin.license.choose": "Parcourir",
"admin.license.chooseFile": "Parcourir",
@@ -506,17 +506,17 @@
"admin.office365.EnableHtmlDesc": "<ol><li><a href='https://login.microsoftonline.com/'>Connectez-vous</a> à votre compte Microsoft ou Office 365. Veuillez vous assurer que le compte est sur le même <a href='https://msdn.microsoft.com/en-us/library/azure/jj573650.aspx#Anchor_0'>tenant</a> que celui avec lequel vous voulez connecter vos utilisateurs.</li><li>Allez à <a href='https://apps.dev.microsoft.com'>https://apps.dev.microsoft.com</a>, cliquez sur <strong>Go to app list</strong> > <strong>Add an app</strong> et utilisez \"Mattermost - votre-nom-d-entreprise\" comme <strong>Application Name</strong>.</li><li>Dans <strong>Application Secrets</strong>, cliquez sur <strong>Generate New Password</strong> et collez-le en-dessous dans le champ <strong>Application Secret Password</strong>.</li><li>Sous <strong>Platforms</strong>, cliquez sur <strong>Add Platform</strong>, choisissez <strong>Web</strong> et saisissez <strong>votre-url-mattermost/signup/office365/complete</strong> (exemple: http://localhost:8065/signup/office365/complete) sous <strong>Redirect URIs</strong>. Décochez aussi <strong>Allow Implicit Flow</strong>.</li><li>Enfin, cliquez sur <strong>Save</strong> et collez l'<strong>Application ID</strong> ci-dessous.</li></ol>",
"admin.office365.authTitle": "URL d'authentification (auth endpoint) :",
"admin.office365.clientIdDescription": "L'Application/Client ID que vous avez reçu lorsque vous avez enregistré l'application avec Microsoft.",
- "admin.office365.clientIdExample": "Exemple : \"adf3sfa2-ag3f-sn4n-ids0-sh1hdax192qq\"",
+ "admin.office365.clientIdExample": "Ex. : \"adf3sfa2-ag3f-sn4n-ids0-sh1hdax192qq\"",
"admin.office365.clientIdTitle": "ID d'application :",
"admin.office365.clientSecretDescription": "Le mot de passe d'application que vous avez reçu lorsque vous avez enregistré l'application avec Microsoft.",
- "admin.office365.clientSecretExample": "Exemple : \"shAieM47sNBfgl20f8ci294\"",
+ "admin.office365.clientSecretExample": "Ex. : \"shAieM47sNBfgl20f8ci294\"",
"admin.office365.clientSecretTitle": "Mot de passe secret de l'application :",
"admin.office365.tokenTitle": "URL du jeton (token endpoint) :",
"admin.office365.userTitle": "URL de l'API (User API endpoint) :",
"admin.password.lowercase": "Au moins une lettre minuscule",
"admin.password.minimumLength": "Longueur minimale du mot de passe :",
"admin.password.minimumLengthDescription": "Nombre minimum de caractères acceptés pour un mot de passe. Doit être un nombre entier supérieur ou égal à {min} et inférieur ou égal à {max}.",
- "admin.password.minimumLengthExample": "E.g.: \"5\"",
+ "admin.password.minimumLengthExample": "Ex. : \"5\"",
"admin.password.number": "Au moins un nombre",
"admin.password.preview": "Aperçu du message d'erreur",
"admin.password.requirements": "Gestion des mots de passe :",
@@ -530,18 +530,18 @@
"admin.rate.enableLimiterDescription": "Si activé, les APIs sont limitées comme spécifié ci-dessous.",
"admin.rate.enableLimiterTitle": "Limiter l'accès aux API : ",
"admin.rate.httpHeaderDescription": "Quand ce champ est rempli, les flux des requêtes sont limités par l'en-tête HTTP spécifié (par exemple \"X-Real-IP\" avec Nginx, \"X-Forwarded-For\" pour AmazonELB)",
- "admin.rate.httpHeaderExample": "Exemple : \"X-Real-IP\", \"X-Forwarded-For\"",
+ "admin.rate.httpHeaderExample": "Ex. : \"X-Real-IP\", \"X-Forwarded-For\"",
"admin.rate.httpHeaderTitle": "Limiter l'accès au moyen d'un en-tête HTTP",
"admin.rate.maxBurst": "Limite maximale de dépassement :",
"admin.rate.maxBurstDescription": "Nombre maximum de requêtes autorisées à dépasser le seuil limite de requêtes par seconde.",
- "admin.rate.maxBurstExample": "E.g.: \"100\"",
+ "admin.rate.maxBurstExample": "Ex. : \"100\"",
"admin.rate.memoryDescription": "Nombre maximum de sessions utilisateur connectées au système, comme indiqué dans les paramètres \"Adresse distante Vary By\" et \"En-tête HTTP Vary By\" ci-dessous.",
- "admin.rate.memoryExample": "E.g.: \"10000\"",
+ "admin.rate.memoryExample": "Ex. : \"10000\"",
"admin.rate.memoryTitle": "Taille du stockage en mémoire :",
"admin.rate.noteDescription": "Modifier des paramètres dans cette section nécessite un redémarrage du serveur.",
"admin.rate.noteTitle": "Remarque :",
"admin.rate.queriesDescription": "Limite l'API à ce nombre de requêtes par seconde.",
- "admin.rate.queriesExample": "E.g.: \"10\"",
+ "admin.rate.queriesExample": "Ex. : \"10\"",
"admin.rate.queriesTitle": "Nombre maximum de requêtes par seconde :",
"admin.rate.remoteDescription": "Si activé, l'API est limitée au moyen de l'adresse IP du client.",
"admin.rate.remoteTitle": "Adapter la limite en fonction de l'adresse distante : ",
@@ -562,39 +562,39 @@
"admin.reset_password.titleReset": "Réinitialiser le mot de passe",
"admin.reset_password.titleSwitch": "Basculez vers l’addresse électronique / mot de passe de votre compte",
"admin.saml.assertionConsumerServiceURLDesc": "Entrez https://<votre-url-mattermost>/login/sso/saml. Veillez à saisir HTTP ou HTTPS dans l'URL suivant votre configuration. Ce champ est aussi connu comme étant l'URL d'Assertion Consumer Service.",
- "admin.saml.assertionConsumerServiceURLEx": "Ex : \"https://<your-mattermost-url>/login/sso/saml\"",
+ "admin.saml.assertionConsumerServiceURLEx": "Ex. : \"https://<your-mattermost-url>/login/sso/saml\"",
"admin.saml.assertionConsumerServiceURLTitle": "URL du service d'identification :",
- "admin.saml.bannerDesc": "Si une propriété de l'utilisateur est modifiée sur le serveur LDAP, elle sera mise à jour la prochaine fois que l'utilisateur se loguera à Mattermost. Cela concerne également le fait de désactiver ou supprimer un utilisateur du serveur LDAP. La synchronisation continue sera disponible ultérieurement.",
+ "admin.saml.bannerDesc": "Si une propriété de l'utilisateur est modifiée sur le serveur SAML, elle sera mise à jour la prochaine fois que l'utilisateur se connectera à Mattermost, ce y compris si l'utilisateur est désactivé ou supprimé d'un fournisseur d'identité SAML. La déconnexion à distance à l'aide de serveurs SAML est prévue dans une version ultérieure.",
"admin.saml.emailAttrDesc": "Attribut du SAML pour le champ \"adresse électronique\" dans Mattermost.",
- "admin.saml.emailAttrEx": "Exemple : \"Email\" ou \"PrimaryEmail\"",
+ "admin.saml.emailAttrEx": "Ex. : \"Email\" ou \"EmailPrincipal\"",
"admin.saml.emailAttrTitle": "Attribut \"adresse électronique\" :",
"admin.saml.enableDescription": "Si activé, Mattermost autorise la connexion en utilisant SAML. Consultez la <a href='http://docs.mattermost.com/deployment/sso-saml.html' target='_blank'>documentation</a> pour en apprendre davantage sur la configuration de SAML pour Mattermost.",
"admin.saml.enableTitle": "Activer la connexion avec SAML :",
"admin.saml.encryptDescription": "Si activé, Mattermost déchiffre les commandes SAML chiffrées avec le certificat public de votre serveur d'authentification.",
"admin.saml.encryptTitle": "Activer le chiffrement :",
"admin.saml.firstnameAttrDesc": "(Optionnel) Attribut du serveur LDAP utilisé pour le champ \"surnom\" des utilisateurs dans Mattermost.",
- "admin.saml.firstnameAttrEx": "Exemple : \"FirstName\"",
+ "admin.saml.firstnameAttrEx": "Ex. : \"Prénom\"",
"admin.saml.firstnameAttrTitle": "Attribut prénom :",
"admin.saml.idpCertificateFileDesc": "Le certificat public fourni par votre serveur d'authentification.",
"admin.saml.idpCertificateFileRemoveDesc": "Retirer le certificat public fourni par votre serveur d'authentification.",
"admin.saml.idpCertificateFileTitle": "Certificat public du service d'identification :",
"admin.saml.idpDescriptorUrlDesc": "L'URL d'émetteur pour le fournisseur d'identité utilisé pour les requêtes SAML.",
- "admin.saml.idpDescriptorUrlEx": "Ex \"https://idp.example.org/SAML2/issuer\"",
+ "admin.saml.idpDescriptorUrlEx": "Ex. : \"https://idp.example.org/SAML2/issuer\"",
"admin.saml.idpDescriptorUrlTitle": "URL du serveur d'identité :",
"admin.saml.idpUrlDesc": "L'URL où Mattermost enverra une requête SAML pour démarrer la séquence de connexion.",
- "admin.saml.idpUrlEx": "Ex : \"https://idp.example.org/SAML2/SSO/Login\"",
+ "admin.saml.idpUrlEx": "Ex. : \"https://idp.example.org/SAML2/SSO/Login\"",
"admin.saml.idpUrlTitle": "URL SSO SAML :",
"admin.saml.lastnameAttrDesc": "(Optionnel) Attribut SAML utilisé pour le champ \"langue\" des utilisateurs dans Mattermost.",
- "admin.saml.lastnameAttrEx": "Ex : \"LastName\"",
+ "admin.saml.lastnameAttrEx": "Ex. : \"NomDeFamille\"",
"admin.saml.lastnameAttrTitle": "Attribut \"nom de famille\" :",
"admin.saml.localeAttrDesc": "(Optionnel) Attribut SAML utilisé pour le champ \"langue\" des utilisateurs dans Mattermost.",
- "admin.saml.localeAttrEx": "Ex : \"Locale\" ou \"PrimaryLanguage\"",
+ "admin.saml.localeAttrEx": "Ex. : \"Langue\" ou \"LanguePrincipale\"",
"admin.saml.localeAttrTitle": "Attribut language préféré :",
"admin.saml.loginButtonTextDesc": "(Facultatif) Le texte qui apparait sur le bouton de \"se connecter\" de la page de connection. Par défaut, \"Avec SAML\".",
- "admin.saml.loginButtonTextEx": "Ex : \"With OKTA\"",
+ "admin.saml.loginButtonTextEx": "Ex. : \"Avec OKTA\"",
"admin.saml.loginButtonTextTitle": "Texte du bouton de connexion :",
"admin.saml.nicknameAttrDesc": "(Optionnel) Attribut du serveur LDAP utilisé pour le champ \"surnom\" des utilisateurs dans Mattermost.",
- "admin.saml.nicknameAttrEx": "Exemple : \"surnom\"",
+ "admin.saml.nicknameAttrEx": "Ex. : \"Surnom\"",
"admin.saml.nicknameAttrTitle": "Attribut \"surnom\" : ",
"admin.saml.privateKeyFileFileDesc": "La clé privée utilisée pour déchiffrer le SAML de votre serveur d'identité.",
"admin.saml.privateKeyFileFileRemoveDesc": "La clé privée utilisée pour déchiffrer le SAML de votre serveur d'identité.",
@@ -610,7 +610,7 @@
"admin.saml.uploading.certificate": "Téléchargement du certificat...",
"admin.saml.uploading.privateKey": "Téléchargement de la clé privée...",
"admin.saml.usernameAttrDesc": "Attribut du SAML utilisé pour le champ \"nom d'utilisateur\" des utilisateurs dans Mattermost.",
- "admin.saml.usernameAttrEx": "Ex : \"Username\"",
+ "admin.saml.usernameAttrEx": "Ex. : \"NomDUtilisateur\"",
"admin.saml.usernameAttrTitle": "Attribut \"nom d'utilisateur\" :",
"admin.saml.verifyDescription": "Si vrai, Mattermost vérifie la signature du SAML.",
"admin.saml.verifyTitle": "Vérifier la signature :",
@@ -629,7 +629,7 @@
"admin.select_team.select": "Sélectionner",
"admin.select_team.selectTeam": "Choisir une équipe",
"admin.service.attemptDescription": "Nombre de tentatives de connexion autorisées avant que l'utilisateur ne soit bloqué et qu'une réinitialisation du mot de passe par courriel ne soit obligatoire.",
- "admin.service.attemptExample": "E.g.: \"10\"",
+ "admin.service.attemptExample": "Ex. : \"10\"",
"admin.service.attemptTitle": "Nombre maximum de tentatives de connexion :",
"admin.service.cmdsDesc": "Si activé, les commandes slash personnalisées seront autorisées. Consultez la <a href='http://docs.mattermost.com/developer/slash-commands.html' target='_blank'>documentation</a> pour en savoir plus.",
"admin.service.cmdsTitle": "Activer les commandes slash : ",
@@ -639,7 +639,7 @@
"admin.service.developerDesc": "Si activé, les erreurs Javascript sont affichées dans une barre en haut de l'interface. Ceci n'est pas recommandé sur un serveur de production. ",
"admin.service.developerTitle": "Activer le mode développeur : ",
"admin.service.googleDescription": "Définissez cette clé pour activer l'affichage des titres pour les aperçus de vidéos YouTube. Sans la clé, les aperçus YouTube seront créés à partir des liens apparaissant des messages ou commentaires mais ils ne montreront pas le titre de la vidéo. Regardez un <a href=\"https://www.youtube.com/watch?v=Im69kzhpR3I\" target=\"_blank\">tutoriel Google Developers</a> pour des instructions sur l'obtention d'une clé.",
- "admin.service.googleExample": "Exemple : \"7rAh6iwQCkV4cA1Gsg3fgGOXJAQ43QV\"",
+ "admin.service.googleExample": "Ex. : \"7rAh6iwQCkV4cA1Gsg3fgGOXJAQ43QV\"",
"admin.service.googleTitle": "Clé API Google :",
"admin.service.iconDescription": "Lorsqu'activé, les webhooks, commandes slash et autres intégrations, telles que <a href=\"https://docs.mattermost.com/integrations/zapier.html\" target=\"_blank\">Zapier</a>, seront autorisées à changer la photo du profil à partir duquel elles émettent des messages. Note : Si les intégrations sont également autorisées à redéfinir les noms d'utilisateur, des utilisateurs pourraient effectuer des attaques de phishing en se faisant passer pour d'autres utilisateurs.",
"admin.service.iconTitle": "Activer les intégrations à redéfinir les images de profil utilisateur :",
@@ -648,8 +648,8 @@
"admin.service.integrationAdmin": "Restreindre la gestion des intégrations aux administrateurs :",
"admin.service.integrationAdminDesc": "Lorsqu'activé, les webhooks et commandes slash peuvent seulement être créées, éditées et vues par les administrateurs systèmes et d'équipe, et par les applications OAuth 2.0 des administrateurs systèmes. Les intégrations sont disponibles à tous les utilisateurs après qu'elles ont été créées par l'administrateur.",
"admin.service.listenAddress": "Adresse IP du serveur :",
- "admin.service.listenDescription": "The address and port to which to bind and listen. Specifying \":8065\" will bind to all network interfaces. Specifying \"127.0.0.1:8065\" will only bind to the network interface having that IP address. If you choose a port of a lower level (called \"system ports\" or \"well-known ports\", in the range of 0-1023), you must have permissions to bind to that port. On Linux you can use: \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" to allow Mattermost to bind to well-known ports.",
- "admin.service.listenExample": "E.g.: \":8065\"",
+ "admin.service.listenDescription": "L'adresse et le port sur laquelle se lier et écouter. Spécifier \":8065\" se liera sur toutes les interfaces réseau. Spécifier \"127.0.0.1:8065\" se liera uniquement sur l'interface réseau disposant de cette adresse IP. Si vous choisissez un port de bas niveau (également appelés \"ports systèmes\" ou \"ports bien connus\", dans l'intervalle 0-1023), vous devez disposer des permissions pour vous lier sur ces ports. Sous Linux, vous pouvez utiliser : \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" pour autoriser Mattermost à se lier sur ces ports bien connus.",
+ "admin.service.listenExample": "Ex. : \":8065\"",
"admin.service.mfaDesc": "Si activé, Les utilisateurs auront la possibilité d'ajouter l'authentification multi- facteur à leur compte . Ils auront besoin d'un smartphone et une application d'authentification tels que Google Authenticator .",
"admin.service.mfaTitle": "Activité l’authentification multi-facteurs:",
"admin.service.mobileSessionDays": "Durée de la session sur les applis mobiles (en jours) :",
@@ -661,14 +661,14 @@
"admin.service.securityDesc": "Si activé, les administrateurs système sont notifiés par courriel si une alerte de sécurité a été annoncée ces 12 dernières heures. La messagerie doit être activée.",
"admin.service.securityTitle": "Activer les alertes de sécurité : ",
"admin.service.segmentDescription": "Segment.com est un service en ligne qui peut éventuellement être utilisé pour le suivi des statistiques détaillées du système. Vous pouvez obtenir une clé de signature -up pour un compte gratuit à Segment.com.",
- "admin.service.segmentExample": "Exemple : \"g3fgGOXJAQ43QV7rAh6iwQCkV4cA1Gs\"",
+ "admin.service.segmentExample": "Ex. : \"g3fgGOXJAQ43QV7rAh6iwQCkV4cA1Gs\"",
"admin.service.segmentTitle": "Clé d'écriture du segment :",
"admin.service.sessionCache": "Cache de session en minutes :",
"admin.service.sessionCacheDesc": "Durée pendant laquelle une session est gardée en mémoire.",
- "admin.service.sessionDaysEx": "E.g.: \"30\"",
+ "admin.service.sessionDaysEx": "Ex. : \"30\"",
"admin.service.siteURL": "URL du site :",
"admin.service.siteURLDescription": "L'URL, incluant le numéro de port et le protocol, que les utilisateurs utilisent pour accéder à Mattermost. Ce champ peut être laissé vide à moins que vous ne configuriez l'envoi d'email par lots dans <b>Notifications > Email</b>. Lorsque le champ est vide, l'URL est configurée automatiquement sur base du trafic entrant.",
- "admin.service.siteURLExample": "Ex \"https://mattermost.example.com:1234\"",
+ "admin.service.siteURLExample": "Ex. : \"https://mattermost.example.com:1234\"",
"admin.service.ssoSessionDays": "Durée de la session SSO (en jours) :",
"admin.service.ssoSessionDaysDesc": "Le nombre de jours entre la dernière fois qu'un utilisateur a entré ses identifiants et l'expiration de la session de l'utilisateur. Si la méthode d'authentification est SAML ou GitLab, l'utilisateur pourra être automatiquement connecté à nouveau dans Mattermost s'ils sont déjà connectés dans SAML ou GitLab. Après le changement de ce paramètre, il prendra effet la prochaine fois que les utilisateurs entreront leurs identifiants.",
"admin.service.testingDescription": "(Option de développement) Si activé, la commande \"/loadtest\" est active et charge des données de test. Changer ce paramètre nécessite de redémarrer le serveur.",
@@ -735,13 +735,13 @@
"admin.sql.dataSource": "Source de données :",
"admin.sql.driverName": "Nom du pilote :",
"admin.sql.keyDescription": "Clé de salage de 32 caractères utilisée pour chiffrer et déchiffrer les champs en base de données.",
- "admin.sql.keyExample": "Exemple : \"gxHVDcKUyP2y1eiyW8S8na1UYQAfq6J6\"",
+ "admin.sql.keyExample": "Ex. : \"gxHVDcKUyP2y1eiyW8S8na1UYQAfq6J6\"",
"admin.sql.keyTitle": "Clé de chiffrement des données au repos :",
"admin.sql.maxConnectionsDescription": "Nombre maximum de connexion inactives à la base de données gardées ouvertes.",
- "admin.sql.maxConnectionsExample": "E.g.: \"10\"",
+ "admin.sql.maxConnectionsExample": "Ex. : \"10\"",
"admin.sql.maxConnectionsTitle": "Nombre maximum de connexions inactives :",
"admin.sql.maxOpenDescription": "Nombre maximum de connexions ouvertes à la base de données.",
- "admin.sql.maxOpenExample": "E.g.: \"10\"",
+ "admin.sql.maxOpenExample": "Ex. : \"10\"",
"admin.sql.maxOpenTitle": "Nombre max. de connexions ouvertes :",
"admin.sql.noteDescription": "Modifier ces paramètres nécessite de redémarrer le serveur.",
"admin.sql.noteTitle": "Remarque :",
@@ -749,7 +749,7 @@
"admin.sql.traceDescription": "(Mode développeur) Si activé, toutes les commandes SQL sont enregistrées dans le journal.",
"admin.sql.traceTitle": "Tracer : ",
"admin.sql.warning": "Attention : Ré-générer cette clé de salage peut provoquer des valeurs vides dans certaines colonnes de la base de données.",
- "admin.support.aboutDesc": "Faites un lien vers la page À propos pour plus d'informations sur votre déploiement Mattermost, par exemple son utilisation et son public dans votre organisation. Par défaut c'est un lien vers la page d'information de Mattermost.",
+ "admin.support.aboutDesc": "Faites un lien vers la page À propos pour plus d'informations sur votre déploiement Mattermost, par exemple son utilisation et son public dans votre organisation. Par défaut, c'est un lien vers la page d'information de Mattermost.",
"admin.support.aboutTitle": "Lien \"À propos\" :",
"admin.support.emailHelp": "Adresse électronique affichée sur les notifications de courrier électronique et au cours du tutoriel pour permettre aux utilisateurs de poser des questions.",
"admin.support.emailTitle": "Adresse électronique de support :",
@@ -767,21 +767,21 @@
"admin.system_analytics.title": "le Système",
"admin.system_analytics.totalPosts": "Nombre total de messages",
"admin.team.brandDesc": "Activer l'image nouvelle personnalisé pour afficher une image de votre choix , téléchargé ci-dessous , et un texte d'aide , écrit ci-dessous , sur la page de connexion .",
- "admin.team.brandDescriptionExample": "Toute la communication de votre équipe au même endroit, accessible de partout",
- "admin.team.brandDescriptionHelp": "Description of service shown in login screens and UI. When not specified, \"All team communication in one place, searchable and accessible anywhere\" is displayed.",
- "admin.team.brandDescriptionTitle": "Description du site",
+ "admin.team.brandDescriptionExample": "Toute votre communication d'équipe en un seul endroit, consultable et accessible de partout",
+ "admin.team.brandDescriptionHelp": "Description du service affiché dans les écrans de connexion et dans l'interface utilisateur. Lorsque non défini, \"Toute votre communication d'équipe en un seul endroit, consultable et accessible de partout\" est affiché.",
+ "admin.team.brandDescriptionTitle": "Description du site :",
"admin.team.brandImageTitle": "Nouvelle image personnalisée :",
- "admin.team.brandTextDescription": "Text that will appear below your custom brand image on your login screen. Supports Markdown-formatted text. Maximum 500 characters allowed.",
+ "admin.team.brandTextDescription": "Le texte apparaissant en-dessous de votre image personnalisée sur l'écran de connexion. Supporte le formattage de texte Markdown. 500 caractères maximum autorisés.",
"admin.team.brandTextTitle": "Nouveau texte personnalisé",
"admin.team.brandTitle": "activer une image personnalisée : ",
"admin.team.chooseImage": "choisit une nouvelle image",
"admin.team.dirDesc": "Si activé, les équipes configurées pour apparaitre dans l'annuaire des équipes apparaitront sur la page d'accueil à la place de la création d'une nouvelle équipe.",
"admin.team.dirTitle": "Activé l'annuaire des équipes : ",
- "admin.team.maxChannelsDescription": "Nombre maximum d'utilisateurs par équipe, actifs et inactifs.",
- "admin.team.maxChannelsExample": "Exemple : \"100\"",
- "admin.team.maxChannelsTitle": "Max Channels Per Team:",
+ "admin.team.maxChannelsDescription": "Nombre maximum de canaux par équipe, incluant les canaux actifs et supprimés.",
+ "admin.team.maxChannelsExample": "Ex.: \"100\"",
+ "admin.team.maxChannelsTitle": "Nombre maximum de canaux par équipe :",
"admin.team.maxUsersDescription": "Nombre maximum d'utilisateurs par équipe, actifs et inactifs.",
- "admin.team.maxUsersExample": "E.g.: \"25\"",
+ "admin.team.maxUsersExample": "Ex.: \"25\"",
"admin.team.maxUsersTitle": "Nombre max. d'utilisateurs par équipe :",
"admin.team.noBrandImage": "Pas de nouvelle image a télécharger",
"admin.team.openServerDescription": "Si activé, tout le monde peut s’enregistrer pour un compte d'utilisateur sur ce serveur sans qu'il soit nécessaire d'être invité.",
@@ -789,19 +789,19 @@
"admin.team.restrictDescription": "Les équipes et comptes utilisateur ne peuvent être créés que depuis un domaine spécifique (par ex. \"mattermost.org\") ou une liste de domaines séparés par des virgules (ex \"corp.mattermost.com, mattermost.org\").",
"admin.team.restrictDirectMessage": "Permettre aux utilisateurs d'ouvrir des canaux de message avec :",
"admin.team.restrictDirectMessageDesc": "‘Tout utilisateur sur le serveur Mattermost' permet aux utilisateurs d' ouvrir un canal de message direct avec un utilisateur sur le serveur, même si elles ne sont pas sur les équipes. ‘Tout membre de l'équipe’ limite la capacité d'ouvrir des canaux de messages directs aux seuls utilisateurs qui sont dans la même équipe.",
- "admin.team.restrictExample": "Exemple : \"corp.mattermost.com, mattermost.org\"",
+ "admin.team.restrictExample": "Ex.: \"corp.mattermost.com, mattermost.org\"",
"admin.team.restrictNameDesc": "Si activé, vous ne pourrez pas créer une équipe portant un nom réservé (comme www, admin, support, test, channel, etc).",
"admin.team.restrictNameTitle": "Noms d'équipes restreints : ",
"admin.team.restrictTitle": "Restreindre la création de compte à ces domaines :",
"admin.team.restrict_direct_message_any": "Tout utilisateur sur le serveur Mattermost",
"admin.team.restrict_direct_message_team": "Tout les membres de l’équipe",
"admin.team.siteNameDescription": "Nom du service affiché dans les écrans de connexion et l'interface.",
- "admin.team.siteNameExample": "Exemple : \"Mattermost\"",
+ "admin.team.siteNameExample": "Ex.: \"Mattermost\"",
"admin.team.siteNameTitle": "Nom du site :",
"admin.team.teamCreationDescription": "Si faux, seuls les administrateurs système peuvent créer des équipes.",
"admin.team.teamCreationTitle": "Autoriser la création d'équipes : ",
"admin.team.upload": "Télécharger",
- "admin.team.uploadDesc": "Customize your user experience by adding a custom image to your login screen. Recommended maximum image size is less than 2 MB.",
+ "admin.team.uploadDesc": "Personnalisez votre expérience utilisateur en ajoutant une image personnalisée sur votre écran de connexion. Taille d'image recommandée inférieure à 2Mio.",
"admin.team.uploaded": "téléchargement terminé!",
"admin.team.uploading": "téléchargement..",
"admin.team.userCreationDescription": "Si désactivé, la possibilité de créer des comptes est désactivée.",
@@ -811,8 +811,8 @@
"admin.true": "oui",
"admin.userList.title": "Utilisateurs de {team}",
"admin.userList.title2": "Utilisateurs de {team} ({count})",
- "admin.user_item.authServiceEmail": ", <strong>Sign-in Method:</strong> Courriel",
- "admin.user_item.authServiceNotEmail": ", <strong>Sign-in Method:</strong> {service}",
+ "admin.user_item.authServiceEmail": "<strong>Méthode de connexion :</strong> Adresse email",
+ "admin.user_item.authServiceNotEmail": "<strong>Méthode de connexion :</strong> {service}",
"admin.user_item.confirmDemoteDescription": "Si vous vous retirez le rôle d'administrateur et qu'il n'y a aucun autre administrateur désigné, vous devrez en désigner un en utilisant les outils en ligne de commande depuis un terminal sur le serveur.",
"admin.user_item.confirmDemoteRoleTitle": "Confirmez le retrait de votre rôle d'administrateur",
"admin.user_item.confirmDemotion": "Confirmer le retrait",
@@ -825,8 +825,8 @@
"admin.user_item.makeSysAdmin": "Assigner le rôle administrateur système",
"admin.user_item.makeTeamAdmin": "Assigner le rôle \"Administrateur d'équipe\"",
"admin.user_item.member": "Membre",
- "admin.user_item.mfaNo": ", <strong>MFA</strong> : Non",
- "admin.user_item.mfaYes": ", <strong>MFA</strong> : Oui",
+ "admin.user_item.mfaNo": "<strong>MFA</strong> : Non",
+ "admin.user_item.mfaYes": "<strong>MFA</strong> : Oui",
"admin.user_item.resetMfa": "supprimer l’identification à facteurs-multiples",
"admin.user_item.resetPwd": "Réinitialiser le mot de passe",
"admin.user_item.switchToEmail": "Basculer vers votre adresse électronique / mot de passe",
@@ -835,25 +835,25 @@
"admin.webrtc.enableDescription": "Lorsqu'activé, Mattermost autorise les appels vidéo en <strong>tête-à-tête</strong>. Les appels par WebRTC sont disponibles sur Chrome, Firefox et les applications Mattermost de bureau.",
"admin.webrtc.enableTitle": "Activer Mattermost WebRTC :",
"admin.webrtc.gatewayAdminSecretDescription": "Saisissez votre mot de passe pour accéder à l'URL de la passerelle administrateur.",
- "admin.webrtc.gatewayAdminSecretExample": "Ex. : \"PVRzWNN1Tg6szn7IQWvhpAvLByScWxdy\"",
+ "admin.webrtc.gatewayAdminSecretExample": "Ex.: \"PVRzWNN1Tg6szn7IQWvhpAvLByScWxdy\"",
"admin.webrtc.gatewayAdminSecretTitle": "Mot de passe administrateur de la passerelle :",
"admin.webrtc.gatewayAdminUrlDescription": "Entrez https://<mattermost-webrtc-gateway-url>:<port>/admin. Assurez-vous d'utiliser HTTP ou HTTPS dans votre URL en fonction de la configuration de votre serveur. Mattermost WebRTC utilise cette URL pour obtenir des jetons valides pour chaque pair afin d'établir la connexion.",
- "admin.webrtc.gatewayAdminUrlExample": "Ex. : \"https://webrtc.mattermost.com:7089/admin\"",
+ "admin.webrtc.gatewayAdminUrlExample": "Ex.: \"https://webrtc.mattermost.com:7089/admin\"",
"admin.webrtc.gatewayAdminUrlTitle": "URL de la passerelle administrateur :",
"admin.webrtc.gatewayWebsocketUrlDescription": "Entrez wss://<mattermost-webrtc-gateway-url>:<port>. Assurez-vous d'utiliser WS ou WSS dans votre URL en fonction de la configuration de votre serveur. Il s'agit du websocket utilisé pour signaler et établir une communication entre les pairs.",
- "admin.webrtc.gatewayWebsocketUrlExample": "Ex. : \"wss://webrtc.mattermost.com:8189\"",
+ "admin.webrtc.gatewayWebsocketUrlExample": "Ex.: \"wss://webrtc.mattermost.com:8189\"",
"admin.webrtc.gatewayWebsocketUrlTitle": "URL de la passerelle Websocket :",
"admin.webrtc.stunUriDescription": "Spécifiez votre URI STUN sous la forme stun:<your-stun-url>:<port>. STUN est un protocole réseau standardisé permettant aux clients finaux de déterminer leur adresse IP publique lorsqu'ils sont situés derrière un NAT.",
- "admin.webrtc.stunUriExample": "Ex. : \"stun:webrtc.mattermost.com:5349\"",
+ "admin.webrtc.stunUriExample": "Ex.: \"stun:webrtc.mattermost.com:5349\"",
"admin.webrtc.stunUriTitle": "STUN URI",
"admin.webrtc.turnSharedKeyDescription": "Spécifiez votre clé partagée pour le serveur TURN. Elle est utilisée pour créer des mots de passe dynamiques pour établir la connexion. Chaque mot de passe est valide pendant une période de temps assez courte.",
- "admin.webrtc.turnSharedKeyExample": "Ex. : \"bXdkOWQxc3d0Ynk3emY5ZmsxZ3NtazRjaWg=\"",
+ "admin.webrtc.turnSharedKeyExample": "Ex.: \"bXdkOWQxc3d0Ynk3emY5ZmsxZ3NtazRjaWg=\"",
"admin.webrtc.turnSharedKeyTitle": "Clé partagée TURN :",
"admin.webrtc.turnUriDescription": "Spécifiez votre URI TURN sous la forme turn:<your-turn-url>:<port>. TURN est un protocole réseau standardisé permettant aux clients finaux d'établir une connexion en utilisant une adresse IP publique comme relai lorsque ces clients sont situés derrière un NAT symétrique.",
- "admin.webrtc.turnUriExample": "Ex. : \"turn:webrtc.mattermost.com:5349\"",
+ "admin.webrtc.turnUriExample": "Ex.: \"turn:webrtc.mattermost.com:5349\"",
"admin.webrtc.turnUriTitle": "URI TURN",
"admin.webrtc.turnUsernameDescription": "Spécifiez votre nom d'utilisateur pour le serveur TURN.",
- "admin.webrtc.turnUsernameExample": "Ex. : \"monNomDUtilisateur\"",
+ "admin.webrtc.turnUsernameExample": "Ex.: \"monnomdutilisateur\"",
"admin.webrtc.turnUsernameTitle": "Nom d'utilisateur TURN :",
"admin.webserverModeDisabled": "Désactivé",
"admin.webserverModeDisabledDescription": "Le serveur Mattermost ne servira pas les fichiers statiques.",
@@ -879,14 +879,14 @@
"analytics.system.totalFilePosts": "Messages avec fichiers",
"analytics.system.totalHashtagPosts": "Messages avec hashtags",
"analytics.system.totalIncomingWebhooks": "Webhooks entrants",
- "analytics.system.totalMasterDbConnections": "Master DB Conns",
+ "analytics.system.totalMasterDbConnections": "Connexions bases de données maîtres",
"analytics.system.totalOutgoingWebhooks": "Webhooks sortants",
"analytics.system.totalPosts": "Nombre de messages",
- "analytics.system.totalReadDbConnections": "Replica DB Conns",
+ "analytics.system.totalReadDbConnections": "Connexions bases de données de réplication",
"analytics.system.totalSessions": "Nombre de sessions",
"analytics.system.totalTeams": "Nombre d'équipes",
"analytics.system.totalUsers": "Nombre d'utilisateurs",
- "analytics.system.totalWebsockets": "Websocket Conns",
+ "analytics.system.totalWebsockets": "Connexions websocket",
"analytics.team.activeUsers": "Nombre d'utilisateurs actifs avec messages",
"analytics.team.newlyCreated": "Nouveaux utilisateurs",
"analytics.team.privateGroups": "Groupes privés",
@@ -980,20 +980,20 @@
"channel_flow.handleTooShort": "L'URL du canal doit comporter au moins 2 caractères alphanumériques minuscules",
"channel_flow.invalidName": "Nom du canal incorrect",
"channel_flow.set_url_title": "Choisir l'URL de {term}",
- "channel_header.addToFavorites": "Add to Favorites",
+ "channel_header.addToFavorites": "Ajouter aux favoris",
"channel_header.channel": "Canal",
- "channel_header.channelHeader": "Définir l'en-tête du canal...",
- "channel_header.delete": "Supprimer {term}...",
+ "channel_header.channelHeader": "Éditer l'entête du canal",
+ "channel_header.delete": "Supprimer {term}",
"channel_header.flagged": "Messages avec indicateur",
"channel_header.group": "Groupe",
"channel_header.leave": "Quitter {term}",
"channel_header.manageMembers": "Gérer les membres",
"channel_header.notificationPreferences": "Préférences de notification",
"channel_header.recentMentions": "Mentions récentes",
- "channel_header.removeFromFavorites": "Remove from Favorites",
- "channel_header.rename": "Renommer {term}...",
- "channel_header.setHeader": "Choisir l'en-tête de {term}...",
- "channel_header.setPurpose": "Choisir la description de {term}...",
+ "channel_header.removeFromFavorites": "Retirer des favoris",
+ "channel_header.rename": "Renommer {term}",
+ "channel_header.setHeader": "Éditer l'entête {term}",
+ "channel_header.setPurpose": "Éditer le descriptif {term}",
"channel_header.viewInfo": "Informations",
"channel_header.viewMembers": "Voir les membres",
"channel_header.webrtc.call": "Démarrer un appel vidéo",
@@ -1004,7 +1004,7 @@
"channel_info.id": "ID : ",
"channel_info.name": "Nom",
"channel_info.notFound": "Aucun canal",
- "channel_info.purpose": "Objectif",
+ "channel_info.purpose": "Description :",
"channel_info.url": "URL :",
"channel_invite.add": " Ajouter",
"channel_invite.addNewMembers": "Ajouter de nouveaux membres à ",
@@ -1110,13 +1110,13 @@
"create_post.write": "Écrire un message...",
"create_team.agreement": "En créant votre compte et en utilisant votre {siteName}, vous acceptez nos <a href='/static/help/terms.html'>Terms of Service</a> and <a href='/static/help/privacy.html'>Privacy Policy</a>. Si vous n’acceptez pas, vous ne pouvez utilisé votre {siteName}.",
"create_team.display_name.back": "Retour à l’étape précedente",
- "create_team.display_name.charLength": "Le nom doit contenir de 4 à 15 caractères",
+ "create_team.display_name.charLength": "Le nom doit comporter au minimum 2 caractères avec un maximum de 15",
"create_team.display_name.nameHelp": "Nommez votre équipe dans toutes les langues. Votre nom d'équipe sera montré dans les menus et rubriques.",
"create_team.display_name.next": "Suivant",
"create_team.display_name.required": "Ce champ est obligatoire",
"create_team.display_name.teamName": "Nom de l'équipe",
"create_team.team_url.back": "Retour à l’étape précedente",
- "create_team.team_url.charLength": "Le nom doit contenir de 4 à 15 caractères",
+ "create_team.team_url.charLength": "Le nom doit comporter au minimum 2 caractères avec un maximum de 15",
"create_team.team_url.creatingTeam": "Création de l'équipe...",
"create_team.team_url.finish": "Terminer",
"create_team.team_url.hint": "<li>Courte et facile à retenir</li><li>Utilisez des lettres minuscules, des chiffres et des tirets </li><li>Doit commencer par une lettre et ne peut pas se terminer par un tiret</li>",
@@ -1134,7 +1134,7 @@
"delete_channel.confirm": "Confirmez la SUPPRESSION du canal",
"delete_channel.del": "Supprimer",
"delete_channel.group": "groupe",
- "delete_channel.question": "Voulez-vous vraiment supprimer {display_name} {term} ?",
+ "delete_channel.question": "Ceci va supprimer le canal de l'équipe et rendre son contenu inaccessible de tous les utilisateurs. Voulez-vous vraiment supprimer {display_name} {term} ?",
"delete_post.cancel": "Annuler",
"delete_post.comment": "Commentaire",
"delete_post.confirm": "Confirmer la suppression de {term}",
@@ -1200,14 +1200,14 @@
"file_upload.limited": "Les téléchargements sont limités à {count} fichiers par message. Envoyez d'autres messages pour ajouter d'autres fichiers.",
"file_upload.pasted": "Image collée à ",
"filtered_channels_list.count": "{count} {count, plural, =0 {0 channels} un {channel} autres {channels}}",
- "filtered_channels_list.countTotal": "{count} {count, plural, =0 {0 channels} one {channel} other {channels}} of {total} Total",
+ "filtered_channels_list.countTotal": "{count} {count, plural, =0 {0 channels} one {channel} other {channels}} of {total} au total",
"filtered_channels_list.search": "Rechercher des canaux",
"filtered_user_list.any_team": "Tous les utilisateurs",
"filtered_user_list.count": "{count} {count, plural, =0 {0 members} un {member} autres {members}}",
- "filtered_user_list.countTotal": "{count} {count, plural, =0 {0 members} un {member} autres {members}} sur {total} au total",
- "filtered_user_list.countTotalPage": "{startCount, number} - {endCount, number} {count, plural, =0 {0 members} one {member} other {members}} of {total} total",
+ "filtered_user_list.countTotal": "{count} {count, plural, =0 {0 members} one {member} other {members}} of {total} au total",
+ "filtered_user_list.countTotalPage": "{startCount, number} - {endCount, number} {count, plural, =0 {0 members} one {member} other {members}} of {total} au total",
"filtered_user_list.member": "Membre",
- "filtered_user_list.search": "Press enter to search",
+ "filtered_user_list.search": "Appuyez sur Entrée pour rechercher",
"filtered_user_list.show": "Filtre :",
"filtered_user_list.team_only": "Membre de l’équipe",
"find_team.email": "Adresse électronique",
@@ -1489,14 +1489,14 @@
"member_list.noUsersAdd": "Aucun utilisateur à ajouter.",
"members_popover.msg": "Message",
"members_popover.title": "Membres",
- "mobile.components.channels_list_view.yourChannels": "Your channels:",
- "mobile.components.select_server_view.enterServerUrl": "Enter Server URL",
- "mobile.components.select_server_view.proceed": "Proceed",
+ "mobile.components.channels_list_view.yourChannels": "Vos canaux :",
+ "mobile.components.select_server_view.enterServerUrl": "Spécifiez l'URL du serveur",
+ "mobile.components.select_server_view.proceed": "Continuer",
"mobile.components.select_server_view.siteUrlPlaceholder": "https://mattermost.example.com",
"mobile.routes.channels": "Canaux",
- "mobile.routes.enterServerUrl": "Enter Server URL",
- "mobile.routes.login": "S’identifier",
- "mobile.routes.postsList": "Posts List",
+ "mobile.routes.enterServerUrl": "Spécifiez l'URL du serveur",
+ "mobile.routes.login": "Se connecter",
+ "mobile.routes.postsList": "Liste des messages",
"mobile.routes.selectTeam": "Choisir une équipe",
"more_channels.close": "Fermer",
"more_channels.create": "Créer un nouveau canal",
@@ -1641,6 +1641,7 @@
"sidebar.createChannel": "Créer un nouveau canal",
"sidebar.createGroup": "Créer un nouveau groupe",
"sidebar.direct": "Messages privés",
+ "sidebar.favorite": "Favoris",
"sidebar.more": "Plus…",
"sidebar.moreElips": "Plus...",
"sidebar.otherMembers": "En dehors de l’équipe",
@@ -1854,7 +1855,7 @@
"user.settings.display.showNickname": "Afficher le pseudo s'il existe, sinon afficher prénom et nom",
"user.settings.display.showUsername": "Afficher le nom d'utilisateur (défaut)",
"user.settings.display.teammateDisplay": "Affichage des membres de l'équipe",
- "user.settings.display.theme.applyToAllTeams": "Apply new theme to all my teams",
+ "user.settings.display.theme.applyToAllTeams": "Appliquer le nouveau thème à toutes mes équipes",
"user.settings.display.theme.customTheme": "Thème personnalisé",
"user.settings.display.theme.describe": "Ouvrez pour gérer votre thème",
"user.settings.display.theme.import": "Importer des couleurs de thème depuis Slack",
@@ -1914,12 +1915,13 @@
"user.settings.languages.change": "Changer la langue de l'interface",
"user.settings.languages.promote": "Sélectionnez quelle langue utiliser dans l'interface utilisateur de Mattermost.<br /><br />Vous souhaitez apporter votre aide pour traduire ? Rejoignez le <a href='http://translate.mattermost.com/' target='_blank'>Serveur de Traduction Mattermost</a> pour contribuer.",
"user.settings.mfa.add": "Ajouter une identification à multi-facteur à votre compte",
- "user.settings.mfa.addHelp": "Vous pouvez demander un token provenant d'un smartphone, en plus de votre mot de passe, pour vous connecter à Mattermost.<br/><br/>Pour l'activer, télécharger Google Authenticator depuis <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> ou <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a> pour votre téléphone, puis<br/><br/>1. Cliquez sur le bouton <strong>Ajouter une identification à multi-facteur à votre compte</strong> ci-dessus.<br/>2 . Utilisez Google Authenticator pour scanner le code QR qui apparaît.<br/>3. Tapez le jeton généré par Google Authenticator et cliquez sur <strong >Enregistrer</strong>.<br/><br/> Lors de la connexion, vous serez invité à entrer un jeton de Google Authenticator en plus de vos informations d'identification régulières.",
- "user.settings.mfa.addHelpQr": "Scanner le code-barres avec l'application Google Authenticator sur votre smartphone et remplir le jeton avec celui fourni par l'application.",
+ "user.settings.mfa.addHelp": "Vous pouvez utiliser un code provenant d'un smartphone, en plus de votre mot de passe, pour vous connecter à Mattermost.<br/><br/>Pour activer cette fonctionnalité, téléchargez Google Authenticator depuis <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> ou <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a> pour votre téléphone, puis<br/><br/>1. Cliquez sur le bouton <strong>Ajouter une identification à multi-facteur à votre compte</strong> ci-dessus.<br/>2 . Utilisez Google Authenticator pour scanner le code QR qui apparaît ou tapez la clé fournie manuellement.<br/>3. Tapez le code généré par Google Authenticator et cliquez sur <strong >Enregistrer</strong>.<br/><br/> Lors de la connexion, vous serez invité à entrer un code de Google Authenticator en plus de vos informations d'identification habituelles.",
+ "user.settings.mfa.addHelpQr": "Veuillez scanner le QR code avec l'application Google Authenticator sur votre smartphone et saisissez le code fourni par l'application. Si vous ne pouvez pas scanner le code, vous pouvez saisir manuellement la clé secrète fournie.",
"user.settings.mfa.enterToken": "Token",
"user.settings.mfa.qrCode": "Code barre",
"user.settings.mfa.remove": "Retirer l’authentification à facteurs multiples",
"user.settings.mfa.removeHelp": "Retirer l’authentification multi-facteur signifie que vous n’aurez plus besoin d'un code d'accès basé sur un téléphone pour vous connecter à votre compte.",
+ "user.settings.mfa.secret": "Clé secrète :",
"user.settings.mfa.title": "Activité l’authentification multi-facteurs:",
"user.settings.modal.advanced": "Options avancées",
"user.settings.modal.confirmBtns": "Oui, abandonner",
@@ -2008,7 +2010,7 @@
"user.settings.security.google": "Google",
"user.settings.security.lastUpdated": "Dernière mise à jour le {date} à {time}",
"user.settings.security.ldap": "AD/LDAP",
- "user.settings.security.loginGitlab": "Connexion avec Gitlab",
+ "user.settings.security.loginGitlab": "Connexion avec GitLab",
"user.settings.security.loginLdap": "Connexion avec LDAP",
"user.settings.security.logoutActiveSessions": "Consulter et déconnecter les sessions actives",
"user.settings.security.method": "Méthode de connexion",
diff --git a/webapp/i18n/i18n.jsx b/webapp/i18n/i18n.jsx
index 923d87501..0513f1154 100644
--- a/webapp/i18n/i18n.jsx
+++ b/webapp/i18n/i18n.jsx
@@ -28,7 +28,7 @@ import zhLocaleData from 'react-intl/locale-data/zh';
const languages = {
de: {
value: 'de',
- name: 'Deutsch (Beta)',
+ name: 'Deutsch',
order: 0,
url: de
},
@@ -46,19 +46,19 @@ const languages = {
},
fr: {
value: 'fr',
- name: 'Français (Beta)',
+ name: 'Français',
order: 3,
url: fr
},
ja: {
value: 'ja',
- name: '日本語 (Beta)',
+ name: '日本語',
order: 10,
url: ja
},
ko: {
value: 'ko',
- name: '한국어 (Beta)',
+ name: '한국어 (Alpha)',
order: 7,
url: ko
},
@@ -82,13 +82,13 @@ const languages = {
},
'zh-TW': {
value: 'zh-TW',
- name: '中文 (繁體) (Beta)',
+ name: '中文 (繁體)',
order: 9,
url: zh_TW
},
'zh-CN': {
value: 'zh-CN',
- name: '中文 (简体) (Beta)',
+ name: '中文 (简体)',
order: 8,
url: zh_CN
}
diff --git a/webapp/i18n/ja.json b/webapp/i18n/ja.json
index 20a878d6e..f0d560085 100644
--- a/webapp/i18n/ja.json
+++ b/webapp/i18n/ja.json
@@ -648,7 +648,7 @@
"admin.service.integrationAdmin": "統合機能の管理を管理者のみに制限する:",
"admin.service.integrationAdminDesc": "有効な場合、ウェブフックとスラッシュコマンドはチーム管理者とシステム管理者のみが、OAuth 2.0アプリケーションはシステム管理者のみが作成、編集、閲覧できるようになります。統合機能は管理者によって作成された後、全てのユーザーが利用できます。",
"admin.service.listenAddress": "接続待ちアドレス:",
- "admin.service.listenDescription": "The address and port to which to bind and listen. Specifying \":8065\" will bind to all network interfaces. Specifying \"127.0.0.1:8065\" will only bind to the network interface having that IP address. If you choose a port of a lower level (called \"system ports\" or \"well-known ports\", in the range of 0-1023), you must have permissions to bind to that port. On Linux you can use: \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" to allow Mattermost to bind to well-known ports.",
+ "admin.service.listenDescription": "使用するIPアドレスとポート番号を設定します。\":8065\"と入力することで全てのインターフェイスのIPアドレスでアクセスを待ちます。\"127.0.0.1:8065\"と指定することで、一つのIPアドレスでアクセスを待ちます。\"システムポート\"や\"ウェルノウンポート\"と呼ばれる 0~1023 までの範囲のポート番号を選んだ場合、そのポートを使用する権限が必要になります。Linuxでは、Mattermostがウェルノウンポートを使用するために \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" を利用することができます。",
"admin.service.listenExample": "例: \":8065\"",
"admin.service.mfaDesc": "有効な場合、ユーザーは多要素認証をオプションとして選択できます。ユーザーはスマートフォンとGoogle Authenticatorのような認証アプリが必要になります。",
"admin.service.mfaTitle": "多要素認証を有効にする:",
@@ -980,20 +980,20 @@
"channel_flow.handleTooShort": "チャンネルURLは2文字以上の小文字の英数字にしてください",
"channel_flow.invalidName": "不正なチャンネル名です",
"channel_flow.set_url_title": "{term}のURLを設定する",
- "channel_header.addToFavorites": "Add to Favorites",
+ "channel_header.addToFavorites": "お気に入りに追加する",
"channel_header.channel": "チャンネル",
- "channel_header.channelHeader": "チャンネルのヘッダーを設定する…",
- "channel_header.delete": "{term}を削除する…",
+ "channel_header.channelHeader": "チャンネルヘッダーを編集する",
+ "channel_header.delete": "{term}を削除する",
"channel_header.flagged": "フラグの立てられた投稿",
"channel_header.group": "グループ",
"channel_header.leave": "{term}から出る",
"channel_header.manageMembers": "メンバーを管理する",
"channel_header.notificationPreferences": "通知の設定",
"channel_header.recentMentions": "最近のあなたについての投稿",
- "channel_header.removeFromFavorites": "Remove from Favorites",
- "channel_header.rename": "{term}の名前を変更する…",
- "channel_header.setHeader": "{term}のヘッダーを設定する…",
- "channel_header.setPurpose": "{term}の目的を設定する…",
+ "channel_header.removeFromFavorites": "お気に入りから削除する",
+ "channel_header.rename": "{term}の名前を変更する",
+ "channel_header.setHeader": "{term}ヘッダーを編集する",
+ "channel_header.setPurpose": "{term}の目的を編集する",
"channel_header.viewInfo": "情報を表示する",
"channel_header.viewMembers": "メンバーを見る",
"channel_header.webrtc.call": "ビデオ通話の開始",
@@ -1134,7 +1134,7 @@
"delete_channel.confirm": "チャンネルの削除を確認する",
"delete_channel.del": "削除",
"delete_channel.group": "グループ",
- "delete_channel.question": "{display_name} {term}を本当に削除しますか?",
+ "delete_channel.question": "チームからチャンネルを削除し、全てのユーザーがチャンネルの内容にアクセスできないようになります。本当に {display_name} {term} を削除しますか?",
"delete_post.cancel": "キャンセル",
"delete_post.comment": "コメント",
"delete_post.confirm": "{term}の削除を確認する",
@@ -1200,14 +1200,14 @@
"file_upload.limited": "同時にアップロードできるのは{count}ファイルまでです。これ以上アップロードするには新しい投稿をしてください。",
"file_upload.pasted": "画像の貼り付け先: ",
"filtered_channels_list.count": "{count} {count, plural, =0 {0 channels} one {channel} other {channels}}",
- "filtered_channels_list.countTotal": "{count} {count, plural, =0 {0 channels} one {channel} other {channels}} of {total} Total",
+ "filtered_channels_list.countTotal": "{count} {count, plural, =0 {0 channels} one {channel} other {channels}} of {total} 合計",
"filtered_channels_list.search": "チャンネルを検索する",
"filtered_user_list.any_team": "全てのユーザー",
"filtered_user_list.count": "{count} {count, plural, =0 {0 members} one {member} other {members}}",
"filtered_user_list.countTotal": "{count} {count, plural, =0 {0 members} one {member} other {members}} of {total} 合計",
- "filtered_user_list.countTotalPage": "{startCount, number} - {endCount, number} {count, plural, =0 {0 members} one {member} other {members}} of {total} total",
+ "filtered_user_list.countTotalPage": "{startCount, number} - {endCount, number} {count, plural, =0 {0 members} one {member} other {members}} of {total} 合計",
"filtered_user_list.member": "メンバー",
- "filtered_user_list.search": "Press enter to search",
+ "filtered_user_list.search": "検索するにはEnterを押してください",
"filtered_user_list.show": "フィルター:",
"filtered_user_list.team_only": "このチームのメンバー",
"find_team.email": "電子メールアドレス",
@@ -1489,14 +1489,14 @@
"member_list.noUsersAdd": "ユーザーは追加されません。",
"members_popover.msg": "メッセージ",
"members_popover.title": "メンバー",
- "mobile.components.channels_list_view.yourChannels": "Your channels:",
- "mobile.components.select_server_view.enterServerUrl": "Enter Server URL",
+ "mobile.components.channels_list_view.yourChannels": "あなたのチャンネル:",
+ "mobile.components.select_server_view.enterServerUrl": "サーバーURLを入力してください",
"mobile.components.select_server_view.proceed": "続行する",
"mobile.components.select_server_view.siteUrlPlaceholder": "https://mattermost.example.com",
"mobile.routes.channels": "チャンネル",
- "mobile.routes.enterServerUrl": "Enter Server URL",
+ "mobile.routes.enterServerUrl": "サーバーURLを入力してください",
"mobile.routes.login": "ログイン",
- "mobile.routes.postsList": "Posts List",
+ "mobile.routes.postsList": "投稿リスト",
"mobile.routes.selectTeam": "チームを選択する",
"more_channels.close": "閉じる",
"more_channels.create": "新しいチャンネルを作成する",
@@ -1641,6 +1641,7 @@
"sidebar.createChannel": "新しいチャンネルを作成する",
"sidebar.createGroup": "新しいグループを作成する",
"sidebar.direct": "ダイレクトメッセージ",
+ "sidebar.favorite": "お気に入り",
"sidebar.more": "もっと",
"sidebar.moreElips": "もっと…",
"sidebar.otherMembers": "このチームの外側",
@@ -1720,7 +1721,7 @@
"sso_signup.team_error": "チーム名を入力してください",
"suggestion.mention.all": "チャンネルの全員に通知します。{townsquare}で使うとチーム全体に通知します。",
"suggestion.mention.channel": "チャンネルの全員に通知します。",
- "suggestion.mention.channels": "私のチャンネル",
+ "suggestion.mention.channels": "自分のチャンネル",
"suggestion.mention.here": "チャンネル内のオンラインな全員へ通知します",
"suggestion.mention.members": "チャンネルのメンバー",
"suggestion.mention.morechannels": "他のチャンネル",
@@ -1854,7 +1855,7 @@
"user.settings.display.showNickname": "ニックネームが存在すればそれを表示する。存在していなければ氏名を表示する",
"user.settings.display.showUsername": "ユーザー名を表示する(デフォルト)",
"user.settings.display.teammateDisplay": "チームメイトの名前の表示",
- "user.settings.display.theme.applyToAllTeams": "Apply new theme to all my teams",
+ "user.settings.display.theme.applyToAllTeams": "全ての自分のチームに新しいテーマを適用する",
"user.settings.display.theme.customTheme": "カスタムテーマ",
"user.settings.display.theme.describe": "テーマを管理する",
"user.settings.display.theme.import": "Slackからテーマカラーをインポートする",
@@ -1914,12 +1915,13 @@
"user.settings.languages.change": "インターフェイスの言語を変更する",
"user.settings.languages.promote": "ユーザーインターフェイスでMattermostが表示する言語を選択してください。<br /><br />翻訳を手伝っていただけますか? 是非、<a href='http://translate.mattermost.com/' target='_blank'>Mattermost Translation Server</a>に参加してください。",
"user.settings.mfa.add": "MFAをあなたのアカウントに追加する",
- "user.settings.mfa.addHelp": "Mattermostにサインインするのに、パスワードに加え、スマートフォンを使ったトークンの入力が必要です。<br/><br/>有効にするには、<a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a>または<a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a>から、Google Authenicatorをダウンロードしてください。<br/><br/>1. 上の<strong>MFAをアカウントに追加する</strong>ボタンを押してください。<br/>2. 表示されるQRコードをGoogle Authenticatorでスキャンしてください。<br/>3. Google Authenticatorの生成したトークンを入力し、<strong>保存</strong>ボタンを押してください。<br/><br/>ログインする際には、通常の認証情報に加え、Google Authenticatorの生成するトークンが求められます。",
- "user.settings.mfa.addHelpQr": "QRコードをスマートフォン上のGoogle Authenticatorアプリでスキャンしてください。その上で表示されたトークンをここに入力してください。",
+ "user.settings.mfa.addHelp": "Mattermostにサインインするのに、パスワードに加え、スマートフォンを使ったトークンの入力を要求することができます。<br/><br/>有効にするには、あなたのスマートフォンに<a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a>または<a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a>から、Google Authenticatorをダウンロードしてください。<br/><br/>1. 上の<strong>MFAをアカウントに追加する</strong>ボタンを押してください。<br/>2. 表示されるQRコードをGoogle Authenticatorでスキャンするか秘密情報を手入力してください。<br/>3. Google Authenticatorの生成したトークンを入力し、<strong>保存</strong>ボタンを押してください。<br/><br/>ログインする際には、通常の認証情報に加え、Google Authenticatorの生成するトークンが求められます。",
+ "user.settings.mfa.addHelpQr": "スマートフォンのGoogle AuthenticatorアプリでQRコードをスキャンし、アプリから提供されるトークンを入力してください。コードをスキャンできない場合、秘密情報を手入力することができます。",
"user.settings.mfa.enterToken": "トークン(メンバーのみ)",
"user.settings.mfa.qrCode": "QRコード",
"user.settings.mfa.remove": "あなたのアカウントからMFAを削除する",
"user.settings.mfa.removeHelp": "多要素認証を削除すると、サインインする際にスマートフォンを使ったパスコードの入力は不要になります。",
+ "user.settings.mfa.secret": "秘密情報",
"user.settings.mfa.title": "多要素認証",
"user.settings.modal.advanced": "詳細",
"user.settings.modal.confirmBtns": "破棄します",
diff --git a/webapp/i18n/ko.json b/webapp/i18n/ko.json
index 275296ae0..f1b1a28dd 100644
--- a/webapp/i18n/ko.json
+++ b/webapp/i18n/ko.json
@@ -982,7 +982,7 @@
"channel_flow.set_url_title": "{term} URL 설정",
"channel_header.addToFavorites": "Add to Favorites",
"channel_header.channel": "채널",
- "channel_header.channelHeader": "채널 헤더 설정...",
+ "channel_header.channelHeader": "Edit Channel Header",
"channel_header.delete": "{term} 삭제...",
"channel_header.flagged": "중요 메시지",
"channel_header.group": "그룹",
@@ -992,8 +992,8 @@
"channel_header.recentMentions": "최근 멘션",
"channel_header.removeFromFavorites": "Remove from Favorites",
"channel_header.rename": "{term}의 이름을 변경...",
- "channel_header.setHeader": "{term}의 헤더 설정...",
- "channel_header.setPurpose": "{term}의 설명 설정...",
+ "channel_header.setHeader": "Edit {term} Header",
+ "channel_header.setPurpose": "Edit {term} Purpose",
"channel_header.viewInfo": "정보 보기",
"channel_header.viewMembers": "회원 보기",
"channel_header.webrtc.call": "Start Video Call",
@@ -1134,7 +1134,7 @@
"delete_channel.confirm": "채널 삭제 확인",
"delete_channel.del": "삭제",
"delete_channel.group": "그룹",
- "delete_channel.question": "정말 {display_name} {term}을 삭제하시겠습니까?",
+ "delete_channel.question": "This will delete the channel from the team and make its contents inaccessible for all users. Are you sure you wish to delete the {display_name} {term}?",
"delete_post.cancel": "취소",
"delete_post.comment": "답글",
"delete_post.confirm": "{term} 삭제 확인",
@@ -1641,6 +1641,7 @@
"sidebar.createChannel": "채널 생성하기",
"sidebar.createGroup": "그룹 생성하기",
"sidebar.direct": "개인 메시지",
+ "sidebar.favorite": "Favorites",
"sidebar.more": "더 보기",
"sidebar.moreElips": "더 보기...",
"sidebar.otherMembers": "팀 외부",
@@ -1915,11 +1916,12 @@
"user.settings.languages.promote": "Select which language Mattermost displays in the user interface.<br /><br />Would like to help with translations? Join the <a href='http://translate.mattermost.com/' target='_blank'>Mattermost Translation Server</a> to contribute.",
"user.settings.mfa.add": "Add MFA to your account",
"user.settings.mfa.addHelp": "You can require a smartphone-based token, in addition to your password, to sign into Mattermost.<br/><br/>To enable, download Google Authenticator from <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> or <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a> for your phone, then<br/><br/>1. Click the <strong>Add MFA to your account</strong> button above.<br/>2. Use Google Authenticator to scan the QR code that appears.<br/>3. Type in the Token generated by Google Authenticator and click <strong>Save</strong>.<br/><br/>When logging in, you will be asked to enter a token from Google Authenticator in addition to your regular credentials.",
- "user.settings.mfa.addHelpQr": "Please scan the bar code with the Google Authenticator app on your smartphone and fill in the token with one provided by the app.",
+ "user.settings.mfa.addHelpQr": "Please scan the QR code with the Google Authenticator app on your smartphone and fill in the token with one provided by the app. If you are unable to scan the code, you can maunally enter the secret provided.",
"user.settings.mfa.enterToken": "토큰 (숫자만)",
"user.settings.mfa.qrCode": "Bar Code",
"user.settings.mfa.remove": "Remove MFA from your account",
"user.settings.mfa.removeHelp": "Removing multi-factor authentication means you will no longer require a phone-based passcode to sign-in to your account.",
+ "user.settings.mfa.secret": "Secret",
"user.settings.mfa.title": "Enable Multi-factor Authentication:",
"user.settings.modal.advanced": "고급",
"user.settings.modal.confirmBtns": "네, 취소합니다.",
diff --git a/webapp/i18n/nl.json b/webapp/i18n/nl.json
index e9ec01c6a..d6e870fa9 100644
--- a/webapp/i18n/nl.json
+++ b/webapp/i18n/nl.json
@@ -982,7 +982,7 @@
"channel_flow.set_url_title": "Instelling {term} URL",
"channel_header.addToFavorites": "Add to Favorites",
"channel_header.channel": "Kanaal",
- "channel_header.channelHeader": "Stel de kanaalkoptekst in...",
+ "channel_header.channelHeader": "Edit Channel Header",
"channel_header.delete": "Verwijder {term}...",
"channel_header.flagged": "Gemarkeerde Berichten",
"channel_header.group": "Groep",
@@ -992,8 +992,8 @@
"channel_header.recentMentions": "Recente vermeldingen",
"channel_header.removeFromFavorites": "Remove from Favorites",
"channel_header.rename": "Hernoem {term}...",
- "channel_header.setHeader": "Zet {term} koptekst...",
- "channel_header.setPurpose": "Zet {term} doel...",
+ "channel_header.setHeader": "Edit {term} Header",
+ "channel_header.setPurpose": "Edit {term} Purpose",
"channel_header.viewInfo": "Bekijk informatie",
"channel_header.viewMembers": "Bekijk Leden",
"channel_header.webrtc.call": "Een video-oproep starten",
@@ -1134,7 +1134,7 @@
"delete_channel.confirm": "Bevestig het WISSEN van het kanaal",
"delete_channel.del": "Verwijderen",
"delete_channel.group": "groep",
- "delete_channel.question": "Weet u zeker dat u de {display_name} {term} wilt verwijderen?",
+ "delete_channel.question": "This will delete the channel from the team and make its contents inaccessible for all users. Are you sure you wish to delete the {display_name} {term}?",
"delete_post.cancel": "Annuleren",
"delete_post.comment": "Commentaar",
"delete_post.confirm": "Bevestig {term} verwijdering",
@@ -1641,6 +1641,7 @@
"sidebar.createChannel": "Maak een nieuw kanaal",
"sidebar.createGroup": "Maak een nieuwe groep",
"sidebar.direct": "Privé berichten",
+ "sidebar.favorite": "Favorites",
"sidebar.more": "Meer",
"sidebar.moreElips": "Meer...",
"sidebar.otherMembers": "Buiten dit team",
@@ -1915,11 +1916,12 @@
"user.settings.languages.promote": "Selecteer welke taal Mattermost moet weergeven in de gebruikersinterface.<br /><br />Wil je helpen met vertalen? Word lid van de <a href='http://translate.mattermost.com/' target='_blank'>Mattermost Translation Server</a>.",
"user.settings.mfa.add": "Toevoegen van MFA aan jouw account",
"user.settings.mfa.addHelp": "Je kan een smartphone gebaseerde token verplichten, naast jouw wachtwoord, om in te loggen op Mattermost.<br/><br/>Om dit aan te zetten, download Google Authenticator van <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> of <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a>voor jouw telefoon, dan <br/><br/>1. Klik op de <strong>Voeg MFA aan jouw account</strong> knop erboven.<br/>2. Gebruik Google Authenticator om de QR code te scannen die verschijnt.<br/>3. Type het Token wat gegenereerd is door Google Authenticator en druk <strong>Opslaan</strong><br/><br/>Wanneer je inlogt, zal wirden gevraagd naar een token van Google Authenticator naast jouw reguliere inlog gegevens. ",
- "user.settings.mfa.addHelpQr": "Scan de barcode met de Google Authenticator app op jouw smartphone en vul het token in wat je van de app gekregen hebt.",
+ "user.settings.mfa.addHelpQr": "Please scan the QR code with the Google Authenticator app on your smartphone and fill in the token with one provided by the app. If you are unable to scan the code, you can maunally enter the secret provided.",
"user.settings.mfa.enterToken": "Token (enkel nummers)",
"user.settings.mfa.qrCode": "Streepjescode",
"user.settings.mfa.remove": "Verwijderen van MFA van jouw account",
"user.settings.mfa.removeHelp": "Verwijderen van multi-factor autenticatie betekent dat je niet langer verplicht een telefoon gebaseerde toegangscode nodig hebt om in te loggen op jouw account. ",
+ "user.settings.mfa.secret": "Geheim:",
"user.settings.mfa.title": "Multi-factor Authenticatie:",
"user.settings.modal.advanced": "Geavanceerd",
"user.settings.modal.confirmBtns": "Ja, verwijderen",
diff --git a/webapp/i18n/pt-BR.json b/webapp/i18n/pt-BR.json
index d911cfcf3..52b7b881e 100644
--- a/webapp/i18n/pt-BR.json
+++ b/webapp/i18n/pt-BR.json
@@ -110,7 +110,7 @@
"add_oauth_app.name.help": "Nome de exibição para sua aplicação OAuth 2.0 contendo até 64 caracteres.",
"add_oauth_app.nameRequired": "Nome para a aplicação OAuth 2.0 é obrigatória.",
"add_oauth_app.trusted.help": "Quando verdadeiro, a aplicação OAuth 2.0 é considerado confiável pelo servidor Mattermost e não requer que o usuário aceite a autorização. Quando falso, uma janela adicional será exibida, solicitando ao usuário para aceitar ou negar a autorização.",
- "add_oauth_app.url": "<b>URL</b>: {url}",
+ "add_oauth_app.url": "<b>URL(s)</b>: {url}",
"add_outgoing_webhook.callbackUrls": "URLs Callback (Uma Por Linha)",
"add_outgoing_webhook.callbackUrls.help": "A URL que as mensagens serão enviadas.",
"add_outgoing_webhook.callbackUrlsRequired": "Uma ou mais URLs callback são necessárias",
@@ -228,11 +228,11 @@
"admin.developer.title": "Configurações de Desenvolvedor",
"admin.email.agreeHPNS": " Eu entendo e aceito o serviço de notificação push Mattermost Hosted<a href=\"https://about.mattermost.com/hpns-terms/\" target=\"_blank\">Termos do Serviço</a> e <a href=\"https://about.mattermost.com/hpns-privacy/\" target=\"_blank\">Politica de Privacidade</a>.",
"admin.email.allowEmailSignInDescription": "Quando verdadeiro, Mattermost permite aos usuários fazer login usando o e-mail e senha.",
- "admin.email.allowEmailSignInTitle": "Habilitar Login por email:",
+ "admin.email.allowEmailSignInTitle": "Habilitar login por email:",
"admin.email.allowSignupDescription": "Quando verdadeiro, Mattermost permite a criação de equipe e conta de inscrição através de e-mail e senha. Este valor deve ser falso somente quando você deseja limitar a entrada para o single-sign-on service como OAuth ou AD/LDAP.",
"admin.email.allowSignupTitle": "Habilitar criação de contas com email: ",
"admin.email.allowUsernameSignInDescription": "Quando verdadeiro, Mattermost permite os usuários fazer login usando seu nome de usuário e senha. Esta configuração é normalmente utilizado apenas quando a verificação de e-mail está desativada.",
- "admin.email.allowUsernameSignInTitle": "Habilitar Login com nome de usuário:",
+ "admin.email.allowUsernameSignInTitle": "Habilitar login com nome de usuário:",
"admin.email.connectionSecurityTest": "Testar Conexão",
"admin.email.easHelp": "Leia mais sobre compilar e publicar seu próprio aplicativo móvel em <a href=\"http://docs.mattermost.com/deployment/push.html#enterprise-app-store-eas\" target=\"_blank\">Enterprise App Store</a>.",
"admin.email.emailFail": "Conexão falhou: {error}",
@@ -339,7 +339,7 @@
"admin.google.authTitle": "Autenticação Endpoint:",
"admin.google.clientIdDescription": "A ID do Cliente que você recebeu quando registrou sua aplicação com o Google.",
"admin.google.clientIdExample": "Ex.: \"7602141235235-url0fhs1mayfasbmop5qlfns8dh4.apps.googleusercontent.com\"",
- "admin.google.clientIdTitle": "ID do Cliente",
+ "admin.google.clientIdTitle": "ID do Cliente:",
"admin.google.clientSecretDescription": "A Chave Secreta do Cliente que você recebeu quando registrou sua aplicação com o Google.",
"admin.google.clientSecretExample": "Ex.: \"H8sz0Az-dDs2p15-7QzD231\"",
"admin.google.clientSecretTitle": "Chave Secreta do Cliente:",
@@ -633,7 +633,7 @@
"admin.service.attemptTitle": "Máxima Tentativas de Login:",
"admin.service.cmdsDesc": "Quando verdadeiro, comandos slash personalizados serão permitidos. Veja a <a href='http://docs.mattermost.com/developer/slash-commands.html' target='_blank'>documentação</a> para saber mais.",
"admin.service.cmdsTitle": "Ativar Comandos Slash Personalizados: ",
- "admin.service.corsDescription": "Ativar requisição de origem HTTP Cross dos domínios especificados (separados por espaço). Usar \"*\" se você quiser permitir CORS de qualquer domínio ou deixe em branco para desativar.",
+ "admin.service.corsDescription": "Ativar requisição de origem HTTP Cross dos domínios especificados. Usar \"*\" se você quiser permitir CORS de qualquer domínio ou deixe em branco para desativar.",
"admin.service.corsEx": "http://example.com",
"admin.service.corsTitle": "Permitir requisição cross-origin de:",
"admin.service.developerDesc": "Quando verdadeiro, erros Javascript são mostrados em uma barra vermelha no topo da interface de usuário. Não recomendado para uso em produção. ",
@@ -977,13 +977,13 @@
"channel_flow.channel": "Canal",
"channel_flow.create": "Criar {term}",
"channel_flow.group": "Grupo",
- "channel_flow.handleTooShort": "URL do canal precisa ter 2 ou mais caracteres minúsculos alfanuméricos.",
+ "channel_flow.handleTooShort": "URL do canal precisa ter 2 ou mais caracteres minúsculos alfanuméricos",
"channel_flow.invalidName": "Nome do Canal Inválido",
"channel_flow.set_url_title": "Ajustar URL {term}",
"channel_header.addToFavorites": "Adicionar aos Favoritos",
"channel_header.channel": "Canal",
- "channel_header.channelHeader": "Definir Cabeçalho do Canal...",
- "channel_header.delete": "Deletar {term}...",
+ "channel_header.channelHeader": "Editar Cabeçalho do Canal",
+ "channel_header.delete": "Deletar {term}",
"channel_header.flagged": "Posts Marcados",
"channel_header.group": "Grupo",
"channel_header.leave": "Sair {term}",
@@ -991,9 +991,9 @@
"channel_header.notificationPreferences": "Preferências de Notificação",
"channel_header.recentMentions": "Menções Recentes",
"channel_header.removeFromFavorites": "Remover dos Favoritos",
- "channel_header.rename": "Renomear {term}...",
- "channel_header.setHeader": "Definir Cabeçalho do {term}...",
- "channel_header.setPurpose": "Ajustar Propósito {term}...",
+ "channel_header.rename": "Renomear {term}",
+ "channel_header.setHeader": "Editar Cabeçalho {term}",
+ "channel_header.setPurpose": "Editar Propósito {term}",
"channel_header.viewInfo": "Ver Informações",
"channel_header.viewMembers": "Ver Membros",
"channel_header.webrtc.call": "Iniciar Vídeo Chamada",
@@ -1079,13 +1079,13 @@
"claim.ldap_to_email.confirm": "Confirmar senha",
"claim.ldap_to_email.email": "Você vai usar o email {email} para logar",
"claim.ldap_to_email.enterLdapPwd": "Entre a sua senha {ldapPassword} para o sua conta de email {site}",
- "claim.ldap_to_email.enterPwd": "Entre a nova senha para o sua conta com email.",
+ "claim.ldap_to_email.enterPwd": "Entre a nova senha para o sua conta com email",
"claim.ldap_to_email.ldapPasswordError": "Por favor digite a sua senha AD/LDAP.",
"claim.ldap_to_email.ldapPwd": "Senha AD/LDAP",
"claim.ldap_to_email.pwd": "Senha",
"claim.ldap_to_email.pwdError": "Por favor digite a sua senha.",
"claim.ldap_to_email.pwdNotMatch": "As senha não correspondem.",
- "claim.ldap_to_email.ssoType": "Após a alteração do tipo de conta, você só vai ser capaz de logar com seu e-mail e senha.",
+ "claim.ldap_to_email.ssoType": "Após a alteração do tipo de conta, você só vai ser capaz de logar com seu e-mail e senha",
"claim.ldap_to_email.switchTo": "Trocar a conta para e-mail/senha",
"claim.ldap_to_email.title": "Mudar Conta AD/LDAP para E-mail/Senha",
"claim.oauth_to_email.confirm": "Confirmar Senha",
@@ -1134,7 +1134,7 @@
"delete_channel.confirm": "Confirmar EXCLUSÃO do Canal",
"delete_channel.del": "Deletar",
"delete_channel.group": "grupo",
- "delete_channel.question": "Você tem certeza que deseja deletar o {display_name} {term}?",
+ "delete_channel.question": "Isto irá apagar o canal do equipe e todo o conteúdo não vai estar disponível para os usuários. Você está certo que deseja apagar {display_name} {term}?",
"delete_post.cancel": "Cancelar",
"delete_post.comment": "Comentário",
"delete_post.confirm": "Confirmar Delete {term}",
@@ -1208,7 +1208,7 @@
"filtered_user_list.countTotalPage": "{startCount, number} - {endCount, number} {count, plural, =0 {0 membros} one {membro} other {membros}} de {total} no total",
"filtered_user_list.member": "Membro",
"filtered_user_list.search": "Pressione enter para procurar",
- "filtered_user_list.show": "Mostrar",
+ "filtered_user_list.show": "Filtro:",
"filtered_user_list.team_only": "Membros desta Equipe",
"find_team.email": "E-mail",
"find_team.findDescription": "Foi enviado um e-mail com links para todas as equipes do qual você é membro.",
@@ -1330,13 +1330,13 @@
"help.mentioning.recent": "## Menções Recentes\nClique `@` ao lado da caixa de pesquisa para consultar suas @menções recentes e palavras que disparam menções. Clique **Pular** ao lado do resultado da busca na barra lateral direita para pular ao painel central do canal no local da mensagem com a menção.",
"help.mentioning.title": "# Mencionando Colegas de Equipe\n_____",
"help.mentioning.triggers": "## Palavras Que Disparam Menções\nAlém de ter sido notificada por @usuário e @channel, você pode personalizar as palavras que desencadeiam notificações de menção em **Configurações de Conta** > **Notificações** > **Palavras que desencadeiam menções**. Por padrão você receberá notificações de menção em seu nome, e você pode adicionar mais palavras, escrevendo-as na caixa de entrada separados por vírgulas. Isso é útil se você quiser ser notificado de todas as mensagens sobre determinados temas, por exemplo, \"entrevista\" ou \"marketing\".",
- "help.mentioning.username": "#### @Usuário\nVocê pode mencionar um colega de equipe usando o símbolo '@' mais seu nome de usuário para enviar uma notificação menção.\n\nDigite `@` para abrir uma lista de membros da equipe que podem ser mencionados. Para filtrar a lista, digite as primeiras letras de qualquer nome de usuário, nome, sobrenome ou apelido. As teclas de seta **Cima** e **Baixo** podem então ser usada para percorrer as entradas na lista, e pressione **ENTER** para selecionar qual o usuário a mencionar. Uma vez selecionado, o nome de usuário irá substituir automaticamente o nome completo ou apelido.\nO exemplo a seguir envia uma notificação menção especial a **alice** que a alerta do canal e mensagem onde ela foi mencionada. Se **alice** está ausente do Mattermost e tem ativo [notificações de e-mail](http://docs.mattermost.com/help/getting-started/configuring-notifications.html#email-notifications), então ela vai receber um alerta de e-mail de sua menção juntamente com o texto da mensagem.",
+ "help.mentioning.username": "#### @Usuário\nVocê pode mencionar um colega de equipe usando o símbolo `@` mais seu nome de usuário para enviar uma notificação menção.\n\nDigite `@` para abrir uma lista de membros da equipe que podem ser mencionados. Para filtrar a lista, digite as primeiras letras de qualquer nome de usuário, nome, sobrenome ou apelido. As teclas de seta **Cima** e **Baixo** podem então ser usada para percorrer as entradas na lista, e pressione **ENTER** para selecionar qual o usuário a mencionar. Uma vez selecionado, o nome de usuário irá substituir automaticamente o nome completo ou apelido.\nO exemplo a seguir envia uma notificação menção especial a **alice** que a alerta do canal e mensagem onde ela foi mencionada. Se **alice** está ausente do Mattermost e tem ativo [notificações de e-mail](http://docs.mattermost.com/help/getting-started/configuring-notifications.html#email-notifications), então ela vai receber um alerta de e-mail de sua menção juntamente com o texto da mensagem.",
"help.mentioning.usernameCont": "Se o usuário que você mencionou não pertence ao canal, uma mensagem do sistema será enviada para informá-lo. Esta é uma mensagem temporária visto apenas pela pessoa que desencadeou. Para adicionar o usuário mencionado para o canal, vá para o menu suspenso ao lado do nome do canal e selecione **Adicionar Membros**.",
"help.mentioning.usernameExample": "@alice como foi sua entrevista como é o novo candidato?",
"help.messaging.attach": "**Anexar arquivos** arrastando e soltando no Mattermost ou clicando no ícone anexo na caixa de entrada. ",
"help.messaging.emoji": "**Rapidamente adicione emoji** digitando \":\", que irá abrir uma lista de emoji. Se os emojis existentes não cobrem o que você quer expressar, você pode também criar seu próprio [Emoji Personalizado](http://docs.mattermost.com/help/settings/custom-emoji.html).",
"help.messaging.format": "**Formate suas mensagens** usando Markdown que suporta o estilo do texto, títulos, links, emojis, blocos de código, citar bloco, tabelas, listas e imagens na linha.",
- "help.messaging.notify": "**Notificar colegas de equipe** quando eles são necessários digitando `@usuário`",
+ "help.messaging.notify": "**Notificar colegas de equipe** quando eles são necessários digitando `@usuário`.",
"help.messaging.reply": "**Responder a mensagens** clicando na seta de resposta ao lado do texto da mensagem.",
"help.messaging.title": "# Mensagens Básico\n_____",
"help.messaging.write": "**Escreva mensagens** usando a caixa de texto na parte inferior do Mattermost. Pressione **ENTER** para enviar a mensagem. Use **Shift+ENTER** para criar uma nova linha sem enviar a mensagem.",
@@ -1436,7 +1436,7 @@
"invite_member.send": "Enviar Convite",
"invite_member.send2": "Enviar Convites",
"invite_member.sending": " Enviando",
- "invite_member.teamInviteLink": "Você também pode convidar pessoas usando o {link}",
+ "invite_member.teamInviteLink": "Você também pode convidar pessoas usando o {link}.",
"ldap_signup.find": "Encontrar minhas equipes",
"ldap_signup.ldap": "Criar uma equipe com uma Conta AD/LDAP",
"ldap_signup.length_error": "O nome deve ser de 3 ou mais caracteres até um máximo de 15",
@@ -1550,7 +1550,7 @@
"password_form.title": "Resetar Senha",
"password_form.update": "Sua senha foi atualizada com sucesso.",
"password_send.checkInbox": "Por favor verifique sua caixa de entrada.",
- "password_send.description": "Para resetar sua senha, entre o endereço de email que você usou para se inscrever.",
+ "password_send.description": "Para resetar sua senha, entre o endereço de email que você usou para se inscrever",
"password_send.email": "E-mail",
"password_send.error": "Por favor entre um endereço de e-mail válido.",
"password_send.link": "<p>Um link para resetar senha foi enviado para <b>{email}</b></p>",
@@ -1641,6 +1641,7 @@
"sidebar.createChannel": "Criar novo canal",
"sidebar.createGroup": "Criar um novo grupo",
"sidebar.direct": "Mensagens Diretas",
+ "sidebar.favorite": "Favoritos",
"sidebar.more": "Mais",
"sidebar.moreElips": "Mais...",
"sidebar.otherMembers": "Fora desta equipe",
@@ -1832,7 +1833,7 @@
"user.settings.display.channeldisplaymode": "Selecione a largura do centro do canal.",
"user.settings.display.clockDisplay": "Exibição do Relógio",
"user.settings.display.collapseDesc": "Expandir links para mostrar pré-visualização de conteúdo, quando disponível.",
- "user.settings.display.collapseDisplay": "Visualização de Link",
+ "user.settings.display.collapseDisplay": "Visualização de link",
"user.settings.display.collapseOff": "Desligado",
"user.settings.display.collapseOn": "Ligado",
"user.settings.display.fixedWidthCentered": "Largura fixa, centralizada",
@@ -1914,12 +1915,13 @@
"user.settings.languages.change": "Alterar o idioma da interface",
"user.settings.languages.promote": "Escolha qual idioma Mattermost exibirá a interface do usuário.<br /><br />Gostaria de ajudar com as traduções? Junte-se ao <a href='http://translate.mattermost.com/' target='_blank'>Mattermost Translation Server</a> para contribuir.",
"user.settings.mfa.add": "Adicionar MFA para sua conta",
- "user.settings.mfa.addHelp": "Você pode exigir um token gerado por um smartphone, além da sua senha, para entrar no Mattermost.<br/><br/>Para ativar, faça download no seu telefone do Google Authenticator no <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> ou <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a>, em seguida,<br/><br/>1. Clique no botão acima<strong>Adicionar MFA para sua conta</strong>.<br/>2. Use o Google Authenticator para scanear o QR code que aparece.<br/>3. Digite o Token gerado pelo Google Authenticator e clique em <strong>Salvar</strong>.<br/><br/>Quando o logar, você será solicitado a digitar um token do Google Authenticator, além de suas credenciais regulares.",
- "user.settings.mfa.addHelpQr": "Por favor escanei o QR code com o app Google Authenticator no seu smartphone e preencha com o token fornecido pelo app.",
+ "user.settings.mfa.addHelp": "Você pode exigir um token gerado por um smartphone, além da sua senha, para entrar no Mattermost.<br/><br/>Para ativar, faça download no seu smartphone do Google Authenticator no <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> ou <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a>, em seguida,<br/><br/>1. Clique no botão acima<strong>Adicionar MFA para sua conta</strong>.<br/>2. Use o Google Authenticator para escanear o QR code que aparece ou digite a chave manualmente.<br/>3. Digite o Token gerado pelo Google Authenticator e clique em <strong>Salvar</strong>.<br/><br/>Quando logar, você será solicitado a digitar um token do Google Authenticator, além de suas credenciais regulares.",
+ "user.settings.mfa.addHelpQr": "Por favor escanei o código QR com o aplicativo Google Authenticator no smartphone e preencha com o token fornecido pelo aplicativo. Se você não conseguir escanear o código, você pode manualmente inserir a chave fornecida.",
"user.settings.mfa.enterToken": "Token (somente números)",
"user.settings.mfa.qrCode": "Código de Barra",
"user.settings.mfa.remove": "Remover MFA da sua conta",
"user.settings.mfa.removeHelp": "Remoção da autenticação multi-fator significa que você não vai mais exigir um código de acesso baseado no telefone para fazer login na sua conta.",
+ "user.settings.mfa.secret": "Chave",
"user.settings.mfa.title": "Autenticação Multi-Fator",
"user.settings.modal.advanced": "Avançado",
"user.settings.modal.confirmBtns": "Sim, Descartar",
@@ -1936,7 +1938,7 @@
"user.settings.notifications.comments": "Responder notificações",
"user.settings.notifications.commentsAny": "Dispara notificações de mensagens em resposta a tópicos que eu iniciei ou participo",
"user.settings.notifications.commentsInfo": "Além de notificações para quando você for mencionado, selecione se você gostaria de receber notificações sobre respostas de tópicos.",
- "user.settings.notifications.commentsNever": "Não disparar notificações para respostas mensagens a menos que eu for mencionado.",
+ "user.settings.notifications.commentsNever": "Não disparar notificações para respostas mensagens a menos que eu for mencionado",
"user.settings.notifications.commentsRoot": "Dispara notificações de mensagens em tópicos que eu iniciei",
"user.settings.notifications.desktop": "Enviar notificações de desktop",
"user.settings.notifications.desktop.allFirefoxForever": "Para toda atividade, mostrada indefinidamente",
@@ -1955,9 +1957,9 @@
"user.settings.notifications.desktop.mentionsSoundTimed": "Para menções e mensagens diretas, com som, mostrada por {seconds} segundos",
"user.settings.notifications.desktop.seconds": "{seconds} segundos",
"user.settings.notifications.desktop.sound": "Som da notificação",
- "user.settings.notifications.desktop.title": "Notificação no Desktop",
+ "user.settings.notifications.desktop.title": "Notificação no desktop",
"user.settings.notifications.desktop.unlimited": "Ilimitado",
- "user.settings.notifications.desktopSounds": "Som de notificação no Desktop",
+ "user.settings.notifications.desktopSounds": "Som de notificação no desktop",
"user.settings.notifications.email.everyHour": "Cara hora",
"user.settings.notifications.email.everyXMinutes": "Cada {count, plural, one {minuto} other {{count, number} minutos}}",
"user.settings.notifications.email.immediately": "Imediatamente",
diff --git a/webapp/i18n/ru.json b/webapp/i18n/ru.json
index 6664ea606..81e8e3518 100644
--- a/webapp/i18n/ru.json
+++ b/webapp/i18n/ru.json
@@ -285,7 +285,7 @@
"admin.email.smtpServerDescription": "Адрес SMTP сервера.",
"admin.email.smtpServerExample": "Например: \"smtp.yourcompany.com\", \"email-smtp.us-east-1.amazonaws.com\"",
"admin.email.smtpServerTitle": "SMTP Сервер:",
- "admin.email.smtpUsernameDescription": " Obtain this credential from administrator setting up your email server.",
+ "admin.email.smtpUsernameDescription": " Получите эти сведения от администратора вашего сервера электронной почты.",
"admin.email.smtpUsernameExample": "Например: \"admin@yourcompany.com\", \"AKIADTOVBGERKLCBV\"",
"admin.email.smtpUsernameTitle": "Имя пользователя SMTP:",
"admin.email.testing": "Проверка...",
@@ -316,12 +316,12 @@
"admin.general.policy.teamInviteTitle": "Включить отправку приглашения в команды из:",
"admin.general.privacy": "Конфиденциальность",
"admin.general.usersAndTeams": "Пользователи и команды",
- "admin.gitab.clientSecretDescription": "Obtain this value via the instructions above for logging into GitLab.",
+ "admin.gitab.clientSecretDescription": "Получите это значение с помощью вышеуказанных инструкций для входа в GitLab.",
"admin.gitlab.EnableHtmlDesc": "<ol><li>Войдите в свою учетную запись на GitLab и пройдите в Настройки профиля -> Приложения.</li><li>Введите перенаправляющие URI-адреса \"<url-вашего-mattermost>/login/gitlab/complete\" (пример: http://localhost:8065/login/gitlab/complete) и \"<url-вашего-mattermost>/signup/gitlab/complete\". </li><li>Затем используйте поля \"Секретный ключ приложения\" и \"Идентификатор приложения\" из GitLab для заполнения опций ниже.</li><li>Заполните URL-адреса конечных точек ниже. </li></ol>",
"admin.gitlab.authDescription": "Введите https://<your-gitlab-url>/oauth/authorize (например https://example.com:3000/oauth/authorize). Убедитесь, используете ли вы HTTP или HTTPS в своем URL-адресе в соответствии с настройками своего сервера.",
"admin.gitlab.authExample": "Например: \"https://<your-gitlab-url>/oauth/authorize\"",
"admin.gitlab.authTitle": "Конечная точка авторизации:",
- "admin.gitlab.clientIdDescription": "Obtain this value via the instructions above for logging into GitLab",
+ "admin.gitlab.clientIdDescription": "Получите это значение с помощью вышеуказанных инструкций для входа в GitLab.",
"admin.gitlab.clientIdExample": "Например: \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"",
"admin.gitlab.clientIdTitle": "ID приложения:",
"admin.gitlab.clientSecretExample": "Например: \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"",
@@ -462,13 +462,13 @@
"admin.license.upload": "Загрузить",
"admin.license.uploadDesc": "Загрузить лицензионный ключ для Mattermost Enterprise Edition для обновления этого сервера . <a href=\"http://mattermost.com\" target=\"_blank\">Посетите сайт</a> , чтобы узнать о преимуществах Enterprise Edition или заказать ключ.",
"admin.license.uploading": "Загрузка лицензии...",
- "admin.log.consoleDescription": "Typically set to false in production. Developers may set this field to true to output log messages to console based on the console level option. If true, server writes messages to the standard output stream (stdout).",
+ "admin.log.consoleDescription": "Как правило, значение false в продакшене. Разработчики могут установить в этом поле значение true для вывода сообщений журнала на консоль в зависимости от параметров уровня логирования в консоли. Если значение true, сервер пишет сообщения в стандартный выходной поток (stdout).",
"admin.log.consoleTitle": "Исходящие журналы в консоль:",
"admin.log.enableDiagnostics": "Включение диагностики и отчетов об ошибках:",
"admin.log.enableDiagnosticsDescription": "Включите функцию отправки отчётов об ошибках и диагностической информации для того, чтобы мы смогли улучшить Mattermost. Прочтите нашу <a href=\"https://about.mattermost.com/default-privacy-policy/\" target=\"_blank\">политику безопасности.</a>",
"admin.log.enableWebhookDebugging": "Включить отладку Webhook-ов:",
- "admin.log.enableWebhookDebuggingDescription": "You can set this to false to disable the debug logging of all incoming webhook request bodies.",
- "admin.log.fileDescription": "Typically set to true in production. When true, log files are written to the log file specified in file location field below.",
+ "admin.log.enableWebhookDebuggingDescription": "Вы можете установить это значение в false, чтобы отключить отладочное журналирование тел всех запросов входящие вебхуки.",
+ "admin.log.fileDescription": "Обычно значение true в продакшене. Если true, то файлы журналов записываются в файл журнала, указанный в поле расположение файла ниже.",
"admin.log.fileLevelDescription": "This setting determines the level of detail at which log events are written to the log file. ERROR: Outputs only error messages. INFO: Outputs error messages and information around startup and initialization. DEBUG: Prints high detail for developers working on debugging issues.",
"admin.log.fileLevelTitle": "Файловый уровень логирования:",
"admin.log.fileTitle": "Исходящие журнали в файл: ",
@@ -527,7 +527,7 @@
"admin.privacy.showEmailTitle": "Показать Email: ",
"admin.privacy.showFullNameDescription": "Когда отключено, то полное имя пользователей будет скрыто от других пользователей, в том числе членов команды и администраторов команды. Логин пользователя показывается вместо полного имени.",
"admin.privacy.showFullNameTitle": "Показать полное имя: ",
- "admin.rate.enableLimiterDescription": "When true, APIs are throttled at rates specified below.",
+ "admin.rate.enableLimiterDescription": "Когда true, API регулируются по уровням, указанным ниже.",
"admin.rate.enableLimiterTitle": "Включить ограничение скорости:",
"admin.rate.httpHeaderDescription": "When filled in, vary rate limiting by HTTP header field specified (e.g. when configuring NGINX set to \"X-Real-IP\", when configuring AmazonELB set to \"X-Forwarded-For\").",
"admin.rate.httpHeaderExample": "Например: \"X-Real-IP\", \"X-Forwarded-For\"",
@@ -540,7 +540,7 @@
"admin.rate.memoryTitle": "Размер хранилища памяти:",
"admin.rate.noteDescription": "Изменения в этой секции потребуют перезагрузки сервера.",
"admin.rate.noteTitle": "Заметка:",
- "admin.rate.queriesDescription": "Throttles API at this number of requests per second.",
+ "admin.rate.queriesDescription": "Ограничивать API при таком количество запросов в секунду.",
"admin.rate.queriesExample": "Например: \"10\"",
"admin.rate.queriesTitle": "Максимальное количество запросов в секунду:",
"admin.rate.remoteDescription": "When true, rate limit API access by IP address.",
@@ -664,7 +664,7 @@
"admin.service.segmentExample": "Например: \"g3fgGOXJAQ43QV7rAh6iwQCkV4cA1Gs\"",
"admin.service.segmentTitle": "Segment Write Key:",
"admin.service.sessionCache": "Кэш сессиий (в минутах):",
- "admin.service.sessionCacheDesc": "The number of minutes to cache a session in memory.",
+ "admin.service.sessionCacheDesc": "Продолжительность кеширования сессии в памяти (в минутах).",
"admin.service.sessionDaysEx": "Например: \"30\"",
"admin.service.siteURL": "Адрес сайта:",
"admin.service.siteURLDescription": "URL-адрес, включая номер порта и протокол, который пользователи используют для доступа к Mattermost. Это поле может быть оставлено пустым, если вы не настраиваете почтовые объединения в <b>Уведомлениях > Электронная почта</b>. Если оставить пустым, URL-адрес автоматически настраивается на основе входящего трафика.",
@@ -790,7 +790,7 @@
"admin.team.restrictDirectMessage": "Enable users to open Direct Message channels with:",
"admin.team.restrictDirectMessageDesc": "'Any user on the Mattermost server' enables users to open a Direct Message channel with any user on the server, even if they are not on any teams together. 'Any member of the team' limits the ability to open Direct Message channels to only users who are in the same team.",
"admin.team.restrictExample": "Например: \"corp.mattermost.com, mattermost.org\"",
- "admin.team.restrictNameDesc": "When true, You cannot create a team name with reserved words like www, admin, support, test, channel, etc",
+ "admin.team.restrictNameDesc": "Когда включено, Вы не сможете использовать зарезервированные слова в имени команды (такие как www, admin, support, test, channel и др.)",
"admin.team.restrictNameTitle": "Запрещённые имена команд:",
"admin.team.restrictTitle": "Ограничить создание аккаунтов с указанных почтовых доменов:",
"admin.team.restrict_direct_message_any": "Все пользователи сервера Mattermost",
@@ -879,10 +879,10 @@
"analytics.system.totalFilePosts": "Сообщения с файлами",
"analytics.system.totalHashtagPosts": "Сообщения с хештегами",
"analytics.system.totalIncomingWebhooks": "Входящие Webhook-и",
- "analytics.system.totalMasterDbConnections": "Master DB Conns",
+ "analytics.system.totalMasterDbConnections": "Подключений к главной БД",
"analytics.system.totalOutgoingWebhooks": "Исходящие Webhook-и",
"analytics.system.totalPosts": "Всего сообщений",
- "analytics.system.totalReadDbConnections": "Replica DB Conns",
+ "analytics.system.totalReadDbConnections": "Подключений к реплике БД",
"analytics.system.totalSessions": "Всего сессий",
"analytics.system.totalTeams": "Всего команд",
"analytics.system.totalUsers": "Всего пользователей",
@@ -949,7 +949,7 @@
"audit_table.userAdded": "Добавлен пользователь {username} в канал/группу {channelName}",
"audit_table.userId": "ID пользователя",
"audit_table.userRemoved": "Удален пользователь {username} из канала/группы {channelName}",
- "audit_table.verified": "Sucessfully verified your email address",
+ "audit_table.verified": "Адрес электронной почты подтвержден",
"authorize.access": "Предоставить <strong>{appName}</strong> доступ?",
"authorize.allow": "Разрешить",
"authorize.app": "Приложение <strong>{appName}</strong> запрашивает разрешение на просмотр и модификацию вашей базовой информации.",
@@ -980,9 +980,9 @@
"channel_flow.handleTooShort": "Ссылка на канал должна быть не короче 2-х буквенных символов",
"channel_flow.invalidName": "Недопустимое имя канала",
"channel_flow.set_url_title": "Set {term} URL",
- "channel_header.addToFavorites": "Add to Favorites",
+ "channel_header.addToFavorites": "Добавить в избранное",
"channel_header.channel": "Канал",
- "channel_header.channelHeader": "Заголовок канала...",
+ "channel_header.channelHeader": "Изменить заголовок канала",
"channel_header.delete": "Удалить {term}...",
"channel_header.flagged": "Отмеченные сообщения",
"channel_header.group": "Группа",
@@ -992,8 +992,8 @@
"channel_header.recentMentions": "Недавние упоминания",
"channel_header.removeFromFavorites": "Удалить из избранного",
"channel_header.rename": "Переименовать {term}...",
- "channel_header.setHeader": "Заголовок {term}а...",
- "channel_header.setPurpose": "Назначение {term}а...",
+ "channel_header.setHeader": "Edit {term} Header",
+ "channel_header.setPurpose": "Edit {term} Purpose",
"channel_header.viewInfo": "Информация",
"channel_header.viewMembers": "Просмотреть список участников",
"channel_header.webrtc.call": "Видеовызов",
@@ -1134,7 +1134,7 @@
"delete_channel.confirm": "Подтверждение УДАЛЕНИЯ канала",
"delete_channel.del": "Удалить",
"delete_channel.group": "группа",
- "delete_channel.question": "Вы уверены, что хотите удалить {term} {display_name}?",
+ "delete_channel.question": "Это удалит канал из команды и все его данные. Вы уверены, что хотите удалить {display_name} {term}?",
"delete_post.cancel": "Отмена",
"delete_post.comment": "Комментарий",
"delete_post.confirm": "Confirm {term} Delete",
@@ -1207,7 +1207,7 @@
"filtered_user_list.countTotal": "{count} {count, plural, =0 {0 members} one {member} other {members}} of {total} Total",
"filtered_user_list.countTotalPage": "{startCount, number} - {endCount, number} {count, plural, =0 {0 members} one {member} other {members}} of {total} total",
"filtered_user_list.member": "Участник",
- "filtered_user_list.search": "Press enter to search",
+ "filtered_user_list.search": "Нажмите Enter для поиска",
"filtered_user_list.show": "Фильтр:",
"filtered_user_list.team_only": "Участники команды",
"find_team.email": "Email",
@@ -1491,12 +1491,12 @@
"members_popover.title": "Участники",
"mobile.components.channels_list_view.yourChannels": "Ваши каналы:",
"mobile.components.select_server_view.enterServerUrl": "Enter Server URL",
- "mobile.components.select_server_view.proceed": "Proceed",
+ "mobile.components.select_server_view.proceed": "Продолжить",
"mobile.components.select_server_view.siteUrlPlaceholder": "https://mattermost.example.com",
"mobile.routes.channels": "Каналы",
"mobile.routes.enterServerUrl": "Enter Server URL",
"mobile.routes.login": "Вход",
- "mobile.routes.postsList": "Posts List",
+ "mobile.routes.postsList": "Список постов",
"mobile.routes.selectTeam": "Выберите команду",
"more_channels.close": "Закрыть",
"more_channels.create": "Создать новый канал",
@@ -1641,6 +1641,7 @@
"sidebar.createChannel": "Создать канал",
"sidebar.createGroup": "Создать группу",
"sidebar.direct": "Прямые сообщения",
+ "sidebar.favorite": "Favorites",
"sidebar.more": "Еще",
"sidebar.moreElips": "Еще...",
"sidebar.otherMembers": "За пределами команды",
@@ -1915,11 +1916,12 @@
"user.settings.languages.promote": "Выберите язык отображения пользовательского интерфейса Mattermost.<br /><br />Хотите помочь с переводами? Присоединяйтесь к <a href='http://translate.mattermost.com/' target='_blank'>Mattermost Translation Server</a> и внесите свой вклад.",
"user.settings.mfa.add": "Добавить MFA в ваш аккаунт",
"user.settings.mfa.addHelp": "You can require a smartphone-based token, in addition to your password, to sign into Mattermost.<br/><br/>To enable, download Google Authenticator from <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> or <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a> for your phone, then<br/><br/>1. Click the <strong>Add MFA to your account</strong> button above.<br/>2. Use Google Authenticator to scan the QR code that appears.<br/>3. Type in the Token generated by Google Authenticator and click <strong>Save</strong>.<br/><br/>When logging in, you will be asked to enter a token from Google Authenticator in addition to your regular credentials.",
- "user.settings.mfa.addHelpQr": "Please scan the bar code with the Google Authenticator app on your smartphone and fill in the token with one provided by the app.",
+ "user.settings.mfa.addHelpQr": "Please scan the QR code with the Google Authenticator app on your smartphone and fill in the token with one provided by the app. If you are unable to scan the code, you can maunally enter the secret provided.",
"user.settings.mfa.enterToken": "Token (numbers only)",
"user.settings.mfa.qrCode": "Штрихкод",
"user.settings.mfa.remove": "Удалить MFA из вашего аккаунта",
"user.settings.mfa.removeHelp": "Removing multi-factor authentication means you will no longer require a phone-based passcode to sign-in to your account.",
+ "user.settings.mfa.secret": "Secret:",
"user.settings.mfa.title": "Включить многофакторную аутентификацию",
"user.settings.modal.advanced": "Дополнительно",
"user.settings.modal.confirmBtns": "Да, отменить",
diff --git a/webapp/i18n/zh_CN.json b/webapp/i18n/zh_CN.json
index 90c5ab2ab..c9af2fb6f 100644
--- a/webapp/i18n/zh_CN.json
+++ b/webapp/i18n/zh_CN.json
@@ -982,8 +982,8 @@
"channel_flow.set_url_title": "设置{term}URL",
"channel_header.addToFavorites": "添加到收藏",
"channel_header.channel": "频道",
- "channel_header.channelHeader": "设置频道标题…",
- "channel_header.delete": "删除{term}...",
+ "channel_header.channelHeader": "编辑频道标题",
+ "channel_header.delete": "删除 {term}",
"channel_header.flagged": "已标记的信息",
"channel_header.group": "群组",
"channel_header.leave": "离开{term}",
@@ -991,9 +991,9 @@
"channel_header.notificationPreferences": "消息通知设置",
"channel_header.recentMentions": "最近提及",
"channel_header.removeFromFavorites": "从收藏中移除",
- "channel_header.rename": "重命名{term}...",
- "channel_header.setHeader": "设置{term}标题…",
- "channel_header.setPurpose": "设置{term}用途…",
+ "channel_header.rename": "重命名 {term}",
+ "channel_header.setHeader": "修改 {term} 标题",
+ "channel_header.setPurpose": "修改 {term} 用途",
"channel_header.viewInfo": "查看信息",
"channel_header.viewMembers": "查看成员",
"channel_header.webrtc.call": "开始视频通话",
@@ -1134,7 +1134,7 @@
"delete_channel.confirm": "确认删除频道",
"delete_channel.del": "删除",
"delete_channel.group": "群组",
- "delete_channel.question": "您确认要删除{display_name}{term}?",
+ "delete_channel.question": "这会从团队删除此频道并且没有用户可以读取其数据。您确定要删除 {display_name} {term}?",
"delete_post.cancel": "取消",
"delete_post.comment": "评论",
"delete_post.confirm": "确认{term}删除",
@@ -1641,6 +1641,7 @@
"sidebar.createChannel": "创建新的频道",
"sidebar.createGroup": "创建新组",
"sidebar.direct": "私信",
+ "sidebar.favorite": "收藏",
"sidebar.more": "更多",
"sidebar.moreElips": "更多...",
"sidebar.otherMembers": "此团队之外",
@@ -1914,12 +1915,13 @@
"user.settings.languages.change": "更改界面语言",
"user.settings.languages.promote": "选择 Mattermost 界面显示的语言。<br /><br />想要帮忙翻译吗?加入<a href='http://translate.mattermost.com/' target='_blank'>Mattermost 翻译服务器</a>。",
"user.settings.mfa.add": "向您的账户添加多重验证",
- "user.settings.mfa.addHelp": "您需要密码之外用基于智能手机的令牌来登入 Mattermost。<br/><br/>请从 <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> 或 <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a> 下载Google Authenticator 到您的手机,然后<br/><br/>1. 点击上方<strong>添加多重验证到您的帐号</strong>按钮。<br/>2. 使用Google Authenticator扫描显示的QR码。<br/>3. 输入Google Authenticator生成的令牌并点击<strong>保存</strong>。<br/><br/>登入时,您会被要求额外输入Google Authenticator令牌。",
- "user.settings.mfa.addHelpQr": "请使用您智能手机的Google Authenticator应用扫描二维码并填写一个由应用程序提供的令牌。",
+ "user.settings.mfa.addHelp": "您需要密码之外用基于智能手机的令牌来登入 Mattermost。<br/><br/>请从 <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> 或 <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a> 下载 Google Authenticator 到您的手机,然后<br/><br/>1. 点击上方<strong>添加多重验证到您的帐号</strong>按钮。<br/>2. 使用Google Authenticator扫描显示的 QR 码或手动输入密码。<br/>3. 输入Google Authenticator生成的令牌并点击<strong>保存</strong>。<br/><br/>登入时,您会被要求额外输入Google Authenticator令牌。",
+ "user.settings.mfa.addHelpQr": "请用您智能手机上的 Google Authenticator 应用扫描 QR 码后填写应用提供的令牌。如果您无法扫描 QR 码,您可以手动输入提供的密钥。",
"user.settings.mfa.enterToken": "令牌(仅限数字)",
"user.settings.mfa.qrCode": "条形码",
"user.settings.mfa.remove": "从您的账户中删除多重验证",
"user.settings.mfa.removeHelp": "删除多重验证意味着您不再需要基于手机的密码来登入您的帐号。",
+ "user.settings.mfa.secret": "秘钥:",
"user.settings.mfa.title": "启用多重验证:",
"user.settings.modal.advanced": "高级",
"user.settings.modal.confirmBtns": "是的,放弃",
diff --git a/webapp/i18n/zh_TW.json b/webapp/i18n/zh_TW.json
index cd43ed06f..b03e03a1d 100644
--- a/webapp/i18n/zh_TW.json
+++ b/webapp/i18n/zh_TW.json
@@ -980,20 +980,20 @@
"channel_flow.handleTooShort": "頻道網址必須為小寫英數字、至少兩個字元",
"channel_flow.invalidName": "無效的頻道名稱",
"channel_flow.set_url_title": "設定 {term} 網址",
- "channel_header.addToFavorites": "Add to Favorites",
+ "channel_header.addToFavorites": "新增至我的最愛",
"channel_header.channel": "頻道",
- "channel_header.channelHeader": "設定頻道標題…",
- "channel_header.delete": "刪除{term}…",
+ "channel_header.channelHeader": "編輯頻道標題",
+ "channel_header.delete": "刪除{term}",
"channel_header.flagged": "被標記的訊息",
"channel_header.group": "群組",
"channel_header.leave": "退出{term}",
"channel_header.manageMembers": "成員管理",
"channel_header.notificationPreferences": "通知喜好設定",
"channel_header.recentMentions": "最近提及",
- "channel_header.removeFromFavorites": "Remove from Favorites",
- "channel_header.rename": "變更{term}名稱…",
- "channel_header.setHeader": "設定{term}標題…",
- "channel_header.setPurpose": "設定{term}用途…",
+ "channel_header.removeFromFavorites": "從我的最愛中移除",
+ "channel_header.rename": "變更{term}名稱",
+ "channel_header.setHeader": "編輯{term}標題",
+ "channel_header.setPurpose": "編輯{term}用途",
"channel_header.viewInfo": "檢視資訊",
"channel_header.viewMembers": "檢視成員",
"channel_header.webrtc.call": "開始視訊通話",
@@ -1134,7 +1134,7 @@
"delete_channel.confirm": "請確認刪除頻道",
"delete_channel.del": "刪除",
"delete_channel.group": "群組",
- "delete_channel.question": "確定要刪除{display_name} {term}嘛?",
+ "delete_channel.question": "這將會從團隊刪除頻道並且禁止所有使用者存取頻道內容。您確定要刪除{display_name}{term}?",
"delete_post.cancel": "取消",
"delete_post.comment": "註解",
"delete_post.confirm": "請確認刪除{term}",
@@ -1641,6 +1641,7 @@
"sidebar.createChannel": "建立頻道",
"sidebar.createGroup": "建立群組",
"sidebar.direct": "直接訊息",
+ "sidebar.favorite": "我的最愛",
"sidebar.more": "更多",
"sidebar.moreElips": "更多...",
"sidebar.otherMembers": "此團隊以外",
@@ -1914,12 +1915,13 @@
"user.settings.languages.change": "變更介面語言",
"user.settings.languages.promote": "選擇 Mattermost 用哪種語言顯示使用者界面。<br /><br />想要幫忙翻譯嘛?加入 <a href='http://translate.mattermost.com/' target='_blank'>Mattermost 翻譯伺服器</a> 來幫忙。",
"user.settings.mfa.add": "為您的帳號加上多重要素驗證",
- "user.settings.mfa.addHelp": "在密碼之上您還可以要求使用智慧型手機所產生的代碼來登入 Mattermost。<br/><br/>若要啟用,請從<a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a>或<a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a>下載 Google Authenticator。<br/><br/>1. 按上面的<strong>為您的帳號加上多重要素驗證</strong>。<br/>2. 用 Google Authenticator 掃描出來的 QR 碼。<br/>3. 輸入 Google Authenticator 產生的 Token 並點擊<strong>儲存</strong>。<br/><br/>登入時,除了您原本的認證以外還會被要求輸入來自 Google Authenticator 的 Token。",
- "user.settings.mfa.addHelpQr": "請用智慧型手機上的 Google Authenticator 應用程式掃描條碼,並將應用程式提供的 Token 填寫於此。",
+ "user.settings.mfa.addHelp": "在密碼之上您還可以要求使用智慧型手機所產生的代碼來登入 Mattermost。<br/><br/>若要啟用,請根據手機從<a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a>或<a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a>下載 Google Authenticator,然後:<br/><br/>1. 按上面的<strong>為您的帳號加上多重要素驗證</strong>。<br/>2. 用 Google Authenticator 掃描出來的 QR 碼或是手動輸入密碼。<br/>3. 輸入 Google Authenticator 產生的 Token 並點擊<strong>儲存</strong>。<br/><br/>登入時,除了您原本的認證以外還會被要求輸入來自 Google Authenticator 的 Token。",
+ "user.settings.mfa.addHelpQr": "請用手機上的 Google Authenticator 應用程式掃描 QR 碼並填入應用程式提供的 Token。如果無法掃描 QR 碼,可以手動輸入密碼。",
"user.settings.mfa.enterToken": "Token (僅限數字)",
"user.settings.mfa.qrCode": "條碼",
"user.settings.mfa.remove": "從您的帳號移除多重要素驗證",
"user.settings.mfa.removeHelp": "刪除多重因子認證後將不再需要一個基於手機的密碼以登入帳戶。",
+ "user.settings.mfa.secret": "密碼",
"user.settings.mfa.title": "多重要素驗證",
"user.settings.modal.advanced": "進階",
"user.settings.modal.confirmBtns": "是,放棄它們",
diff --git a/webapp/routes/route_team.jsx b/webapp/routes/route_team.jsx
index 5b6948ea2..4bdfd1cc6 100644
--- a/webapp/routes/route_team.jsx
+++ b/webapp/routes/route_team.jsx
@@ -17,6 +17,8 @@ import ChannelStore from 'stores/channel_store.jsx';
import emojiRoute from 'routes/route_emoji.jsx';
import integrationsRoute from 'routes/route_integrations.jsx';
+import {loadProfilesAndTeamMembersForDMSidebar} from 'actions/user_actions.jsx';
+
function onChannelEnter(nextState, replace, callback) {
doChannelChange(nextState, replace, callback);
}
@@ -68,6 +70,8 @@ function preNeedsTeam(nextState, replace, callback) {
TeamStore.saveMyTeam(team);
TeamStore.emitChange();
+ loadProfilesAndTeamMembersForDMSidebar();
+ AsyncClient.getMyChannelMembers();
var d1 = $.Deferred(); //eslint-disable-line new-cap
diff --git a/webapp/sass/components/_modal.scss b/webapp/sass/components/_modal.scss
index 3faf78bc6..f89fb5c40 100644
--- a/webapp/sass/components/_modal.scss
+++ b/webapp/sass/components/_modal.scss
@@ -125,6 +125,7 @@
}
.modal-dialog {
+ margin-bottom: 0;
margin-left: auto;
margin-right: auto;
max-width: 95%;
@@ -237,19 +238,6 @@
top: 0;
}
- &.more-channel__modal {
- .modal-body {
- overflow-x: hidden;
- padding: 10px 0 15px;
- }
-
- .channel-count {
- @include opacity(.8);
- float: right;
- margin-top: 5px;
- }
- }
-
.modal-image {
height: 100%;
margin: 0 auto;
@@ -449,9 +437,37 @@
}
}
}
+
+ &.more-channel__modal {
+ .modal-body {
+ overflow-x: hidden;
+ padding: 10px 0 15px;
+ }
+
+ .channel-count {
+ @include opacity(.8);
+ float: right;
+ margin-top: 5px;
+ }
+
+ .more-modal__list {
+ max-height: calc(100vh - 270px);
+ }
+ }
}
.more-modal {
+ .more-modal__list {
+ height: 100vh;
+ max-height: calc(100vh - 340px);
+ }
+
+ &.more-direct-channels {
+ .more-modal__list {
+ max-height: calc(100vh - 325px);
+ }
+ }
+
.user-list {
margin-top: 10px;
overflow-x: hidden;
diff --git a/webapp/sass/responsive/_mobile.scss b/webapp/sass/responsive/_mobile.scss
index 6a6153469..00f89ff15 100644
--- a/webapp/sass/responsive/_mobile.scss
+++ b/webapp/sass/responsive/_mobile.scss
@@ -36,21 +36,24 @@
padding: 15px 20px 100px;
}
- .close__icon {
- @include border-radius(50%);
- border: 1px solid $white;
- bottom: 25px;
- color: $white;
+ .close {
+ font-family: 'Open Sans', sans-serif;
display: block;
- font-size: 23px;
- font-weight: 300;
+ position: fixed;
+ bottom: 25px;
height: 30px;
+ width: 30px;
+ margin-left: -15px;
left: 50%;
- line-height: 23px;
- margin-left: -25px;
- position: fixed;
+ font-size: 23px;
+ line-height: 27px;
+ border-radius: 50%;
+ border: 1px solid $white;
text-align: center;
- width: 30px;
+ opacity: 1;
+ text-shadow: none;
+ color: white;
+ font-weight: 200;
}
}
@@ -81,9 +84,10 @@
.tutorial-steps__container {
.tutorial__content {
.tutorial__steps {
- margin-bottom: 0;
- min-height: auto;
- padding-bottom: 8em;
+ margin-top: 15%;
+ margin-bottom: 15%;
+ max-height: 70%;
+ padding-bottom: 0;
}
}
}
@@ -749,22 +753,24 @@
top: 42px;
width: 100%;
- &:after {
- @include border-radius(50%);
- border: 1px solid $white;
- bottom: 25px;
- color: $white;
- content: '\D7';
+ .close {
+ font-family: 'Open Sans', sans-serif;
display: block;
- font-size: 23px;
- font-weight: 300;
+ position: fixed;
+ bottom: 25px;
height: 30px;
+ width: 30px;
+ margin-left: -15px;
left: 50%;
+ font-size: 23px;
line-height: 27px;
- margin-left: -25px;
- position: fixed;
+ border-radius: 50%;
+ border: 1px solid $white;
text-align: center;
- width: 30px;
+ opacity: 1;
+ text-shadow: none;
+ color: white;
+ font-weight: 200;
}
> li {
@@ -1306,8 +1312,28 @@
}
.app__body {
+ .more-modal {
+ .modal-body {
+ padding-bottom: 5px;
+ }
+
+ .more-modal__list {
+ max-height: calc(100vh - 260px);
+ }
+
+ &.more-direct-channels {
+ .more-modal__list {
+ max-height: calc(100vh - 295px);
+ }
+ }
+ }
+
.modal {
&.more-channel__modal {
+ .more-modal__list {
+ max-height: calc(100vh - 250px);
+ }
+
.modal-body {
padding-bottom: 35px;
}
@@ -1394,6 +1420,25 @@
.tutorial__steps {
padding: 0 20px;
width: 100%;
+ h1 {
+ font-size: 35px;
+ margin: -5px 0 20px;
+ }
+ h3 {
+ margin-bottom: 10px;
+ }
+ .tutorial__app-icons {
+ margin: 10px 0;
+ }
+ .tutorial__circles {
+ margin: 0 0 15px;
+ bottom: 60px;
+ position: absolute;
+ }
+ .tutorial__footer {
+ bottom: 30px;
+ position: absolute;
+ }
}
}
}
diff --git a/webapp/stores/channel_store.jsx b/webapp/stores/channel_store.jsx
index 13a5c4574..136423d45 100644
--- a/webapp/stores/channel_store.jsx
+++ b/webapp/stores/channel_store.jsx
@@ -263,6 +263,12 @@ class ChannelStoreClass extends EventEmitter {
});
}
+ setUnreadCountsByCurrentMembers() {
+ Object.keys(this.myChannelMembers).forEach((key) => {
+ this.setUnreadCountByChannel(this.myChannelMembers[key].channel_id);
+ });
+ }
+
setUnreadCountsByChannels(channels) {
channels.forEach((c) => {
this.setUnreadCountByChannel(c.id);
@@ -368,6 +374,15 @@ ChannelStore.dispatchToken = AppDispatcher.register((payload) => {
ChannelStore.setUnreadCountsByMembers(action.members);
ChannelStore.emitChange();
break;
+ case ActionTypes.RECEIVED_CHANNEL_MEMBER:
+ ChannelStore.storeMyChannelMember(action.member);
+ currentId = ChannelStore.getCurrentId();
+ if (currentId && window.isActive) {
+ ChannelStore.resetCounts(currentId);
+ }
+ ChannelStore.setUnreadCountsByCurrentMembers();
+ ChannelStore.emitChange();
+ break;
case ActionTypes.RECEIVED_MORE_CHANNELS:
ChannelStore.storeMoreChannels(action.channels);
ChannelStore.emitChange();
@@ -385,4 +400,4 @@ ChannelStore.dispatchToken = AppDispatcher.register((payload) => {
}
});
-export default ChannelStore; \ No newline at end of file
+export default ChannelStore;
diff --git a/webapp/stores/suggestion_store.jsx b/webapp/stores/suggestion_store.jsx
index 75221421f..39bea0b0c 100644
--- a/webapp/stores/suggestion_store.jsx
+++ b/webapp/stores/suggestion_store.jsx
@@ -121,6 +121,11 @@ class SuggestionStore extends EventEmitter {
}
addSuggestions(id, terms, items, component, matchedPretext) {
+ if (!this.getPretext(id).endsWith(matchedPretext)) {
+ // These suggestions are out of date since the pretext has changed
+ return;
+ }
+
const suggestion = this.suggestions.get(id);
suggestion.terms.push(...terms);
@@ -218,7 +223,7 @@ class SuggestionStore extends EventEmitter {
}
handleEventPayload(payload) {
- const {type, id, ...other} = payload.action; // eslint-disable-line no-use-before-define
+ const {type, id, ...other} = payload.action;
switch (type) {
case ActionTypes.SUGGESTION_PRETEXT_CHANGED:
@@ -243,6 +248,7 @@ class SuggestionStore extends EventEmitter {
this.emitSuggestionsChanged(id);
break;
case ActionTypes.SUGGESTION_CLEAR_SUGGESTIONS:
+ this.setPretext(id, '');
this.clearSuggestions(id);
this.clearSelection(id);
this.emitSuggestionsChanged(id);
diff --git a/webapp/utils/async_client.jsx b/webapp/utils/async_client.jsx
index 1149c565f..efa9eeb2b 100644
--- a/webapp/utils/async_client.jsx
+++ b/webapp/utils/async_client.jsx
@@ -111,26 +111,31 @@ export function getChannel(id) {
}
export function getMyChannelMembers() {
- if (isCallInProgress('getMyChannelMembers')) {
- return;
- }
+ return new Promise((resolve, reject) => {
+ if (isCallInProgress('getMyChannelMembers')) {
+ resolve();
+ return;
+ }
- callTracker.getMyChannelMembers = utils.getTimestamp();
+ callTracker.getMyChannelMembers = utils.getTimestamp();
- Client.getMyChannelMembers(
- (data) => {
- callTracker.getMyChannelMembers = 0;
+ Client.getMyChannelMembers(
+ (data) => {
+ callTracker.getMyChannelMembers = 0;
- AppDispatcher.handleServerAction({
- type: ActionTypes.RECEIVED_MY_CHANNEL_MEMBERS,
- members: data
- });
- },
- (err) => {
- callTracker.getChannelsUnread = 0;
- dispatchError(err, 'getMyChannelMembers');
- }
- );
+ AppDispatcher.handleServerAction({
+ type: ActionTypes.RECEIVED_MY_CHANNEL_MEMBERS,
+ members: data
+ });
+ resolve();
+ },
+ (err) => {
+ callTracker.getChannelsUnread = 0;
+ dispatchError(err, 'getMyChannelMembers');
+ reject();
+ }
+ );
+ });
}
export function updateLastViewedAt(id, active) {
@@ -263,28 +268,33 @@ export function getChannelStats(channelId = ChannelStore.getCurrentId(), doVersi
}
export function getChannelMember(channelId, userId) {
- if (isCallInProgress(`getChannelMember${channelId}${userId}`)) {
- return;
- }
+ return new Promise((resolve, reject) => {
+ if (isCallInProgress(`getChannelMember${channelId}${userId}`)) {
+ resolve();
+ return;
+ }
- callTracker[`getChannelMember${channelId}${userId}`] = utils.getTimestamp();
+ callTracker[`getChannelMember${channelId}${userId}`] = utils.getTimestamp();
- Client.getChannelMember(
- channelId,
- userId,
- (data) => {
- callTracker[`getChannelMember${channelId}${userId}`] = 0;
+ Client.getChannelMember(
+ channelId,
+ userId,
+ (data) => {
+ callTracker[`getChannelMember${channelId}${userId}`] = 0;
- AppDispatcher.handleServerAction({
- type: ActionTypes.RECEIVED_CHANNEL_MEMBER,
- member: data
- });
- },
- (err) => {
- callTracker[`getChannelMember${channelId}${userId}`] = 0;
- dispatchError(err, 'getChannelMember');
- }
- );
+ AppDispatcher.handleServerAction({
+ type: ActionTypes.RECEIVED_CHANNEL_MEMBER,
+ member: data
+ });
+ resolve();
+ },
+ (err) => {
+ callTracker[`getChannelMember${channelId}${userId}`] = 0;
+ dispatchError(err, 'getChannelMember');
+ reject();
+ }
+ );
+ });
}
export function getUser(userId) {
diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx
index 29f4ea64e..d8965516e 100644
--- a/webapp/utils/constants.jsx
+++ b/webapp/utils/constants.jsx
@@ -70,6 +70,7 @@ export const ActionTypes = keyMirror({
RECEIVED_CHANNELS: null,
RECEIVED_CHANNEL: null,
+ RECEIVED_CHANNEL_MEMBER: null,
RECEIVED_MORE_CHANNELS: null,
RECEIVED_CHANNEL_STATS: null,
RECEIVED_MY_CHANNEL_MEMBERS: null,
diff --git a/webapp/utils/utils.jsx b/webapp/utils/utils.jsx
index 5d456bf83..d2ea25f22 100644
--- a/webapp/utils/utils.jsx
+++ b/webapp/utils/utils.jsx
@@ -1270,7 +1270,15 @@ export function isValidPassword(password) {
}
export function getSiteURL() {
- return global.mm_config.SiteURL || window.location.origin;
+ if (global.mm_config.SiteURL) {
+ return global.mm_config.SiteURL;
+ }
+
+ if (window.location.origin) {
+ return window.location.origin;
+ }
+
+ return window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '');
}
export function handleFormattedTextClick(e) {