From 79726b5d8e6ebc13d61e083a4f598d9356328e5e Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Mon, 13 Nov 2017 14:46:29 -0500 Subject: Replace os.Rename with directory copy util in plugin extraction (#7825) --- app/plugins.go | 2 +- utils/file.go | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ utils/file_test.go | 54 ++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+), 1 deletion(-) diff --git a/app/plugins.go b/app/plugins.go index 0ce669290..43b7a7451 100644 --- a/app/plugins.go +++ b/app/plugins.go @@ -358,7 +358,7 @@ func (a *App) InstallPlugin(pluginFile io.Reader) (*model.Manifest, *model.AppEr return nil, model.NewAppError("UnpackAndActivatePlugin", "app.plugin.manifest.app_error", nil, err.Error(), http.StatusBadRequest) } - os.Rename(tmpPluginDir, filepath.Join(a.PluginEnv.SearchPath(), manifest.Id)) + err = utils.CopyDir(tmpPluginDir, filepath.Join(a.PluginEnv.SearchPath(), manifest.Id)) if err != nil { return nil, model.NewAppError("UnpackAndActivatePlugin", "app.plugin.mvdir.app_error", nil, err.Error(), http.StatusInternalServerError) } diff --git a/utils/file.go b/utils/file.go index c7e092a20..6472770a0 100644 --- a/utils/file.go +++ b/utils/file.go @@ -5,6 +5,8 @@ package utils import ( "bytes" + "fmt" + "io" "io/ioutil" "net/http" "os" @@ -367,3 +369,102 @@ func CopyMetadata(encrypt bool) map[string]string { metaData["x-amz-server-side-encryption"] = "AES256" return metaData } + +// CopyFile will copy a file from src path to dst path. +// Overwrites any existing files at dst. +// Permissions are copied from file at src to the new file at dst. +func CopyFile(src, dst string) (err error) { + in, err := os.Open(src) + if err != nil { + return + } + defer in.Close() + + out, err := os.Create(dst) + if err != nil { + return + } + defer func() { + if e := out.Close(); e != nil { + err = e + } + }() + + _, err = io.Copy(out, in) + if err != nil { + return + } + + err = out.Sync() + if err != nil { + return + } + + stat, err := os.Stat(src) + if err != nil { + return + } + err = os.Chmod(dst, stat.Mode()) + if err != nil { + return + } + + return +} + +// CopyDir will copy a directory and all contained files and directories. +// src must exist and dst must not exist. +// Permissions are preserved when possible. Symlinks are skipped. +func CopyDir(src string, dst string) (err error) { + src = filepath.Clean(src) + dst = filepath.Clean(dst) + + stat, err := os.Stat(src) + if err != nil { + return + } + if !stat.IsDir() { + return fmt.Errorf("source must be a directory") + } + + _, err = os.Stat(dst) + if err != nil && !os.IsNotExist(err) { + return + } + if err == nil { + return fmt.Errorf("destination already exists") + } + + err = os.MkdirAll(dst, stat.Mode()) + if err != nil { + return + } + + items, err := ioutil.ReadDir(src) + if err != nil { + return + } + + for _, item := range items { + srcPath := filepath.Join(src, item.Name()) + dstPath := filepath.Join(dst, item.Name()) + + if item.IsDir() { + err = CopyDir(srcPath, dstPath) + if err != nil { + return + } + } else { + if item.Mode()&os.ModeSymlink != 0 { + continue + } + + err = CopyFile(srcPath, dstPath) + if err != nil { + return + } + } + } + + return +} diff --git a/utils/file_test.go b/utils/file_test.go index 5c7162450..91e78f24e 100644 --- a/utils/file_test.go +++ b/utils/file_test.go @@ -5,9 +5,13 @@ package utils import ( "fmt" + "io/ioutil" "os" + "path/filepath" "testing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" "github.com/mattermost/mattermost-server/model" @@ -180,3 +184,53 @@ func (s *FileTestSuite) TestRemoveDirectory() { _, err = ReadFile("tests2/asdf") s.Error(err) } + +func TestCopyDir(t *testing.T) { + srcDir, err := ioutil.TempDir("", "src") + require.NoError(t, err) + defer os.RemoveAll(srcDir) + + dstParentDir, err := ioutil.TempDir("", "dstparent") + require.NoError(t, err) + defer os.RemoveAll(dstParentDir) + + dstDir := filepath.Join(dstParentDir, "dst") + + tempFile := "temp.txt" + err = ioutil.WriteFile(filepath.Join(srcDir, tempFile), []byte("test file"), 0655) + require.NoError(t, err) + + childDir := "child" + err = os.Mkdir(filepath.Join(srcDir, childDir), 0777) + require.NoError(t, err) + + childTempFile := "childtemp.txt" + err = ioutil.WriteFile(filepath.Join(srcDir, childDir, childTempFile), []byte("test file"), 0755) + require.NoError(t, err) + + err = CopyDir(srcDir, dstDir) + assert.NoError(t, err) + + stat, err := os.Stat(filepath.Join(dstDir, tempFile)) + assert.NoError(t, err) + assert.Equal(t, uint32(0655), uint32(stat.Mode())) + assert.False(t, stat.IsDir()) + data, err := ioutil.ReadFile(filepath.Join(dstDir, tempFile)) + assert.NoError(t, err) + assert.Equal(t, "test file", string(data)) + + stat, err = os.Stat(filepath.Join(dstDir, childDir)) + assert.NoError(t, err) + assert.True(t, stat.IsDir()) + + stat, err = os.Stat(filepath.Join(dstDir, childDir, childTempFile)) + assert.NoError(t, err) + assert.Equal(t, uint32(0755), uint32(stat.Mode())) + assert.False(t, stat.IsDir()) + data, err = ioutil.ReadFile(filepath.Join(dstDir, childDir, childTempFile)) + assert.NoError(t, err) + assert.Equal(t, "test file", string(data)) + + err = CopyDir(srcDir, dstDir) + assert.Error(t, err) +} -- cgit v1.2.3-1-g7c22 From e17554a375c78ede4525d1afa5e3e1395242ee67 Mon Sep 17 00:00:00 2001 From: Christopher Brown Date: Mon, 13 Nov 2017 14:05:34 -0600 Subject: add codecov.yml --- codecov.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 000000000..29fa07a58 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,8 @@ +coverage: + status: + project: + default: + threshold: 1% + patch: off +ignore: + - store/storetest -- cgit v1.2.3-1-g7c22 From a0017f184578d4d6250a9b54b50e656524078949 Mon Sep 17 00:00:00 2001 From: enahum Date: Tue, 14 Nov 2017 15:30:06 -0300 Subject: translations PR 20171113 (#7827) --- i18n/de.json | 50 ++++++++++---------- i18n/es.json | 6 +-- i18n/fr.json | 140 ++++++++++++++++++++++++++++---------------------------- i18n/it.json | 2 +- i18n/ja.json | 4 +- i18n/pt-BR.json | 2 +- i18n/ru.json | 4 +- i18n/tr.json | 50 ++++++++++---------- i18n/zh-CN.json | 10 ++-- i18n/zh-TW.json | 58 +++++++++++------------ 10 files changed, 163 insertions(+), 163 deletions(-) diff --git a/i18n/de.json b/i18n/de.json index 2d3b5d755..c783faddc 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -637,15 +637,15 @@ }, { "id": "api.command_dnd.desc", - "translation": "Do not disturb disables desktop and mobile push notifications." + "translation": "\"Nicht stören\" deaktiviert Desktop-Benachrichtigungen und mobile Push-Benachrichtigungen." }, { "id": "api.command_dnd.disabled", - "translation": "Do Not Disturb is disabled." + "translation": "\"Nicht stören\" ist deaktiviert." }, { "id": "api.command_dnd.error", - "translation": "Error to retrieve the user status." + "translation": "Fehler beim Abrufen des Benutzerstatus." }, { "id": "api.command_dnd.name", @@ -653,7 +653,7 @@ }, { "id": "api.command_dnd.success", - "translation": "Do Not Disturb is enabled. You will not receive desktop or mobile push notifications until Do Not Disturb is turned off." + "translation": "\"Nicht stören\" ist aktiviert. Sie werden keine Desktop-Benachrichtigungen oder mobile Push-Benachrichtigungen erhalten, bis \"Nicht stören\" deaktiviert ist." }, { "id": "api.command_echo.create.app_error", @@ -853,11 +853,11 @@ }, { "id": "api.command_remove.direct_group.app_error", - "translation": "You can't remove someone from a direct message channel." + "translation": "Sie können keinen Benutzer aus einem Direktnachrichtenkanal entfernen." }, { "id": "api.command_remove.hint", - "translation": "@[username]" + "translation": "@[Benutzername]" }, { "id": "api.command_remove.message.app_error", @@ -873,7 +873,7 @@ }, { "id": "api.command_remove.permission.app_error", - "translation": "Sie haben nicht die nötigen Berechtigungen, um den Kanal umzubenennen." + "translation": "Sie haben nicht die nötigen Berechtigungen, um das Mitglied zu Entfernen." }, { "id": "api.command_remove.user_not_in_channel", @@ -929,7 +929,7 @@ }, { "id": "api.command_shrug.name", - "translation": "zucken" + "translation": "achselzucken" }, { "id": "api.compliance.init.debug", @@ -1029,7 +1029,7 @@ }, { "id": "api.email_batching.render_batched_post.channel.app_error", - "translation": "Konnte Kanal für gestapelte E-Mail-Benachrichtigung nicht finden" + "translation": "Konnte Kanal der Nachricht für gestapelte E-Mail-Benachrichtigung nicht finden" }, { "id": "api.email_batching.render_batched_post.date", @@ -1575,19 +1575,19 @@ }, { "id": "api.post.check_for_out_of_channel_mentions.link.private", - "translation": "add them to this private channel" + "translation": "sie diesem privaten Kanal hinzufügen" }, { "id": "api.post.check_for_out_of_channel_mentions.link.public", - "translation": "add them to the channel" + "translation": "sie diesem Kanal hinzufügen" }, { "id": "api.post.check_for_out_of_channel_mentions.message.multiple", - "translation": "@{{.Usernames}} and @{{.LastUsername}} were mentioned but they are not in the channel. Would you like to {{.Phrase}}? They will have access to all message history." + "translation": "@{{.Usernames}} und @{{.LastUsername}} wurden erwähnt, befinden sich aber nicht im Kanal. Möchten Sie {{.Phrase}}? Sie werden Zugriff auf den Nachrichtenverlauf haben." }, { "id": "api.post.check_for_out_of_channel_mentions.message.one", - "translation": "@{{.Username}} was mentioned but they are not in the channel. Would you like to {{.Phrase}}? They will have access to all message history." + "translation": "@{{.Usernames}} wurde erwähnt, befindet sich aber nicht im Kanal. Möchten Sie {{.Phrase}}? Der Benutzer wird Zugriff auf den Nachrichtenverlauf haben." }, { "id": "api.post.create_post.attach_files.error", @@ -1729,7 +1729,7 @@ }, { "id": "api.post.send_notifications_and_forget.clear_push_notification.debug", - "translation": "Leere Push-Mitteilung an %v mit channel_id %v" + "translation": "Leere Push-Benachrichtigung an %v mit channel_id %v" }, { "id": "api.post.send_notifications_and_forget.files.error", @@ -2165,7 +2165,7 @@ }, { "id": "api.team.import_team.no_import_from.app_error", - "translation": "Falsch gebildete Anfrage: Feld filesize fehlt." + "translation": "Falsch gebildete Anfrage: Feld importFrom fehlt." }, { "id": "api.team.import_team.open.app_error", @@ -2805,7 +2805,7 @@ }, { "id": "api.user.update_active.no_deactivate_sso.app_error", - "translation": "Sie können den Aktivitätsstatus des AD-/LDAP-Kontos nicht ändern. Bitte ändern Sie diesen über den AD-/LDAP-Server." + "translation": "Sie können den Aktivitätsstatus des SSO-Kontos nicht ändern. Bitte ändern Sie diesen über denSSO-Server." }, { "id": "api.user.update_active.permissions.app_error", @@ -3497,7 +3497,7 @@ }, { "id": "app.plugin.config.app_error", - "translation": "Error saving plugin state in config" + "translation": "Fehler beim Speichern des Plugin-Status in der Konfiguration" }, { "id": "app.plugin.deactivate.app_error", @@ -3505,7 +3505,7 @@ }, { "id": "app.plugin.disabled.app_error", - "translation": "Plugins have been disabled." + "translation": "Plugins wurden deaktiviert." }, { "id": "app.plugin.extract.app_error", @@ -3533,7 +3533,7 @@ }, { "id": "app.plugin.not_installed.app_error", - "translation": "Plugin is not installed" + "translation": "Plugin ist nicht installiert" }, { "id": "app.plugin.remove.app_error", @@ -3541,7 +3541,7 @@ }, { "id": "app.plugin.upload_disabled.app_error", - "translation": "Plugins and/or plugin uploads have been disabled." + "translation": "Plugins und/oder Plugin-Uploads wurden deaktiviert." }, { "id": "app.user_access_token.disabled", @@ -3829,7 +3829,7 @@ }, { "id": "ent.elasticsearch.indexer.do_job.get_oldest_post.error", - "translation": "The oldest post could not be retrieved from the database." + "translation": "Die älteste Nachricht konnte nicht aus der Datenbank abgerufen werden." }, { "id": "ent.elasticsearch.indexer.do_job.parse_end_time.error", @@ -4281,7 +4281,7 @@ }, { "id": "model.channel_member.is_valid.push_level.app_error", - "translation": "Ungültige Pushbenachrichtigungsstufe" + "translation": "Ungültige Push-Benachrichtigungsstufe" }, { "id": "model.channel_member.is_valid.role.app_error", @@ -4485,7 +4485,7 @@ }, { "id": "model.config.is_valid.elastic_search.bulk_indexing_time_window_seconds.app_error", - "translation": "Elasticsearch Bulk Indexing Time Window must be at least 1 second." + "translation": "Zeitfenster für Elasticsearch-Bulk-Indizierung muss mindestens eine Sekunde sein." }, { "id": "model.config.is_valid.elastic_search.connection_url.app_error", @@ -4509,7 +4509,7 @@ }, { "id": "model.config.is_valid.elastic_search.request_timeout_seconds.app_error", - "translation": "Elasticsearch Request Timeout must be at least 1 second." + "translation": "Timeout für Elasticsearch-Anfrage muss mindestens 1 Sekunde sein." }, { "id": "model.config.is_valid.elastic_search.username.app_error", @@ -6933,7 +6933,7 @@ }, { "id": "web.incoming_webhook.split_props_length.app_error", - "translation": "Unable to split webhook props into {{.Max}} character parts." + "translation": "Konnte Webhook-Props nicht in {{.Max}} Teile aufteilen." }, { "id": "web.incoming_webhook.text.app_error", diff --git a/i18n/es.json b/i18n/es.json index e62574a61..dd31196b5 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -3517,11 +3517,11 @@ }, { "id": "app.plugin.get_plugins.app_error", - "translation": "No se puede obtener los plugins activos" + "translation": "No se puede obtener los complementos activos" }, { "id": "app.plugin.get_plugins.app_error", - "translation": "No se puede obtener los plugins activos" + "translation": "No se puede obtener los complementos activos" }, { "id": "app.plugin.manifest.app_error", @@ -3541,7 +3541,7 @@ }, { "id": "app.plugin.upload_disabled.app_error", - "translation": "Plugins y/o la carga de plugins han sido deshabilitados." + "translation": "Los Complementos y/o la carga de complementos han sido deshabilitados." }, { "id": "app.user_access_token.disabled", diff --git a/i18n/fr.json b/i18n/fr.json index 717e468ca..0dadd2536 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -201,7 +201,7 @@ }, { "id": "api.channel.create_channel.direct_channel.app_error", - "translation": "Vous devez utiliser le service d'API createDirectChannel pour la création d'un canal de messages privés" + "translation": "Vous devez utiliser le service d'API createDirectChannel pour la création d'un canal de messages personnels" }, { "id": "api.channel.create_channel.invalid_character.app_error", @@ -305,7 +305,7 @@ }, { "id": "api.channel.leave.direct.app_error", - "translation": "Impossible de quitter un canal de messages privés" + "translation": "Impossible de quitter un canal de messages personnels" }, { "id": "api.channel.leave.last_member.app_error", @@ -465,7 +465,7 @@ }, { "id": "api.command.invite_people.name", - "translation": "inviter_personne" + "translation": "invite_people" }, { "id": "api.command.invite_people.no_email", @@ -489,7 +489,7 @@ }, { "id": "api.command_away.desc", - "translation": "Définit votre état sur « Absent »." + "translation": "Définit votre statut sur « Absent »." }, { "id": "api.command_away.name", @@ -541,7 +541,7 @@ }, { "id": "api.command_channel_purpose.direct_group.app_error", - "translation": "Impossible de définir la description des canaux de messages privés. Utilisez /header pour définir l'entête à la place." + "translation": "Impossible de définir la description des canaux de messages personnels. Utilisez /header pour définir l'entête à la place." }, { "id": "api.command_channel_purpose.hint", @@ -573,7 +573,7 @@ }, { "id": "api.command_channel_rename.direct_group.app_error", - "translation": "Impossible de renommer les canaux de messages privés." + "translation": "Impossible de renommer les canaux de messages personnels." }, { "id": "api.command_channel_rename.hint", @@ -637,23 +637,23 @@ }, { "id": "api.command_dnd.desc", - "translation": "Do not disturb disables desktop and mobile push notifications." + "translation": "Le mode « Ne pas déranger » désactive les notifications de bureau et push sur mobile." }, { "id": "api.command_dnd.disabled", - "translation": "Do Not Disturb is disabled." + "translation": "Le mode « Ne pas déranger » est désactivé." }, { "id": "api.command_dnd.error", - "translation": "Error to retrieve the user status." + "translation": "Une erreur s'est produite lors de la récupération du statut de l'utilisateur." }, { "id": "api.command_dnd.name", - "translation": "dnd" + "translation": "Ne pas déranger" }, { "id": "api.command_dnd.success", - "translation": "Do Not Disturb is enabled. You will not receive desktop or mobile push notifications until Do Not Disturb is turned off." + "translation": "Le mode « Ne pas déranger » est activé. Vous ne recevrez pas les notifications de bureau et push sur mobile tant que le mode « Ne pas déranger » est activé." }, { "id": "api.command_echo.create.app_error", @@ -737,7 +737,7 @@ }, { "id": "api.command_kick.name", - "translation": "kick" + "translation": "Éjecter" }, { "id": "api.command_leave.desc", @@ -789,11 +789,11 @@ }, { "id": "api.command_msg.desc", - "translation": "Envoie un message privé à un utilisateur" + "translation": "Envoie un message personnel à un utilisateur" }, { "id": "api.command_msg.dm_fail.app_error", - "translation": "Une erreur s'est produite à la création du message privé." + "translation": "Une erreur s'est produite à la création du message personnel." }, { "id": "api.command_msg.fail.app_error", @@ -821,7 +821,7 @@ }, { "id": "api.command_offline.desc", - "translation": "Définit votre état sur « Hors ligne »." + "translation": "Définit votre statut sur « Hors ligne »." }, { "id": "api.command_offline.name", @@ -833,7 +833,7 @@ }, { "id": "api.command_online.desc", - "translation": "Définit votre état sur « Connecté »" + "translation": "Définit votre statut sur « Connecté »" }, { "id": "api.command_online.name", @@ -849,35 +849,35 @@ }, { "id": "api.command_remove.desc", - "translation": "Remove a member from the channel" + "translation": "Éjecte un membre du canal" }, { "id": "api.command_remove.direct_group.app_error", - "translation": "You can't remove someone from a direct message channel." + "translation": "Vous ne pouvez pas retirer un utilisateur d'un canal de messages personnels." }, { "id": "api.command_remove.hint", - "translation": "@[username]" + "translation": "@[nom d'utilisateur]" }, { "id": "api.command_remove.message.app_error", - "translation": "Un message doit être spécifié avec la commande /rename." + "translation": "Un message doit être spécifié avec la commande /remove ou /kick." }, { "id": "api.command_remove.missing.app_error", - "translation": "Utilisateur introuvable" + "translation": "Impossible de trouver l'utilisateur" }, { "id": "api.command_remove.name", - "translation": "remove" + "translation": "supprimer" }, { "id": "api.command_remove.permission.app_error", - "translation": "Vous ne disposez pas des permissions requises pour renommer le canal." + "translation": "Vous ne disposez pas des permissions requises pour retirer le membre." }, { "id": "api.command_remove.user_not_in_channel", - "translation": "{{.Username}} is not a member of this channel." + "translation": "{{.Username}} n'est pas un membre de ce canal." }, { "id": "api.command_search.desc", @@ -1037,7 +1037,7 @@ }, { "id": "api.email_batching.render_batched_post.direct_message", - "translation": "Message privé de " + "translation": "Message personnel de " }, { "id": "api.email_batching.render_batched_post.go_to_post", @@ -1575,19 +1575,19 @@ }, { "id": "api.post.check_for_out_of_channel_mentions.link.private", - "translation": "add them to this private channel" + "translation": "ajouter à ce canal privé" }, { "id": "api.post.check_for_out_of_channel_mentions.link.public", - "translation": "add them to the channel" + "translation": "ajouter à ce canal" }, { "id": "api.post.check_for_out_of_channel_mentions.message.multiple", - "translation": "@{{.Usernames}} and @{{.LastUsername}} were mentioned but they are not in the channel. Would you like to {{.Phrase}}? They will have access to all message history." + "translation": "@{{.Usernames}} et @{{.LastUsername}} ont été mentionnés, mais ils ne sont pas dans ce canal. Voulez-vous les {{.Phrase}} ? Ils auront alors accès à tout l'historique de messages pour ce canal." }, { "id": "api.post.check_for_out_of_channel_mentions.message.one", - "translation": "@{{.Username}} was mentioned but they are not in the channel. Would you like to {{.Phrase}}? They will have access to all message history." + "translation": "@{{.Username}} a été mentionné mais il n'est pas dans ce canal. Voulez-vous l'{{.Phrase}} ? Il aura alors accès à tout l'historique de messages pour ce canal." }, { "id": "api.post.create_post.attach_files.error", @@ -1666,7 +1666,7 @@ }, { "id": "api.post.get_message_for_notification.get_files.error", - "translation": "Une erreur s'est produite lors de la récupération des fichiers pour la notification de nouveau message, post_id=%v, err=%v" + "translation": "Une erreur s'est produite lors de la récupération des fichiers pour la notification de nouveaux messages, post_id=%v, err=%v" }, { "id": "api.post.get_message_for_notification.images_sent", @@ -1701,7 +1701,7 @@ }, { "id": "api.post.link_preview_disabled.app_error", - "translation": "Les prévisualisations de liens ont été désactivées par l'administrateur système." + "translation": "Les aperçus de liens ont été désactivées par l'administrateur système." }, { "id": "api.post.make_direct_channel_visible.get_2_members.error", @@ -1733,7 +1733,7 @@ }, { "id": "api.post.send_notifications_and_forget.files.error", - "translation": "Impossible de récupérer les fichiers pour la notification de nouveau message post_id=%v, err=%v" + "translation": "Impossible de récupérer les fichiers pour la notification de nouveaux messages post_id=%v, err=%v" }, { "id": "api.post.send_notifications_and_forget.get_teams.error", @@ -1741,7 +1741,7 @@ }, { "id": "api.post.send_notifications_and_forget.mention_subject", - "translation": "Nouvelle Mention" + "translation": "Nouvelle mention" }, { "id": "api.post.send_notifications_and_forget.push_image_only", @@ -1749,7 +1749,7 @@ }, { "id": "api.post.send_notifications_and_forget.push_image_only_dm", - "translation": " A envoyé un ou plusieurs fichiers dans un message privé" + "translation": " A envoyé un ou plusieurs fichiers dans un message personnel" }, { "id": "api.post.send_notifications_and_forget.push_in", @@ -1765,7 +1765,7 @@ }, { "id": "api.post.send_notifications_and_forget.push_message", - "translation": " vous a envoyé un message privé" + "translation": " vous a envoyé un message personnel" }, { "id": "api.post.send_notifications_and_forget.push_non_mention", @@ -2105,7 +2105,7 @@ }, { "id": "api.status.save_status.error", - "translation": "Echec de la mise-à-jour de LastPingAt pour user_id=%v, err=%v" + "translation": "Échec de l'enregistrement du statut pour user_id=%v, err=%v" }, { "id": "api.status.user_not_found.app_error", @@ -2165,7 +2165,7 @@ }, { "id": "api.team.import_team.no_import_from.app_error", - "translation": "Requête malformée : le champ de taille de fichier n'est pas présent." + "translation": "Requête malformée : le champ importFrom n'est pas présent." }, { "id": "api.team.import_team.open.app_error", @@ -2417,7 +2417,7 @@ }, { "id": "api.templates.upgrade_30_body.info", - "translation": "

VOS COMPTES DUPLIQUES ONT ETE MIS A NIVEAU

Votre serveur Mattermost a été mis à niveau vers la version 3.0, qui vous permet d'utiliser un seul compte pour plusieurs équipes.

Vous recevez cet e-mail parce que le processus de mise à niveau a détecté que votre compte utilisait la même adresse e-mail ou le même nom d'utilisateur que d'autres comptes présents sur le serveur.

Les mises à niveau suivantes ont été effectuées :

{{if .EmailChanged }}- Une adresse e-mail dupliquée d'un compte de l'équipe `/{{.TeamName}}` a été changé en `{{.Email}}`. Vous devrez utiliser cette nouvelle adresse e-mail la prochaine fois que vous vous connecterez à l'aide de votre adresse e-mail et mot de passe.

{{end}}{{if .UsernameChanged }}- Un nom d'utilisateur en doublon d'un compte de l'équipe `/{{.TeamName}}` a été changé en `{{.Username}}` pour éviter toute confusion avec d'autres comptes.

{{end}} ACTION RECOMMANDÉE :

Il est nécessaire que vous vous connectiez aux équipes qui utilisent vos comptes dupliqués de façon à ajouter votre compte principal à cette équipe et ainsi pouvoir continuer à utiliser vos groupes publics et privés.

De cette façon, votre compte principal aura accès à l'entièreté de l'historique des canaux publics et privés. Vous pouvez continuer à utiliser l'historique des messages privés en utilisant vos comptes dupliqués en vous connectant à l'aide de leurs paramètres d'authentification.

POUR PLUS D'INFORMATION:

Pour plus d'information sur la mise à niveau vers Mattermost 3.0, veuillez vous référer à : http://www.mattermost.org/upgrading-to-mattermost-3-0/

" + "translation": "

VOS COMPTES DUPLIQUES ONT ETE MIS A NIVEAU

Votre serveur Mattermost a été mis à niveau vers la version 3.0, qui vous permet d'utiliser un seul compte pour plusieurs équipes.

Vous recevez cet e-mail parce que le processus de mise à niveau a détecté que votre compte utilisait la même adresse e-mail ou le même nom d'utilisateur que d'autres comptes présents sur le serveur.

Les mises à niveau suivantes ont été effectuées :

{{if .EmailChanged }}- Une adresse e-mail dupliquée d'un compte de l'équipe `/{{.TeamName}}` a été changé en `{{.Email}}`. Vous devrez utiliser cette nouvelle adresse e-mail la prochaine fois que vous vous connecterez à l'aide de votre adresse e-mail et mot de passe.

{{end}}{{if .UsernameChanged }}- Un nom d'utilisateur en doublon d'un compte de l'équipe `/{{.TeamName}}` a été changé en `{{.Username}}` pour éviter toute confusion avec d'autres comptes.

{{end}} ACTION RECOMMANDÉE :

Il est nécessaire que vous vous connectiez aux équipes qui utilisent vos comptes dupliqués de façon à ajouter votre compte principal à cette équipe et ainsi pouvoir continuer à utiliser vos groupes publics et privés.

De cette façon, votre compte principal aura accès à l'entièreté de l'historique des canaux publics et privés. Vous pouvez continuer à utiliser l'historique des messages personnels en utilisant vos comptes dupliqués en vous connectant à l'aide de leurs paramètres d'authentification.

POUR PLUS D'INFORMATION:

Pour plus d'information sur la mise à niveau vers Mattermost 3.0, veuillez vous référer à : http://www.mattermost.org/upgrading-to-mattermost-3-0/

" }, { "id": "api.templates.upgrade_30_subject.info", @@ -2497,7 +2497,7 @@ }, { "id": "api.user.add_direct_channels_and_forget.failed.error", - "translation": "Impossible de spécifier les préférences du canal de messages directs pour l'utilisateur user_id={{.UserId}}, team_id={{.TeamId}}, err={{.Error}}" + "translation": "Impossible de spécifier les préférences du canal de messages personnels pour l'utilisateur user_id={{.UserId}}, team_id={{.TeamId}}, err={{.Error}}" }, { "id": "api.user.authorize_oauth_user.bad_response.app_error", @@ -2805,7 +2805,7 @@ }, { "id": "api.user.update_active.no_deactivate_sso.app_error", - "translation": "Vous ne pouvez pas modifier le statut actif des comptes AD/LDAP. Veuillez désactiver ce compte dans votre serveur AD/LDAP." + "translation": "Vous ne pouvez pas modifier le statut d'activation des comptes utilisant l'authentification unique (SSO). Veuillez modifier ce compte dans votre serveur d'authentification unique (SSO)." }, { "id": "api.user.update_active.permissions.app_error", @@ -3105,7 +3105,7 @@ }, { "id": "app.import.import_direct_post.create_direct_channel.error", - "translation": "Impossible de récupérer le canal de messages directs" + "translation": "Impossible de récupérer le canal de messages personnels" }, { "id": "app.import.import_direct_post.create_group_channel.error", @@ -3257,7 +3257,7 @@ }, { "id": "app.import.validate_direct_post_import_data.message_missing.error", - "translation": "La propriété requise pour un message privé est manquante: message" + "translation": "La propriété requise pour un message personnel est manquante: message" }, { "id": "app.import.validate_direct_post_import_data.unknown_flagger.error", @@ -3453,11 +3453,11 @@ }, { "id": "app.notification.body.intro.direct.full", - "translation": "Vous avez un nouveau message privé." + "translation": "Vous avez un nouveau message personnel." }, { "id": "app.notification.body.intro.direct.generic", - "translation": "Vous avez un nouveau message privé de {{.SenderName}}" + "translation": "Vous avez un nouveau message personnel de {{.SenderName}}" }, { "id": "app.notification.body.intro.notification.full", @@ -3485,7 +3485,7 @@ }, { "id": "app.notification.subject.direct.full", - "translation": "[{{.SiteName}}] Nouveau message privé de {{.SenderDisplayName}} du {{.Day}}/{{.Month}}/{{.Year}}" + "translation": "[{{.SiteName}}] Nouveau message personnel de {{.SenderDisplayName}} du {{.Day}}/{{.Month}}/{{.Year}}" }, { "id": "app.notification.subject.notification.full", @@ -3497,7 +3497,7 @@ }, { "id": "app.plugin.config.app_error", - "translation": "Error saving plugin state in config" + "translation": "Une erreur s'est produite lors de la sauvegarde de l'état du plugin dans la configuration" }, { "id": "app.plugin.deactivate.app_error", @@ -3505,7 +3505,7 @@ }, { "id": "app.plugin.disabled.app_error", - "translation": "Plugins have been disabled." + "translation": "Les plugins ont été désactivés." }, { "id": "app.plugin.extract.app_error", @@ -3533,7 +3533,7 @@ }, { "id": "app.plugin.not_installed.app_error", - "translation": "Plugin is not installed" + "translation": "Le plugin n'est pas installé" }, { "id": "app.plugin.remove.app_error", @@ -3541,7 +3541,7 @@ }, { "id": "app.plugin.upload_disabled.app_error", - "translation": "Plugins and/or plugin uploads have been disabled." + "translation": "Les plugins et/ou l'envoi de plugins ont été désactivés." }, { "id": "app.user_access_token.disabled", @@ -3829,7 +3829,7 @@ }, { "id": "ent.elasticsearch.indexer.do_job.get_oldest_post.error", - "translation": "The oldest post could not be retrieved from the database." + "translation": "Impossible de récupérer le message le plus ancien de la base de données." }, { "id": "ent.elasticsearch.indexer.do_job.parse_end_time.error", @@ -3861,7 +3861,7 @@ }, { "id": "ent.elasticsearch.start.create_bulk_processor_failed.app_error", - "translation": "Failed to create Elasticsearch bulk processor" + "translation": "Impossible de créer le processeur d'opérations en masse d'Elasticsearch (Elasticsearch bulk processor)" }, { "id": "ent.elasticsearch.start.index_settings_failed", @@ -3869,7 +3869,7 @@ }, { "id": "ent.elasticsearch.start.start_bulk_processor_failed.app_error", - "translation": "Failed to start Elasticsearch bulk processor" + "translation": "Impossible de démarrer le processeur d'opérations en masse d'Elasticsearch (Elasticsearch bulk processor)" }, { "id": "ent.elasticsearch.test_config.connect_failed", @@ -4089,7 +4089,7 @@ }, { "id": "jobs.set_job_error.update.error", - "translation": "Impossible de définir l'état de la tâche sur erreur" + "translation": "Impossible de définir le statut de la tâche sur erreur" }, { "id": "manaultesting.get_channel_id.no_found.debug", @@ -4485,7 +4485,7 @@ }, { "id": "model.config.is_valid.elastic_search.bulk_indexing_time_window_seconds.app_error", - "translation": "Elasticsearch Bulk Indexing Time Window must be at least 1 second." + "translation": "La fenêtre de temps de l'indexation en masse d'Elasticsearch (Elasticsearch Bulk Indexing Time Window) doit être au moins d'une seconde" }, { "id": "model.config.is_valid.elastic_search.connection_url.app_error", @@ -4497,7 +4497,7 @@ }, { "id": "model.config.is_valid.elastic_search.live_indexing_batch_size.app_error", - "translation": "Elasticsearch Live Indexing Batch Size must be at least 1" + "translation": "La taille du lot d'index en direct d'Elasticsearch (Elasticsearch Live Indexing Batch Size) doit être au moins de 1" }, { "id": "model.config.is_valid.elastic_search.password.app_error", @@ -4509,7 +4509,7 @@ }, { "id": "model.config.is_valid.elastic_search.request_timeout_seconds.app_error", - "translation": "Elasticsearch Request Timeout must be at least 1 second." + "translation": "Le délai d'expiration de la requête d'Elasticsearch (Elasticsearch Request Timeout) doit être au moins d'une seconde." }, { "id": "model.config.is_valid.elastic_search.username.app_error", @@ -4685,7 +4685,7 @@ }, { "id": "model.config.is_valid.restrict_direct_message.app_error", - "translation": "La restriction du message direct est invalide. Doit être 'tout', ou 'équipe'" + "translation": "La restriction du message personnel est invalide. Doit être 'tout', ou 'équipe'" }, { "id": "model.config.is_valid.saml_assertion_consumer_service_url.app_error", @@ -4861,7 +4861,7 @@ }, { "id": "model.job.is_valid.status.app_error", - "translation": "État de tâche invalide" + "translation": "Statut de tâche invalide" }, { "id": "model.job.is_valid.type.app_error", @@ -5793,7 +5793,7 @@ }, { "id": "store.sql_job.get_count_by_status_and_type.app_erro", - "translation": "Impossible de récupérere le nombre de job par statut et par type" + "translation": "Impossible de récupérer le nombre de job par statut et par type" }, { "id": "store.sql_job.get_newest_job_by_status_and_type.app_error", @@ -6193,23 +6193,23 @@ }, { "id": "store.sql_status.get.app_error", - "translation": "Erreur lors de la récupération de l'état" + "translation": "Erreur lors de la récupération du statut" }, { "id": "store.sql_status.get.missing.app_error", - "translation": "Aucune entrée pour cet état." + "translation": "Aucune entrée pour ce statut." }, { "id": "store.sql_status.get_online.app_error", - "translation": "Erreur lors de la récupération de tous les états en-ligne" + "translation": "Erreur lors de la récupération de tous les statuts en-ligne" }, { "id": "store.sql_status.get_online_away.app_error", - "translation": "Une erreur s'est produite lors de l'enregistrement de tous les états en ligne/absent" + "translation": "Une erreur s'est produite lors de l'enregistrement de tous les statuts en ligne/absent" }, { "id": "store.sql_status.get_team_statuses.app_error", - "translation": "Une erreur s'est produite lors de la récupération de tous les états des membres de l'équipe" + "translation": "Une erreur s'est produite lors de la récupération de tous les statuts des membres de l'équipe" }, { "id": "store.sql_status.get_total_active_users_count.app_error", @@ -6217,15 +6217,15 @@ }, { "id": "store.sql_status.reset_all.app_error", - "translation": "Une erreur s'est produite lors de la réinitialisation de tous les états" + "translation": "Une erreur s'est produite lors de la réinitialisation de tous les statuts" }, { "id": "store.sql_status.save.app_error", - "translation": "Une erreur s'est produite lors de l'enregistrement de l'état" + "translation": "Une erreur s'est produite lors de l'enregistrement du statut" }, { "id": "store.sql_status.update.app_error", - "translation": "Une erreur s'est produite lors de la mise à jour de l'état" + "translation": "Une erreur s'est produite lors de la mise à jour du statut" }, { "id": "store.sql_system.get.app_error", @@ -6537,7 +6537,7 @@ }, { "id": "store.sql_user.update_mfa_active.app_error", - "translation": "Une erreur s'est produite lors de la mise à jour de l'état ​​actif MFA de l'utilisateur" + "translation": "Une erreur s'est produite lors de la mise à jour du statut ​​actif MFA de l'utilisateur" }, { "id": "store.sql_user.update_mfa_secret.app_error", @@ -6933,7 +6933,7 @@ }, { "id": "web.incoming_webhook.split_props_length.app_error", - "translation": "Unable to split webhook props into {{.Max}} character parts." + "translation": "Impossible de scinder les propriétés de webhook en {{.Max}} parties de caractères." }, { "id": "web.incoming_webhook.text.app_error", @@ -7037,7 +7037,7 @@ }, { "id": "wsapi.status.init.debug", - "translation": "Initialisation des routes de l'API des états" + "translation": "Initialisation des routes de l'API des statuts" }, { "id": "wsapi.system.init.debug", diff --git a/i18n/it.json b/i18n/it.json index 126bc26ae..e5377bf0a 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -4985,7 +4985,7 @@ }, { "id": "model.post.is_valid.msg.app_error", - "translation": "Messagio invalido" + "translation": "Messaggio invalido" }, { "id": "model.post.is_valid.original_id.app_error", diff --git a/i18n/ja.json b/i18n/ja.json index 875e57842..190e5f886 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -2805,7 +2805,7 @@ }, { "id": "api.user.update_active.no_deactivate_sso.app_error", - "translation": "SSOアカウントのアクティベーション状態を変更することはできません。SSOサーバーを通じて変更してください。" + "translation": "シングルサインオンアカウントのアクティベーション状態を変更することはできません。シングルサインオンサーバーを通じて変更してください。" }, { "id": "api.user.update_active.permissions.app_error", @@ -4705,7 +4705,7 @@ }, { "id": "model.config.is_valid.saml_idp_url.app_error", - "translation": "SAML SSOのURLを正しく設定してください。URLはhttp://またはhttps://で始まります。" + "translation": "SAMLシングルサインオンのURLを正しく設定してください。URLはhttp://またはhttps://で始まります。" }, { "id": "model.config.is_valid.saml_private_key.app_error", diff --git a/i18n/pt-BR.json b/i18n/pt-BR.json index 5a8276e52..f29903181 100644 --- a/i18n/pt-BR.json +++ b/i18n/pt-BR.json @@ -2165,7 +2165,7 @@ }, { "id": "api.team.import_team.no_import_from.app_error", - "translation": "Requisição mal formada: campo filesize não está presente." + "translation": "Requisição mal formada: campo importFrom não está presente." }, { "id": "api.team.import_team.open.app_error", diff --git a/i18n/ru.json b/i18n/ru.json index 28862571f..1bf03bf0d 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -297,7 +297,7 @@ }, { "id": "api.channel.join_channel.post_and_forget", - "translation": "%v присоединился к каналу." + "translation": "%v присоединился(ась) к каналу." }, { "id": "api.channel.leave.default.app_error", @@ -6901,7 +6901,7 @@ }, { "id": "web.error.unsupported_browser.title", - "translation": "Unsupported Browser" + "translation": "Неподдерживаемый Браузер" }, { "id": "web.find_team.title", diff --git a/i18n/tr.json b/i18n/tr.json index bcc6a0c19..52841f7e4 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -69,7 +69,7 @@ }, { "id": "api.admin.get_brand_image.storage.app_error", - "translation": "Görsel deposu yapılandırılmamış." + "translation": "Görsel deposu ayarları yapılmamış." }, { "id": "api.admin.init.debug", @@ -125,7 +125,7 @@ }, { "id": "api.admin.upload_brand_image.storage.app_error", - "translation": "Görsel yüklenemedi. Görsel deposu ayarlanmamış." + "translation": "Görsel yüklenemedi. Görsel deposu ayarları yapılmamış." }, { "id": "api.admin.upload_brand_image.too_large.app_error", @@ -1131,7 +1131,7 @@ }, { "id": "api.emoji.storage.app_error", - "translation": "Dosya depolaması doğru şekilde ayarlanmamış. Lütfen dosya depolaması için bir S3 ya da yerel sunucusu ayarlayın." + "translation": "Dosya depolama ayarları doğru şekilde yapılmamış. Lütfen dosya depolaması için bir S3 ya da yerel sunucusu ayarlayın." }, { "id": "api.emoji.upload.image.app_error", @@ -1279,7 +1279,7 @@ }, { "id": "api.file.move_file.configured.app_error", - "translation": "Dosya depolaması doğru şekilde ayarlanmamış. Lütfen dosya depolaması için bir S3 ya da yerel sunucusu ayarlayın." + "translation": "Dosya depolaması ayarları doğru şekilde yapılmamış. Lütfen dosya depolaması için bir S3 ya da yerel sunucusu ayarlayın." }, { "id": "api.file.move_file.delete_from_s3.app_error", @@ -1295,7 +1295,7 @@ }, { "id": "api.file.read_file.configured.app_error", - "translation": "Dosya depolaması doğru şekilde ayarlanmamış. Lütfen dosya depolaması için bir S3 ya da yerel sunucusu ayarlayın." + "translation": "Dosya depolama ayarları doğru şekilde yapılmamış. Lütfen dosya depolaması için bir S3 ya da yerel sunucusu ayarlayın." }, { "id": "api.file.read_file.get.app_error", @@ -1315,7 +1315,7 @@ }, { "id": "api.file.upload_file.storage.app_error", - "translation": "Dosya yüklenemedi. Görsel deposu ayarlanmamış." + "translation": "Dosya yüklenemedi. Görsel deposu ayarları yapılmamış." }, { "id": "api.file.upload_file.too_large.app_error", @@ -1323,7 +1323,7 @@ }, { "id": "api.file.write_file.configured.app_error", - "translation": "Dosya depolaması doğru şekilde ayarlanmamış. Lütfen dosya depolaması için bir S3 ya da yerel sunucusu ayarlayın." + "translation": "Dosya depolaması ayarları doğru şekilde yapılmamış. Lütfen dosya depolaması için bir S3 ya da yerel sunucusu ayarlayın." }, { "id": "api.file.write_file.s3.app_error", @@ -1881,7 +1881,7 @@ }, { "id": "api.server.start_server.rate.warn", - "translation": "Hız Sınırlama Ayarları VaryByHeader kullanılarak ve VaryByRemoteAddr devre dışı bırakılarak doğru şekilde ayarlanamamış" + "translation": "Hız Sınırlama Ayarları VaryByHeader kullanılarak ve VaryByRemoteAddr devre dışı bırakılarak doğru şekilde yapılmamış" }, { "id": "api.server.start_server.rate_limiting_memory_store", @@ -2893,7 +2893,7 @@ }, { "id": "api.user.upload_profile_user.storage.app_error", - "translation": "Dosya yüklenemedi. Görsel deposu ayarlanmamış." + "translation": "Dosya yüklenemedi. Görsel deposu ayarları yapılmamış." }, { "id": "api.user.upload_profile_user.too_large.app_error", @@ -4029,7 +4029,7 @@ }, { "id": "ent.saml.configure.app_error", - "translation": "SAML Hizmet Sağlayıcısı yapılandırılırken bir sorun çıktı. Hata: %v" + "translation": "SAML Hizmet Sağlayıcısı ayarları yapılırken bir sorun çıktı. Hata: %v" }, { "id": "ent.saml.configure.encryption_not_enabled.app_error", @@ -4129,7 +4129,7 @@ }, { "id": "mattermost.config_file", - "translation": "%v üzerinden yüklenen yapılandırma dosyası" + "translation": "%v üzerinden yüklenen ayar dosyası" }, { "id": "mattermost.current_version", @@ -6657,23 +6657,23 @@ }, { "id": "utils.config.add_client_locale.app_error", - "translation": "Mattermost yapılandırma dosyası yüklenemedi: Kullanılabilecek Yerel ayarlara VarsayılanİstemciYereli ekleniyor." + "translation": "Mattermost ayar dosyası yüklenemedi: Kullanılabilecek Yerel ayarlara VarsayılanİstemciYereli ekleniyor." }, { "id": "utils.config.load_config.decoding.panic", - "translation": "Yapılandırma dosyasının kodu çözülürken sorun çıktı. Dosya: {{.Filename}}, Hata: {{.Error}}" + "translation": "Ayar dosyasının kodu çözülürken sorun çıktı. Dosya: {{.Filename}}, Hata: {{.Error}}" }, { "id": "utils.config.load_config.getting.panic", - "translation": "Yapılandırma bilgileri dosyası alınırken sorun çıktı. Dosya: {{.Filename}}, Hata: {{.Error}}" + "translation": "Ayar bilgileri dosyası alınırken sorun çıktı. Dosya: {{.Filename}}, Hata: {{.Error}}" }, { "id": "utils.config.load_config.opening.panic", - "translation": "Yapılandırma dosyası açılırken sorun çıktı. Dosya: {{.Filename}}, Hata: {{.Error}}" + "translation": "Ayar dosyası açılırken sorun çıktı. Dosya: {{.Filename}}, Hata: {{.Error}}" }, { "id": "utils.config.load_config.validating.panic", - "translation": "Yapılandırma dosyası doğrulanırken sorun çıktı. Dosya: {{.Filename}}, Hata: {{.Error}}" + "translation": "Ayar dosyası doğrulanırken sorun çıktı. Dosya: {{.Filename}}, Hata: {{.Error}}" }, { "id": "utils.config.save_config.saving.app_error", @@ -6681,19 +6681,19 @@ }, { "id": "utils.config.supported_available_locales.app_error", - "translation": "Mattermost yapılandırma dosyası yüklenemedi: Kullanılabilecek Yerel ayarlarda VarsayılanİstemciYereli bulunmalıdır. Tüm yerel ayarlar için varsayılan değer olarak Kullanılabilecek Yerel Ayarlar ayarlanıyor." + "translation": "Mattermost ayar dosyası yüklenemedi: Kullanılabilecek Yerel ayarlarda VarsayılanİstemciYereli bulunmalıdır. Tüm yerel ayarlar için varsayılan değer olarak Kullanılabilecek Yerel Ayarlar ayarlanıyor." }, { "id": "utils.config.supported_client_locale.app_error", - "translation": "Mattermost yapılandırma dosyası yüklenemedi: VarsayılanİstemciYereli desteklenen yerel ayarlardan biri olmalıdır. VarsayılanİstemciYereli varsayılan değer olarak en değerine ayarlanıyor." + "translation": "Mattermost ayar dosyası yüklenemedi: VarsayılanİstemciYereli desteklenen yerel ayarlardan biri olmalıdır. VarsayılanİstemciYereli varsayılan değer olarak en değerine ayarlanıyor." }, { "id": "utils.config.supported_server_locale.app_error", - "translation": "Mattermost yapılandırma dosyası yüklenemedi: DefaultServerLocale desteklenen yerel seçeneklerinden birine ayarlanmalıdır. DefaultServerLocale varsayılan olarak en değerine ayarlanıyor." + "translation": "Mattermost ayar dosyası yüklenemedi: DefaultServerLocale desteklenen yerel seçeneklerinden birine ayarlanmalıdır. DefaultServerLocale varsayılan olarak en değerine ayarlanıyor." }, { "id": "utils.config.validate_locale.app_error", - "translation": "Mattermost yapılandırma dosyası yüklenemedi: AvailableLocales seçeneğinde DefaultClientLocale bulunmalıdır" + "translation": "Mattermost ayar dosyası yüklenemedi: AvailableLocales seçeneğinde DefaultClientLocale bulunmalıdır" }, { "id": "utils.diagnostic.analytics_not_found.app_error", @@ -6701,7 +6701,7 @@ }, { "id": "utils.file.list_directory.configured.app_error", - "translation": "Dosya depolaması doğru şekilde yapılandırılmamış. Lütfen dosya depolaması için bir S3 ya da yerel sunucu yapılandırın." + "translation": "Dosya depolama ayarları doğru şekilde yapılmamış. Lütfen dosya depolaması için bir S3 ya da yerel sunucu ayarlayın." }, { "id": "utils.file.list_directory.local.app_error", @@ -6713,7 +6713,7 @@ }, { "id": "utils.file.remove_directory.configured.app_error", - "translation": "Dosya depolaması doğru şekilde yapılandırılmamış. Lütfen S3 ya da yerel sunucusu depolamasını yapılandırın." + "translation": "Dosya depolama ayarları doğru şekilde yapılmamış. Lütfen S3 ya da yerel sunucusu depolama ayarlarını yapın." }, { "id": "utils.file.remove_directory.local.app_error", @@ -6725,7 +6725,7 @@ }, { "id": "utils.file.remove_file.configured.app_error", - "translation": "Dosya depolaması doğru şekilde yapılandırılmamış. Lütfen S3 ya da yerel sunucu depolamasını yapılandırın." + "translation": "Dosya depolama ayarları doğru şekilde yapılmamış. Lütfen S3 ya da yerel sunucu depolama ayarlarını yapın." }, { "id": "utils.file.remove_file.local.app_error", @@ -6817,11 +6817,11 @@ }, { "id": "utils.mail.test.configured.error", - "translation": "SMTP sunucu ayarları doğru yapılmamış görünüyor. Hata: %v, Ayrıntılar: %v" + "translation": "SMTP sunucu ayarları doğru şekilde yapılmamış görünüyor. Hata: %v, Ayrıntılar: %v" }, { "id": "utils.mail.test.configured.error", - "translation": "SMTP sunucu ayarları doğru yapılmamış görünüyor. Hata: %v, Ayrıntılar: %v" + "translation": "SMTP sunucu ayarları doğru şekilde yapılmamış görünüyor. Hata: %v, Ayrıntılar: %v" }, { "id": "web.admin_console.title", diff --git a/i18n/zh-CN.json b/i18n/zh-CN.json index f8e65303e..6e71a218f 100644 --- a/i18n/zh-CN.json +++ b/i18n/zh-CN.json @@ -2165,7 +2165,7 @@ }, { "id": "api.team.import_team.no_import_from.app_error", - "translation": "错误请求:缺少 filesize 字段。" + "translation": "错误请求:缺少 importFrom 字段。" }, { "id": "api.team.import_team.open.app_error", @@ -4485,7 +4485,7 @@ }, { "id": "model.config.is_valid.elastic_search.bulk_indexing_time_window_seconds.app_error", - "translation": "Elasticsearch Bulk Indexing Time Window must be at least 1 second." + "translation": "Elasticsearch 批量索引时间段必须至少 1 秒。" }, { "id": "model.config.is_valid.elastic_search.connection_url.app_error", @@ -4497,7 +4497,7 @@ }, { "id": "model.config.is_valid.elastic_search.live_indexing_batch_size.app_error", - "translation": "Elasticsearch Live Indexing Batch Size must be at least 1" + "translation": "Elasticsearch 即时索引批量大小必须至少为 1" }, { "id": "model.config.is_valid.elastic_search.password.app_error", @@ -4509,7 +4509,7 @@ }, { "id": "model.config.is_valid.elastic_search.request_timeout_seconds.app_error", - "translation": "Elasticsearch Request Timeout must be at least 1 second." + "translation": "Elasticsearch 请求超时必须至少 1 秒。" }, { "id": "model.config.is_valid.elastic_search.username.app_error", @@ -6933,7 +6933,7 @@ }, { "id": "web.incoming_webhook.split_props_length.app_error", - "translation": "Unable to split webhook props into {{.Max}} character parts." + "translation": "无法拆分 webhook 属性信息到 {{.Max}} 字符块。" }, { "id": "web.incoming_webhook.text.app_error", diff --git a/i18n/zh-TW.json b/i18n/zh-TW.json index c293cc1c9..96008a46f 100644 --- a/i18n/zh-TW.json +++ b/i18n/zh-TW.json @@ -637,23 +637,23 @@ }, { "id": "api.command_dnd.desc", - "translation": "Do not disturb disables desktop and mobile push notifications." + "translation": "請勿打擾會停止桌面以及行動推播通知。" }, { "id": "api.command_dnd.disabled", - "translation": "Do Not Disturb is disabled." + "translation": "請勿打擾已被停用。" }, { "id": "api.command_dnd.error", - "translation": "Error to retrieve the user status." + "translation": "取得使用者狀態時錯誤。" }, { "id": "api.command_dnd.name", - "translation": "dnd" + "translation": "請勿打擾" }, { "id": "api.command_dnd.success", - "translation": "Do Not Disturb is enabled. You will not receive desktop or mobile push notifications until Do Not Disturb is turned off." + "translation": "請勿打擾已啟用。在停用前您將不會收到桌面以及行動推播通知。" }, { "id": "api.command_echo.create.app_error", @@ -737,7 +737,7 @@ }, { "id": "api.command_kick.name", - "translation": "kick" + "translation": "踢出" }, { "id": "api.command_leave.desc", @@ -849,11 +849,11 @@ }, { "id": "api.command_remove.desc", - "translation": "Remove a member from the channel" + "translation": "將成員從頻道中移除" }, { "id": "api.command_remove.direct_group.app_error", - "translation": "You can't remove someone from a direct message channel." + "translation": "無法將成員從直接通訊頻道中移除。" }, { "id": "api.command_remove.hint", @@ -861,7 +861,7 @@ }, { "id": "api.command_remove.message.app_error", - "translation": "使用 /rename 命令必須提供訊息。" + "translation": "使用 /remove 或 /kick 命令必須提供訊息。" }, { "id": "api.command_remove.missing.app_error", @@ -869,15 +869,15 @@ }, { "id": "api.command_remove.name", - "translation": "remove" + "translation": "移除" }, { "id": "api.command_remove.permission.app_error", - "translation": "權限不足以更改頻道名稱。" + "translation": "權限不足以移除成員。" }, { "id": "api.command_remove.user_not_in_channel", - "translation": "{{.Username}} is not a member of this channel." + "translation": "{{.Username}}不是此頻道的成員。" }, { "id": "api.command_search.desc", @@ -1575,19 +1575,19 @@ }, { "id": "api.post.check_for_out_of_channel_mentions.link.private", - "translation": "add them to this private channel" + "translation": "將他們加入此私人頻道" }, { "id": "api.post.check_for_out_of_channel_mentions.link.public", - "translation": "add them to the channel" + "translation": "將他們加入頻道" }, { "id": "api.post.check_for_out_of_channel_mentions.message.multiple", - "translation": "@{{.Usernames}} and @{{.LastUsername}} were mentioned but they are not in the channel. Would you like to {{.Phrase}}? They will have access to all message history." + "translation": "提到了 @{{.Usernames}} 跟 @{{.LastUsername}} 但他們不在此頻道。要{{.Phrase}}?他們將能看到全部的訊息紀錄。" }, { "id": "api.post.check_for_out_of_channel_mentions.message.one", - "translation": "@{{.Username}} was mentioned but they are not in the channel. Would you like to {{.Phrase}}? They will have access to all message history." + "translation": "提到了 @{{.Username}} 但他們不在此頻道。要{{.Phrase}}?他們將能看到全部的訊息紀錄。" }, { "id": "api.post.create_post.attach_files.error", @@ -2165,7 +2165,7 @@ }, { "id": "api.team.import_team.no_import_from.app_error", - "translation": "要求格式錯誤:沒有檔案大小欄位。" + "translation": "要求格式錯誤:沒有 importFrom 欄位。" }, { "id": "api.team.import_team.open.app_error", @@ -2805,7 +2805,7 @@ }, { "id": "api.user.update_active.no_deactivate_sso.app_error", - "translation": "不能變更 AD/LDAP 帳號的啟用狀態。請變更 AD/LDAP 伺服器上對應的帳號狀態。" + "translation": "不能變更 SSO 帳號的啟用狀態。請透過 SSO 伺服器變更。" }, { "id": "api.user.update_active.permissions.app_error", @@ -3497,7 +3497,7 @@ }, { "id": "app.plugin.config.app_error", - "translation": "Error saving plugin state in config" + "translation": "儲存模組狀態於設定時錯誤" }, { "id": "app.plugin.deactivate.app_error", @@ -3505,7 +3505,7 @@ }, { "id": "app.plugin.disabled.app_error", - "translation": "Plugins have been disabled." + "translation": "模組已被停用。" }, { "id": "app.plugin.extract.app_error", @@ -3533,7 +3533,7 @@ }, { "id": "app.plugin.not_installed.app_error", - "translation": "Plugin is not installed" + "translation": "模組尚未安裝" }, { "id": "app.plugin.remove.app_error", @@ -3541,7 +3541,7 @@ }, { "id": "app.plugin.upload_disabled.app_error", - "translation": "Plugins and/or plugin uploads have been disabled." + "translation": "模組 跟/或 上傳模組已被停用。" }, { "id": "app.user_access_token.disabled", @@ -3829,7 +3829,7 @@ }, { "id": "ent.elasticsearch.indexer.do_job.get_oldest_post.error", - "translation": "The oldest post could not be retrieved from the database." + "translation": "無法從資料庫取得最老的訊息。" }, { "id": "ent.elasticsearch.indexer.do_job.parse_end_time.error", @@ -3861,7 +3861,7 @@ }, { "id": "ent.elasticsearch.start.create_bulk_processor_failed.app_error", - "translation": "Failed to create Elasticsearch bulk processor" + "translation": "建立 Elasticsearch 批次處理器時失敗" }, { "id": "ent.elasticsearch.start.index_settings_failed", @@ -3869,7 +3869,7 @@ }, { "id": "ent.elasticsearch.start.start_bulk_processor_failed.app_error", - "translation": "Failed to start Elasticsearch bulk processor" + "translation": "啟動 Elasticsearch 批次處理器時失敗" }, { "id": "ent.elasticsearch.test_config.connect_failed", @@ -4485,7 +4485,7 @@ }, { "id": "model.config.is_valid.elastic_search.bulk_indexing_time_window_seconds.app_error", - "translation": "Elasticsearch Bulk Indexing Time Window must be at least 1 second." + "translation": "Elasticsearch 批次索引的時間範圍必須至少為 1 秒。" }, { "id": "model.config.is_valid.elastic_search.connection_url.app_error", @@ -4497,7 +4497,7 @@ }, { "id": "model.config.is_valid.elastic_search.live_indexing_batch_size.app_error", - "translation": "Elasticsearch Live Indexing Batch Size must be at least 1" + "translation": "Elasticsearch 即時索引的批次大小必須至少為 1 。" }, { "id": "model.config.is_valid.elastic_search.password.app_error", @@ -4509,7 +4509,7 @@ }, { "id": "model.config.is_valid.elastic_search.request_timeout_seconds.app_error", - "translation": "Elasticsearch Request Timeout must be at least 1 second." + "translation": "Elasticsearch 回應逾期的時間必須至少為 1 秒。" }, { "id": "model.config.is_valid.elastic_search.username.app_error", @@ -6933,7 +6933,7 @@ }, { "id": "web.incoming_webhook.split_props_length.app_error", - "translation": "Unable to split webhook props into {{.Max}} character parts." + "translation": "無法拆分 Webhook 屬性成 {{.Max}} 字元。" }, { "id": "web.incoming_webhook.text.app_error", -- cgit v1.2.3-1-g7c22