Merge branch 'release-4.4'
Этот коммит содержится в:
@@ -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)
|
||||
}
|
||||
|
||||
50
i18n/de.json
50
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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
140
i18n/fr.json
140
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": "<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",
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
50
i18n/tr.json
50
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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
101
utils/file.go
101
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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user