Этот коммит содержится в:
Christopher Speller
2017-11-16 08:46:16 -08:00
родитель bf6bb9bce9 a0017f1845
Коммит 9513309879
13 изменённых файлов: 319 добавлений и 164 удалений

Просмотреть файл

@@ -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) 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 { if err != nil {
return nil, model.NewAppError("UnpackAndActivatePlugin", "app.plugin.mvdir.app_error", nil, err.Error(), http.StatusInternalServerError) return nil, model.NewAppError("UnpackAndActivatePlugin", "app.plugin.mvdir.app_error", nil, err.Error(), http.StatusInternalServerError)
} }

Просмотреть файл

@@ -637,15 +637,15 @@
}, },
{ {
"id": "api.command_dnd.desc", "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", "id": "api.command_dnd.disabled",
"translation": "Do Not Disturb is disabled." "translation": "\"Nicht stören\" ist deaktiviert."
}, },
{ {
"id": "api.command_dnd.error", "id": "api.command_dnd.error",
"translation": "Error to retrieve the user status." "translation": "Fehler beim Abrufen des Benutzerstatus."
}, },
{ {
"id": "api.command_dnd.name", "id": "api.command_dnd.name",
@@ -653,7 +653,7 @@
}, },
{ {
"id": "api.command_dnd.success", "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", "id": "api.command_echo.create.app_error",
@@ -853,11 +853,11 @@
}, },
{ {
"id": "api.command_remove.direct_group.app_error", "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", "id": "api.command_remove.hint",
"translation": "@[username]" "translation": "@[Benutzername]"
}, },
{ {
"id": "api.command_remove.message.app_error", "id": "api.command_remove.message.app_error",
@@ -873,7 +873,7 @@
}, },
{ {
"id": "api.command_remove.permission.app_error", "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", "id": "api.command_remove.user_not_in_channel",
@@ -929,7 +929,7 @@
}, },
{ {
"id": "api.command_shrug.name", "id": "api.command_shrug.name",
"translation": "zucken" "translation": "achselzucken"
}, },
{ {
"id": "api.compliance.init.debug", "id": "api.compliance.init.debug",
@@ -1029,7 +1029,7 @@
}, },
{ {
"id": "api.email_batching.render_batched_post.channel.app_error", "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", "id": "api.email_batching.render_batched_post.date",
@@ -1575,19 +1575,19 @@
}, },
{ {
"id": "api.post.check_for_out_of_channel_mentions.link.private", "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", "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", "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", "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", "id": "api.post.create_post.attach_files.error",
@@ -1729,7 +1729,7 @@
}, },
{ {
"id": "api.post.send_notifications_and_forget.clear_push_notification.debug", "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", "id": "api.post.send_notifications_and_forget.files.error",
@@ -2165,7 +2165,7 @@
}, },
{ {
"id": "api.team.import_team.no_import_from.app_error", "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", "id": "api.team.import_team.open.app_error",
@@ -2805,7 +2805,7 @@
}, },
{ {
"id": "api.user.update_active.no_deactivate_sso.app_error", "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", "id": "api.user.update_active.permissions.app_error",
@@ -3497,7 +3497,7 @@
}, },
{ {
"id": "app.plugin.config.app_error", "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", "id": "app.plugin.deactivate.app_error",
@@ -3505,7 +3505,7 @@
}, },
{ {
"id": "app.plugin.disabled.app_error", "id": "app.plugin.disabled.app_error",
"translation": "Plugins have been disabled." "translation": "Plugins wurden deaktiviert."
}, },
{ {
"id": "app.plugin.extract.app_error", "id": "app.plugin.extract.app_error",
@@ -3533,7 +3533,7 @@
}, },
{ {
"id": "app.plugin.not_installed.app_error", "id": "app.plugin.not_installed.app_error",
"translation": "Plugin is not installed" "translation": "Plugin ist nicht installiert"
}, },
{ {
"id": "app.plugin.remove.app_error", "id": "app.plugin.remove.app_error",
@@ -3541,7 +3541,7 @@
}, },
{ {
"id": "app.plugin.upload_disabled.app_error", "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", "id": "app.user_access_token.disabled",
@@ -3829,7 +3829,7 @@
}, },
{ {
"id": "ent.elasticsearch.indexer.do_job.get_oldest_post.error", "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", "id": "ent.elasticsearch.indexer.do_job.parse_end_time.error",
@@ -4281,7 +4281,7 @@
}, },
{ {
"id": "model.channel_member.is_valid.push_level.app_error", "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", "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", "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", "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", "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", "id": "model.config.is_valid.elastic_search.username.app_error",
@@ -6933,7 +6933,7 @@
}, },
{ {
"id": "web.incoming_webhook.split_props_length.app_error", "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", "id": "web.incoming_webhook.text.app_error",

Просмотреть файл

@@ -3517,11 +3517,11 @@
}, },
{ {
"id": "app.plugin.get_plugins.app_error", "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", "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", "id": "app.plugin.manifest.app_error",
@@ -3541,7 +3541,7 @@
}, },
{ {
"id": "app.plugin.upload_disabled.app_error", "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", "id": "app.user_access_token.disabled",

Просмотреть файл

@@ -201,7 +201,7 @@
}, },
{ {
"id": "api.channel.create_channel.direct_channel.app_error", "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", "id": "api.channel.create_channel.invalid_character.app_error",
@@ -305,7 +305,7 @@
}, },
{ {
"id": "api.channel.leave.direct.app_error", "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", "id": "api.channel.leave.last_member.app_error",
@@ -465,7 +465,7 @@
}, },
{ {
"id": "api.command.invite_people.name", "id": "api.command.invite_people.name",
"translation": "inviter_personne" "translation": "invite_people"
}, },
{ {
"id": "api.command.invite_people.no_email", "id": "api.command.invite_people.no_email",
@@ -489,7 +489,7 @@
}, },
{ {
"id": "api.command_away.desc", "id": "api.command_away.desc",
"translation": "Définit votre état sur « Absent »." "translation": "Définit votre statut sur « Absent »."
}, },
{ {
"id": "api.command_away.name", "id": "api.command_away.name",
@@ -541,7 +541,7 @@
}, },
{ {
"id": "api.command_channel_purpose.direct_group.app_error", "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", "id": "api.command_channel_purpose.hint",
@@ -573,7 +573,7 @@
}, },
{ {
"id": "api.command_channel_rename.direct_group.app_error", "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", "id": "api.command_channel_rename.hint",
@@ -637,23 +637,23 @@
}, },
{ {
"id": "api.command_dnd.desc", "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", "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", "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", "id": "api.command_dnd.name",
"translation": "dnd" "translation": "Ne pas déranger"
}, },
{ {
"id": "api.command_dnd.success", "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", "id": "api.command_echo.create.app_error",
@@ -737,7 +737,7 @@
}, },
{ {
"id": "api.command_kick.name", "id": "api.command_kick.name",
"translation": "kick" "translation": "Éjecter"
}, },
{ {
"id": "api.command_leave.desc", "id": "api.command_leave.desc",
@@ -789,11 +789,11 @@
}, },
{ {
"id": "api.command_msg.desc", "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", "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", "id": "api.command_msg.fail.app_error",
@@ -821,7 +821,7 @@
}, },
{ {
"id": "api.command_offline.desc", "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", "id": "api.command_offline.name",
@@ -833,7 +833,7 @@
}, },
{ {
"id": "api.command_online.desc", "id": "api.command_online.desc",
"translation": "Définit votre état sur « Connecté »" "translation": "Définit votre statut sur « Connecté »"
}, },
{ {
"id": "api.command_online.name", "id": "api.command_online.name",
@@ -849,35 +849,35 @@
}, },
{ {
"id": "api.command_remove.desc", "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", "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", "id": "api.command_remove.hint",
"translation": "@[username]" "translation": "@[nom d'utilisateur]"
}, },
{ {
"id": "api.command_remove.message.app_error", "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", "id": "api.command_remove.missing.app_error",
"translation": "Utilisateur introuvable" "translation": "Impossible de trouver l'utilisateur"
}, },
{ {
"id": "api.command_remove.name", "id": "api.command_remove.name",
"translation": "remove" "translation": "supprimer"
}, },
{ {
"id": "api.command_remove.permission.app_error", "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", "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", "id": "api.command_search.desc",
@@ -1037,7 +1037,7 @@
}, },
{ {
"id": "api.email_batching.render_batched_post.direct_message", "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", "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", "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", "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", "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", "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", "id": "api.post.create_post.attach_files.error",
@@ -1666,7 +1666,7 @@
}, },
{ {
"id": "api.post.get_message_for_notification.get_files.error", "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", "id": "api.post.get_message_for_notification.images_sent",
@@ -1701,7 +1701,7 @@
}, },
{ {
"id": "api.post.link_preview_disabled.app_error", "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", "id": "api.post.make_direct_channel_visible.get_2_members.error",
@@ -1733,7 +1733,7 @@
}, },
{ {
"id": "api.post.send_notifications_and_forget.files.error", "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", "id": "api.post.send_notifications_and_forget.get_teams.error",
@@ -1741,7 +1741,7 @@
}, },
{ {
"id": "api.post.send_notifications_and_forget.mention_subject", "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", "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", "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", "id": "api.post.send_notifications_and_forget.push_in",
@@ -1765,7 +1765,7 @@
}, },
{ {
"id": "api.post.send_notifications_and_forget.push_message", "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", "id": "api.post.send_notifications_and_forget.push_non_mention",
@@ -2105,7 +2105,7 @@
}, },
{ {
"id": "api.status.save_status.error", "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", "id": "api.status.user_not_found.app_error",
@@ -2165,7 +2165,7 @@
}, },
{ {
"id": "api.team.import_team.no_import_from.app_error", "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", "id": "api.team.import_team.open.app_error",
@@ -2417,7 +2417,7 @@
}, },
{ {
"id": "api.templates.upgrade_30_body.info", "id": "api.templates.upgrade_30_body.info",
"translation": "<h3 style='font-weight: normal; margin-top: 10px;'>VOS COMPTES DUPLIQUES ONT ETE MIS A NIVEAU</h3>Votre serveur Mattermost a été mis à niveau vers la version 3.0, qui vous permet d'utiliser un seul compte pour plusieurs équipes.<br/><br/>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.<br/><br/>Les mises à niveau suivantes ont été effectuées : <br/><br/>{{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.<br/><br/>{{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.<br/><br/>{{end}} ACTION RECOMMANDÉE : <br/><br/>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.<br/><br/>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. <br/><br/>POUR PLUS D'INFORMATION: <br/><br/>Pour plus d'information sur la mise à niveau vers Mattermost 3.0, veuillez vous référer à : <a href='http://www.mattermost.org/upgrading-to-mattermost-3-0/'>http://www.mattermost.org/upgrading-to-mattermost-3-0/</a><br/><br/>" "translation": "<h3 style='font-weight: normal; margin-top: 10px;'>VOS COMPTES DUPLIQUES ONT ETE MIS A NIVEAU</h3>Votre serveur Mattermost a été mis à niveau vers la version 3.0, qui vous permet d'utiliser un seul compte pour plusieurs équipes.<br/><br/>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.<br/><br/>Les mises à niveau suivantes ont été effectuées : <br/><br/>{{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.<br/><br/>{{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.<br/><br/>{{end}} ACTION RECOMMANDÉE : <br/><br/>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.<br/><br/>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. <br/><br/>POUR PLUS D'INFORMATION: <br/><br/>Pour plus d'information sur la mise à niveau vers Mattermost 3.0, veuillez vous référer à : <a href='http://www.mattermost.org/upgrading-to-mattermost-3-0/'>http://www.mattermost.org/upgrading-to-mattermost-3-0/</a><br/><br/>"
}, },
{ {
"id": "api.templates.upgrade_30_subject.info", "id": "api.templates.upgrade_30_subject.info",
@@ -2497,7 +2497,7 @@
}, },
{ {
"id": "api.user.add_direct_channels_and_forget.failed.error", "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", "id": "api.user.authorize_oauth_user.bad_response.app_error",
@@ -2805,7 +2805,7 @@
}, },
{ {
"id": "api.user.update_active.no_deactivate_sso.app_error", "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", "id": "api.user.update_active.permissions.app_error",
@@ -3105,7 +3105,7 @@
}, },
{ {
"id": "app.import.import_direct_post.create_direct_channel.error", "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", "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", "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", "id": "app.import.validate_direct_post_import_data.unknown_flagger.error",
@@ -3453,11 +3453,11 @@
}, },
{ {
"id": "app.notification.body.intro.direct.full", "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", "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", "id": "app.notification.body.intro.notification.full",
@@ -3485,7 +3485,7 @@
}, },
{ {
"id": "app.notification.subject.direct.full", "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", "id": "app.notification.subject.notification.full",
@@ -3497,7 +3497,7 @@
}, },
{ {
"id": "app.plugin.config.app_error", "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", "id": "app.plugin.deactivate.app_error",
@@ -3505,7 +3505,7 @@
}, },
{ {
"id": "app.plugin.disabled.app_error", "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", "id": "app.plugin.extract.app_error",
@@ -3533,7 +3533,7 @@
}, },
{ {
"id": "app.plugin.not_installed.app_error", "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", "id": "app.plugin.remove.app_error",
@@ -3541,7 +3541,7 @@
}, },
{ {
"id": "app.plugin.upload_disabled.app_error", "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", "id": "app.user_access_token.disabled",
@@ -3829,7 +3829,7 @@
}, },
{ {
"id": "ent.elasticsearch.indexer.do_job.get_oldest_post.error", "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", "id": "ent.elasticsearch.indexer.do_job.parse_end_time.error",
@@ -3861,7 +3861,7 @@
}, },
{ {
"id": "ent.elasticsearch.start.create_bulk_processor_failed.app_error", "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", "id": "ent.elasticsearch.start.index_settings_failed",
@@ -3869,7 +3869,7 @@
}, },
{ {
"id": "ent.elasticsearch.start.start_bulk_processor_failed.app_error", "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", "id": "ent.elasticsearch.test_config.connect_failed",
@@ -4089,7 +4089,7 @@
}, },
{ {
"id": "jobs.set_job_error.update.error", "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", "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", "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", "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", "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", "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", "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", "id": "model.config.is_valid.elastic_search.username.app_error",
@@ -4685,7 +4685,7 @@
}, },
{ {
"id": "model.config.is_valid.restrict_direct_message.app_error", "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", "id": "model.config.is_valid.saml_assertion_consumer_service_url.app_error",
@@ -4861,7 +4861,7 @@
}, },
{ {
"id": "model.job.is_valid.status.app_error", "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", "id": "model.job.is_valid.type.app_error",
@@ -5793,7 +5793,7 @@
}, },
{ {
"id": "store.sql_job.get_count_by_status_and_type.app_erro", "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", "id": "store.sql_job.get_newest_job_by_status_and_type.app_error",
@@ -6193,23 +6193,23 @@
}, },
{ {
"id": "store.sql_status.get.app_error", "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", "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", "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", "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", "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", "id": "store.sql_status.get_total_active_users_count.app_error",
@@ -6217,15 +6217,15 @@
}, },
{ {
"id": "store.sql_status.reset_all.app_error", "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", "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", "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", "id": "store.sql_system.get.app_error",
@@ -6537,7 +6537,7 @@
}, },
{ {
"id": "store.sql_user.update_mfa_active.app_error", "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", "id": "store.sql_user.update_mfa_secret.app_error",
@@ -6933,7 +6933,7 @@
}, },
{ {
"id": "web.incoming_webhook.split_props_length.app_error", "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", "id": "web.incoming_webhook.text.app_error",
@@ -7037,7 +7037,7 @@
}, },
{ {
"id": "wsapi.status.init.debug", "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", "id": "wsapi.system.init.debug",

Просмотреть файл

@@ -4985,7 +4985,7 @@
}, },
{ {
"id": "model.post.is_valid.msg.app_error", "id": "model.post.is_valid.msg.app_error",
"translation": "Messagio invalido" "translation": "Messaggio invalido"
}, },
{ {
"id": "model.post.is_valid.original_id.app_error", "id": "model.post.is_valid.original_id.app_error",

Просмотреть файл

@@ -2805,7 +2805,7 @@
}, },
{ {
"id": "api.user.update_active.no_deactivate_sso.app_error", "id": "api.user.update_active.no_deactivate_sso.app_error",
"translation": "SSOアカウントのアクティベーション状態を変更することはできません。SSOサーバーを通じて変更してください。" "translation": "シングルサインオンアカウントのアクティベーション状態を変更することはできません。シングルサインオンサーバーを通じて変更してください。"
}, },
{ {
"id": "api.user.update_active.permissions.app_error", "id": "api.user.update_active.permissions.app_error",
@@ -4705,7 +4705,7 @@
}, },
{ {
"id": "model.config.is_valid.saml_idp_url.app_error", "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", "id": "model.config.is_valid.saml_private_key.app_error",

Просмотреть файл

@@ -2165,7 +2165,7 @@
}, },
{ {
"id": "api.team.import_team.no_import_from.app_error", "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", "id": "api.team.import_team.open.app_error",

Просмотреть файл

@@ -297,7 +297,7 @@
}, },
{ {
"id": "api.channel.join_channel.post_and_forget", "id": "api.channel.join_channel.post_and_forget",
"translation": "%v присоединился к каналу." "translation": "%v присоединился(ась) к каналу."
}, },
{ {
"id": "api.channel.leave.default.app_error", "id": "api.channel.leave.default.app_error",
@@ -6901,7 +6901,7 @@
}, },
{ {
"id": "web.error.unsupported_browser.title", "id": "web.error.unsupported_browser.title",
"translation": "Unsupported Browser" "translation": "Неподдерживаемый Браузер"
}, },
{ {
"id": "web.find_team.title", "id": "web.find_team.title",

Просмотреть файл

@@ -69,7 +69,7 @@
}, },
{ {
"id": "api.admin.get_brand_image.storage.app_error", "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", "id": "api.admin.init.debug",
@@ -125,7 +125,7 @@
}, },
{ {
"id": "api.admin.upload_brand_image.storage.app_error", "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", "id": "api.admin.upload_brand_image.too_large.app_error",
@@ -1131,7 +1131,7 @@
}, },
{ {
"id": "api.emoji.storage.app_error", "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", "id": "api.emoji.upload.image.app_error",
@@ -1279,7 +1279,7 @@
}, },
{ {
"id": "api.file.move_file.configured.app_error", "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", "id": "api.file.move_file.delete_from_s3.app_error",
@@ -1295,7 +1295,7 @@
}, },
{ {
"id": "api.file.read_file.configured.app_error", "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", "id": "api.file.read_file.get.app_error",
@@ -1315,7 +1315,7 @@
}, },
{ {
"id": "api.file.upload_file.storage.app_error", "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", "id": "api.file.upload_file.too_large.app_error",
@@ -1323,7 +1323,7 @@
}, },
{ {
"id": "api.file.write_file.configured.app_error", "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", "id": "api.file.write_file.s3.app_error",
@@ -1881,7 +1881,7 @@
}, },
{ {
"id": "api.server.start_server.rate.warn", "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", "id": "api.server.start_server.rate_limiting_memory_store",
@@ -2893,7 +2893,7 @@
}, },
{ {
"id": "api.user.upload_profile_user.storage.app_error", "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", "id": "api.user.upload_profile_user.too_large.app_error",
@@ -4029,7 +4029,7 @@
}, },
{ {
"id": "ent.saml.configure.app_error", "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", "id": "ent.saml.configure.encryption_not_enabled.app_error",
@@ -4129,7 +4129,7 @@
}, },
{ {
"id": "mattermost.config_file", "id": "mattermost.config_file",
"translation": "%v üzerinden yüklenen yapılandırma dosyası" "translation": "%v üzerinden yüklenen ayar dosyası"
}, },
{ {
"id": "mattermost.current_version", "id": "mattermost.current_version",
@@ -6657,23 +6657,23 @@
}, },
{ {
"id": "utils.config.add_client_locale.app_error", "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", "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", "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", "id": "utils.config.load_config.opening.panic",
"translation": "Yapılandırma dosyasıılırken sorun çıktı. Dosya: {{.Filename}}, Hata: {{.Error}}" "translation": "Ayar dosyasıılırken sorun çıktı. Dosya: {{.Filename}}, Hata: {{.Error}}"
}, },
{ {
"id": "utils.config.load_config.validating.panic", "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", "id": "utils.config.save_config.saving.app_error",
@@ -6681,19 +6681,19 @@
}, },
{ {
"id": "utils.config.supported_available_locales.app_error", "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", "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", "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", "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", "id": "utils.diagnostic.analytics_not_found.app_error",
@@ -6701,7 +6701,7 @@
}, },
{ {
"id": "utils.file.list_directory.configured.app_error", "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", "id": "utils.file.list_directory.local.app_error",
@@ -6713,7 +6713,7 @@
}, },
{ {
"id": "utils.file.remove_directory.configured.app_error", "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", "id": "utils.file.remove_directory.local.app_error",
@@ -6725,7 +6725,7 @@
}, },
{ {
"id": "utils.file.remove_file.configured.app_error", "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", "id": "utils.file.remove_file.local.app_error",
@@ -6817,11 +6817,11 @@
}, },
{ {
"id": "utils.mail.test.configured.error", "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", "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", "id": "web.admin_console.title",

Просмотреть файл

@@ -2165,7 +2165,7 @@
}, },
{ {
"id": "api.team.import_team.no_import_from.app_error", "id": "api.team.import_team.no_import_from.app_error",
"translation": "错误请求:缺少 filesize 字段。" "translation": "错误请求:缺少 importFrom 字段。"
}, },
{ {
"id": "api.team.import_team.open.app_error", "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", "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", "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", "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", "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", "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", "id": "model.config.is_valid.elastic_search.username.app_error",
@@ -6933,7 +6933,7 @@
}, },
{ {
"id": "web.incoming_webhook.split_props_length.app_error", "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", "id": "web.incoming_webhook.text.app_error",

Просмотреть файл

@@ -637,23 +637,23 @@
}, },
{ {
"id": "api.command_dnd.desc", "id": "api.command_dnd.desc",
"translation": "Do not disturb disables desktop and mobile push notifications." "translation": "請勿打擾會停止桌面以及行動推播通知。"
}, },
{ {
"id": "api.command_dnd.disabled", "id": "api.command_dnd.disabled",
"translation": "Do Not Disturb is disabled." "translation": "請勿打擾已被停用。"
}, },
{ {
"id": "api.command_dnd.error", "id": "api.command_dnd.error",
"translation": "Error to retrieve the user status." "translation": "取得使用者狀態時錯誤。"
}, },
{ {
"id": "api.command_dnd.name", "id": "api.command_dnd.name",
"translation": "dnd" "translation": "請勿打擾"
}, },
{ {
"id": "api.command_dnd.success", "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", "id": "api.command_echo.create.app_error",
@@ -737,7 +737,7 @@
}, },
{ {
"id": "api.command_kick.name", "id": "api.command_kick.name",
"translation": "kick" "translation": "踢出"
}, },
{ {
"id": "api.command_leave.desc", "id": "api.command_leave.desc",
@@ -849,11 +849,11 @@
}, },
{ {
"id": "api.command_remove.desc", "id": "api.command_remove.desc",
"translation": "Remove a member from the channel" "translation": "將成員從頻道中移除"
}, },
{ {
"id": "api.command_remove.direct_group.app_error", "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", "id": "api.command_remove.hint",
@@ -861,7 +861,7 @@
}, },
{ {
"id": "api.command_remove.message.app_error", "id": "api.command_remove.message.app_error",
"translation": "使用 /rename 命令必須提供訊息。" "translation": "使用 /remove 或 /kick 命令必須提供訊息。"
}, },
{ {
"id": "api.command_remove.missing.app_error", "id": "api.command_remove.missing.app_error",
@@ -869,15 +869,15 @@
}, },
{ {
"id": "api.command_remove.name", "id": "api.command_remove.name",
"translation": "remove" "translation": "移除"
}, },
{ {
"id": "api.command_remove.permission.app_error", "id": "api.command_remove.permission.app_error",
"translation": "權限不足以更改頻道名稱。" "translation": "權限不足以移除成員。"
}, },
{ {
"id": "api.command_remove.user_not_in_channel", "id": "api.command_remove.user_not_in_channel",
"translation": "{{.Username}} is not a member of this channel." "translation": "{{.Username}}不是此頻道的成員。"
}, },
{ {
"id": "api.command_search.desc", "id": "api.command_search.desc",
@@ -1575,19 +1575,19 @@
}, },
{ {
"id": "api.post.check_for_out_of_channel_mentions.link.private", "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", "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", "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", "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", "id": "api.post.create_post.attach_files.error",
@@ -2165,7 +2165,7 @@
}, },
{ {
"id": "api.team.import_team.no_import_from.app_error", "id": "api.team.import_team.no_import_from.app_error",
"translation": "要求格式錯誤:沒有檔案大小欄位。" "translation": "要求格式錯誤:沒有 importFrom 欄位。"
}, },
{ {
"id": "api.team.import_team.open.app_error", "id": "api.team.import_team.open.app_error",
@@ -2805,7 +2805,7 @@
}, },
{ {
"id": "api.user.update_active.no_deactivate_sso.app_error", "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", "id": "api.user.update_active.permissions.app_error",
@@ -3497,7 +3497,7 @@
}, },
{ {
"id": "app.plugin.config.app_error", "id": "app.plugin.config.app_error",
"translation": "Error saving plugin state in config" "translation": "儲存模組狀態於設定時錯誤"
}, },
{ {
"id": "app.plugin.deactivate.app_error", "id": "app.plugin.deactivate.app_error",
@@ -3505,7 +3505,7 @@
}, },
{ {
"id": "app.plugin.disabled.app_error", "id": "app.plugin.disabled.app_error",
"translation": "Plugins have been disabled." "translation": "模組已被停用。"
}, },
{ {
"id": "app.plugin.extract.app_error", "id": "app.plugin.extract.app_error",
@@ -3533,7 +3533,7 @@
}, },
{ {
"id": "app.plugin.not_installed.app_error", "id": "app.plugin.not_installed.app_error",
"translation": "Plugin is not installed" "translation": "模組尚未安裝"
}, },
{ {
"id": "app.plugin.remove.app_error", "id": "app.plugin.remove.app_error",
@@ -3541,7 +3541,7 @@
}, },
{ {
"id": "app.plugin.upload_disabled.app_error", "id": "app.plugin.upload_disabled.app_error",
"translation": "Plugins and/or plugin uploads have been disabled." "translation": "模組 跟/或 上傳模組已被停用。"
}, },
{ {
"id": "app.user_access_token.disabled", "id": "app.user_access_token.disabled",
@@ -3829,7 +3829,7 @@
}, },
{ {
"id": "ent.elasticsearch.indexer.do_job.get_oldest_post.error", "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", "id": "ent.elasticsearch.indexer.do_job.parse_end_time.error",
@@ -3861,7 +3861,7 @@
}, },
{ {
"id": "ent.elasticsearch.start.create_bulk_processor_failed.app_error", "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", "id": "ent.elasticsearch.start.index_settings_failed",
@@ -3869,7 +3869,7 @@
}, },
{ {
"id": "ent.elasticsearch.start.start_bulk_processor_failed.app_error", "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", "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", "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", "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", "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", "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", "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", "id": "model.config.is_valid.elastic_search.username.app_error",
@@ -6933,7 +6933,7 @@
}, },
{ {
"id": "web.incoming_webhook.split_props_length.app_error", "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", "id": "web.incoming_webhook.text.app_error",

Просмотреть файл

@@ -5,6 +5,8 @@ package utils
import ( import (
"bytes" "bytes"
"fmt"
"io"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"os" "os"
@@ -367,3 +369,102 @@ func CopyMetadata(encrypt bool) map[string]string {
metaData["x-amz-server-side-encryption"] = "AES256" metaData["x-amz-server-side-encryption"] = "AES256"
return metaData 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
}

Просмотреть файл

@@ -5,9 +5,13 @@ package utils
import ( import (
"fmt" "fmt"
"io/ioutil"
"os" "os"
"path/filepath"
"testing" "testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
@@ -180,3 +184,53 @@ func (s *FileTestSuite) TestRemoveDirectory() {
_, err = ReadFile("tests2/asdf") _, err = ReadFile("tests2/asdf")
s.Error(err) 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)
}