From 3bc93c8f386ab8f70fa0b0217197bc2c56700a64 Mon Sep 17 00:00:00 2001 From: Harrison Healey Date: Mon, 9 Jul 2018 14:59:46 -0400 Subject: [PATCH 01/11] MM-11203 Adjust reply icon margins to not affect other components (#1897) --- app/components/post_header/post_header.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/post_header/post_header.js b/app/components/post_header/post_header.js index 145895be9..d821b1cee 100644 --- a/app/components/post_header/post_header.js +++ b/app/components/post_header/post_header.js @@ -291,7 +291,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', - height: 35, + marginVertical: -10, minWidth: 40, paddingVertical: 10, }, From 3a2e8e256a47338e1786766f4b142b3c8c2da53d Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Mon, 9 Jul 2018 15:46:54 -0400 Subject: [PATCH 02/11] Set the proper size to the drawer when device rotates (#1899) --- app/components/sidebars/main/main_sidebar.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/sidebars/main/main_sidebar.js b/app/components/sidebars/main/main_sidebar.js index 48ecc89ed..5acda1a8d 100644 --- a/app/components/sidebars/main/main_sidebar.js +++ b/app/components/sidebars/main/main_sidebar.js @@ -93,7 +93,7 @@ export default class ChannelSidebar extends Component { } shouldComponentUpdate(nextProps, nextState) { - const {currentTeamId, isLandscape, teamsCount} = this.props; + const {currentTeamId, deviceWidth, isLandscape, teamsCount} = this.props; const {openDrawerOffset} = this.state; if (nextState.openDrawerOffset !== openDrawerOffset || nextState.show !== this.state.show) { @@ -101,7 +101,7 @@ export default class ChannelSidebar extends Component { } return nextProps.currentTeamId !== currentTeamId || - nextProps.isLandscape !== isLandscape || + nextProps.isLandscape !== isLandscape || nextProps.deviceWidth !== deviceWidth || nextProps.teamsCount !== teamsCount || this.state.lockMode !== nextState.lockMode; } From 91a4abbd24b245892cf7e358dadf17f267745703 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Mon, 9 Jul 2018 16:15:50 -0400 Subject: [PATCH 03/11] Fix race condition when opening the app from push notification (#1898) --- app/utils/push_notifications.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/app/utils/push_notifications.js b/app/utils/push_notifications.js index 146fb8db1..b01cf5229 100644 --- a/app/utils/push_notifications.js +++ b/app/utils/push_notifications.js @@ -48,8 +48,18 @@ const onRegisterDevice = (data) => { } }; +const loadFromNotification = async (notification) => { + await store.dispatch(loadFromPushNotification(notification)); + if (!app.startAppFromPushNotification) { + EventEmitter.emit(ViewTypes.NOTIFICATION_TAPPED); + PushNotifications.resetNotification(); + } +}; + const onPushNotification = async (deviceNotification) => { const {dispatch, getState} = store; + let unsubscribeFromStore = null; + let stopLoadingNotification = false; // mark the app as started as soon as possible if (Platform.OS === 'android' && !app.appStarted) { @@ -77,11 +87,17 @@ const onPushNotification = async (deviceNotification) => { } else if (userInteraction && !notification.localNotification) { EventEmitter.emit('close_channel_drawer'); if (getState().views.root.hydrationComplete) { - await dispatch(loadFromPushNotification(notification)); - if (!app.startAppFromPushNotification) { - EventEmitter.emit(ViewTypes.NOTIFICATION_TAPPED); - PushNotifications.resetNotification(); - } + loadFromNotification(notification); + } else { + const waitForHydration = () => { + if (getState().views.root.hydrationComplete && !stopLoadingNotification) { + stopLoadingNotification = true; + unsubscribeFromStore(); + loadFromNotification(notification); + } + }; + + unsubscribeFromStore = store.subscribe(waitForHydration); } } } From c65d8f2e1c05db865f7361be62591261160f0f44 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Mon, 9 Jul 2018 18:29:58 -0400 Subject: [PATCH 04/11] translations PR 20180709 (#1905) --- assets/base/i18n/de.json | 309 ++++++++++++++++++------------------ assets/base/i18n/en.json | 5 +- assets/base/i18n/es.json | 11 +- assets/base/i18n/fr.json | 11 +- assets/base/i18n/it.json | 11 +- assets/base/i18n/ja.json | 13 +- assets/base/i18n/ko.json | 15 +- assets/base/i18n/nl.json | 11 +- assets/base/i18n/pl.json | 9 +- assets/base/i18n/pt-BR.json | 243 ++++++++++++++-------------- assets/base/i18n/ru.json | 11 +- assets/base/i18n/tr.json | 11 +- assets/base/i18n/zh-CN.json | 275 ++++++++++++++++---------------- assets/base/i18n/zh-TW.json | 293 +++++++++++++++++----------------- 14 files changed, 635 insertions(+), 593 deletions(-) diff --git a/assets/base/i18n/de.json b/assets/base/i18n/de.json index 5287ac643..6bc4b3f65 100644 --- a/assets/base/i18n/de.json +++ b/assets/base/i18n/de.json @@ -184,7 +184,7 @@ "admin.cluster.GossipPortDesc": "Der für das Gossip-Protokoll verwendete Port. UDP und TCP sollten auf diesem Port erlaubt sein.", "admin.cluster.GossipPortEx": "Z.B.: \"8074\"", "admin.cluster.OverrideHostname": "Hostname überschreiben:", - "admin.cluster.OverrideHostnameDesc": "Der Standardwert von wird versuchen den Hostnamen vom Betriebssystem oder der IP-Adresse zu erhalten. Sie können den Hostnamen dieses Servers mit dieser Eigenschaft überschreiben. Es wird nicht empfohlen den Hostnamen zu überschreiben, wenn es nicht benötigt wird. Diese Eigenschaft kann ebenfalls auf eine spezifische IP-Adresse gesetzt werden, falls benötigt.", + "admin.cluster.OverrideHostnameDesc": "Der Standardwert von wird versuchen den Hostnamen vom Betriebssystem oder der IP-Adresse abzurufen. Sie können den Hostnamen dieses Servers mit dieser Eigenschaft überschreiben. Es wird nicht empfohlen den Hostnamen zu überschreiben, wenn es nicht benötigt wird. Diese Eigenschaft kann ebenfalls auf eine spezifische IP-Adresse gesetzt werden, falls benötigt.", "admin.cluster.OverrideHostnameEx": "Z.B.: \"app-server-01\"", "admin.cluster.ReadOnlyConfig": "Nur-Lesen-Konfiguration:", "admin.cluster.ReadOnlyConfigDesc": "Wenn wahr, wird der Server jede Änderung an der Konfigurationsdatei zurückweisen, die von der Systemkonsole aus durchgeführt wurde. In Produktionsumgebungen wird empfohlen diese Option auf wahr zu setzen.", @@ -296,21 +296,21 @@ "admin.customization.appDownloadLinkTitle": "Link zur Downloadseite der Mattermost-Apps:", "admin.customization.customBrand": "Eigenes Branding", "admin.customization.customUrlSchemes": "Eigene URL-Schemen:", - "admin.customization.customUrlSchemesDesc": "Erlaubt das Anzeigen von Nachrichtentext als Link, falls er mit einem der aufgelisteten, kommaseparierten URL-Schemen beginnt. Standardmäßig generieren folgende Schemen Links: \"http\", \"https\", \"ftp\", \"tel\", und \"mailto\".", + "admin.customization.customUrlSchemesDesc": "Erlaubt das Anzeigen von Nachrichtentext als Link, falls er mit einem der aufgelisteten, kommaseparierten URL-Schemas beginnt. Standardmäßig generieren folgende Schemen Links: \"http\", \"https\", \"ftp\", \"tel\", und \"mailto\".", "admin.customization.customUrlSchemesEx": "Z.B.: \"git,smtp\"", "admin.customization.emoji": "Emoji", "admin.customization.enableCustomEmojiDesc": "Erlaube es Benutzern, eigene Emojis für Nachrichten zu erstellen. Wenn aktiviert, können eigene Emojis durch wechseln zu einem Team, Klicken auf die drei Punkte über der Kanal-Seitenleiste und dem Auswählen von \"Eigene Emoji\" aufgerufen werden.", "admin.customization.enableCustomEmojiTitle": "Eigene Emoji ermöglichen:", "admin.customization.enableEmojiPickerDesc": "Die Emojiauswahl ermöglicht den Benutzern Emojis als Reaktionen oder zur Verwendung in Nachrichten auszuwählen. Die Aktivierung der Emojiauswahl bei einer großen Anzahl an benutzerdefinierten Emojis kann die Performance verringern.", "admin.customization.enableEmojiPickerTitle": "Emojiauswahl aktivieren:", - "admin.customization.enableGifPickerDesc": "Allow users to select GIFs from the emoji picker via a Gfycat integration.", + "admin.customization.enableGifPickerDesc": "Erlaubt Benutzern GIFs in der Emoji-Auswahl über eine Gfycat-Integration auszuwählen.", "admin.customization.enableGifPickerTitle": "GIF-Auswahl aktivieren:", "admin.customization.enableLinkPreviewsDesc": "Zeigt eine Vorschau von Webseiten unterhalb von Nachrichten, wenn verfügbar. Benutzer können diese Vorschauen unter Kontoeinstellungen > Anzeige > Webseitenvorschauen deaktivieren.", "admin.customization.enableLinkPreviewsTitle": "Erlaube Link-Vorschauen:", - "admin.customization.gfycatApiKey": "Gfycat API Key:", - "admin.customization.gfycatApiKeyDescription": "Request an API key at https://developers.gfycat.com/signup/#/. Enter the client ID you receive via email to this field. When blank, uses the default API key provided by Gfycat.", - "admin.customization.gfycatApiSecret": "Gfycat API Secret:", - "admin.customization.gfycatApiSecretDescription": "The API secret generated by Gfycat for your API key. When blank, uses the default API secret provided by Gfycat.", + "admin.customization.gfycatApiKey": "Gfycat-API-Schlüssel:", + "admin.customization.gfycatApiKeyDescription": "Fordern Sie einen API-Schlüssel auf https://developers.gfycat.com/signup/#/ an. Geben Sie in dieses Feld die Client-ID ein, die Sie per E-Mail von Gfycat erhalten.", + "admin.customization.gfycatApiSecret": "Gfycat-API-Geheimnis:", + "admin.customization.gfycatApiSecretDescription": "Das API-Geheimnis, das von Gfycat für ihren API-Schlüssel generiert wurde. Wenn leer, wird er Standard-API-Schlüssel verwendet, der von Gfycat zur Verfügung gestellt wird.", "admin.customization.gif": "GIF (Beta)", "admin.customization.iosAppDownloadLinkDesc": "Einen Link zum Download der iOS-App hinzufügen. Benutzer, die die Seite über einen mobilen Browser aufrufen, wird eine Seite mit der Option die App herunterzuladen angezeigt. Dieses Feld leer lassen um zu verhindern, dass die Seite angezeigt wird.", "admin.customization.iosAppDownloadLinkTitle": "iOS-App-Downloadlink:", @@ -541,10 +541,10 @@ "admin.image.amazonS3EndpointDescription": "Hostname Ihres S3 kompatiblen Speicheranbieters. Standardmäßig \"s3.amazonaws.com\".", "admin.image.amazonS3EndpointExample": "Z.B.: \"s3.amazonaws.com\"", "admin.image.amazonS3EndpointTitle": "Amazon S3 Endpunkt:", - "admin.image.amazonS3IdDescription": "(Optional) Nur benötigt, falls Sie nicht durch Verwendung einer IAM-Rolle authentifizieren möchten. Geben Sie die durch ihren Amazon-EC2-Administrator zur Verfügung gestellten Access-Key-ID ein.", + "admin.image.amazonS3IdDescription": "(Optional) Nur benötigt, falls Sie bei S3 nicht durch Verwendung einer IAM-Rolle authentifizieren möchten. Geben Sie die durch ihren Amazon-EC2-Administrator zur Verfügung gestellte Access-Key-ID ein.", "admin.image.amazonS3IdExample": "Z.B.: \"AKIADTOVBGERKLCBV\"", "admin.image.amazonS3IdTitle": "Amazon S3 Zugangsschlüssel-ID:", - "admin.image.amazonS3RegionDescription": "AWS-Region, die Sie beim Erstellen ihres S3-Buckets gewählt haben. Wenn keine Region eingestellt ist, versucht Mattermost die entsprechende Region von AWS zu erhalten oder setzt sie auf 'us-east-1', falls keine gefunden wird.", + "admin.image.amazonS3RegionDescription": "AWS-Region, die Sie beim Erstellen ihres S3-Buckets gewählt haben. Wenn keine Region eingestellt ist, versucht Mattermost die entsprechende Region von AWS abzurufen oder setzt sie auf 'us-east-1', falls keine gefunden wird.", "admin.image.amazonS3RegionExample": "Z.B.: \"us-east-1\"", "admin.image.amazonS3RegionTitle": "Amazon S3 Region:", "admin.image.amazonS3SSEDescription": "Wenn wahr, werden Dateien in Amazon S3 mit serverseitiger Verschlüsselung mit Amazon S3-verwalteten Schlüsseln verschlüsselt. Schauen Sie in die Dokumentation, um mehr zu erfahren.", @@ -565,7 +565,7 @@ "admin.image.proxyOptions": "Bild-Proxy-Optionen:", "admin.image.proxyOptionsDescription": "Zusätzliche Optionen wie den URL-Signierungsschlüssel. Beziehen Sie sich auf die Dokumentation ihres Image-Proxys, um mehr über die unterstützten Funktionen zu erfahren.", "admin.image.proxyType": "Bild-Proxy-Typ:", - "admin.image.proxyTypeDescription": "Konfigurieren Sie einen Bild-Proxy, um alle Markdown-Bilder durch einen Proxy zu laden. Der Bild-Proxy verhindert, dass Benutzer unsichere Bildanfragen durchführen, stellt Caching für verbesserte Leistung zur Verfügung und automatisiert Bildanpassungen wie z.B. Größenänderungen. Sehen Sie sich die Dokumentation an, um mehr zu erfahren.", + "admin.image.proxyTypeDescription": "Konfigurieren Sie einen Bild-Proxy, um alle Markdown-Bilder durch einen Proxy zu laden. Der Bild-Proxy verhindert, dass Benutzer unsichere Bildanfragen durchführen, stellt Caching für verbesserte Leistung zur Verfügung und automatisiert Bildanpassungen wie z.B. Größenänderungen. Sehen Sie sich die Dokumentation an, um mehr zu erfahren.", "admin.image.proxyTypeNone": "Keiner", "admin.image.proxyURL": "Bild-Proxy-URL:", "admin.image.proxyURLDescription": "URL ihres Bild-Proxy-Servers.", @@ -765,13 +765,13 @@ "admin.permissions.documentationLinkText": "Dokumentation", "admin.permissions.group.delete_posts.description": "Nachrichten löschen.", "admin.permissions.group.delete_posts.name": "Nachrichten löschen", - "admin.permissions.group.integrations.description": "Oauth, Slash-Befehle, Webhooks and Emojis verwalten", + "admin.permissions.group.integrations.description": "Oauth 2.0, Slash-Befehle, Webhooks and Emojis verwalten", "admin.permissions.group.integrations.name": "Integrationen & Anpassungen", "admin.permissions.group.posts.description": "Nachrichten schreiben, bearbeiten und löschen.", "admin.permissions.group.posts.name": "Nachrichten verwalten", - "admin.permissions.group.private_channel.description": "Kanäle erstellen und löschen, Einstellungen und Mitglieder verwalten.", + "admin.permissions.group.private_channel.description": "Kanäle erstellen und archivieren, Einstellungen und Mitglieder verwalten.", "admin.permissions.group.private_channel.name": "Private Kanäle verwalten", - "admin.permissions.group.public_channel.description": "Kanäle betreten, erstellen und löschen, Einstellungen und Mitglieder verwalten.", + "admin.permissions.group.public_channel.description": "Kanäle betreten, erstellen und archivieren, Einstellungen und Mitglieder verwalten.", "admin.permissions.group.public_channel.name": "Öffentliche Kanäle verwalten", "admin.permissions.group.reactions.description": "Reaktionen zu Nachrichten hinzufügen und löschen.", "admin.permissions.group.reactions.name": "Nachrichten-Reaktionen", @@ -779,9 +779,9 @@ "admin.permissions.group.send_invites.name": "Teammitglieder hinzufügen", "admin.permissions.group.teams.description": "Teams erstellen und Mitglieder verwalten.", "admin.permissions.group.teams.name": "Teams", - "admin.permissions.inherited_from": "Vererbt von {name}", - "admin.permissions.introBanner": "Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our [documentation](!https://about.mattermost.com/default-advanced-permissions).", - "admin.permissions.loadMoreSchemes": "Mehr Schemen laden", + "admin.permissions.inherited_from": "Vererbt von {name}.", + "admin.permissions.introBanner": "Berechtigungs-Schemas setzen die Standard-Berechtigungen für Teamadministratoren, Kanaladministratoren und alle anderen. Lernen Sie mehr über Berechtigungs-Schemas in unserer [Dokumentation](!https://about.mattermost.com/default-advanced-permissions).", + "admin.permissions.loadMoreSchemes": "Mehr Schemas laden", "admin.permissions.loadingMoreSchemes": "Lade...", "admin.permissions.permission.assign_system_admin_role.description": "Systemadministratoren-Rolle zuweisen", "admin.permissions.permission.assign_system_admin_role.name": "Systemadministratoren-Rolle zuweisen", @@ -801,10 +801,10 @@ "admin.permissions.permission.delete_others_posts.name": "Nachrichten von anderen löschen", "admin.permissions.permission.delete_post.description": "Die eigenen Nachrichten von Autoren können gelöscht werden.", "admin.permissions.permission.delete_post.name": "Eigene Nachrichten löschen", - "admin.permissions.permission.delete_private_channel.description": "Private Kanäle löschen.", - "admin.permissions.permission.delete_private_channel.name": "Archive Channels", - "admin.permissions.permission.delete_public_channel.description": "Öffentliche Kanäle löschen.", - "admin.permissions.permission.delete_public_channel.name": "Archive Channels", + "admin.permissions.permission.delete_private_channel.description": "Private Kanäle archivieren", + "admin.permissions.permission.delete_private_channel.name": "Kanäle archivieren", + "admin.permissions.permission.delete_public_channel.description": "Öffentliche Kanäle archivieren", + "admin.permissions.permission.delete_public_channel.name": "Kanäle archivieren", "admin.permissions.permission.edit_other_users.description": "Andere Benutzer bearbeiten", "admin.permissions.permission.edit_other_users.name": "Andere Benutzer bearbeiten", "admin.permissions.permission.edit_post.description": "{editTimeLimitButton} Benutzern erlauben, nach dem Absenden ihre eigenen Nachrichten zu bearbeiten.", @@ -841,7 +841,7 @@ "admin.permissions.permission.manage_team.name": "Team verwalten", "admin.permissions.permission.manage_team_roles.description": "Team-Rollen verwalten", "admin.permissions.permission.manage_team_roles.name": "Team-Rollen verwalten", - "admin.permissions.permission.manage_webhooks.description": "Eingehende und ausgehende Webhooks erstellen, bearbeiten und löschen", + "admin.permissions.permission.manage_webhooks.description": "Eingehende und ausgehende Webhooks erstellen, bearbeiten und löschen.", "admin.permissions.permission.manage_webhooks.name": "Webhooks verwalten", "admin.permissions.permission.permanent_delete_user.description": "Benutzer permanent löschen", "admin.permissions.permission.permanent_delete_user.name": "Benutzer permanent löschen", @@ -866,7 +866,7 @@ "admin.permissions.permissionsTree.description": "Beschreibung", "admin.permissions.permissionsTree.permission": "Berechtigung", "admin.permissions.roles.all_users.name": "Alle Mitglieder", - "admin.permissions.roles.channel_admin.name": "Kanal-Administrator", + "admin.permissions.roles.channel_admin.name": "Kanaladministrator", "admin.permissions.roles.channel_user.name": "Kanalbenutzer", "admin.permissions.roles.system_admin.name": "Systemadministrator", "admin.permissions.roles.system_user.name": "Systembenutzer", @@ -877,7 +877,7 @@ "admin.permissions.systemScheme.allMembersTitle": "Alle Mitglieder", "admin.permissions.systemScheme.channelAdminsDescription": "Berechtigung für Kanalersteller und alle Benutzer, die zu Kanaladministratoren befördert werden.", "admin.permissions.systemScheme.channelAdminsTitle": "Kanaladministratoren", - "admin.permissions.systemScheme.introBanner": "Configure the default permissions for Team Admins, Channel Admins and other members. This scheme is inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied in specific teams.", + "admin.permissions.systemScheme.introBanner": "Konfiguriert die Standard-Berechtigungen für Teamadministratoren, Kanaladministratoren und andere Benutzer. Das Schema wird von allen Team geerbt, außer es wird ein [übergeordnetes Teamschema](!https://about.mattermost.com/default-team-override-scheme) auf spezifische Teams angewendet.", "admin.permissions.systemScheme.resetDefaultsButton": "Auf Voreinstellungen zurücksetzen", "admin.permissions.systemScheme.resetDefaultsButtonModalBody": "Dies wird alle Auswahlen auf dieser Seite auf ihre Standardeinstellungen zurücksetzen. Sind Sie sicher, dass Sie zurücksetzen möchten?", "admin.permissions.systemScheme.resetDefaultsButtonModalTitle": "Auf Voreinstellungen zurücksetzen?", @@ -887,17 +887,17 @@ "admin.permissions.systemScheme.teamAdminsDescription": "Berechtigung für Teamersteller und alle Benutzer, die zu Teamadministratoren befördert werden.", "admin.permissions.systemScheme.teamAdminsTitle": "Teamadministratoren", "admin.permissions.systemSchemeBannerButton": "Schema bearbeiten", - "admin.permissions.systemSchemeBannerText": "Set the default permissions inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied.", + "admin.permissions.systemSchemeBannerText": "Setzen Sie die Standard-Berechtigungen, die von allen Teams geerbt werden, außer es wird ein [übergeordnetes Teamschema](!https://about.mattermost.com/default-team-override-scheme) angewendet.", "admin.permissions.systemSchemeBannerTitle": "Systemschema", - "admin.permissions.teamOverrideSchemesBannerText": "Use when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).", + "admin.permissions.teamOverrideSchemesBannerText": "Verwenden, wenn spezifische Teams Ausnahmen vom [Systemschema](!https://about.mattermost.com/default-system-scheme) benötigen.", "admin.permissions.teamOverrideSchemesInProgress": "Migrations-Job läuft. Übergeordnete Teamschemen sind nicht verfügbar, bis der Job-Server die Berechtigungsmigration abgeschlossen hat. Lernen Sie mehr in der {documentationLink}.", "admin.permissions.teamOverrideSchemesNewButton": "Neues übergeordnetes Teamschema", "admin.permissions.teamOverrideSchemesNoJobsEnabled": "Migrations-Job pausiert: Übergeordnete Teamschemen sind nicht verfügbar, bis der Job-Server die Berechtigungsmigration ausführen kann. Der Job wird automatisch gestartet, wenn der Job-Server aktiviert ist. Lernen Sie mehr in der {documentationLink}.", - "admin.permissions.teamOverrideSchemesNoSchemes": "Keine übergeordneten Teamschemen erstellt.", + "admin.permissions.teamOverrideSchemesNoSchemes": "Keine übergeordneten Teamschemas erstellt.", "admin.permissions.teamOverrideSchemesTitle": "Übergeordnete Teamschemen", "admin.permissions.teamScheme": "Teamschema", "admin.permissions.teamScheme.addTeams": "Teams hinzufügen", - "admin.permissions.teamScheme.introBanner": "[Team Override Schemes](!https://about.mattermost.com/default-team-override-scheme) set the permissions for Team Admins, Channel Admins and other members in specific teams. Use a Team Override Scheme when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).", + "admin.permissions.teamScheme.introBanner": "[Übergeordnete Teamschemas](!https://about.mattermost.com/default-team-override-scheme) setzen die Berechtigungen für Teamadministratoren, Kanaladministratoren und andere Benutzer in spezifischen Teams. Verwenden, wenn spezifische Teams Ausnahmen vom [Systemschema](!https://about.mattermost.com/default-system-scheme) benötigen.", "admin.permissions.teamScheme.noTeams": "Kein Team ausgewählt. Bitte Teams zur Liste hinzufügen.", "admin.permissions.teamScheme.removeTeam": "Entfernen", "admin.permissions.teamScheme.schemeDescriptionLabel": "Schema-Beschreibung:", @@ -1059,8 +1059,8 @@ "admin.saml.privateKeyFileFileDesc": "Der private Schlüssel der zur Entschlüsselung der SAML Assertions des Identitätsproviders verwendet wird.", "admin.saml.privateKeyFileFileRemoveDesc": "Den privaten Schlüssel zur Entschlüsselung der SAML Assertions löschen.", "admin.saml.privateKeyFileTitle": "Service Provider Privater Schlüssel:", - "admin.saml.publicCertificateFileDesc": "Das Zertifikat mit dem die Signatur für SAML Anfragen an den Identitätsprovider für den Service Provider initiierten SAML Login generiert wird, wenn Mattermost der Service Provider ist.", - "admin.saml.publicCertificateFileRemoveDesc": "Entferne das Zertifikat mit dem die Signatur für SAML Anfragen an den Identitätsprovider für den Service Provider initiierten SAML Login generiert wird, wenn Mattermost der Service Provider ist.", + "admin.saml.publicCertificateFileDesc": "Das Zertifikat, mit dem die Signatur für SAML-Anfragen an den Identitäts-Provider für die Service-Provider initiierten SAML-Anmeldung generiert wird, wenn Mattermost der Service-Provider ist.", + "admin.saml.publicCertificateFileRemoveDesc": "Entferne das Zertifikat mit dem die Signatur für SAML-Anfragen an den Identitäts-Provider für die Service-Provider initiierten SAML-Anmeldung generiert wird, wenn Mattermost der Service-Provider ist.", "admin.saml.publicCertificateFileTitle": "Öffentliches Zertifikat des Service Providers:", "admin.saml.remove.idp_certificate": "Entferne Zertifikat des Identitätsproviders", "admin.saml.remove.privKey": "Entferne privaten Schlüssel des Service Providers", @@ -1121,7 +1121,7 @@ "admin.service.letsEncryptCertificateCacheFile": "Let's Encrypt Zertifikat Cache Datei:", "admin.service.letsEncryptCertificateCacheFileDescription": "Zertifikate und andere Daten über den Let's Encrypt Dienst werden in dieser Datei gespeichert.", "admin.service.listenAddress": "Empfangs-Adresse:", - "admin.service.listenDescription": "Die Adresse und Port an die gebunden und gehört wird. Bei Angabe von \":8065\" wird an alle Netzwerkkarten gebunden. Bei Angabe von \"127.0.0.1:8065\" wird nur an die Netzwerkkarte mit der IP Adresse gebunden. Wenn Sie einen Port eines niedrigen Levels wählen (auch \"System Ports\" oder \"Well Known Ports\" im Bereich 0-1023), müssen Sie Berechtigungen für das Binden an den Port haben. Auf Linux können Sie \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" verwenden um Mattermost das Binden an Well Known Ports zu erlauben.", + "admin.service.listenDescription": "Die Adresse und Port an die gebunden und gehört wird. Bei Angabe von \":8065\" wird an alle Netzwerkkarten gebunden. Bei Angabe von \"127.0.0.1:8065\" wird nur an die Netzwerkkarte mit der IP-Adresse gebunden. Wenn Sie einen Port eines niedrigen Levels wählen (auch \"System-Ports\" oder \"Well Known Ports\" im Bereich 0-1023), müssen Sie Berechtigungen für das Binden an den Port haben. Auf Linux können Sie \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" verwenden um Mattermost das Binden an Well Known Ports zu erlauben.", "admin.service.listenExample": "Z.B.: \":8065\"", "admin.service.mfaDesc": "Wenn wahr, können Benutzer mit AD/LDAP- oder E-Mail-Anmeldung Multi-Faktor-Authentifizierung ihrem Konto mit Google-Authenticator hinzufügen.", "admin.service.mfaTitle": "Multi-Faktor-Authentifizierung einschalten:", @@ -1142,8 +1142,8 @@ "admin.service.sessionIdleTimeoutDesc": "Die Anzahl an Minuten zwischen der letzten Aktivität eines Benutzers im System und dem Ablaufen der Benutzersitzung. Einmal abgelaufen, muss sich der Benutzer erneut anmelden, um fortzufahren. Minimum ist 5 Minuten, 0 ist unbegrenzt.

Gilt für Desktop-App und Browser. Nutzen Sie für mobile Apps einen EMM-Anbieter, um die App zu sperren, wenn sie nicht verwendet wird. Im Hochverfügbarkeitsmodus IP-Hash Load-Balancing für verlässliche Timeout-Messung aktivieren.", "admin.service.sessionIdleTimeoutEx": "Z.B.: \"60\"", "admin.service.siteURL": "Seiten-URL:", - "admin.service.siteURLDescription": "The URL that users will use to access Mattermost. Standard ports, such as 80 and 443, can be omitted, but non-standard ports are required. For example: http://example.com:8065. This setting is required.

Mattermost may be hosted at a subpath. For example: http://example.com:8065/company/mattermost. A restart is required before the server will work correctly.", - "admin.service.siteURLExample": "E.g.: \"http://example.com:8065\"", + "admin.service.siteURLDescription": "Die URL, die Benutzer verwenden werden um auf Mattermost zuzugreifen. Standard-Ports wie 80 und 443 können ausgelassen werden, aber Nicht-Standard-Ports müssen eingetragen werden. Diese Einstellung wird benötigt.

Mattermost könnte auf einem Unterpfad gehostet werden. Zum Beispiel: http://beispiel.de:8065/firma/mattermost. Ein Neustart wird benötigt, bevor der Server korrekt arbeitet.", + "admin.service.siteURLExample": "Z.B.: \"http://example.com:8065\"", "admin.service.ssoSessionDays": "SSO-Sessiondauer (Tage):", "admin.service.ssoSessionDaysDesc": "Die Anzahl der Tage seit der letzten Anmeldung des Benutzers bis zum Ablauf der Sitzung. Wenn die Authentifizierungsmethode SAML oder GitLab ist, wird der Benutzer automatisch wieder angemeldet, sofern er noch bei SAML oder GitLab angemeldet ist. Bei Änderung dieser Einstellung tritt die neue Sitzungsdauer in Kraft nachdem der Benutzer sich das nächste Mal anmeldet.", "admin.service.testingDescription": "Wenn wahr, wird der /test Slash-Befehl aktiviert, um Testkonten, -daten und Textformatierungen zu laden. Änderung erfordern einen Server-Neustart, bevor sie in Kraft treten.", @@ -1204,7 +1204,7 @@ "admin.sidebar.oauth": "OAuth 2.0", "admin.sidebar.other": "ANDERE", "admin.sidebar.password": "Passwort", - "admin.sidebar.permissions": "Advanced Permissions", + "admin.sidebar.permissions": "Erweiterte Berechtigungen", "admin.sidebar.plugins": "Plugins (Beta)", "admin.sidebar.plugins.configuration": "Konfiguration", "admin.sidebar.plugins.management": "Verwaltung", @@ -1230,9 +1230,9 @@ "admin.sidebar.view_statistics": "Systemstatistiken", "admin.sidebar.webrtc": "WebRTC (Beta)", "admin.sidebarHeader.systemConsole": "Systemkonsole", - "admin.sql.connMaxLifetimeDescription": "Maximum lifetime (in milliseconds) for a connection to the database.", - "admin.sql.connMaxLifetimeExample": "Z.B.: \"10000\"", - "admin.sql.connMaxLifetimeTitle": "Maximum Connection Lifetime:", + "admin.sql.connMaxLifetimeDescription": "Maximale Lebenszeit (in Millisekunden) für eine Verbindung zur Datenbank.", + "admin.sql.connMaxLifetimeExample": "Z.B.: \"3600000\"", + "admin.sql.connMaxLifetimeTitle": "Maximale Verbindungs-Lebensdauer:", "admin.sql.dataSource": "Datenquelle:", "admin.sql.driverName": "Treibername:", "admin.sql.keyDescription": "32 Zeichen Salt zur Ver- und Entschlüsselung von sensitiven Feldern in der Datenbank.", @@ -1286,7 +1286,7 @@ "admin.team.dirTitle": "Team Verzeichnis aktivieren: ", "admin.team.enableConfirmNotificationsToChannelDescription": "Wenn wahr, müssen Benutzer bestätigen, wenn sie @channel und @all in Kanälen mit mehr als fünf Mitgliedern verwenden. Wenn falsch, ist keine Bestätigung erforderlich.", "admin.team.enableConfirmNotificationsToChannelTitle": "Zeige den @channel- und @all-Bestätigungsdialog: ", - "admin.team.maxChannelsDescription": "Maximale Anzahl an Kanälen pro Team, inklusive aktiven und gelöschten Kanälen.", + "admin.team.maxChannelsDescription": "Maximale Anzahl an Kanälen pro Team, inklusive aktiven und archivierten Kanälen.", "admin.team.maxChannelsExample": "Z.B.: \"100\"", "admin.team.maxChannelsTitle": "Maximal Kanäle pro Team:", "admin.team.maxNotificationsPerChannelDescription": "Maximale Anzahl von Benutzern in einem Kanal bis Benutzer mit @all,@here und @channel keine Benachrichtigungen aufgrund von Performance auslösen können.", @@ -1346,7 +1346,7 @@ "admin.user_item.member": "Mitglied", "admin.user_item.mfaNo": "MFA: Nein", "admin.user_item.mfaYes": "MFA: Ja", - "admin.user_item.resetEmail": "E-Mail erneut senden", + "admin.user_item.resetEmail": "E-Mail zurücksetzen", "admin.user_item.resetMfa": "MFA entfernen", "admin.user_item.resetPwd": "Passwort zurücksetzen", "admin.user_item.revokeSessions": "Sitzung zurückziehen", @@ -1448,7 +1448,7 @@ "audit_table.attemptedAllowOAuthAccess": "Versuchte einen neuen OAuth Service Zugriff zu erlauben", "audit_table.attemptedLicenseAdd": "Versuchte eine neue Lizenz hinzuzufügen", "audit_table.attemptedLogin": "Versuchte anzumelden", - "audit_table.attemptedOAuthToken": "Versuchte einen OAuth Zugangstoken zu erhalten", + "audit_table.attemptedOAuthToken": "Versuchte ein OAuth-Zugangstoken abzurufen", "audit_table.attemptedPassword": "Versuchte das Passwort zu ändern", "audit_table.attemptedRegisterApp": "Versuchte eine neue OAuth-Anwendung mit der ID {id} zu registrieren", "audit_table.attemptedReset": "Versuchte das Passwort zurückzusetzen", @@ -1458,7 +1458,7 @@ "audit_table.by": " von {username}", "audit_table.byAdmin": " von einem Administrator", "audit_table.channelCreated": "Kanal {channelName} wurde erstellt", - "audit_table.channelDeleted": "Kanal mit der URL {url} wurde gelöscht", + "audit_table.channelDeleted": "Kanal mit der URL {url} wurde archiviert", "audit_table.establishedDM": "Ein Kanal für Direktnachrichten an {username} wurde aufgebaut", "audit_table.failedExpiredLicenseAdd": "Neue Lizenz wurde nicht hinzugefügt weil diese entweder abgelaufen oder noch nicht begonnen hat", "audit_table.failedInvalidLicenseAdd": "Ungültige Lizenz wurde nicht hinzugefügt", @@ -1475,7 +1475,7 @@ "audit_table.logout": "Von Ihren Zugang abgemeldet", "audit_table.member": "Mitglied", "audit_table.nameUpdated": "Name des Kanals {channelName} aktualisiert", - "audit_table.oauthTokenFailed": "Fehler beim Laden des OAuth Access Token - {token}", + "audit_table.oauthTokenFailed": "Fehler beim Abruf des OAuth-Access-Token - {token}", "audit_table.revokedAll": "Alle aktuellen Sitzungen für das Team zurückgezogen", "audit_table.sentEmail": "Es wurde eine E-Mail an {email} gesendet um das Passwort zurückzusetzen", "audit_table.session": "Sitzungs-ID", @@ -1512,7 +1512,7 @@ "backstage_sidebar.integrations.outgoing_webhooks": "Ausgehende Webhooks", "calling_screen": "Rufe an", "center_panel.recent": "Hier klicken, um zu neuesten Mitteilungen zu springen. ", - "center_panel.recent.icon": "Zu neuesten Mitteilungen springen", + "center_panel.recent.icon": "\"Zu neuesten Mitteilungen springen\"-Symbol", "change_url.close": "Schließen", "change_url.endWithLetter": "Die URL muss mit einem Buchstaben oder einer Zahl enden.", "change_url.invalidUrl": "Ungültige URL", @@ -1536,7 +1536,7 @@ "channel_header.channelHeader": "Kanalüberschrift bearbeiten", "channel_header.channelMembers": "Mitglieder", "channel_header.convert": "In privaten Kanal umwandeln", - "channel_header.delete": "Archive Channel", + "channel_header.delete": "Kanal archivieren", "channel_header.directchannel.you": "{displayname} (Sie) ", "channel_header.flagged": "Markierte Nachrichten", "channel_header.leave": "Kanal verlassen", @@ -1711,7 +1711,7 @@ "create_post.comment": "Kommentar", "create_post.deactivated": "Sie betrachten einen archivierten Kanal mit einem deaktivierten Benutzer.", "create_post.error_message": "Ihre Nachricht ist zu lang. Zeichenanzahl: {length}/{limit}", - "create_post.icon": "Send Post Icon", + "create_post.icon": "\"Nachricht absenden\"-Symbol", "create_post.post": "Senden", "create_post.read_only": "Dieser Kanal ist schreibgeschützt. Nur berechtigte Mitglieder können hier schreiben.", "create_post.shortcutsNotSupported": "Tastaturkürzel werden auf Ihrem Gerät nicht unterstützt.", @@ -1744,9 +1744,9 @@ "deactivate_member_modal.title": "{username} deaktivieren", "default_channel.purpose": "Senden Sie Nachrichten hier, die jeder sehen können soll. Jeder wird automatisch ein permanentes Mitglied in diesem Kanal wenn Sie dem Team beitreten.", "delete_channel.cancel": "Abbrechen", - "delete_channel.confirm": "Confirm ARCHIVE Channel", - "delete_channel.del": "Archive", - "delete_channel.question": "Dies wird den Kanal aus dem Team löschen und die Inhalte für alle Benutzer unzugänglich machen.

Sind Sie sich sicher, dass Sie den Kanal {display_name} löschen möchten?", + "delete_channel.confirm": "ARCHIVIERUNG des Kanals bestätigen", + "delete_channel.del": "Archivieren", + "delete_channel.question": "Dies wird den Kanal aus dem Team archivieren und die Inhalte für alle Benutzer unzugänglich machen.

Sind Sie sich sicher, dass Sie den Kanal {display_name} archivieren möchten?", "delete_post.cancel": "Abbrechen", "delete_post.comment": "Kommentar", "delete_post.confirm": "Bestätige Löschung von {term}", @@ -1754,10 +1754,10 @@ "delete_post.post": "Nachricht", "delete_post.question": "Sind Sie sicher, dass Sie diese(n) {term} löschen möchten?", "delete_post.warning": "Diese Nachricht hat {count, number} {count, plural, one {Kommentar} other {Kommentare}}.", - "device_icons.android": "Android Icon", - "device_icons.apple": "Apple Icon", - "device_icons.linux": "Linux Icon", - "device_icons.windows": "Windows Icon", + "device_icons.android": "Android-Symbol", + "device_icons.apple": "Apple-Symbol", + "device_icons.linux": "Linux-Symbol", + "device_icons.windows": "Windows-Symbol", "discard_changes_modal.leave": "Ja, verwerfen", "discard_changes_modal.message": "Sie haben nicht gespeicherte Änderungen, möchten Sie diese wirklich verwerfen?", "discard_changes_modal.title": "Änderungen verwerfen?", @@ -1781,7 +1781,7 @@ "edit_post.edit": "{title} bearbeiten", "edit_post.editPost": "Nachricht bearbeiten...", "edit_post.save": "Speichern", - "edit_post.time_limit_button.for_n_seconds": "⚙ Für {n} Sekunden", + "edit_post.time_limit_button.for_n_seconds": "Für {n} Sekunden", "edit_post.time_limit_button.no_limit": "Jederzeit", "edit_post.time_limit_modal.description": "Einstellung des Zeitlimits wird auf alle Benutzer angewendet, die die Berechtigung \"Nachricht bearbeiten\" besitzen.", "edit_post.time_limit_modal.invalid_time_limit": "Ungültiges Zeitlimit", @@ -1827,13 +1827,13 @@ "emoji_picker.people": "Leute", "emoji_picker.places": "Orte", "emoji_picker.recent": "Zuletzt verwendet", - "emoji_picker.search": "Search Emoji", + "emoji_picker.search": "Emoji suchen", "emoji_picker.searchResults": "Suchergebnisse", "emoji_picker.symbols": "Symbole", "ent.cluster.save_config_with_roles.error": "Die folgenden Konfigurationseinstellungen können nicht gespeichert werden, wenn der Hochverfügbarkeitsmodus aktiviert und die Systemkonsole im schreibgeschützten Modus ist: {keys}.", - "error.channelNotFound.link": "Back to {defaultChannelName}", - "error.channel_not_found.message": "The channel you're requesting is private or does not exist. Please contact an Administrator to be added to the channel.", - "error.channel_not_found.title": "Channel Not Found", + "error.channelNotFound.link": "Zurück zu {defaultChannelName}", + "error.channel_not_found.message": "Der Kanal, den Sie anfordern ist privat oder existiert nicht. Bitte kontaktieren sie einen Administrator, um dem Kanal hinzugefügt zu werden.", + "error.channel_not_found.title": "Kanal nicht gefunden", "error.generic.link": "Zurück zu {siteName}", "error.generic.link_message": "Zurück zu {siteName}", "error.generic.message": "Ein Fehler ist aufgetreten.", @@ -1856,8 +1856,8 @@ "error.oauth_missing_code.office365": "Für {link} stellen Sie bitte sicher, dass der Administrator ihrer Microsoft-Organisation die Mattermost-App aktiviert hat.", "error.oauth_missing_code.office365.link": "Office 365", "error.oauth_missing_code.title": "Mattermost benötigt ihre Hilfe", - "error.team_not_found.message": "The team you're requesting is private or does not exist. Please contact your Administrator for an invitation.", - "error.team_not_found.title": "Team Not Found", + "error.team_not_found.message": "Das Team, das Sie anfordern ist privat oder existiert nicht. Bitte kontaktieren sie einen Administrator, um dem Team hinzugefügt zu werden.", + "error.team_not_found.title": "Team nicht gefunden", "error_bar.apiv3_enabled": "API-Version 3 ist veraltet und für die Entfernung vorgemerkt. Lernen Sie, wie Sie zur APIv4 migrieren.", "error_bar.expired": "Enterprise-Lizenz ist abgelaufen und einige Funktionen wurden evtl. deaktiviert. Bitte erneuern.", "error_bar.expiring": "Enterprise-Lizenz läuft am {date} ab. Bitte erneuern.", @@ -1924,50 +1924,50 @@ "general_tab.teamNameRestrictions": "Name muss {min} oder mehr und maximal {max} Zeichen lang sein. Sie können eine längere Teambeschreibung hinzufügen.", "general_tab.title": "Allgemeine Einstellungen", "general_tab.yes": "Ja", - "generic_icons.add": "Add Icon", - "generic_icons.archive": "Archive Icon", - "generic_icons.arrow.down": "Down Arrow Icon", - "generic_icons.arrow.up": "Up Arrow Icon", - "generic_icons.attach": "Attachment Icon", - "generic_icons.back": "Back Icon", - "generic_icons.breadcrumb": "Breadcrumb Icon", - "generic_icons.channel.private": "Privater Kanal", - "generic_icons.channel.public": "Public Channel Icon", - "generic_icons.collapse": "Collapse Icon", - "generic_icons.download": "Download Icon", - "generic_icons.dropdown": "Dropdown Icon", - "generic_icons.edit": "Edit Icon", - "generic_icons.email": "Email Icon", - "generic_icons.expand": "Expand Icon", - "generic_icons.failure": "Failure Icon", - "generic_icons.flag": "Flag Icon", - "generic_icons.flagged": "Flagged Icon", - "generic_icons.help": "Help Icon", - "generic_icons.info": "Info Icon", - "generic_icons.join": "Join Icon", - "generic_icons.loading": "Loading Icon", - "generic_icons.logout": "Logout Icon", - "generic_icons.mattermost": "Mattermost Logo", - "generic_icons.member": "Member Icon", - "generic_icons.mention": "Mention Icon", - "generic_icons.menu": "Menu Icon", - "generic_icons.message": "Message Icon", - "generic_icons.muted": "Muted Icon", - "generic_icons.next": "Next Icon", - "generic_icons.pin": "Pin Icon", - "generic_icons.previous": "Previous Icon", - "generic_icons.reload": "Reload Icon", - "generic_icons.remove": "Remove Icon", - "generic_icons.reply": "Reply Icon", - "generic_icons.report": "Report Icon", - "generic_icons.search": "Search Icon", - "generic_icons.searching": "Searching Icon", - "generic_icons.select": "Select Icon", - "generic_icons.settings": "Settings Icon", - "generic_icons.success": "Success Icon", - "generic_icons.testing": "Testing Icon", - "generic_icons.upload": "Upload Icon", - "generic_icons.warning": "Warning Icon", + "generic_icons.add": "Hinzufügen-Symbol", + "generic_icons.archive": "Archivieren-Symbol", + "generic_icons.arrow.down": "\"Pfeil nach unten\"-Symbol", + "generic_icons.arrow.up": "\"Pfeil nach oben\"-Symbol", + "generic_icons.attach": "Anhang-Symbol", + "generic_icons.back": "Zurück-Symbol", + "generic_icons.breadcrumb": "Brotkrumennavigation-Symbol", + "generic_icons.channel.private": "\"Privater Kanal\"-Symbol", + "generic_icons.channel.public": "\"Öffentlicher Kanal\"-Symbol", + "generic_icons.collapse": "Zusammenklappen-Symbol", + "generic_icons.download": "Download-Symbol", + "generic_icons.dropdown": "Dropdown-Symbol", + "generic_icons.edit": "Bearbeiten-Symbol", + "generic_icons.email": "E-Mail-Symbol", + "generic_icons.expand": "Erweitern-Symbol", + "generic_icons.failure": "Fehler-Symbol", + "generic_icons.flag": "Markieren-Symbol", + "generic_icons.flagged": "Markiert-Symbol", + "generic_icons.help": "Hilfe-Symbol", + "generic_icons.info": "Info-Symbol", + "generic_icons.join": "Beitreten-Symbol", + "generic_icons.loading": "Laden-Symbol", + "generic_icons.logout": "Abmelden-Symbol", + "generic_icons.mattermost": "Mattermost-Logo", + "generic_icons.member": "Mitglied-Symbol", + "generic_icons.mention": "Erwähnung-Symbol", + "generic_icons.menu": "Menü-Symbol", + "generic_icons.message": "Nachricht-Symbol", + "generic_icons.muted": "Stummgeschaltet-Symbol", + "generic_icons.next": "Nächstes-Symbol", + "generic_icons.pin": "Pin-Symbol", + "generic_icons.previous": "Vorheriges-Symbol", + "generic_icons.reload": "\"Neu laden\"-Symbol", + "generic_icons.remove": "Entfernen-Symbol", + "generic_icons.reply": "Antworten-Symbol", + "generic_icons.report": "Melden-Symbol", + "generic_icons.search": "Such-Symbol", + "generic_icons.searching": "Suchen-Symbol", + "generic_icons.select": "Auswählen-Symbol", + "generic_icons.settings": "Einstellungen-Symbol", + "generic_icons.success": "Erfolg-Symbol", + "generic_icons.testing": "Testen-Symbol", + "generic_icons.upload": "Hochladen-Symbol", + "generic_icons.warning": "Warnung-Symbol", "get_app.alreadyHaveIt": "Haben Sie bereits?", "get_app.androidAppName": "Mattermost für Android", "get_app.androidHeader": "Mattermost funktioniert am besten, wenn Sie unsere Android-App benutzen", @@ -2027,7 +2027,7 @@ "help.formatting.headings2Example": "Große Überschrift\n--------------", "help.formatting.headingsExample": "## Große Überschrift\n### Kleinere Überschrift\n#### Noch kleinere Überschrift", "help.formatting.images": "## Eingebettete Bilder\n\nErstellen Sie eingebettete Bilder durch `!`gefolgt vom alternativen Text in eckigen Klammern und einem Link in normalen Klammern. Fügen Sie einen Hover Text hinzu, indem Sie diesen in Anführungszeichen nach dem Link schreiben.", - "help.formatting.imagesExample": "![Alternativer Text](Link \"Hover Text\")\n\nund\n\n[![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform) [![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)", + "help.formatting.imagesExample": "![Alternativer Text](Link \"Hover Text\")\n\nund\n\n[![Build Status](https://travis-ci.org/mattermost/mattermost-server.svg?branch=master)](https://travis-ci.org/mattermost/mattermost-server) [![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/mattermost-server)", "help.formatting.inline": "## Eingebetteter Code\n\nErstellen Sie eingebetteten Monospaced Font durch die Verwendung von Backticks vor und nach dem Code.", "help.formatting.intro": "Markdown macht es einfach Nachrichten zu formatieren. Schreiben Sie Nachrichten wie Sie es normalerweise Tun würden und verwenden diese Regeln um ihn zu formatieren.", "help.formatting.lines": "## Linien\n\nErstellen Sie eine Linie durch drei `*`, `_`oder `-`.", @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "Ankündigung", "mobile.channel.markAsRead": "Als gelesen markieren", "mobile.channel_drawer.search": "Springe zu...", - "mobile.channel_info.alertMessageDeleteChannel": "Sind Sie sicher, dass Sie den {term} {name} löschen möchten?", + "mobile.channel_info.alertMessageDeleteChannel": "Sind Sie sicher, dass Sie den {term} {name} archivieren möchten?", "mobile.channel_info.alertMessageLeaveChannel": "Sind Sie sicher, dass Sie den {term} {name} verlassen möchten?", "mobile.channel_info.alertNo": "Nein", - "mobile.channel_info.alertTitleDeleteChannel": "{term} löschen", + "mobile.channel_info.alertTitleDeleteChannel": "{term} archivieren", "mobile.channel_info.alertTitleLeaveChannel": "{term} verlassen", "mobile.channel_info.alertYes": "Ja", - "mobile.channel_info.delete_failed": "Der Kanal {displayName} konnte nicht gelöscht werden. Bitte überprüfen Sie Ihre Verbindung und versuchen es erneut.", + "mobile.channel_info.delete_failed": "Der Kanal {displayName} konnte nicht archiviert werden. Bitte überprüfen Sie Ihre Verbindung und versuchen es erneut.", "mobile.channel_info.edit": "Kanal bearbeiten", "mobile.channel_info.privateChannel": "Privater Kanal", "mobile.channel_info.publicChannel": "Öffentlicher Kanal", @@ -2473,8 +2473,8 @@ "mobile.notification_settings.auto_responder.enabled": "Aktiviert", "mobile.notification_settings.auto_responder.footer_message": "Stellen Sie eine individuelle Nachricht ein, die als Antwort auf Direktnachrichten gesendet wird. Erwähnungen in öffentlichen oder privaten Kanälen werden keine automatische Nachricht auslösen. Das Aktivieren automatische Nachrichten setzt ihren Status auf \"Nicht im Büro\" und deaktiviert E-Mail- und Push-Benachrichtigungen.", "mobile.notification_settings.auto_responder.message_placeholder": "Nachricht", - "mobile.notification_settings.auto_responder.message_title": "CUSTOM MESSAGE", - "mobile.notification_settings.auto_responder_short": "Automatic Replies", + "mobile.notification_settings.auto_responder.message_title": "EIGENE NACHRICHT", + "mobile.notification_settings.auto_responder_short": "Automatische Antworten", "mobile.notification_settings.email": "E-Mail", "mobile.notification_settings.email_title": "E-Mail-Benachrichtigungen", "mobile.notification_settings.mentions.channelWide": "Kanalweite Erwähnungen", @@ -2538,11 +2538,11 @@ "mobile.request.invalid_response": "Ungültige Antwort vom Server erhalten.", "mobile.reset_status.alert_cancel": "Abbrechen", "mobile.reset_status.alert_ok": "Ok", - "mobile.reset_status.title_ooo": "Disable \"Out Of Office\"?", + "mobile.reset_status.title_ooo": "\"Nicht im Büro\" deaktivieren?", "mobile.retry_message": "Aktualisierung der Nachrichten fehlgeschlagen. Nach oben ziehen, um erneut zu versuchen.", "mobile.routes.channelInfo": "Info", "mobile.routes.channelInfo.createdBy": "Erstellt durch {creator} am ", - "mobile.routes.channelInfo.delete_channel": "Kanal löschen", + "mobile.routes.channelInfo.delete_channel": "Kanal archivieren", "mobile.routes.channelInfo.favorite": "Favoriten", "mobile.routes.channel_members.action": "Mitglieder entfernen", "mobile.routes.channel_members.action_message": "Sie müssen mindestens ein Mitglied auswählen.", @@ -2566,7 +2566,7 @@ "mobile.routes.thread": "{channelName} Diskussion", "mobile.routes.thread_dm": "Direktnachrichten-Diskussion", "mobile.routes.user_profile": "Profil", - "mobile.routes.user_profile.local_time": "LOCAL TIME", + "mobile.routes.user_profile.local_time": "LOKALE ZEIT", "mobile.routes.user_profile.send_message": "Nachricht senden", "mobile.search.from_modifier_description": "um Nachrichten von spezifischen Benutzern zu finden", "mobile.search.from_modifier_title": "Benutzername", @@ -2585,13 +2585,13 @@ "mobile.server_url.invalid_format": "URL muss mit http:// oder https:// beginnen", "mobile.session_expired": "Sitzung abgelaufen: Bitte anmelden um weiterhin Benachrichtigungen zu erhalten.", "mobile.set_status.away": "Abwesend", - "mobile.set_status.away.icon": "Away Icon", + "mobile.set_status.away.icon": "Abwesend-Symbol", "mobile.set_status.dnd": "Nicht stören", - "mobile.set_status.dnd.icon": "\"Nicht stören\"-Anzeige", + "mobile.set_status.dnd.icon": "\"Nicht stören\"-Symbol", "mobile.set_status.offline": "Offline", - "mobile.set_status.offline.icon": "Offline Icon", + "mobile.set_status.offline.icon": "Offline-Symbol", "mobile.set_status.online": "Online", - "mobile.set_status.online.icon": "Online Icon", + "mobile.set_status.online.icon": "Online-Symbol", "mobile.settings.clear": "Offline-Speicher leeren", "mobile.settings.clear_button": "Leeren", "mobile.settings.clear_message": "\nDies wird alle gespeicherten Offlinedaten löschen und die Anwendung neustarten. Sie werden automatisch wieder angemeldet, sobald die App neugestartet wurde.\n", @@ -2602,13 +2602,14 @@ "mobile.share_extension.error_close": "Schließen", "mobile.share_extension.error_message": "Es ist ein Fehler bei der Verwendung der Teilen-Erweiterung aufgetreten.", "mobile.share_extension.error_title": "Erweiterungs-Fehler", - "mobile.share_extension.post_error": "An error has occurred while posting the message. Please try again.", + "mobile.share_extension.post_error": "Fehler beim Senden der Nachricht. Bitte erneut versuchen.", "mobile.share_extension.send": "Senden", "mobile.share_extension.team": "Team", "mobile.suggestion.members": "Mitglieder", "mobile.timezone_settings.automatically": "Automatisch einstellen", "mobile.timezone_settings.manual": "Zeitzone ändern", - "mobile.timezone_settings.select": "Select Timezone", + "mobile.timezone_settings.select": "Zeitzone auswählen", + "mobile.user.settings.notifications.email.fifteenMinutes": "Alle 15 Minuten", "mobile.video.save_error_message": "Um das Video zu speichern, müssen Sie es zuerst herunterladen.", "mobile.video.save_error_title": "Fehler beim Speichern des Videos", "mobile.video_playback.failed_description": "Beim Abspielen des Videos ist ein Fehler aufgetreten.\n", @@ -2667,7 +2668,7 @@ "navbar.addMembers": "Mitglieder hinzufügen", "navbar.click": "Klicken Sie hier", "navbar.clickToAddHeader": "{clickHere} zum Hinzufügen.", - "navbar.delete": "Archive Channel...", + "navbar.delete": "Kanal archivieren...", "navbar.leave": "Kanal verlassen", "navbar.manageMembers": "Mitglieder verwalten", "navbar.noHeader": "Noch keine Kanalüberschrift.", @@ -2684,16 +2685,16 @@ "navbar_dropdown.addMemberToTeam": "Mitglieder zum Team hinzufügen", "navbar_dropdown.console": "Systemkonsole", "navbar_dropdown.create": "Neues Team erstellen", - "navbar_dropdown.create.icon": "Neues Team erstellen", + "navbar_dropdown.create.icon": "Neues Team-Symbol erstellen", "navbar_dropdown.emoji": "Eigene Emojis", "navbar_dropdown.help": "Hilfe", "navbar_dropdown.integrations": "Integrationen", "navbar_dropdown.inviteMember": "E-Mail-Einladung versenden", "navbar_dropdown.join": "Einem anderen Team beitreten", - "navbar_dropdown.join.icon": "Einem anderen Team beitreten", + "navbar_dropdown.join.icon": "\"Einem anderen Team beitreten\"-Symbol", "navbar_dropdown.keyboardShortcuts": "Tastaturkürzel", "navbar_dropdown.leave": "Team verlassen", - "navbar_dropdown.leave.icon": "Leave Team Icon", + "navbar_dropdown.leave.icon": "\"Team verlassen\"-Symbol", "navbar_dropdown.logout": "Abmelden", "navbar_dropdown.manageMembers": "Mitglieder verwalten", "navbar_dropdown.nativeApps": "Apps herunterladen", @@ -2749,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "Löschen", "post_info.edit": "Bearbeiten", + "post_info.message.show_less": "Weniger anzeigen", + "post_info.message.show_more": "Mehr anzeigen", "post_info.message.visible": "(Nur für Sie sichtbar)", "post_info.message.visible.compact": " (Nur für Sie sichtbar)", "post_info.mobile.flag": "Markieren", @@ -2818,12 +2821,12 @@ "rhs_header.backToResultsTooltip": "Zurück zu den Suchergebnissen", "rhs_header.closeSidebarTooltip": "Seitenleiste schließen", "rhs_header.closeTooltip": "Seitenleiste schließen", - "rhs_header.closeTooltip.icon": "Close Sidebar Icon", + "rhs_header.closeTooltip.icon": "\"Seitenleiste schließen\"-Symbol", "rhs_header.details": "Nachrichtendetails", "rhs_header.expandSidebarTooltip": "Seitenleiste erweitern", - "rhs_header.expandSidebarTooltip.icon": "Expand Sidebar Icon", + "rhs_header.expandSidebarTooltip.icon": "\"Seitenleiste erweitern\"-Symbol", "rhs_header.expandTooltip": "Seitenleiste verkleinern", - "rhs_header.expandTooltip.icon": "Shrink Sidebar Icon", + "rhs_header.expandTooltip.icon": "\"Seitenleiste schrumpfen\"-Symbol", "rhs_header.shrinkSidebarTooltip": "Seitenleiste verkleinern", "rhs_root.del": "Löschen", "rhs_root.direct": "Direktnachricht", @@ -2861,8 +2864,8 @@ "search_results.usagePin2": "Alle Mitglieder dieses Kanals können wichtige oder nützliche Nachrichten anheften.", "search_results.usagePin3": "Angeheftete Nachrichten sind für alle Kanalmitglieder sichtbar.", "search_results.usagePin4": "Um eine Nachricht anzuheften: Gehen Sie auf die Nachricht welche Sie anheften wollen, klicken auf [...] > \"An Kanal anheften\".", - "select_team.icon": "Select Team Icon", - "select_team.join.icon": "Join Team Icon", + "select_team.icon": "\"Team auswählen\"-Symbol", + "select_team.join.icon": "\"Team beitreten\"-Symbol", "select_team.title": "Team auswählen", "setting_item_max.cancel": "Abbrechen", "setting_item_max.save": "Speichern", @@ -2948,34 +2951,34 @@ "sidebar_header.tutorial": "

Hauptmenü

Über das Hauptmenükönnen Sie neue Teammitglieder einladen, auf Ihre Benutzereinstellungen zugreifen und Ihre Motiv Farbe ändern.

Teamadministratoren können außerdem auf die Team Einstellungen zugreifen.

Systemadministratoren werden eine System Konsole Option für die Administration des kompletten Systems finden.

", "sidebar_right_menu.accountSettings": "Kontoeinstellungen", "sidebar_right_menu.addMemberToTeam": "Mitglieder zum Team hinzufügen", - "sidebar_right_menu.addMemberToTeam.icon": "Mitglieder zum Team hinzufügen", + "sidebar_right_menu.addMemberToTeam.icon": "\"Mitglieder zum Team hinzufügen\"-Symbol", "sidebar_right_menu.console": "Systemkonsole", - "sidebar_right_menu.console.icon": "System Console Icon", + "sidebar_right_menu.console.icon": "Systemkonsole-Symbol", "sidebar_right_menu.flagged": "Markierte Nachrichten", "sidebar_right_menu.help": "Hilfe", "sidebar_right_menu.inviteNew": "E-Mail-Einladung versenden", - "sidebar_right_menu.inviteNew.icon": "E-Mail-Einladung versenden", + "sidebar_right_menu.inviteNew.icon": "\"E-Mail-Einladung versenden\"-Symbol", "sidebar_right_menu.logout": "Abmelden", "sidebar_right_menu.manageMembers": "Mitglieder verwalten", "sidebar_right_menu.nativeApps": "Apps herunterladen", - "sidebar_right_menu.nativeApps.icon": "Native Apps Icon", + "sidebar_right_menu.nativeApps.icon": "\"Native Apps\"-Symbol", "sidebar_right_menu.recentMentions": "Kürzliche Erwähnungen", "sidebar_right_menu.report": "Fehler melden", "sidebar_right_menu.teamLink": "Team-Einladungslink erhalten", - "sidebar_right_menu.teamLink.icon": "Team-Einladungslink abrufen", + "sidebar_right_menu.teamLink.icon": "\"Team-Einladungslink abrufen\"-Symbol", "sidebar_right_menu.teamSettings": "Teameinstellungen", "sidebar_right_menu.viewMembers": "Zeige Mitglieder", "signup.email": "E-Mail-Adresse und Passwort", - "signup.email.icon": "Email Icon", + "signup.email.icon": "\"E-Mail\"-Symbol", "signup.gitlab": "GitLab Single-Sign-On", - "signup.gitlab.icon": "GitLab Icon", + "signup.gitlab.icon": "GitLab-Symbol", "signup.google": "Googl-Konto", - "signup.google.icon": "Google Icon", + "signup.google.icon": "Google-Symbol", "signup.ldap": "AD/LDAP-Zugangsdaten", - "signup.ldap.icon": "AD/LDAP-ID", + "signup.ldap.icon": "AD/LDAP-Symbol", "signup.office365": "Office 365", - "signup.office365.icon": "Office 365 Icon", - "signup.saml.icon": "SAML Icon", + "signup.office365.icon": "\"Office 365\"-Symbol", + "signup.saml.icon": "SAML-Symbol", "signup.title": "Ein Konto erstellen mit:", "signup_team.createTeam": "Oder erstellen Sie ein Team", "signup_team.disabled": "Teamerstellung wurde deaktiviert. Bitte kontaktieren Sie einen Administrator.", @@ -3044,7 +3047,7 @@ "suggestion.search.private": "Private Kanäle", "suggestion.search.public": "Öffentliche Kanäle", "system_notice.adminVisible": "Nur sichtbar für Systemadministratoren", - "system_notice.adminVisible.icon": "Nur sichtbar für Systemadministratoren", + "system_notice.adminVisible.icon": "\"Nur sichtbar für Systemadministratoren\"-Symbol", "system_notice.body.api3": "Falls Sie innerhalb der letzten zwei Jahre Erweiterungen erstellt oder installiert haben, finden Sie heraus, wie kürzliche Änderungen diese beeinflusst haben könnten.", "system_notice.body.permissions": "Einige Systemeinstellungen zu Richtlinien und Berechtigungen wurden mit der Veröffentlichung der erweiterten Berechtigungen in Enterprise E10 und E20 verschoben.", "system_notice.dont_show": "Nicht erneut anzeigen", @@ -3134,7 +3137,7 @@ "user.settings.advance.enabledFeatures": "{count, number} {count, plural, one {Funktion} other {Funktionen}} aktiviert", "user.settings.advance.formattingDesc": "Wenn aktiviert, werden Nachrichten so formatiert, dass Links erstellt, Emojis angezeigt, Text formatiert und Zeilenumbrüche hinzugefügt werden. Standardmäßig ist dies aktiviert. Ändern der Einstellung erfordert ein Neuladen der Seite.", "user.settings.advance.formattingTitle": "Formatierung von Nachrichten aktivieren", - "user.settings.advance.icon": "Erweiterte Einstellungen", + "user.settings.advance.icon": "\"Erweiterte Einstellungen\"-Symbol", "user.settings.advance.joinLeaveDesc": "Wenn \"Ein\" werden Systemnachrichten angezeigt wenn ein Benutzer einen Kanal betritt oder verlässt. Wenn \"Aus\" werden diese Nachrichten nicht angezeigt. Es wird weiterhin eine Meldung angezeigt wenn Sie einem Kanal hinzugefügt werden sodass Sie Benachrichtigungen erhalten können.", "user.settings.advance.joinLeaveTitle": "Aktiviere Betreten-/Verlassen-Nachrichten", "user.settings.advance.markdown_preview": "Zeige Markdown-Vorschauoption im Nachrichteneingabefeld", @@ -3181,7 +3184,7 @@ "user.settings.display.collapseOn": "Ausgeklappt", "user.settings.display.fixedWidthCentered": "Feste Breite, zentriert", "user.settings.display.fullScreen": "Ganze Breite", - "user.settings.display.icon": "Anzeigeeinstellungen", + "user.settings.display.icon": "Anzeigeeinstellungen-Symbol", "user.settings.display.language": "Sprache", "user.settings.display.linkPreviewDesc": "Falls verfügbar, wird der erste Link in einer Nachricht als Vorschau des Webseiteninhaltes unterhalb der Nachricht angezeigt.", "user.settings.display.linkPreviewDisplay": "Webseitenvorschauen", @@ -3234,7 +3237,7 @@ "user.settings.general.field_handled_externally": "Dieses Feld wird durch Ihren Login Provider festgelegt. Wenn Sie es ändern möchten, müssen Sie dies durch den Login Provider tun.", "user.settings.general.firstName": "Vorname", "user.settings.general.fullName": "Vollständiger Name", - "user.settings.general.icon": "Allgemeine Einstellungen", + "user.settings.general.icon": "\"Allgemeine Einstellungen\"-Symbol", "user.settings.general.imageTooLarge": "Das Bild konnte nicht hochgeladen werden. Datei ist zu groß.", "user.settings.general.imageUpdated": "Bild zuletzt aktualisiert am {date}", "user.settings.general.lastName": "Nachname", @@ -3326,7 +3329,7 @@ "user.settings.notifications.emailInfo": "E-Mail-Benachrichtigungen werden bei Erwähnungen und Direktnachrichten gesendet, sobald Sie von {siteName} mehr als 5 Minuten offline oder abwesend waren.", "user.settings.notifications.emailNotifications": "E-Mail-Benachrichtigung", "user.settings.notifications.header": "Benachrichtigungen", - "user.settings.notifications.icon": "Benachrichtigungseinstellungen", + "user.settings.notifications.icon": "Benachrichtigungseinstellungen-Symbol", "user.settings.notifications.info": "Desktop-Benachrichtigungen sind in Edge, Firefox, Safari, Chrome und Mattermost-Desktop-Apps verfügbar.", "user.settings.notifications.mentionsInfo": "Erwähnungen werden ausgelöst, sobald jemand eine Nachricht versendet, welche Ihren Benutzernamen (\"@{username}\") oder irgendeine der oben gewählten Optionen enthält.", "user.settings.notifications.never": "Nie", @@ -3370,7 +3373,7 @@ "user.settings.security.emailPwd": "E-Mail-Adresse und Passwort", "user.settings.security.gitlab": "GitLab", "user.settings.security.google": "Google", - "user.settings.security.icon": "Sicherheitseinstellungen", + "user.settings.security.icon": "Sicherheitseinstellungen-Symbol", "user.settings.security.inactive": "Inaktiv", "user.settings.security.lastUpdated": "Zuletzt aktualisiert am {date} um {time} Uhr", "user.settings.security.ldap": "AD/LDAP", @@ -3380,7 +3383,7 @@ "user.settings.security.loginOffice365": "Anmeldung via Office 365", "user.settings.security.loginSaml": "Anmeldung durchgeführt durch SAML", "user.settings.security.logoutActiveSessions": "Zeigen und beenden von aktiven Sitzungen", - "user.settings.security.logoutActiveSessions.icon": "Aktive Sitzungen", + "user.settings.security.logoutActiveSessions.icon": "\"Aktive Sitzungen\"-Symbol", "user.settings.security.method": "Anmeldemethode", "user.settings.security.newPassword": "Neues Passwort", "user.settings.security.noApps": "Es sind keine OAuth-2.0-Anwendungen autorisiert.", @@ -3423,11 +3426,11 @@ "user.settings.security.switchSaml": "Wechsel auf SAML SSO", "user.settings.security.title": "Sicherheitseinstellungen", "user.settings.security.viewHistory": "Zeige Zugriffshistorie", - "user.settings.security.viewHistory.icon": "Access History Icon", + "user.settings.security.viewHistory.icon": "Zugriffshistorie-Symbol", "user.settings.sidebar.after_seven_days": "Nach 7 Tagen ohne neue Nachrichten", "user.settings.sidebar.autoCloseDMDesc": "Direktnachrichtenkonversationen können mit dem \"+\"-Knopf in der Seitenleiste oder durch Verwendung des Kanalwechslers (STRG+K) erneut geöffnet werden.", "user.settings.sidebar.autoCloseDMTitle": "Direktnachrichten automatisch schließen", - "user.settings.sidebar.icon": "Seitenleisteneinstellungen", + "user.settings.sidebar.icon": "Seitenleisteneinstellungen-Symbol", "user.settings.sidebar.never": "Nie", "user.settings.sidebar.showUnreadSection": "Oberhalb der Kanal-Seitenleiste", "user.settings.sidebar.title": "Seitenleisteneinstellungen", @@ -3473,7 +3476,7 @@ "user_profile.account.editSettings": "Kontoeinstellungen bearbeiten", "user_profile.account.localTime": "Ortszeit: ", "user_profile.send.dm": "Nachricht versenden", - "user_profile.send.dm.icon": "Send Message Icon", + "user_profile.send.dm.icon": "\"Nachricht senden\"-Symbol", "user_profile.webrtc.call": "Videoanruf starten", "user_profile.webrtc.offline": "Der Benutzer ist offline", "user_profile.webrtc.unavailable": "Neuer Anruf nicht möglich bis ihr bestehender Anruf beendet ist", @@ -3491,30 +3494,30 @@ "web.root.signup_info": "Die gesamte Teamkommunikation an einem Ort, durchsuchbar und überall verfügbar", "webrtc.busy": "{username} ist beschäftigt.", "webrtc.call": "Anrufen", - "webrtc.call.icon": "Call Icon", + "webrtc.call.icon": "Anruf-Symbol", "webrtc.callEnded": "Anruf mit {username} beendet.", "webrtc.cancel": "Anruf abbrechen", - "webrtc.cancel.icon": "Cancel call Icon", + "webrtc.cancel.icon": "\"Anruf abbrechen\"-Symbol", "webrtc.cancelled": "{username} hat den Anruf abgebrochen.", "webrtc.declined": "Ihr Anruf wurde durch {username} abgelehnt.", "webrtc.disabled": "{username} hat WebRTC deaktiviert. Um die Funktion zu aktivieren, muss der Benutzer zu Kontoeinstellungen > Erweitert > Vorschau auf Funktionen der neuen Version gehen und WebRTC aktivieren.", "webrtc.failed": "Es gab ein Problem bei der Verbindung des Videoanrufs.", "webrtc.hangup": "Auflegen", "webrtc.header": "Anruf mit {username}", - "webrtc.icon": "Webrtc Icon", + "webrtc.icon": "Webrtc-Symbol", "webrtc.inProgress": "Sie haben bereits einen laufenden Anruf. Bitte legen Sie zuerst auf.", "webrtc.mediaError": "Zugriff auf Kamera und Mikrofon nicht möglich.", "webrtc.mute_audio": "Mikrofon stummschalten", - "webrtc.mute_audio.icon": "Mute Icon", + "webrtc.mute_audio.icon": "Stummschalten-Symbol", "webrtc.noAnswer": "{username} beantwortet den Anruf nicht.", "webrtc.notification.answer": "Annehmen", - "webrtc.notification.answer.icon": "Answer Icon", + "webrtc.notification.answer.icon": "Antworten-Symbol", "webrtc.notification.decline": "Ablehnen", "webrtc.notification.incoming_call": "{username} ruft Sie an.", "webrtc.notification.returnToCall": "Zu laufendem Anruf mit {username} zurückkehren", "webrtc.offline": "{username} ist offline.", "webrtc.pause_video": "Kamera abschalten", - "webrtc.return.icon": "Return to Call Icon", + "webrtc.return.icon": "\"Zum Anruf zurückkehren\"-Symbol", "webrtc.unmute_audio": "Mikrofon-Stummschaltung aufheben", "webrtc.unpause_video": "Kamera einschalten", "webrtc.unsupported": "Das Gerät von {username} unterstützt keine Videoanrufe.", diff --git a/assets/base/i18n/en.json b/assets/base/i18n/en.json index 03a5aceff..b5809fd6d 100644 --- a/assets/base/i18n/en.json +++ b/assets/base/i18n/en.json @@ -2307,6 +2307,7 @@ "mobile.android.videos_permission_denied_description": "To upload videos from your library, please change your permission settings.", "mobile.android.videos_permission_denied_title": "Video library access is required", "mobile.announcement_banner.dismiss": "Dismiss", + "mobile.announcement_banner.ok": "OK", "mobile.announcement_banner.title": "Announcement", "mobile.channel.markAsRead": "Mark As Read", "mobile.channel_drawer.search": "Jump to...", @@ -2608,6 +2609,7 @@ "mobile.timezone_settings.automatically": "Set automatically", "mobile.timezone_settings.manual": "Change timezone", "mobile.timezone_settings.select": "Select Timezone", + "mobile.user.settings.notifications.email.fifteenMinutes": "Every 15 minutes", "mobile.video.save_error_message": "To save the video file you need to download it first.", "mobile.video.save_error_title": "Save Video Error", "mobile.video_playback.failed_description": "An error occurred while trying to play the video.\n", @@ -2748,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "Delete", "post_info.edit": "Edit", + "post_info.message.show_less": "Show Less", + "post_info.message.show_more": "Show More", "post_info.message.visible": "(Only visible to you)", "post_info.message.visible.compact": " (Only visible to you)", "post_info.mobile.flag": "Flag", @@ -3318,7 +3322,6 @@ "user.settings.notifications.email.disabled_long": "Email notifications have not been enabled by your System Administrator.", "user.settings.notifications.email.everyHour": "Every hour", "user.settings.notifications.email.everyXMinutes": "Every {count, plural, one {minute} other {{count, number} minutes}}", - "mobile.user.settings.notifications.email.fifteenMinutes": "Every 15 minutes", "user.settings.notifications.email.immediately": "Immediately", "user.settings.notifications.email.never": "Never", "user.settings.notifications.email.send": "Send email notifications", diff --git a/assets/base/i18n/es.json b/assets/base/i18n/es.json index 655406aa3..11973eed9 100644 --- a/assets/base/i18n/es.json +++ b/assets/base/i18n/es.json @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "Anuncio", "mobile.channel.markAsRead": "Marcar como leído", "mobile.channel_drawer.search": "Saltar a...", - "mobile.channel_info.alertMessageDeleteChannel": "¿Seguro quieres abandonar el {term} {name}?", + "mobile.channel_info.alertMessageDeleteChannel": "¿Seguro quieres archivar el {term} {name}?", "mobile.channel_info.alertMessageLeaveChannel": "¿Seguro quieres abandonar el {term} {name}?", "mobile.channel_info.alertNo": "No", - "mobile.channel_info.alertTitleDeleteChannel": "Eliminar {term}", + "mobile.channel_info.alertTitleDeleteChannel": "Archivar {term}", "mobile.channel_info.alertTitleLeaveChannel": "Abandonar {term}", "mobile.channel_info.alertYes": "Sí", - "mobile.channel_info.delete_failed": "No pudimos eliminar el canal {displayName}. Por favor revisa tu conexión e intenta de nuevo.", + "mobile.channel_info.delete_failed": "No se pudo archivar el canal {displayName}. Por favor revisa tu conexión e intenta de nuevo.", "mobile.channel_info.edit": "Editar Canal", "mobile.channel_info.privateChannel": "Canal Privado", "mobile.channel_info.publicChannel": "Canal Público", @@ -2542,7 +2542,7 @@ "mobile.retry_message": "Error obteniendo los mensajes. Tira hacia arriba para reintentar.", "mobile.routes.channelInfo": "Información", "mobile.routes.channelInfo.createdBy": "Creado por {creator} el ", - "mobile.routes.channelInfo.delete_channel": "Borrar Canal", + "mobile.routes.channelInfo.delete_channel": "Archivar Canal", "mobile.routes.channelInfo.favorite": "Favorito", "mobile.routes.channel_members.action": "Eliminar Miembros", "mobile.routes.channel_members.action_message": "Debes seleccionar al menos un miembro a ser eliminado del canal.", @@ -2609,6 +2609,7 @@ "mobile.timezone_settings.automatically": "Asignar automáticamente", "mobile.timezone_settings.manual": "Cambiar zona horaria", "mobile.timezone_settings.select": "Seleccione la zona horaria", + "mobile.user.settings.notifications.email.fifteenMinutes": "Cada 15 minutos", "mobile.video.save_error_message": "Para guardar el vídeo primero debes descargarlo.", "mobile.video.save_error_title": "Error Guardando Vídeo", "mobile.video_playback.failed_description": "Ocurrió un error al reproducir el vídeo.\n", @@ -2749,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "Borrar", "post_info.edit": "Editar", + "post_info.message.show_less": "Ver Menos", + "post_info.message.show_more": "Ver Más", "post_info.message.visible": "(Visible sólo por ti)", "post_info.message.visible.compact": " (Visible sólo por ti)", "post_info.mobile.flag": "Marcar", diff --git a/assets/base/i18n/fr.json b/assets/base/i18n/fr.json index 89fe364c0..693b79794 100644 --- a/assets/base/i18n/fr.json +++ b/assets/base/i18n/fr.json @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "Annonce", "mobile.channel.markAsRead": "Marquer comme lu", "mobile.channel_drawer.search": "Aller à...", - "mobile.channel_info.alertMessageDeleteChannel": "Voulez-vous vraiment supprimer le {term} {name} ?", + "mobile.channel_info.alertMessageDeleteChannel": "Voulez-vous vraiment quitter le {term} {name} ?", "mobile.channel_info.alertMessageLeaveChannel": "Voulez-vous vraiment quitter le {term} {name} ?", "mobile.channel_info.alertNo": "Non", - "mobile.channel_info.alertTitleDeleteChannel": "Supprimer {term}", + "mobile.channel_info.alertTitleDeleteChannel": "Archive {term}", "mobile.channel_info.alertTitleLeaveChannel": "Quitter {term}", "mobile.channel_info.alertYes": "Oui", - "mobile.channel_info.delete_failed": "Impossible de supprimer le canal {displayName}. Veuillez vérifier votre connexion et essayer à nouveau.", + "mobile.channel_info.delete_failed": "Impossible de joindre le canal {displayName}. Veuillez vérifier votre connexion et essayer à nouveau.", "mobile.channel_info.edit": "Modifier le canal", "mobile.channel_info.privateChannel": "Canal privé", "mobile.channel_info.publicChannel": "Canal public", @@ -2542,7 +2542,7 @@ "mobile.retry_message": "Le rafraîchissement des messages a échoué. Tirez vers le haut pour essayer à nouveau.", "mobile.routes.channelInfo": "Information", "mobile.routes.channelInfo.createdBy": "Créé par {creator} le ", - "mobile.routes.channelInfo.delete_channel": "Supprimer le canal", + "mobile.routes.channelInfo.delete_channel": "Archive Channel", "mobile.routes.channelInfo.favorite": "Favoris", "mobile.routes.channel_members.action": "Supprimer des membres", "mobile.routes.channel_members.action_message": "Vous devez sélectionner au moins un membre à supprimer de ce canal.", @@ -2609,6 +2609,7 @@ "mobile.timezone_settings.automatically": "Définir automatiquement", "mobile.timezone_settings.manual": "Changer le fuseau horaire", "mobile.timezone_settings.select": "Select Timezone", + "mobile.user.settings.notifications.email.fifteenMinutes": "Every 15 minutes", "mobile.video.save_error_message": "Pour enregistrer la vidéo, vous devez d'abord la télécharger.", "mobile.video.save_error_title": "Erreur lors de la sauvegarde de la vidéo", "mobile.video_playback.failed_description": "Une erreur s'est produite lors de la tentative de lecture de la vidéo.\n", @@ -2749,6 +2750,8 @@ "post_info.bot": "ROBOT", "post_info.del": "Supprimer", "post_info.edit": "Éditer", + "post_info.message.show_less": "Show Less", + "post_info.message.show_more": "Afficher plus", "post_info.message.visible": "(Visible uniquement par vous)", "post_info.message.visible.compact": " (Visible uniquement par vous)", "post_info.mobile.flag": "Marquer avec un indicateur", diff --git a/assets/base/i18n/it.json b/assets/base/i18n/it.json index 772f4b705..5f62c37d0 100644 --- a/assets/base/i18n/it.json +++ b/assets/base/i18n/it.json @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "Annuncio", "mobile.channel.markAsRead": "Segna Come Letto", "mobile.channel_drawer.search": "Vai a...", - "mobile.channel_info.alertMessageDeleteChannel": "Sei sicuro di voler eliminare questo {term} {name}?", + "mobile.channel_info.alertMessageDeleteChannel": "Sei sicuro di voler archiviare {term} {name}?", "mobile.channel_info.alertMessageLeaveChannel": "Sei sicuro di voler tralasciare questo {term} {name}?", "mobile.channel_info.alertNo": "No", - "mobile.channel_info.alertTitleDeleteChannel": "Elimina {term}", + "mobile.channel_info.alertTitleDeleteChannel": "Archivia {term}", "mobile.channel_info.alertTitleLeaveChannel": "Tralascia {term}", "mobile.channel_info.alertYes": "Si", - "mobile.channel_info.delete_failed": "Impossibile cancellare il canale {displayName}. Controlla la connessione e riprova.", + "mobile.channel_info.delete_failed": "Impossibile archiviare il canale {displayName}. Controlla la connessione e riprova.", "mobile.channel_info.edit": "Modifica Canale", "mobile.channel_info.privateChannel": "Canale privato", "mobile.channel_info.publicChannel": "Canale Pubblico", @@ -2542,7 +2542,7 @@ "mobile.retry_message": "Aggiornamento messaggi fallito. Riprovare.", "mobile.routes.channelInfo": "Informazioni", "mobile.routes.channelInfo.createdBy": "Creato da {creator} il ", - "mobile.routes.channelInfo.delete_channel": "Elimina Canale", + "mobile.routes.channelInfo.delete_channel": "Archivia Canale", "mobile.routes.channelInfo.favorite": "Preferiti", "mobile.routes.channel_members.action": "Rimuovi Membri", "mobile.routes.channel_members.action_message": "Devi selezionare almeno un membro da rimuovere dal canale.", @@ -2609,6 +2609,7 @@ "mobile.timezone_settings.automatically": "Imposta automaticamente", "mobile.timezone_settings.manual": "Cambia fuso orario", "mobile.timezone_settings.select": "Seleziona fuso orario", + "mobile.user.settings.notifications.email.fifteenMinutes": "Ogni 15 minuti", "mobile.video.save_error_message": "Per salvare il file video bisogna prima scaricarlo.", "mobile.video.save_error_title": "Errore Salvataggio Video", "mobile.video_playback.failed_description": "Si è verificato un errore durante la riproduzione del video.\n", @@ -2749,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "Cancella", "post_info.edit": "Modifica", + "post_info.message.show_less": "Mostra di meno", + "post_info.message.show_more": "Mostra di più", "post_info.message.visible": "(Visibile soltanto a te)", "post_info.message.visible.compact": " (Visibile soltanto a te)", "post_info.mobile.flag": "Contrassegna", diff --git a/assets/base/i18n/ja.json b/assets/base/i18n/ja.json index 901297227..03e88c13e 100644 --- a/assets/base/i18n/ja.json +++ b/assets/base/i18n/ja.json @@ -303,7 +303,7 @@ "admin.customization.enableCustomEmojiTitle": "カスタム絵文字を有効にする:", "admin.customization.enableEmojiPickerDesc": "絵文字選択機能は、ユーザーがリアクションやメッセージ内で絵文字を入力する際に、絵文字を選択できるようにします。多くのカスタム絵文字がある状態で絵文字選択機能を有効にすると、パフォーマンスの低下につながる可能性があります。", "admin.customization.enableEmojiPickerTitle": "絵文字選択機能を有効にする:", - "admin.customization.enableGifPickerDesc": "Gfycat統合機能を利用して絵文字ピッカーからGIFを選択できるようにする。", + "admin.customization.enableGifPickerDesc": "Gfycat統合機能を利用して絵文字選択からGIFを選択できるようにする。", "admin.customization.enableGifPickerTitle": "GIF選択機能を有効にする:", "admin.customization.enableLinkPreviewsDesc": "有効な場合、メッセージの下にウェブサイトの内容のプレビューが表示されます。ユーザーは アカウント設定 > 表示 > ウェブサイトリンクプレビュー から、これらのプレビューを無効にできます。", "admin.customization.enableLinkPreviewsTitle": "リンクのプレビューを有効にする:", @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "アナウンス", "mobile.channel.markAsRead": "既読にする", "mobile.channel_drawer.search": "移動する...", - "mobile.channel_info.alertMessageDeleteChannel": "{term} {name} を本当に削除しますか?", + "mobile.channel_info.alertMessageDeleteChannel": "{term} {name} を本当にアーカイブしますか?", "mobile.channel_info.alertMessageLeaveChannel": "{term} {name} から本当に脱退しますか?", "mobile.channel_info.alertNo": "いいえ", - "mobile.channel_info.alertTitleDeleteChannel": "{term} を削除する", + "mobile.channel_info.alertTitleDeleteChannel": "アーカイブ {term}", "mobile.channel_info.alertTitleLeaveChannel": "{term}から脱退する", "mobile.channel_info.alertYes": "はい", - "mobile.channel_info.delete_failed": "チャンネル {displayName} を削除できませんでした。接続を確認し、もう一度試してみてください。", + "mobile.channel_info.delete_failed": "チャンネル {displayName} をアーカイブできませんでした。接続を確認し、もう一度試してみてください。", "mobile.channel_info.edit": "チャンネルを編集する", "mobile.channel_info.privateChannel": "非公開チャンネル", "mobile.channel_info.publicChannel": "公開チャンネル", @@ -2542,7 +2542,7 @@ "mobile.retry_message": "メッセージを更新できませんでした。再度更新するには画面を引き上げてください。", "mobile.routes.channelInfo": "情報", "mobile.routes.channelInfo.createdBy": "{creator} によって作成 ", - "mobile.routes.channelInfo.delete_channel": "チャンネルを削除する", + "mobile.routes.channelInfo.delete_channel": "チャンネルをアーカイブする", "mobile.routes.channelInfo.favorite": "お気に入り", "mobile.routes.channel_members.action": "メンバーを削除する", "mobile.routes.channel_members.action_message": "チャンネルから削除するメンバーを少なくとも一人選択してください。", @@ -2609,6 +2609,7 @@ "mobile.timezone_settings.automatically": "自動検出", "mobile.timezone_settings.manual": "タイムゾーンを変更", "mobile.timezone_settings.select": "タイムゾーンを選択", + "mobile.user.settings.notifications.email.fifteenMinutes": "15 分毎", "mobile.video.save_error_message": "動画ファイルを保存するには、まずダウンロードする必要があります。", "mobile.video.save_error_title": "動画保存エラー", "mobile.video_playback.failed_description": "動画を再生する際にエラーが発生しました。\n", @@ -2749,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "削除する", "post_info.edit": "編集する", + "post_info.message.show_less": "表示を少なくする", + "post_info.message.show_more": "さらに表示", "post_info.message.visible": "(あなただけが見ることができます)", "post_info.message.visible.compact": " (あなただけが見ることができます)", "post_info.mobile.flag": "フラグ", diff --git a/assets/base/i18n/ko.json b/assets/base/i18n/ko.json index d0b67eedd..40afc8204 100644 --- a/assets/base/i18n/ko.json +++ b/assets/base/i18n/ko.json @@ -1746,7 +1746,7 @@ "delete_channel.cancel": "취소", "delete_channel.confirm": "Confirm ARCHIVE Channel", "delete_channel.del": "Archive", - "delete_channel.question": "이렇게하면 팀에서 채널이 삭제되고 모든 사용자가 해당 채널의 내용에 액세스 할 수 없게됩니다. 정말 {display_name} 채널을 삭제 하시겠습니까?", + "delete_channel.question": "이렇게하면 팀에서 채널이 삭제되고 모든 사용자가 해당 채널의 내용에 액세스 할 수 없게됩니다.

정말 {display_name} 채널을 삭제 하시겠습니까?", "delete_post.cancel": "취소", "delete_post.comment": "답글", "delete_post.confirm": "{term} 삭제 확인", @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "Announcement", "mobile.channel.markAsRead": "읽음으로 표시", "mobile.channel_drawer.search": "Jump to...", - "mobile.channel_info.alertMessageDeleteChannel": "{term} {name}을 (를) 삭제 하시겠습니까?", + "mobile.channel_info.alertMessageDeleteChannel": "{term} {name}을 (를) 종료 하시겠습니까?", "mobile.channel_info.alertMessageLeaveChannel": "{term} {name}을 (를) 종료 하시겠습니까?", "mobile.channel_info.alertNo": "아니요", - "mobile.channel_info.alertTitleDeleteChannel": "{term} 삭제", + "mobile.channel_info.alertTitleDeleteChannel": "Archive {term}", "mobile.channel_info.alertTitleLeaveChannel": "{term} 나가기", "mobile.channel_info.alertYes": "네", - "mobile.channel_info.delete_failed": "We couldn't delete the channel {displayName}. Please check your connection and try again.", + "mobile.channel_info.delete_failed": "We couldn't archive the channel {displayName}. Please check your connection and try again.", "mobile.channel_info.edit": "Edit Channel", "mobile.channel_info.privateChannel": "비공개 채널", "mobile.channel_info.publicChannel": "공개 채널", @@ -2542,7 +2542,7 @@ "mobile.retry_message": "Refreshing messages failed. Pull up to try again.", "mobile.routes.channelInfo": "Info", "mobile.routes.channelInfo.createdBy": "Created by {creator} on ", - "mobile.routes.channelInfo.delete_channel": "채널 삭제", + "mobile.routes.channelInfo.delete_channel": "Archive Channel", "mobile.routes.channelInfo.favorite": "즐겨찾기", "mobile.routes.channel_members.action": "팀에서 제거하기", "mobile.routes.channel_members.action_message": "You must select at least one member to remove from the channel.", @@ -2609,6 +2609,7 @@ "mobile.timezone_settings.automatically": "Set automatically", "mobile.timezone_settings.manual": "Change timezone", "mobile.timezone_settings.select": "Select Timezone", + "mobile.user.settings.notifications.email.fifteenMinutes": "Every 15 minutes", "mobile.video.save_error_message": "To save the video file you need to download it first.", "mobile.video.save_error_title": "Save Video Error", "mobile.video_playback.failed_description": "An error occurred while trying to play the video.\n", @@ -2658,7 +2659,7 @@ "msg_typing.isTyping": "{user}(이)가 입력중입니다...", "msg_typing.someone": "Someone", "multiselect.add": "추가", - "multiselect.go": "이동", + "multiselect.go": "시작", "multiselect.list.notFound": "사용자를 찾을 수 없습니다 :(", "multiselect.numPeopleRemaining": "↑↓키로 탐색하고, ↵키로 선택합니다. {num, number} 명 이상 {num, plural, one {person} other {people}}을 추가할 수 있습니다.", "multiselect.numRemaining": "{num, number}명 더 추가할 수 있습니다.", @@ -2749,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "삭제", "post_info.edit": "편집", + "post_info.message.show_less": "Show Less", + "post_info.message.show_more": "Show More", "post_info.message.visible": "(Only visible to you)", "post_info.message.visible.compact": " (Only visible to you)", "post_info.mobile.flag": "중요 지정", diff --git a/assets/base/i18n/nl.json b/assets/base/i18n/nl.json index 48d337534..7c258a9b9 100644 --- a/assets/base/i18n/nl.json +++ b/assets/base/i18n/nl.json @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "Announcement", "mobile.channel.markAsRead": "Mark As Read", "mobile.channel_drawer.search": "Jump to...", - "mobile.channel_info.alertMessageDeleteChannel": "Weet u zeker dat u deze {term} {name} wilt verwijderen?", + "mobile.channel_info.alertMessageDeleteChannel": "Weet u zeker dat u deze {term} wilt verwijderen?", "mobile.channel_info.alertMessageLeaveChannel": "Weet u zeker dat u deze {term} wilt verwijderen?", "mobile.channel_info.alertNo": "Nee", - "mobile.channel_info.alertTitleDeleteChannel": "Verwijder {term}...", + "mobile.channel_info.alertTitleDeleteChannel": "Archive {term}", "mobile.channel_info.alertTitleLeaveChannel": "Verlaat {term}", "mobile.channel_info.alertYes": "Ja", - "mobile.channel_info.delete_failed": "We couldn't delete the channel {displayName}. Please check your connection and try again.", + "mobile.channel_info.delete_failed": "We couldn't archive the channel {displayName}. Please check your connection and try again.", "mobile.channel_info.edit": "Edit Channel", "mobile.channel_info.privateChannel": "Verlaat kanaal", "mobile.channel_info.publicChannel": "Publieke kanalen", @@ -2542,7 +2542,7 @@ "mobile.retry_message": "Refreshing messages failed. Pull up to try again.", "mobile.routes.channelInfo": "Info", "mobile.routes.channelInfo.createdBy": "Created by {creator} on ", - "mobile.routes.channelInfo.delete_channel": "Verwijder kanaal...", + "mobile.routes.channelInfo.delete_channel": "Archive Channel", "mobile.routes.channelInfo.favorite": "Favorite", "mobile.routes.channel_members.action": "Remove Members", "mobile.routes.channel_members.action_message": "You must select at least one member to remove from the channel.", @@ -2609,6 +2609,7 @@ "mobile.timezone_settings.automatically": "Set automatically", "mobile.timezone_settings.manual": "Change timezone", "mobile.timezone_settings.select": "Select Timezone", + "mobile.user.settings.notifications.email.fifteenMinutes": "Every 15 minutes", "mobile.video.save_error_message": "To save the video file you need to download it first.", "mobile.video.save_error_title": "Save Video Error", "mobile.video_playback.failed_description": "An error occurred while trying to play the video.\n", @@ -2749,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "Verwijderen", "post_info.edit": "Bewerken", + "post_info.message.show_less": "Show Less", + "post_info.message.show_more": "Show More", "post_info.message.visible": "(Only visible to you)", "post_info.message.visible.compact": " (Only visible to you)", "post_info.mobile.flag": "Markeer", diff --git a/assets/base/i18n/pl.json b/assets/base/i18n/pl.json index b9cd27a39..44ca2f94f 100644 --- a/assets/base/i18n/pl.json +++ b/assets/base/i18n/pl.json @@ -2311,10 +2311,10 @@ "mobile.announcement_banner.title": "Announcement", "mobile.channel.markAsRead": "Mark As Read", "mobile.channel_drawer.search": "Jump to...", - "mobile.channel_info.alertMessageDeleteChannel": "Jesteś pewien, że chcesz usunąć {term} {name}?", + "mobile.channel_info.alertMessageDeleteChannel": "Jesteś pewien, że chcesz opuścić {term} {name}?", "mobile.channel_info.alertMessageLeaveChannel": "Jesteś pewien, że chcesz opuścić {term} {name}?", "mobile.channel_info.alertNo": "Nie", - "mobile.channel_info.alertTitleDeleteChannel": "{term} - Usuń", + "mobile.channel_info.alertTitleDeleteChannel": "Archive {term}", "mobile.channel_info.alertTitleLeaveChannel": "{term} - Opuść", "mobile.channel_info.alertYes": "Tak", "mobile.channel_info.delete_failed": "Nie można dołączyć do kanału {displayName}. Sprawdź swoje połączenie i spróbuj ponownie.", @@ -2542,7 +2542,7 @@ "mobile.retry_message": "Odświeżanie wiadomości nie powiodło się. Przeciągnij do góry, by spróbować ponownie.", "mobile.routes.channelInfo": "Informacje", "mobile.routes.channelInfo.createdBy": "Utworzono przez {creator}, dnia ", - "mobile.routes.channelInfo.delete_channel": "Usuń kanał", + "mobile.routes.channelInfo.delete_channel": "Archive Channel", "mobile.routes.channelInfo.favorite": "Ulubiony", "mobile.routes.channel_members.action": "Usuń użytkownika", "mobile.routes.channel_members.action_message": "Musisz wybrać co najmniej jednego użytkownika, który ma zostać usunięty z kanału.", @@ -2609,6 +2609,7 @@ "mobile.timezone_settings.automatically": "Set automatically", "mobile.timezone_settings.manual": "Change timezone", "mobile.timezone_settings.select": "Select Timezone", + "mobile.user.settings.notifications.email.fifteenMinutes": "Every 15 minutes", "mobile.video.save_error_message": "To save the video file you need to download it first.", "mobile.video.save_error_title": "Save Video Error", "mobile.video_playback.failed_description": "An error occurred while trying to play the video.\n", @@ -2749,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "Usuń", "post_info.edit": "Edytuj", + "post_info.message.show_less": "Show Less", + "post_info.message.show_more": "Show More", "post_info.message.visible": "(Only visible to you)", "post_info.message.visible.compact": " (Only visible to you)", "post_info.mobile.flag": "Oflaguj", diff --git a/assets/base/i18n/pt-BR.json b/assets/base/i18n/pt-BR.json index b39cc9baf..313d46755 100644 --- a/assets/base/i18n/pt-BR.json +++ b/assets/base/i18n/pt-BR.json @@ -152,7 +152,7 @@ "add_outgoing_webhook.triggerWordsTriggerWhenStartsWith": "Primeira palavra começa com uma palavra gatilho", "add_teams_to_scheme.confirmation.accept": "Sim, Mover Equipe", "add_teams_to_scheme.confirmation.message": "Esta equipe já está selecionada em outro esquema de equipe, você está certo que deseja mover para este esquema de equipe?", - "add_teams_to_scheme.confirmation.title": "Substituir o Esquema de Equipe?", + "add_teams_to_scheme.confirmation.title": "Alterar Esquema de Substituição de Equipe?", "add_teams_to_scheme.title": "Adicionar Equipe na lista de Seleção de Equipe", "add_users_to_team.title": "Adicionar Novos Membros para Equipe {teamName}", "admin.advance.cluster": "Alta Disponibilidade", @@ -232,7 +232,7 @@ "admin.complianceExport.description": "Este recurso suporta exportações de conformidade para os formatos Actiance XML e GlobalRelay EML e está atualmente em versão beta. O suporte para o formato Mattermost CSV está programado para uma versão futura e substituirá o recurso de Conformidade existente.", "admin.complianceExport.exportFormat.actiance": "Actiance XML", "admin.complianceExport.exportFormat.csv": "CSV", - "admin.complianceExport.exportFormat.description": "Formato da exportação de conformidade. Corresponde ao sistema no qual você deseja importar os dados.

Para o Actiance XML, os arquivos de exportação de conformidade são gravados no subdiretório \"exports\" do Diretório de Armazenamento Local configurado. Para o Global Relay EML, eles são enviados por email para o endereço de email configurado.", + "admin.complianceExport.exportFormat.description": "Formato da exportação de conformidade. Corresponde ao sistema no qual você deseja importar os dados.

Para o Actiance XML ou CSV, os arquivos de exportação de conformidade são gravados no subdiretório \"exports\" do Diretório de Armazenamento Local configurado. Para o Global Relay EML, eles são enviados por email para o endereço de email configurado.", "admin.complianceExport.exportFormat.globalrelay": "GlobalRelay EML", "admin.complianceExport.exportFormat.title": "Formato de Exportação:", "admin.complianceExport.exportJobStartTime.description": "Ajuste a hora de início para exportação de diária de conformidade. Escolha uma hora em que tenha menos pessoas utilizando o sistema. A hora em 24 horas e no formato HH:MM.", @@ -303,14 +303,14 @@ "admin.customization.enableCustomEmojiTitle": "Ativar Emoji Personalizado:", "admin.customization.enableEmojiPickerDesc": "O seletor de emoji permite aos usuários selecionar emoji para adicionar como reações ou usar em mensagens. Habilitar o seletor de emoji com um grande número de emoji personalizados pode diminuir o desempenho.", "admin.customization.enableEmojiPickerTitle": "Ativar Seletor de Emoji:", - "admin.customization.enableGifPickerDesc": "Allow users to select GIFs from the emoji picker via a Gfycat integration.", - "admin.customization.enableGifPickerTitle": "Ativar Seletor de Emoji:", + "admin.customization.enableGifPickerDesc": "Permite que os usuários possam selecionar GIFs no emoji picker com a integração do Gfycat.", + "admin.customization.enableGifPickerTitle": "Ativar Seletor de GIF:", "admin.customization.enableLinkPreviewsDesc": "Exibir uma pré-visualização do conteúdo do site abaixo das mensagens, quando disponível. Os usuários podem desabilitar essas pré-visualizações em Definições de Conta > Exibição > Pré-visualização de Website.", "admin.customization.enableLinkPreviewsTitle": "Habilitar Visualizações de Links:", "admin.customization.gfycatApiKey": "Gfycat API Key:", - "admin.customization.gfycatApiKeyDescription": "Request an API key at https://developers.gfycat.com/signup/#/. Enter the client ID you receive via email to this field. When blank, uses the default API key provided by Gfycat.", + "admin.customization.gfycatApiKeyDescription": "Solicite uma API key em https://developers.gfycat.com/signup/#/. Entre com o client ID que você recebeu via email neste campo. Quando em branco será utilizado uma API key padrão fornecide pelo Gfycat.", "admin.customization.gfycatApiSecret": "Gfycat API Secret:", - "admin.customization.gfycatApiSecretDescription": "The API secret generated by Gfycat for your API key. When blank, uses the default API secret provided by Gfycat.", + "admin.customization.gfycatApiSecretDescription": "A API secret gerado pelo Gfycat com a sua API key. Quando em branch, utiliza a API secret padrão fornecida pelo Gfycat.", "admin.customization.gif": "GIF (Beta)", "admin.customization.iosAppDownloadLinkDesc": "Adiciona um link para download do app iOS. Usuários que acessarem o site em um navegador móvel serão perguntados com uma página dando a opção para download do app. Deixe este campo em branco para evitar que a página apareça.", "admin.customization.iosAppDownloadLinkTitle": "App iOS Link para Download:", @@ -547,7 +547,7 @@ "admin.image.amazonS3RegionDescription": "A região AWS que você selecionou quando criou o S3 bucket. Se a região não for configurada, o Mattermost irá tentar selecionar uma região apropriada na AWS, ou configurar para 'us-east-1' caso não ache.", "admin.image.amazonS3RegionExample": "Ex.: \"us-east-1\"", "admin.image.amazonS3RegionTitle": "Amazon S3 Region:", - "admin.image.amazonS3SSEDescription": "Quando verdadeiro, criptografa arquivos no Amazon S3 usando criptografia do lado do servidor com as chaves gerenciadas do Amazon S3. Veja a documentação para saber mais.", + "admin.image.amazonS3SSEDescription": "Quando verdadeiro, criptografa arquivos no Amazon S3 usando criptografia do lado do servidor com as chaves gerenciadas do Amazon S3. Veja a documentação para saber mais.", "admin.image.amazonS3SSETitle": "Ativar Encriptação do Lado do Servidor para o Amazon S3:", "admin.image.amazonS3SSLDescription": "Quando falso, permite conexões inseguras com Amazon S3. Padrão conexões seguras somente.", "admin.image.amazonS3SSLTitle": "Ativar Conexões Seguras com Amazon S3:", @@ -769,9 +769,9 @@ "admin.permissions.group.integrations.name": "Integrações & Personalizações", "admin.permissions.group.posts.description": "Escrever, editar e excluir publicações.", "admin.permissions.group.posts.name": "Gerenciar Posts", - "admin.permissions.group.private_channel.description": "Criar e excluir canais, gerenciar configurações e membros.", + "admin.permissions.group.private_channel.description": "Criar e arquivar canais, gerenciar configurações e membros.", "admin.permissions.group.private_channel.name": "Gerenciar Canais Privados", - "admin.permissions.group.public_channel.description": "Juntar, criar e excluir canais, gerenciar configurações e membros.", + "admin.permissions.group.public_channel.description": "Juntar, criar e arquivar canais, gerenciar configurações e membros.", "admin.permissions.group.public_channel.name": "Gerenciar Canais Publicos", "admin.permissions.group.reactions.description": "Adicionar excluir reações nas publicações.", "admin.permissions.group.reactions.name": "Publicar Reações", @@ -780,7 +780,7 @@ "admin.permissions.group.teams.description": "Criar equipes e gerenciar membros.", "admin.permissions.group.teams.name": "Equipes", "admin.permissions.inherited_from": "Herdado de {name}.", - "admin.permissions.introBanner": "Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our [documentation](!https://about.mattermost.com/default-advanced-permissions).", + "admin.permissions.introBanner": "Esquemas de permissão definem as permissões padrão para Administradores de Equipe, Administradores de Canal e todos os outros. Saiba mais sobre os esquemas de permissão em nossa [documentação](!https://about.mattermost.com/default-advanced-permissions).", "admin.permissions.loadMoreSchemes": "Carregar mais esquemas", "admin.permissions.loadingMoreSchemes": "Carregando...", "admin.permissions.permission.assign_system_admin_role.description": "Atribuir função de admin do sistema", @@ -877,7 +877,7 @@ "admin.permissions.systemScheme.allMembersTitle": "Todos os Membros", "admin.permissions.systemScheme.channelAdminsDescription": "Permissões concedidas a criadores de canais e quaisquer usuários promovidos a Administrador de Canal.", "admin.permissions.systemScheme.channelAdminsTitle": "Administradores de Canal", - "admin.permissions.systemScheme.introBanner": "Configure the default permissions for Team Admins, Channel Admins and other members. This scheme is inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied in specific teams.", + "admin.permissions.systemScheme.introBanner": "Configure as permissões padrão para Administradores de Equipe, Administradores de Canais e outros membros. Este esquema é herdado por todas as equipes, a menos que um [Esquema de Substituição de Equipe](!https://about.mattermost.com/default-team-override-scheme) seja aplicado em equipes específicas.", "admin.permissions.systemScheme.resetDefaultsButton": "Restaurar para o padrão", "admin.permissions.systemScheme.resetDefaultsButtonModalBody": "Isso redefinirá todas as seleções nesta página para as configurações padrão. Tem certeza de que deseja redefinir?", "admin.permissions.systemScheme.resetDefaultsButtonModalTitle": "Restaurar para Padrão?", @@ -887,17 +887,17 @@ "admin.permissions.systemScheme.teamAdminsDescription": "Permissões concedidas para criadores de equipes e qualquer usuário promovido a Administrador de Equipe.", "admin.permissions.systemScheme.teamAdminsTitle": "Administradores de Equipe", "admin.permissions.systemSchemeBannerButton": "Editar Esquema", - "admin.permissions.systemSchemeBannerText": "Set the default permissions inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied.", + "admin.permissions.systemSchemeBannerText": "Defina as permissões padrão herdadas por todas as equipes, a menos que um [Esquema de Substituição de Equipe](!https://about.mattermost.com/default-team-override-scheme) seja aplicado.", "admin.permissions.systemSchemeBannerTitle": "Esquema do Sistema", - "admin.permissions.teamOverrideSchemesBannerText": "Use when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).", + "admin.permissions.teamOverrideSchemesBannerText": "Use quando equipes específicas precisarem de exceções de permissão para o [Esquema do Sistema](!https://about.mattermost.com/default-system-scheme).", "admin.permissions.teamOverrideSchemesInProgress": "Tarefa de migração em progresso: Esquema de Substituição de Equipe não estão disponíveis até a tarefa de migração de permissões no servidor estar completa. Saiba mais em {documentationLink}.", "admin.permissions.teamOverrideSchemesNewButton": "Novo Esquema de Substituição de Equipe", "admin.permissions.teamOverrideSchemesNoJobsEnabled": "Tarefa de migração em espera: Esquema de Substituição de Equipe não estão disponíveis até que a tarefa de migração de permissões possa ser executada no servidor. Saiba mais em {documentationLink}.", "admin.permissions.teamOverrideSchemesNoSchemes": "Nenhum esquema de substituição de equipe criado.", - "admin.permissions.teamOverrideSchemesTitle": "Esquema de substituição de equipe", + "admin.permissions.teamOverrideSchemesTitle": "Esquemas de Substituição de Equipe", "admin.permissions.teamScheme": "Esquema de Equipe", "admin.permissions.teamScheme.addTeams": "Adicionar Equipes", - "admin.permissions.teamScheme.introBanner": "[Team Override Schemes](!https://about.mattermost.com/default-team-override-scheme) set the permissions for Team Admins, Channel Admins and other members in specific teams. Use a Team Override Scheme when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).", + "admin.permissions.teamScheme.introBanner": "[Esquemas de Substituição de Equipe](!https://about.mattermost.com/default-team-override-scheme) definem as permissões para Administradores de Equipe, Administradores de Canal e outros membros em equipes específicas. Use uma Substituição de Esquema Equipe quando equipes específicas precisarem de exceções de permissão para o [Esquema do Sistema](!https://about.mattermost.com/default-system-scheme).", "admin.permissions.teamScheme.noTeams": "Nenhuma equipe selecionada. Por favor adicione equipes a esta lista.", "admin.permissions.teamScheme.removeTeam": "Remover", "admin.permissions.teamScheme.schemeDescriptionLabel": "Descrição do Esquema:", @@ -1121,7 +1121,7 @@ "admin.service.letsEncryptCertificateCacheFile": "Arquivo de Cache de Certificado Let's Encrypt:", "admin.service.letsEncryptCertificateCacheFileDescription": "Os certificados obtidos e outros dados sobre o serviço Let's Encrypt serão armazenados nesse arquivo.", "admin.service.listenAddress": "Endereço à Escutar:", - "admin.service.listenDescription": "O endereço e a porta à qual se ligar e ouvir. Especificando \":8065\" irá ligar-se a todas as interfaces de rede. Especificando \"127.0.0.1:8065\" só irá ligar à interface de rede com esse endereço IP. Se você escolher uma porta de um nível mais baixo (chamadas de \"portas do sistema\" ou \"portas conhecidas\", na faixa de 0-1023), você deve ter permissões para se ligar a essa porta. No Linux, você pode usar: \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" para permitir o Mattermost vincular a portas conhecidas.", + "admin.service.listenDescription": "O endereço e a porta à qual se ligar e ouvir. Especificando \":8065\" irá ligar-se a todas as interfaces de rede. Especificando \"127.0.0.1:8065\" só irá ligar à interface de rede com esse endereço IP. Se você escolher uma porta de um nível mais baixo (chamadas de \"portas do sistema\" ou \"portas conhecidas\", na faixa de 0-1023), você deve ter permissões para se ligar a essa porta. No Linux, você pode usar: \"sudo setcap cap_net_bind_service=+ep ./bin/mattermost\" para permitir o Mattermost vincular a portas conhecidas.", "admin.service.listenExample": "Ex.: \":8065\"", "admin.service.mfaDesc": "Quando verdadeiro, usuários com AD/LDAP ou login por email poderão adicionar a autenticação multi-fator nas suas contas usando o Google Authenticator.", "admin.service.mfaTitle": "Ativar Autenticação Multi-Fator:", @@ -1142,7 +1142,7 @@ "admin.service.sessionIdleTimeoutDesc": "O número de minutos da última vez que um usuário estava ativo no sistema até a expiração da sessão do usuário. Uma vez expirado, o usuário precisará fazer login para continuar. O mínimo é de 5 minutos e 0 é ilimitado.

Aplica-se ao aplicativo de desktop e navegadores. Para aplicativos móveis, use um provedor EMM para bloquear o aplicativo quando não estiver em uso. No modo de Alta Disponibilidade, habilite o balanceamento de carga de IP hash para medição confiável de tempo limite.", "admin.service.sessionIdleTimeoutEx": "Ex.: \"60\"", "admin.service.siteURL": "Site URL:", - "admin.service.siteURLDescription": "The URL that users will use to access Mattermost. Standard ports, such as 80 and 443, can be omitted, but non-standard ports are required. For example: http://example.com:8065. This setting is required.

Mattermost may be hosted at a subpath. For example: http://example.com:8065/company/mattermost. A restart is required before the server will work correctly.", + "admin.service.siteURLDescription": "A URL que os usuários usarão para acessar o Mattermost. Portas padrão, como 80 e 443, podem ser omitidas, mas portas não padrões são necessárias. Por exemplo: http://example.com:8065. Essa configuração é necessária.

O Mattermost pode estar hospedado em um subcaminho. Por exemplo: http://example.com:8065/company/mattermost. Uma reinicialização é necessária antes que o servidor funcione corretamente.", "admin.service.siteURLExample": "Ex.: \"http://example.com:8065\"", "admin.service.ssoSessionDays": "Tamanho da Sessão SSO (dias):", "admin.service.ssoSessionDaysDesc": "O número de dias desde a última vez que um usuário entrou suas credenciais para expirar a sessão do usuário. Se o método de autenticação é SAML ou GitLab, o usuário pode automaticamente ser registrado novamente no Mattermost se já estiver conectado ao SAML ou GitLab. Depois de alterar essa configuração, a configuração terá efeito após a próxima vez que o usuário digitar suas credenciais.", @@ -1230,9 +1230,9 @@ "admin.sidebar.view_statistics": "Estatísticas do Site", "admin.sidebar.webrtc": "WebRTC (Beta)", "admin.sidebarHeader.systemConsole": "Console do Sistema", - "admin.sql.connMaxLifetimeDescription": "Maximum lifetime (in milliseconds) for a connection to the database.", + "admin.sql.connMaxLifetimeDescription": "Duração máxima (em milissegundos) para uma conexão com o banco de dados.", "admin.sql.connMaxLifetimeExample": "Ex.: \"3600000\"", - "admin.sql.connMaxLifetimeTitle": "Maximum Connection Lifetime:", + "admin.sql.connMaxLifetimeTitle": "Duração Máxima da Conexão:", "admin.sql.dataSource": "Fonte de Dados:", "admin.sql.driverName": "Nome do Driver:", "admin.sql.keyDescription": "32-caracteres de salt disponível para encriptar e desencriptar campos no banco de dados.", @@ -1286,7 +1286,7 @@ "admin.team.dirTitle": "Ativar Diretório de Equipe: ", "admin.team.enableConfirmNotificationsToChannelDescription": "Quando verdadeiro, os usuários serão alertados para confirmar o envio do post para @channel e @all em todos os canais com mais de 5 membros. Quando falso, nenhuma confirmação será necessária.", "admin.team.enableConfirmNotificationsToChannelTitle": "Mostrar para @channel e @all a janela de confirmação: ", - "admin.team.maxChannelsDescription": "Número máximo total de canais por equipe, incluindo ambos canais ativos e inativos.", + "admin.team.maxChannelsDescription": "Número máximo total de canais por equipe, incluindo ambos canais ativos e arquivados.", "admin.team.maxChannelsExample": "Ex.: \"100\"", "admin.team.maxChannelsTitle": "Máximo Canais Por Equipe:", "admin.team.maxNotificationsPerChannelDescription": "Número total máximo de usuários em um canal antes de os usuários digitarem as mensagens, @all, @here e @channel não será enviado notificações por motivos de performance.", @@ -1746,7 +1746,7 @@ "delete_channel.cancel": "Cancelar", "delete_channel.confirm": "Confirmar ARQUIVAMENTO do Canal", "delete_channel.del": "Arquivo", - "delete_channel.question": "Isto irá apagar o canal da equipe e todo o conteúdo não vai estar mais disponível para os usuários.

Você tem certeza de que deseja apagar o canal {display_name}?", + "delete_channel.question": "Isto irá arquivar o canal da equipe e todo o conteúdo não vai estar mais disponível para os usuários.

Você tem certeza de que deseja arquivar o canal {display_name}?", "delete_post.cancel": "Cancelar", "delete_post.comment": "Comentário", "delete_post.confirm": "Confirmar Delete {term}", @@ -1831,9 +1831,9 @@ "emoji_picker.searchResults": "Resultados da Pesquisa", "emoji_picker.symbols": "Símbolos", "ent.cluster.save_config_with_roles.error": "A seguinte configuração não pode ser salva quando Alta Disponibilidade está habilitada e o Console do Sistema está em modo de apenas leitura: {keys}.", - "error.channelNotFound.link": "Back to {defaultChannelName}", - "error.channel_not_found.message": "The channel you're requesting is private or does not exist. Please contact an Administrator to be added to the channel.", - "error.channel_not_found.title": "Channel Not Found", + "error.channelNotFound.link": "Voltar para {defaultChannelName}", + "error.channel_not_found.message": "O canal que você está solicitando é privado ou não existe. Entre em contato com um Administrador para ser adicionado ao canal.", + "error.channel_not_found.title": "Canal Não Encontrado", "error.generic.link": "Voltar para {siteName}", "error.generic.link_message": "Voltar para {siteName}", "error.generic.message": "Ocorreu um erro.", @@ -1856,8 +1856,8 @@ "error.oauth_missing_code.office365": "Para {link} verifique se seu administrador da sua conta organizacional da Microsoft foi habilitada para a aplicação Mattermost.", "error.oauth_missing_code.office365.link": "Office 365", "error.oauth_missing_code.title": "Mattermost precisa da sua ajuda", - "error.team_not_found.message": "The team you're requesting is private or does not exist. Please contact your Administrator for an invitation.", - "error.team_not_found.title": "Team Not Found", + "error.team_not_found.message": "A equipe que você está solicitando é particular ou não existe. Entre em contato com seu administrador para um convite.", + "error.team_not_found.title": "Equipe Não Encontrado", "error_bar.apiv3_enabled": "A API versão 3 está obsoleta e agendada para remoção. Saiba como migrar para APIv4.", "error_bar.expired": "Licença Enterprise está expirada e alguns recursos podem estar desativados. Favor renovar.", "error_bar.expiring": "Licença Enterprise expira em {date}. Favor renovar.", @@ -1926,48 +1926,48 @@ "general_tab.yes": "Sim", "generic_icons.add": "Ícone Adicionar", "generic_icons.archive": "Ícone Arquivar", - "generic_icons.arrow.down": "Down Arrow Icon", - "generic_icons.arrow.up": "Up Arrow Icon", - "generic_icons.attach": "Attachment Icon", - "generic_icons.back": "Back Icon", - "generic_icons.breadcrumb": "Breadcrumb Icon", - "generic_icons.channel.private": "Canal Privado", - "generic_icons.channel.public": "Public Channel Icon", - "generic_icons.collapse": "Collapse Icon", - "generic_icons.download": "Download Icon", - "generic_icons.dropdown": "Dropdown Icon", - "generic_icons.edit": "Edit Icon", - "generic_icons.email": "Email Icon", - "generic_icons.expand": "Expand Icon", - "generic_icons.failure": "Failure Icon", - "generic_icons.flag": "Flag Icon", - "generic_icons.flagged": "Flagged Icon", - "generic_icons.help": "Help Icon", - "generic_icons.info": "Info Icon", - "generic_icons.join": "Join Icon", - "generic_icons.loading": "Loading Icon", - "generic_icons.logout": "Logout Icon", - "generic_icons.mattermost": "Mattermost Logo", - "generic_icons.member": "Member Icon", - "generic_icons.mention": "Mention Icon", - "generic_icons.menu": "Menu Icon", - "generic_icons.message": "Message Icon", - "generic_icons.muted": "Muted Icon", - "generic_icons.next": "Next Icon", - "generic_icons.pin": "Pin Icon", - "generic_icons.previous": "Previous Icon", - "generic_icons.reload": "Reload Icon", - "generic_icons.remove": "Remove Icon", - "generic_icons.reply": "Reply Icon", - "generic_icons.report": "Report Icon", - "generic_icons.search": "Search Icon", - "generic_icons.searching": "Searching Icon", - "generic_icons.select": "Select Icon", - "generic_icons.settings": "Settings Icon", - "generic_icons.success": "Success Icon", - "generic_icons.testing": "Testing Icon", - "generic_icons.upload": "Upload Icon", - "generic_icons.warning": "Warning Icon", + "generic_icons.arrow.down": "Ícone Seta para Baixo", + "generic_icons.arrow.up": "Ícone Seta para Cima", + "generic_icons.attach": "Ícone de Anexo", + "generic_icons.back": "Ícone Voltar", + "generic_icons.breadcrumb": "Ícone Migalhas", + "generic_icons.channel.private": "Ícone Canal Privado", + "generic_icons.channel.public": "Ícone Canal Público", + "generic_icons.collapse": "Ícone Recolher", + "generic_icons.download": "Ícone Download", + "generic_icons.dropdown": "Ícone Dropdown", + "generic_icons.edit": "Ícone Editar", + "generic_icons.email": "Ícone Email", + "generic_icons.expand": "Ícone Expandir", + "generic_icons.failure": "Ícone Falha", + "generic_icons.flag": "Ícone Etiqueta", + "generic_icons.flagged": "Ícone Etiquetado", + "generic_icons.help": "Ícone Ajuda", + "generic_icons.info": "Ícone Informação", + "generic_icons.join": "Ícone Juntar", + "generic_icons.loading": "Ícone Carregando", + "generic_icons.logout": "Ícone Sair", + "generic_icons.mattermost": "Logo Mattermost", + "generic_icons.member": "Ícone Membro", + "generic_icons.mention": "Ícone Menção", + "generic_icons.menu": "Ícone Menu", + "generic_icons.message": "Ícone Mensagem", + "generic_icons.muted": "Ícone Mudo", + "generic_icons.next": "Ícone Próximo", + "generic_icons.pin": "Ícone Pinar", + "generic_icons.previous": "Ícone Voltar", + "generic_icons.reload": "Ícone Recarregar", + "generic_icons.remove": "Ícone Remover", + "generic_icons.reply": "Ícone Responder", + "generic_icons.report": "Ícone Relatório", + "generic_icons.search": "Ícone Pesquisar", + "generic_icons.searching": "Ícone Pesquisando", + "generic_icons.select": "Ícone Selecionar", + "generic_icons.settings": "Ícone Configurações", + "generic_icons.success": "Ícone Sucesso", + "generic_icons.testing": "Ícone Testando", + "generic_icons.upload": "Ícone Envio", + "generic_icons.warning": "Ícone Aviso", "get_app.alreadyHaveIt": "Já tem isso?", "get_app.androidAppName": "Mattermost para Android", "get_app.androidHeader": "Mattermost funciona melhor se você alternar para o nosso aplicativo Android", @@ -2027,7 +2027,7 @@ "help.formatting.headings2Example": "Cabeçalho Largo\n-------------", "help.formatting.headingsExample": "## Cabeçalho Largo\n### Cabeçalho Menor\n#### Cabeçalho Ainda Menor", "help.formatting.images": "## Imagens na Linha\n\nCrie imagens na linha usando `!` seguido do texto para imagem entre colchetes e o link entre parenteses. Adicione texto suspenso, colocando-o entre aspas após o link.", - "help.formatting.imagesExample": "![alt texto](link \"texto suspenso\")\n\ne\n\n[![Status Compilação](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform) [![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)", + "help.formatting.imagesExample": "![alt texto](link \"texto suspenso\")\n\ne\n\n[![Status Compilação](https://travis-ci.org/mattermost/mattermost-server.svg?branch=master)](https://travis-ci.org/mattermost/mattermost-server) [![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/mattermost-server)", "help.formatting.inline": "## Código na Linha\n\nCrie fonte monoespaçada na linha cercando o com acentos graves.", "help.formatting.intro": "Markdown torna fácil formatar mensagens. Digite uma mensagem como faria normalmente, e use essas regras para deixa-lá com formatação especial.", "help.formatting.lines": "## Linhas\n\nCrie uma linha usando três `*`, `_`, ou `-`.", @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "Anúncio", "mobile.channel.markAsRead": "Marcar Como Lido", "mobile.channel_drawer.search": "Pular para...", - "mobile.channel_info.alertMessageDeleteChannel": "Você tem certeza que quer excluir o {term} {name}?", + "mobile.channel_info.alertMessageDeleteChannel": "Você tem certeza que quer arquivar o {term} {name}?", "mobile.channel_info.alertMessageLeaveChannel": "Você tem certeza que quer deixar o {term} {name}?", "mobile.channel_info.alertNo": "Não", - "mobile.channel_info.alertTitleDeleteChannel": "Deletar {term}", + "mobile.channel_info.alertTitleDeleteChannel": "Arquivar {term}", "mobile.channel_info.alertTitleLeaveChannel": "Sair {term}", "mobile.channel_info.alertYes": "Sim", - "mobile.channel_info.delete_failed": "Não foi possível apagar o canal {displayName}. Por favor verifique a sua conexão e tente novamente.", + "mobile.channel_info.delete_failed": "Não foi possível arquivar o canal {displayName}. Por favor verifique a sua conexão e tente novamente.", "mobile.channel_info.edit": "Editar Canal", "mobile.channel_info.privateChannel": "Canal Privado", "mobile.channel_info.publicChannel": "Canal Público", @@ -2473,8 +2473,8 @@ "mobile.notification_settings.auto_responder.enabled": "Habilitado", "mobile.notification_settings.auto_responder.footer_message": "Definir uma mensagem personalizada que será enviada automaticamente em resposta a Mensagens Diretas. As menções nos Canais Públicos ou Privados não acionam a resposta automática. A ativação de Respostas Automáticas definem seu status como Fora do Escritório e desativa as notificações por email e por push.", "mobile.notification_settings.auto_responder.message_placeholder": "Mensagem", - "mobile.notification_settings.auto_responder.message_title": "CUSTOM MESSAGE", - "mobile.notification_settings.auto_responder_short": "Automatic Replies", + "mobile.notification_settings.auto_responder.message_title": "MENSAGEM PERSONALIZADA", + "mobile.notification_settings.auto_responder_short": "Respostas Automáticas", "mobile.notification_settings.email": "E-mail", "mobile.notification_settings.email_title": "Notificações por email", "mobile.notification_settings.mentions.channelWide": "Menções de todo canal", @@ -2538,11 +2538,11 @@ "mobile.request.invalid_response": "Recebido uma resposta inválida do servidor.", "mobile.reset_status.alert_cancel": "Cancelar", "mobile.reset_status.alert_ok": "Ok", - "mobile.reset_status.title_ooo": "Disable \"Out Of Office\"?", + "mobile.reset_status.title_ooo": "Desativar \"Fora Do Escritório\"?", "mobile.retry_message": "Atualização de mensagens falharam. Puxe para tentar novamente.", "mobile.routes.channelInfo": "Informações", "mobile.routes.channelInfo.createdBy": "Criado por {creator} em ", - "mobile.routes.channelInfo.delete_channel": "Deletar Canal", + "mobile.routes.channelInfo.delete_channel": "Arquivar Canal", "mobile.routes.channelInfo.favorite": "Favorito", "mobile.routes.channel_members.action": "Remover Membros", "mobile.routes.channel_members.action_message": "Você deve selecionar pelo menos um membro para remover do canal.", @@ -2566,7 +2566,7 @@ "mobile.routes.thread": "Tópico {channelName}", "mobile.routes.thread_dm": "Tópico Mensagem Direta", "mobile.routes.user_profile": "Perfil", - "mobile.routes.user_profile.local_time": "LOCAL TIME", + "mobile.routes.user_profile.local_time": "HORA LOCAL", "mobile.routes.user_profile.send_message": "Enviar Mensagem", "mobile.search.from_modifier_description": "para procurar postagens de um usuário específico", "mobile.search.from_modifier_title": "usuário", @@ -2585,13 +2585,13 @@ "mobile.server_url.invalid_format": "URL deve começar com http:// ou https://", "mobile.session_expired": "Sessão Expirada: Por favor faça o login para continuar recebendo as notificações.", "mobile.set_status.away": "Ausente", - "mobile.set_status.away.icon": "Away Icon", + "mobile.set_status.away.icon": "Ícone Ausente", "mobile.set_status.dnd": "Não Perturbe", - "mobile.set_status.dnd.icon": "Indicador Não Perturbe", + "mobile.set_status.dnd.icon": "Ícone Não Perturbe", "mobile.set_status.offline": "Desconectado", - "mobile.set_status.offline.icon": "Offline Icon", + "mobile.set_status.offline.icon": "Ícone Desconectado", "mobile.set_status.online": "Conectado", - "mobile.set_status.online.icon": "Online Icon", + "mobile.set_status.online.icon": "Ícone Conectado", "mobile.settings.clear": "Apagar Armazenamento Offline", "mobile.settings.clear_button": "Limpar", "mobile.settings.clear_message": "\nIsto irá apagar todos os dados offline e reiniciar o aplicativo. Você será automaticamente conectado novamente quando o aplicativo for reiniciado.\n", @@ -2602,13 +2602,14 @@ "mobile.share_extension.error_close": "Fechar", "mobile.share_extension.error_message": "Um erro ocorreu enquanto usava a extensão compartilhada.", "mobile.share_extension.error_title": "Erro de Extensão", - "mobile.share_extension.post_error": "An error has occurred while posting the message. Please try again.", + "mobile.share_extension.post_error": "Ocorreu um erro enquanto publicava a mensagem. Por favor tente novamente.", "mobile.share_extension.send": "Enviar", "mobile.share_extension.team": "Equipes", "mobile.suggestion.members": "Membros", - "mobile.timezone_settings.automatically": "Definir automáticamente", + "mobile.timezone_settings.automatically": "Definir automaticamente", "mobile.timezone_settings.manual": "Mudar fuso horário", - "mobile.timezone_settings.select": "Select Timezone", + "mobile.timezone_settings.select": "Selecionar Fuso horário", + "mobile.user.settings.notifications.email.fifteenMinutes": "A cada 15 minutos", "mobile.video.save_error_message": "Para salvar o arquivo de video você deve primeiro realizar o download.", "mobile.video.save_error_title": "Erro ao Salvar o Vídeo", "mobile.video_playback.failed_description": "Ocorreu um erro ao tentar reproduzir o video.\n", @@ -2667,7 +2668,7 @@ "navbar.addMembers": "Adicionar Membros", "navbar.click": "Clique aqui", "navbar.clickToAddHeader": "{clickHere} para adionar um.", - "navbar.delete": "Archive Channel...", + "navbar.delete": "Arquivar Canal...", "navbar.leave": "Deixar o Canal", "navbar.manageMembers": "Gerenciar Membros", "navbar.noHeader": "O canal ainda está sem cabeçalho.", @@ -2684,16 +2685,16 @@ "navbar_dropdown.addMemberToTeam": "Adicionar Membros a Equipe", "navbar_dropdown.console": "Console do Sistema", "navbar_dropdown.create": "Criar uma Nova Equipe", - "navbar_dropdown.create.icon": "Criar uma Nova Equipe", + "navbar_dropdown.create.icon": "Criar um Novo Ícone de Equipe", "navbar_dropdown.emoji": "Emoji Personalizado", "navbar_dropdown.help": "Ajuda", "navbar_dropdown.integrations": "Integrações", "navbar_dropdown.inviteMember": "Enviar Email de Convite", "navbar_dropdown.join": "Junte-se a Outra Equipe", - "navbar_dropdown.join.icon": "Junte-se a Outra Equipe", + "navbar_dropdown.join.icon": "Ícone Junte-se a Outra Equipe", "navbar_dropdown.keyboardShortcuts": "Atalhos de teclado", "navbar_dropdown.leave": "Sair da Equipe", - "navbar_dropdown.leave.icon": "Leave Team Icon", + "navbar_dropdown.leave.icon": "Ícone Deixar Equipe", "navbar_dropdown.logout": "Logout", "navbar_dropdown.manageMembers": "Gerenciar Membros", "navbar_dropdown.nativeApps": "Download Aplicativos", @@ -2749,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "Deletar", "post_info.edit": "Editar", + "post_info.message.show_less": "Mostrar Menos", + "post_info.message.show_more": "Mostrar Mais", "post_info.message.visible": "(Visível somente para você)", "post_info.message.visible.compact": " (Visível somente para você)", "post_info.mobile.flag": "Marcar", @@ -2818,12 +2821,12 @@ "rhs_header.backToResultsTooltip": "Voltar para os Resultados da Pesquisa", "rhs_header.closeSidebarTooltip": "Fechar a Barra Lateral", "rhs_header.closeTooltip": "Fechar a Barra Lateral", - "rhs_header.closeTooltip.icon": "Close Sidebar Icon", + "rhs_header.closeTooltip.icon": "Ícone Fechar Barra lateral", "rhs_header.details": "Detalhes da Mensagem", "rhs_header.expandSidebarTooltip": "Expandir a Barra Lateral", - "rhs_header.expandSidebarTooltip.icon": "Expand Sidebar Icon", + "rhs_header.expandSidebarTooltip.icon": "Ícone Expandir Barra lateral", "rhs_header.expandTooltip": "Reduzir a Barra Lateral", - "rhs_header.expandTooltip.icon": "Shrink Sidebar Icon", + "rhs_header.expandTooltip.icon": "Ícone Recolher Barra lateral", "rhs_header.shrinkSidebarTooltip": "Reduzir a Barra Lateral", "rhs_root.del": "Deletar", "rhs_root.direct": "Mensagem Direta", @@ -2861,8 +2864,8 @@ "search_results.usagePin2": "Todos os membros deste canal podem fixar mensagens importantes e úteis.", "search_results.usagePin3": "Mensagens fixadas são visíveis a todos os membros do canal.", "search_results.usagePin4": "Para fixar uma mensagem: Vá para a mensagem que você quer fixar e clique [...] > \"Fixar no canal\".", - "select_team.icon": "Select Team Icon", - "select_team.join.icon": "Join Team Icon", + "select_team.icon": "Ícone Selecionar Equipe", + "select_team.join.icon": "Ícone Juntar a Equipe", "select_team.title": "Selecione Equipe", "setting_item_max.cancel": "Cancelar", "setting_item_max.save": "Salvar", @@ -2948,34 +2951,34 @@ "sidebar_header.tutorial": "

Menu Principal

O Menu Principal é onde você pode Convidar Para Equipe, acessar sua Definição de Conta e ajustar o seu Tema de Cores.

Administradores de equipe podem também acessar suas Configurações de Equipe a partir deste menu.

Administradores de Sistema vão encontrar em Console do Sistema opções para administrar todo o sistema.

", "sidebar_right_menu.accountSettings": "Definições de Conta", "sidebar_right_menu.addMemberToTeam": "Adicionar Membros a Equipe", - "sidebar_right_menu.addMemberToTeam.icon": "Adicionar Membros a Equipe", + "sidebar_right_menu.addMemberToTeam.icon": "Ícone Adicionar Membros a Equipe", "sidebar_right_menu.console": "Console do Sistema", - "sidebar_right_menu.console.icon": "System Console Icon", + "sidebar_right_menu.console.icon": "Ícone Console do Sistema", "sidebar_right_menu.flagged": "Posts Marcados", "sidebar_right_menu.help": "Ajuda", "sidebar_right_menu.inviteNew": "Enviar Email de Convite", - "sidebar_right_menu.inviteNew.icon": "Enviar Email de Convite", + "sidebar_right_menu.inviteNew.icon": "Ícone Enviar Email de Convite", "sidebar_right_menu.logout": "Logout", "sidebar_right_menu.manageMembers": "Gerenciar Membros", "sidebar_right_menu.nativeApps": "Download Aplicativos", - "sidebar_right_menu.nativeApps.icon": "Native Apps Icon", + "sidebar_right_menu.nativeApps.icon": "Ícone Aplicativos Nativos", "sidebar_right_menu.recentMentions": "Menções Recentes", "sidebar_right_menu.report": "Relatar um Problema", "sidebar_right_menu.teamLink": "Obter Link de Convite de Equipe", - "sidebar_right_menu.teamLink.icon": "Obter Link de Convite de Equipe", + "sidebar_right_menu.teamLink.icon": "Ícone Obter Link de Convite de Equipe", "sidebar_right_menu.teamSettings": "Configurações da Equipe", "sidebar_right_menu.viewMembers": "Ver Membros", "signup.email": "Email e Senha", - "signup.email.icon": "Email Icon", + "signup.email.icon": "Ícone Email", "signup.gitlab": "GitLab Single-Sign-On", - "signup.gitlab.icon": "GitLab Icon", + "signup.gitlab.icon": "Ícone Gitlab", "signup.google": "Conta Google", - "signup.google.icon": "Google Icon", + "signup.google.icon": "Ícone Google", "signup.ldap": "Credenciais AD/LDAP", - "signup.ldap.icon": "AD/LDAP ID", + "signup.ldap.icon": "Ícone AD/LDAP", "signup.office365": "Office 365", - "signup.office365.icon": "Office 365 Icon", - "signup.saml.icon": "SAML Icon", + "signup.office365.icon": "Ícone Office 365", + "signup.saml.icon": "Ícone SAML", "signup.title": "Criar uma conta com:", "signup_team.createTeam": "Ou Criar uma Equipe", "signup_team.disabled": "A criação de equipe foi desativada. Por favor, entre em contato com um administrador para o acesso.", @@ -3044,7 +3047,7 @@ "suggestion.search.private": "Canais Privados", "suggestion.search.public": "Canais Públicos", "system_notice.adminVisible": "Somente visivel para os Administradores de Sistema", - "system_notice.adminVisible.icon": "Somente visivel para os Administradores de Sistema", + "system_notice.adminVisible.icon": "Ícone Somente visível para os Administradores de Sistema", "system_notice.body.api3": "Se você criou ou instalou integrações nos últimos dois anos, descubra como as mudanças recentes podem tê-las afetado.", "system_notice.body.permissions": "Algumas configurações de diretiva e permissão do Console do Sistema foram movidas com o lançamento das permissões avançadas em Enterprise E10 e E20.", "system_notice.dont_show": "Não mostrar novamente", @@ -3134,7 +3137,7 @@ "user.settings.advance.enabledFeatures": "{count, number} {count, plural, one {Recurso} other {Recursos}} Ativado", "user.settings.advance.formattingDesc": "Se ativado, posts serão formatados para criar links, exibir emoji, estilo de texto e adicionar quebra de linhas. Por padrão é definido como ativado. Mudando está configuração será necessário recarregar a página.", "user.settings.advance.formattingTitle": "Ativar Formatação de Post", - "user.settings.advance.icon": "Configurações Avançadas", + "user.settings.advance.icon": "Ícone Configurações Avançadas", "user.settings.advance.joinLeaveDesc": "Quando \"Ligado\", Mensagens do Sistema dizendo que um usuário entrou ou saiu de um canal serão visíveis. Quando \"Off\", as Mensagens do Sistema sobre entrada e saída de um canal serão ocultadas. Uma mensagem ainda vai aparecer quando você é adicionado a um canal para que você possa receber uma notificação.", "user.settings.advance.joinLeaveTitle": "Ativar Mensagens Juntar/Deixar", "user.settings.advance.markdown_preview": "Mostrar opção pré-visualização markdown na caixa de entrada de mensagens", @@ -3181,7 +3184,7 @@ "user.settings.display.collapseOn": "Expandido", "user.settings.display.fixedWidthCentered": "Largura fixa, centralizada", "user.settings.display.fullScreen": "Largura inteira", - "user.settings.display.icon": "Configurações de Exibição", + "user.settings.display.icon": "Ícone Configurações de Exibição", "user.settings.display.language": "Idioma", "user.settings.display.linkPreviewDesc": "Quando disponível, o primeiro link em uma mensagem irá exibir uma pré-visualização no conteúdo do site abaixo da mensagem.", "user.settings.display.linkPreviewDisplay": "Pré-visualização de Website", @@ -3234,7 +3237,7 @@ "user.settings.general.field_handled_externally": "Este campo é tratada pelo seu provedor de login. Se você quiser mudá-lo, você precisa fazê-lo através de seu provedor de login.", "user.settings.general.firstName": "Primeiro nome", "user.settings.general.fullName": "Nome Completo", - "user.settings.general.icon": "Definições Gerais", + "user.settings.general.icon": "Ícone Definições Gerais", "user.settings.general.imageTooLarge": "Não é possível fazer upload da imagem de perfil. O arquivo é muito grande.", "user.settings.general.imageUpdated": "Imagem última atualização {date}", "user.settings.general.lastName": "Último Nome", @@ -3326,7 +3329,7 @@ "user.settings.notifications.emailInfo": "Notificações de menções e mensagens diretas, são enviadas por e-mail quando você está desconectado ou ausente do {siteName} por mais de 5 minutos.", "user.settings.notifications.emailNotifications": "Notificações por email", "user.settings.notifications.header": "Notificações", - "user.settings.notifications.icon": "Configurações de Notificação", + "user.settings.notifications.icon": "Ícone Configurações de Notificação", "user.settings.notifications.info": "Notificações no desktop estão disponíveis no Edge, Firefox, Safari, Chrome e Mattermost Desktop Apps.", "user.settings.notifications.mentionsInfo": "As Menções são ativadas quando alguém envia uma mensagem que inclui seu usuário (\"@{username}\") ou qualquer uma das opções selecionadas acima.", "user.settings.notifications.never": "Nunca", @@ -3370,7 +3373,7 @@ "user.settings.security.emailPwd": "Email e Senha", "user.settings.security.gitlab": "GitLab", "user.settings.security.google": "Google", - "user.settings.security.icon": "Configurações de Segurança", + "user.settings.security.icon": "Ícone Configurações de Segurança", "user.settings.security.inactive": "Inativo", "user.settings.security.lastUpdated": "Última atualização {date} {time}", "user.settings.security.ldap": "AD/LDAP", @@ -3380,7 +3383,7 @@ "user.settings.security.loginOffice365": "Login feito através do Office 365", "user.settings.security.loginSaml": "Login feito através do SAML", "user.settings.security.logoutActiveSessions": "Ver e fazer Logout das Sessões Ativas", - "user.settings.security.logoutActiveSessions.icon": "Sessões ativas", + "user.settings.security.logoutActiveSessions.icon": "Ícone Sessões ativas", "user.settings.security.method": "Método de Login", "user.settings.security.newPassword": "Nova Senha", "user.settings.security.noApps": "Nenhuma Aplicação OAuth 2.0 está autorizada.", @@ -3423,11 +3426,11 @@ "user.settings.security.switchSaml": "Trocar para usar SAML SSO", "user.settings.security.title": "Configurações de Segurança", "user.settings.security.viewHistory": "Ver Histórico de Acesso", - "user.settings.security.viewHistory.icon": "Access History Icon", + "user.settings.security.viewHistory.icon": "Ícone Histórico de Acesso", "user.settings.sidebar.after_seven_days": "Após 7 dias sem novas mensagens", "user.settings.sidebar.autoCloseDMDesc": "As conversas de Mensagens Diretas podem ser reabertas com o botão “+” na barra lateral ou usando o Alternador de Canais (CTRL+K).", "user.settings.sidebar.autoCloseDMTitle": "Fechar Mensagens Diretas Automáticamente", - "user.settings.sidebar.icon": "Configurações Barra Lateral", + "user.settings.sidebar.icon": "Ícone Configurações Barra Lateral", "user.settings.sidebar.never": "Nunca", "user.settings.sidebar.showUnreadSection": "No topo do canal na barra lateral", "user.settings.sidebar.title": "Configurações Barra Lateral", @@ -3473,7 +3476,7 @@ "user_profile.account.editSettings": "Editar Definições de Conta", "user_profile.account.localTime": "Hora Local: ", "user_profile.send.dm": "Enviar Mensagem", - "user_profile.send.dm.icon": "Send Message Icon", + "user_profile.send.dm.icon": "Ícone Enviar Mensagem", "user_profile.webrtc.call": "Iniciar Video Chamada", "user_profile.webrtc.offline": "O usuário está desconectado", "user_profile.webrtc.unavailable": "Nova chamada não disponível até que você termine a chamada existente", @@ -3491,30 +3494,30 @@ "web.root.signup_info": "Toda comunicação em um só lugar, pesquisável e acessível em qualquer lugar", "webrtc.busy": "{username} está ocupado.", "webrtc.call": "Chamada", - "webrtc.call.icon": "Call Icon", + "webrtc.call.icon": "Ícone Chamada", "webrtc.callEnded": "Terminada a chamada com {username}.", "webrtc.cancel": "Cancelar chamada", - "webrtc.cancel.icon": "Cancel call Icon", + "webrtc.cancel.icon": "Ícone Cancelar chamada", "webrtc.cancelled": "{username} cancelou a chamada.", "webrtc.declined": "Sua chamada foi recusada por {username}.", "webrtc.disabled": "{username} está com WebRTC desativado, e não pode receber chamadas. Para ativar o recurso, eles devem ir para Configurações de Conta > Avançado > Visualizar recursos de pré-lançamento e ativar WebRTC.", "webrtc.failed": "Houve um problema na conexão da vídeo chamada.", "webrtc.hangup": "Desligar", "webrtc.header": "Chamada com {username}", - "webrtc.icon": "Webrtc Icon", + "webrtc.icon": "Ícone Webrtc", "webrtc.inProgress": "Você já tem uma chamada em progresso. Por favor desligue primeiro.", "webrtc.mediaError": "Não foi possível acessar a câmera ou microfone.", "webrtc.mute_audio": "Silenciar microfone", - "webrtc.mute_audio.icon": "Mute Icon", + "webrtc.mute_audio.icon": "Ícone Mudo", "webrtc.noAnswer": "{username} não está respondendo a chamada.", "webrtc.notification.answer": "Resposta", - "webrtc.notification.answer.icon": "Answer Icon", + "webrtc.notification.answer.icon": "Ícone Responder", "webrtc.notification.decline": "Recusar", "webrtc.notification.incoming_call": "{username} está chamando.", "webrtc.notification.returnToCall": "Retornar a chamada em curso com {username}", "webrtc.offline": "{username} está desconectado.", "webrtc.pause_video": "Desligar a câmera", - "webrtc.return.icon": "Return to Call Icon", + "webrtc.return.icon": "Ícone Retornar a Chamada", "webrtc.unmute_audio": "Ligar microfone", "webrtc.unpause_video": "Ligar a câmera", "webrtc.unsupported": "O cliente de {username} não suporta vídeo chamadas.", diff --git a/assets/base/i18n/ru.json b/assets/base/i18n/ru.json index cd84793bd..9f0763331 100644 --- a/assets/base/i18n/ru.json +++ b/assets/base/i18n/ru.json @@ -1952,7 +1952,7 @@ "generic_icons.mention": "Mention Icon", "generic_icons.menu": "Menu Icon", "generic_icons.message": "Message Icon", - "generic_icons.muted": "Muted Icon", + "generic_icons.muted": "Иконка приглушить звук", "generic_icons.next": "Next Icon", "generic_icons.pin": "Pin Icon", "generic_icons.previous": "Previous Icon", @@ -2311,10 +2311,10 @@ "mobile.announcement_banner.title": "Announcement", "mobile.channel.markAsRead": "Mark As Read", "mobile.channel_drawer.search": "Jump to...", - "mobile.channel_info.alertMessageDeleteChannel": "Вы действительно хотите удалить {term} {name}?", + "mobile.channel_info.alertMessageDeleteChannel": "Вы действительно хотите покинуть {term} {name}?", "mobile.channel_info.alertMessageLeaveChannel": "Вы действительно хотите покинуть {term} {name}?", "mobile.channel_info.alertNo": "Нет", - "mobile.channel_info.alertTitleDeleteChannel": "Удалить {term}", + "mobile.channel_info.alertTitleDeleteChannel": "Archive {term}", "mobile.channel_info.alertTitleLeaveChannel": "Покинуть {term}", "mobile.channel_info.alertYes": "Да", "mobile.channel_info.delete_failed": "Мы не можем подключиться к каналу {displayName}. Пожалуйста, проверьте подключение и попробуйте заново.", @@ -2542,7 +2542,7 @@ "mobile.retry_message": "Refreshing messages failed. Pull up to try again.", "mobile.routes.channelInfo": "Информация", "mobile.routes.channelInfo.createdBy": "Создан {creator} в ", - "mobile.routes.channelInfo.delete_channel": "Удалить канал", + "mobile.routes.channelInfo.delete_channel": "Archive Channel", "mobile.routes.channelInfo.favorite": "Избранные", "mobile.routes.channel_members.action": "Удалить участников", "mobile.routes.channel_members.action_message": "Вы должны выбрать хотя бы одного участника для удаления с канала.", @@ -2609,6 +2609,7 @@ "mobile.timezone_settings.automatically": "Set automatically", "mobile.timezone_settings.manual": "Change timezone", "mobile.timezone_settings.select": "Select Timezone", + "mobile.user.settings.notifications.email.fifteenMinutes": "Every 15 minutes", "mobile.video.save_error_message": "To save the video file you need to download it first.", "mobile.video.save_error_title": "Save Video Error", "mobile.video_playback.failed_description": "An error occurred while trying to play the video.\n", @@ -2749,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "Удалить", "post_info.edit": "Редактировать", + "post_info.message.show_less": "Show Less", + "post_info.message.show_more": "Show More", "post_info.message.visible": "(Только видимый для вас)", "post_info.message.visible.compact": "(Только видимый для вас)", "post_info.mobile.flag": "Отметить", diff --git a/assets/base/i18n/tr.json b/assets/base/i18n/tr.json index c01c172d9..2caa78182 100644 --- a/assets/base/i18n/tr.json +++ b/assets/base/i18n/tr.json @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "Duyuru", "mobile.channel.markAsRead": "Okunmuş Olarak İşaretle", "mobile.channel_drawer.search": "Şuraya geç...", - "mobile.channel_info.alertMessageDeleteChannel": "{term} {name} kanalını silmek istediğinize emin misiniz?", + "mobile.channel_info.alertMessageDeleteChannel": "{term} {name} kanalını arşivlemek istediğinize emin misiniz?", "mobile.channel_info.alertMessageLeaveChannel": "{term} {name} kanalından ayrılmak istediğinize emin misiniz?", "mobile.channel_info.alertNo": "Hayır", - "mobile.channel_info.alertTitleDeleteChannel": "{term} Kanalını Sil", + "mobile.channel_info.alertTitleDeleteChannel": "{term} kanalını arşivle", "mobile.channel_info.alertTitleLeaveChannel": "{term} Kanalından Ayrıl", "mobile.channel_info.alertYes": "Evet", - "mobile.channel_info.delete_failed": "{displayName} kanalı silinemedi. Lütfen bağlantınızı denetleyip yeniden deneyin.", + "mobile.channel_info.delete_failed": "{displayName} kanalı arşivlenemedi. Lütfen bağlantınızı denetleyip yeniden deneyin.", "mobile.channel_info.edit": "Kanalı Düzenle", "mobile.channel_info.privateChannel": "Özel Kanal", "mobile.channel_info.publicChannel": "Herkese Açık Kanal", @@ -2542,7 +2542,7 @@ "mobile.retry_message": "İletiler yenilenemedi. Yeniden denemek için yukarı çekin.", "mobile.routes.channelInfo": "Bilgiler", "mobile.routes.channelInfo.createdBy": "{creator} tarafından şu zamanda oluşturuldu ", - "mobile.routes.channelInfo.delete_channel": "Kanalı Sil", + "mobile.routes.channelInfo.delete_channel": "Kanalı Arşivle", "mobile.routes.channelInfo.favorite": "Beğendiklerime Ekle", "mobile.routes.channel_members.action": "Üyeleri Çıkar", "mobile.routes.channel_members.action_message": "Kanaldan çıkarılacak en az bir üye seçmelisiniz.", @@ -2609,6 +2609,7 @@ "mobile.timezone_settings.automatically": "Otomatik olarak ayarlansın", "mobile.timezone_settings.manual": "Saat dilimini değiştir", "mobile.timezone_settings.select": "Saat Dilimini Seçin", + "mobile.user.settings.notifications.email.fifteenMinutes": "Every 15 minutes", "mobile.video.save_error_message": "Görüntü dosyasını kaydedebilmek için önce indirmelisiniz.", "mobile.video.save_error_title": "Görüntü Kaydetme Sorunu", "mobile.video_playback.failed_description": "Görüntü oynatılmaya çalışılırken bir sorun çıktı.\n", @@ -2749,6 +2750,8 @@ "post_info.bot": "BOT", "post_info.del": "Sil", "post_info.edit": "Düzenle", + "post_info.message.show_less": "Show Less", + "post_info.message.show_more": "Diğerlerini Görüntüle", "post_info.message.visible": "(Yalnız siz görebilirsiniz)", "post_info.message.visible.compact": " (Yalnız siz görebilirsiniz)", "post_info.mobile.flag": "İşaretle", diff --git a/assets/base/i18n/zh-CN.json b/assets/base/i18n/zh-CN.json index 7dda5a18e..d45b39d90 100644 --- a/assets/base/i18n/zh-CN.json +++ b/assets/base/i18n/zh-CN.json @@ -232,7 +232,7 @@ "admin.complianceExport.description": "此功能支持合规导出到 Actiance XML 和 GlobalRelay EML 格式并目前处于 beta 状态。Mattermost CSV 格式预计在今后版本支持并会取代合规功能。", "admin.complianceExport.exportFormat.actiance": "Actiance XML", "admin.complianceExport.exportFormat.csv": "CSV", - "admin.complianceExport.exportFormat.description": "合规导出格式。对应您想导入数据到的系统。

Actiance XML 将导出文件写入到 本地储存目录 中的 \"exports\" 子目录。Global Relay EML 将发送到指定的电子邮件地址。", + "admin.complianceExport.exportFormat.description": "合规导出格式。对应您想导入数据到的系统。

对于 Actiance XML 或 CSV,合规导出文件将写入到 本地储存目录 中的 \"exports\" 子目录。Global Relay EML 将发送到指定的电子邮件地址。", "admin.complianceExport.exportFormat.globalrelay": "GlobalRelay EML", "admin.complianceExport.exportFormat.title": "导出格式:", "admin.complianceExport.exportJobStartTime.description": "设置每日合规导出任务开始的时间。设置一个较少人使用的时间。必须为 24 小时制并格式为 HH:MM。", @@ -303,14 +303,14 @@ "admin.customization.enableCustomEmojiTitle": "启用自定义表情:", "admin.customization.enableEmojiPickerDesc": "表情符选择器允许用户选择表情符做为互动或用在消息中。在拥有大量自定义表情符下开启表情符选择器将会降低性能。", "admin.customization.enableEmojiPickerTitle": "开启表情符选择器:", - "admin.customization.enableGifPickerDesc": "Allow users to select GIFs from the emoji picker via a Gfycat integration.", - "admin.customization.enableGifPickerTitle": "开启表情符选择器:", + "admin.customization.enableGifPickerDesc": "允许用户在表情符选择器中选择 Gfycat 整合中的 GIF 图片。", + "admin.customization.enableGifPickerTitle": "开启 GIF 选择器:", "admin.customization.enableLinkPreviewsDesc": "当可用时,在消息下面显示网址内容预览。用户可以在帐号设定 > 显示 > 网站链接预览关闭这些预览。", "admin.customization.enableLinkPreviewsTitle": "启用链接预览:", - "admin.customization.gfycatApiKey": "Gfycat API Key:", - "admin.customization.gfycatApiKeyDescription": "Request an API key at https://developers.gfycat.com/signup/#/. Enter the client ID you receive via email to this field. When blank, uses the default API key provided by Gfycat.", - "admin.customization.gfycatApiSecret": "Gfycat API Secret:", - "admin.customization.gfycatApiSecretDescription": "The API secret generated by Gfycat for your API key. When blank, uses the default API secret provided by Gfycat.", + "admin.customization.gfycatApiKey": "Gfycat API Key:", + "admin.customization.gfycatApiKeyDescription": "在 https://developers.gfycat.com/signup/#/ 请求 API 键。输入您在邮件中收到的 client ID 到此栏。当留空时,将使用 Gfycat 提供的默认 API 键。", + "admin.customization.gfycatApiSecret": "Gfycat API 密码:", + "admin.customization.gfycatApiSecretDescription": "Gfycat 生成的对应您的 API 键的钥匙。当留空时,将使用 Gfycat 提供的默认钥匙。", "admin.customization.gif": "GIF (Beta)", "admin.customization.iosAppDownloadLinkDesc": "添加iOS应用下载链接。用移动设备访问的用户将看到应用下载提示页面。此栏留空将不显示。", "admin.customization.iosAppDownloadLinkTitle": "iOS应用下载网址:", @@ -541,7 +541,7 @@ "admin.image.amazonS3EndpointDescription": "您的 S3 兼容储存提供商的主机名称。默认为 \"s3.amazonaws.com\"。", "admin.image.amazonS3EndpointExample": "例如:\"s3.amazonaws.com\"", "admin.image.amazonS3EndpointTitle": "亚马逊 S3 连接点:", - "admin.image.amazonS3IdDescription": "(可选) 只有在您不想使用 IAM role 验证 S3。输入您的 Amazon EC2 管理提供的访问密钥 ID。", + "admin.image.amazonS3IdDescription": "(可选) 只有在您不想使用 IAM role 验证 S3 时需要。输入您的 Amazon EC2 管理员提供的访问密钥 ID。", "admin.image.amazonS3IdExample": "例如 \"AKIADTOVBGERKLCBV\"", "admin.image.amazonS3IdTitle": "Amazon S3 访问密钥 ID:", "admin.image.amazonS3RegionDescription": "您创建 S3 储存桶时选择的 AWS 区域。如果没设定区域, Mattermost 将尝试从 AWS 获取适当的区域,如果没有找到则使用 'us-east-1'。", @@ -565,7 +565,7 @@ "admin.image.proxyOptions": "图片代理选项:", "admin.image.proxyOptionsDescription": "额外选项如签署密钥网址。参见您的图片代理文档了解更多支持的选项。", "admin.image.proxyType": "图片代理类型:", - "admin.image.proxyTypeDescription": "设置个 Markdown 代理服务器用于加载图片。图片代理能防止用户发起不安全的图片请求并提供缓存来提高性能和自动图片调整如改变大小。参见文档了解更多。", + "admin.image.proxyTypeDescription": "设置个代理服务器用于加载 Markdown 图片。图片代理能防止用户发起不安全的图片请求并提供缓存来提高性能和自动图片调整如改变大小。参见文档了解更多。", "admin.image.proxyTypeNone": "无", "admin.image.proxyURL": "图片代理网址:", "admin.image.proxyURLDescription": "您的图片代理服务器网址。", @@ -769,9 +769,9 @@ "admin.permissions.group.integrations.name": "整合与自定义", "admin.permissions.group.posts.description": "编写,编辑以及删除消息。", "admin.permissions.group.posts.name": "管理消息", - "admin.permissions.group.private_channel.description": "创建和删除频道,管理设定和成员。", + "admin.permissions.group.private_channel.description": "创建和归档频道,管理设定和成员。", "admin.permissions.group.private_channel.name": "管理私有频道", - "admin.permissions.group.public_channel.description": "加入、创建以及删除频道,管理设定与成员。", + "admin.permissions.group.public_channel.description": "加入、创建以及归档频道,管理设定与成员。", "admin.permissions.group.public_channel.name": "管理公共频道", "admin.permissions.group.reactions.description": "添加和删除消息的反应。", "admin.permissions.group.reactions.name": "消息反应", @@ -780,7 +780,7 @@ "admin.permissions.group.teams.description": "创建团队和管理成员。", "admin.permissions.group.teams.name": "团队", "admin.permissions.inherited_from": "从{name}继承", - "admin.permissions.introBanner": "Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our [documentation](!https://about.mattermost.com/default-advanced-permissions).", + "admin.permissions.introBanner": "给团队管理员、频道管理员、以及所有其他人设置默认权限方案。了解更多关于权限方案请至我们的[文档](!https://about.mattermost.com/default-advanced-permissions)。", "admin.permissions.loadMoreSchemes": "加载更多方案", "admin.permissions.loadingMoreSchemes": "加载中...", "admin.permissions.permission.assign_system_admin_role.description": "指派系统管理员角色", @@ -802,9 +802,9 @@ "admin.permissions.permission.delete_post.description": "作者可以删除自己的消息。", "admin.permissions.permission.delete_post.name": "删除自己的消息", "admin.permissions.permission.delete_private_channel.description": "归档私有频道", - "admin.permissions.permission.delete_private_channel.name": "Archive Channels", - "admin.permissions.permission.delete_public_channel.description": "删除公共频道。", - "admin.permissions.permission.delete_public_channel.name": "Archive Channels", + "admin.permissions.permission.delete_private_channel.name": "归档频道", + "admin.permissions.permission.delete_public_channel.description": "归档公共频道。", + "admin.permissions.permission.delete_public_channel.name": "归档频道", "admin.permissions.permission.edit_other_users.description": "编辑其他用户", "admin.permissions.permission.edit_other_users.name": "编辑其他用户", "admin.permissions.permission.edit_post.description": "在发布 {editTimeLimitButton} 后,允许用户编辑自己的消息。", @@ -877,7 +877,7 @@ "admin.permissions.systemScheme.allMembersTitle": "所有成员", "admin.permissions.systemScheme.channelAdminsDescription": "已给予权限至频道创建者以及任何频道管理员。", "admin.permissions.systemScheme.channelAdminsTitle": "频道管理员", - "admin.permissions.systemScheme.introBanner": "Configure the default permissions for Team Admins, Channel Admins and other members. This scheme is inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied in specific teams.", + "admin.permissions.systemScheme.introBanner": "配置给团队管理员、频道管理员、以及所有其他人默认权限方案。此方案将被所有团队继承除非[团队覆盖方案](!https://about.mattermost.com/default-team-override-scheme)已设置。", "admin.permissions.systemScheme.resetDefaultsButton": "重置至默认", "admin.permissions.systemScheme.resetDefaultsButtonModalBody": "这将重置此页面的所有选择。您确定要重置吗?", "admin.permissions.systemScheme.resetDefaultsButtonModalTitle": "重置至默认?", @@ -887,9 +887,9 @@ "admin.permissions.systemScheme.teamAdminsDescription": "已给予权限至频道创建者以及任何频道管理员。", "admin.permissions.systemScheme.teamAdminsTitle": "团读管理员", "admin.permissions.systemSchemeBannerButton": "编辑方案", - "admin.permissions.systemSchemeBannerText": "Set the default permissions inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied.", + "admin.permissions.systemSchemeBannerText": "设置将被所有团队继承的默认权限方案,除非[团队覆盖方案](!https://about.mattermost.com/default-team-override-scheme)已设置。", "admin.permissions.systemSchemeBannerTitle": "系统方案", - "admin.permissions.teamOverrideSchemesBannerText": "Use when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).", + "admin.permissions.teamOverrideSchemesBannerText": "在指定的团队需要[系统方案](!https://about.mattermost.com/default-system-scheme)特例时使用。", "admin.permissions.teamOverrideSchemesInProgress": "数据转移任务进行中:团队覆盖方案在任务服务器完成转移权限前不可用。参阅 {documentationLink} 了解详情。", "admin.permissions.teamOverrideSchemesNewButton": "新团队覆盖方案", "admin.permissions.teamOverrideSchemesNoJobsEnabled": "数据转移任务暂停中:团队覆盖方案在任务服务器可以转移权限前不可用。任务将在任务服务器开启后自动开始运行。参阅 {documentationLink} 了解详情。", @@ -897,7 +897,7 @@ "admin.permissions.teamOverrideSchemesTitle": "团队覆盖方案", "admin.permissions.teamScheme": "团队方案", "admin.permissions.teamScheme.addTeams": "团加团队", - "admin.permissions.teamScheme.introBanner": "[Team Override Schemes](!https://about.mattermost.com/default-team-override-scheme) set the permissions for Team Admins, Channel Admins and other members in specific teams. Use a Team Override Scheme when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).", + "admin.permissions.teamScheme.introBanner": "[团队覆盖方案](!https://about.mattermost.com/default-team-override-scheme)给指定的团队设置团队管理员、频道管理员、以及其他成员的权限。在指定的团队需要[系统方案](!https://about.mattermost.com/default-system-scheme)特例时使用团队覆盖方案。", "admin.permissions.teamScheme.noTeams": "未选择团队。请添加团队到此列表。", "admin.permissions.teamScheme.removeTeam": "移除", "admin.permissions.teamScheme.schemeDescriptionLabel": "方案描述:", @@ -1142,8 +1142,8 @@ "admin.service.sessionIdleTimeoutDesc": "用户最后活动时间到用户会话失效的分钟数。一旦失效,用户将需要登入才能继续。至少 5 分钟,0 为无限。

使用于桌面应用和浏览器。移动设备应用使用 EMM 提供商使应用在没有活动时锁定。在高可用性模式下,开启 IP 哈系负载平衡来取得可靠的过时测量。", "admin.service.sessionIdleTimeoutEx": "例如:\"60\"", "admin.service.siteURL": "站点网址:", - "admin.service.siteURLDescription": "The URL that users will use to access Mattermost. Standard ports, such as 80 and 443, can be omitted, but non-standard ports are required. For example: http://example.com:8065. This setting is required.

Mattermost may be hosted at a subpath. For example: http://example.com:8065/company/mattermost. A restart is required before the server will work correctly.", - "admin.service.siteURLExample": "E.g.: \"http://example.com:8065\"", + "admin.service.siteURLDescription": "用户访问 Mattermost 的网址。默认端口如 80 和 443 可以被省略,但使用非标准端口时必须填写。举例:http://example.com:8065。此设定为必须。

Mattermost 可以使用子路径。举例:http://example.com:8065/company/mattermost。在服务器正常工作前需重启。", + "admin.service.siteURLExample": "例如:\"http://example.com:8065\"", "admin.service.ssoSessionDays": "SSO 会话时长 (天):", "admin.service.ssoSessionDaysDesc": "从用户上一次输入他们的认证到会话过期的天数。如果验证方式时SAML或GitLab,用户将会自动登入到Mattermost如果他们已经登入到SAML或GitLab。修改此设定后,新的会话时常将在用户下一次输入认证后生效。", "admin.service.testingDescription": "当设为是时,/test 斜杠命令能载入测试账号,数据和文字格式。修改这个设置需要重启服务器才能生效。", @@ -1230,9 +1230,9 @@ "admin.sidebar.view_statistics": "站点统计", "admin.sidebar.webrtc": "WebRTC (Beta)", "admin.sidebarHeader.systemConsole": "系统控制台", - "admin.sql.connMaxLifetimeDescription": "Maximum lifetime (in milliseconds) for a connection to the database.", - "admin.sql.connMaxLifetimeExample": "例如 \"10000\"", - "admin.sql.connMaxLifetimeTitle": "Maximum Connection Lifetime:", + "admin.sql.connMaxLifetimeDescription": "数据库连接的最大时限 (毫秒)。", + "admin.sql.connMaxLifetimeExample": "例如 \"3600000\"", + "admin.sql.connMaxLifetimeTitle": "最大连接时限:", "admin.sql.dataSource": "数据源:", "admin.sql.driverName": "驱动名:", "admin.sql.keyDescription": "32位盐值字符用于加密和解密数据库敏感字段。", @@ -1286,7 +1286,7 @@ "admin.team.dirTitle": "启用团队目录:", "admin.team.enableConfirmNotificationsToChannelDescription": "当设为是时,用户在超过五个成员的频道使用 @channel 和 @all 时提示确认。当设为否时,不需要确认。", "admin.team.enableConfirmNotificationsToChannelTitle": "显示 @channel 和 @all 确认对话框:", - "admin.team.maxChannelsDescription": "每个团队最多频道数,包括活动的和已删除的频道。", + "admin.team.maxChannelsDescription": "每个团队最多频道数,包括活动的和已归档的频道。", "admin.team.maxChannelsExample": "例如:\"100\"", "admin.team.maxChannelsTitle": "每团队最多频道数:", "admin.team.maxNotificationsPerChannelDescription": "因性能限制输入消息、@all、@here 以及 @channel 发通知的最大频道总用户数 。", @@ -1458,7 +1458,7 @@ "audit_table.by": "由 {username}", "audit_table.byAdmin": "由管理员", "audit_table.channelCreated": "创建了 {channelName} 频道", - "audit_table.channelDeleted": "删除了网址为 {url} 的频道", + "audit_table.channelDeleted": "归档了网址为 {url} 的频道", "audit_table.establishedDM": "与 {username} 建立了一个私聊频道", "audit_table.failedExpiredLicenseAdd": "许可证由于已过期或未开始而无法添加", "audit_table.failedInvalidLicenseAdd": "无法添加无效的许可证", @@ -1512,7 +1512,7 @@ "backstage_sidebar.integrations.outgoing_webhooks": "对外Webhooks", "calling_screen": "呼叫中", "center_panel.recent": "点击这里跳转到最近的消息。", - "center_panel.recent.icon": "转跳至最近的消息", + "center_panel.recent.icon": "转跳至最近的消息图标", "change_url.close": "关闭", "change_url.endWithLetter": "网址必须以字母或数字结尾。", "change_url.invalidUrl": "无效的网址", @@ -1536,7 +1536,7 @@ "channel_header.channelHeader": "编辑频道标题", "channel_header.channelMembers": "成员", "channel_header.convert": "转换至私有频道", - "channel_header.delete": "Archive Channel", + "channel_header.delete": "归档频道", "channel_header.directchannel.you": "{displayname} (您) ", "channel_header.flagged": "已标记的信息", "channel_header.leave": "离开频道", @@ -1711,7 +1711,7 @@ "create_post.comment": "评论", "create_post.deactivated": "您正在查看已注销用户的归档频道。", "create_post.error_message": "您的消息太长。字数:{length}/{limit}", - "create_post.icon": "Send Post Icon", + "create_post.icon": "发送消息图标", "create_post.post": "发布", "create_post.read_only": "此频道为只读。只有拥有权限的成员可在此发布消息。", "create_post.shortcutsNotSupported": "您的设备不支持键盘快捷键。", @@ -1744,9 +1744,9 @@ "deactivate_member_modal.title": "停用 {username}", "default_channel.purpose": "发表您想所有人看到的消息。所有人在加入团队时候自动成员此频道的永久成员。", "delete_channel.cancel": "取消", - "delete_channel.confirm": "Confirm ARCHIVE Channel", - "delete_channel.del": "Archive", - "delete_channel.question": "这会从团队删除此频道并且没有用户可以读取其数据。

您确定要删除{display_name}频道?", + "delete_channel.confirm": "确认频道归档", + "delete_channel.del": "归档", + "delete_channel.question": "这会从团队归档此频道并且所有用户将无法读取其数据。

您确定要归档{display_name}频道?", "delete_post.cancel": "取消", "delete_post.comment": "评论", "delete_post.confirm": "确认{term}删除", @@ -1754,10 +1754,10 @@ "delete_post.post": "发布", "delete_post.question": "您确认要删除{term}?", "delete_post.warning": "此消息有 {count, number} 条评论。", - "device_icons.android": "Android Icon", - "device_icons.apple": "Apple Icon", - "device_icons.linux": "Linux Icon", - "device_icons.windows": "Windows Icon", + "device_icons.android": "安卓图标", + "device_icons.apple": "苹果图标", + "device_icons.linux": "Linux 图标", + "device_icons.windows": "Windows 图标", "discard_changes_modal.leave": "是的,抛弃", "discard_changes_modal.message": "您有未保存的更改,您确定你想要抛弃他们吗?", "discard_changes_modal.title": "抛弃修改?", @@ -1827,13 +1827,13 @@ "emoji_picker.people": "人物", "emoji_picker.places": "地点", "emoji_picker.recent": "最近使用", - "emoji_picker.search": "Search Emoji", + "emoji_picker.search": "搜索表情符", "emoji_picker.searchResults": "搜索结果", "emoji_picker.symbols": "符号", "ent.cluster.save_config_with_roles.error": "以下设定在高可用性模式开启并且系统控制台为只读时无法保存:{keys}。", - "error.channelNotFound.link": "Back to {defaultChannelName}", - "error.channel_not_found.message": "The channel you're requesting is private or does not exist. Please contact an Administrator to be added to the channel.", - "error.channel_not_found.title": "Channel Not Found", + "error.channelNotFound.link": "回到{defaultChannelName}", + "error.channel_not_found.message": "您请求的频道为私有或不存在。请联系管理员以添加到频道。", + "error.channel_not_found.title": "无找到频道", "error.generic.link": "返回到 {siteName}", "error.generic.link_message": "返回到 {siteName}", "error.generic.message": "发生了错误。", @@ -1856,8 +1856,8 @@ "error.oauth_missing_code.office365": "对于 {link} 请确认您的微软组管理员已开启 Mattermost 应用。", "error.oauth_missing_code.office365.link": "Office 365", "error.oauth_missing_code.title": "Mattermost 需要您的帮忙", - "error.team_not_found.message": "The team you're requesting is private or does not exist. Please contact your Administrator for an invitation.", - "error.team_not_found.title": "Team Not Found", + "error.team_not_found.message": "您请求的团队为私有或不存在。请联系管理员以获得邀请。", + "error.team_not_found.title": "未找到团队", "error_bar.apiv3_enabled": "API 版本 3 已淘汰并在未来移除。了解如何移植到 APIv4。", "error_bar.expired": "企业版授权已过期,一些功能已停用。请更新授权。", "error_bar.expiring": "企业版授权将于 {date} 过期。请更新授权。", @@ -1924,50 +1924,50 @@ "general_tab.teamNameRestrictions": "名称必须在 {min} 于 {max} 个字符之间。您可以添加更长的团队描述。", "general_tab.title": "基本设置", "general_tab.yes": "是的", - "generic_icons.add": "Add Icon", - "generic_icons.archive": "Archive Icon", - "generic_icons.arrow.down": "Down Arrow Icon", - "generic_icons.arrow.up": "Up Arrow Icon", - "generic_icons.attach": "Attachment Icon", - "generic_icons.back": "Back Icon", - "generic_icons.breadcrumb": "Breadcrumb Icon", - "generic_icons.channel.private": "私有频道", - "generic_icons.channel.public": "Public Channel Icon", - "generic_icons.collapse": "Collapse Icon", - "generic_icons.download": "Download Icon", - "generic_icons.dropdown": "Dropdown Icon", - "generic_icons.edit": "Edit Icon", - "generic_icons.email": "Email Icon", - "generic_icons.expand": "Expand Icon", - "generic_icons.failure": "Failure Icon", - "generic_icons.flag": "Flag Icon", - "generic_icons.flagged": "Flagged Icon", - "generic_icons.help": "Help Icon", - "generic_icons.info": "Info Icon", - "generic_icons.join": "Join Icon", - "generic_icons.loading": "Loading Icon", - "generic_icons.logout": "Logout Icon", + "generic_icons.add": "添加图标", + "generic_icons.archive": "归档图标", + "generic_icons.arrow.down": "向下箭图标", + "generic_icons.arrow.up": "向上箭图标", + "generic_icons.attach": "附件图标", + "generic_icons.back": "返回图标", + "generic_icons.breadcrumb": "面包屑导航图标", + "generic_icons.channel.private": "私有频道图标", + "generic_icons.channel.public": "公共频道图标", + "generic_icons.collapse": "折叠图标", + "generic_icons.download": "下载图标", + "generic_icons.dropdown": "下拉菜单图标", + "generic_icons.edit": "编辑图标", + "generic_icons.email": "邮件图标", + "generic_icons.expand": "展开图标", + "generic_icons.failure": "失败图标", + "generic_icons.flag": "标记图标", + "generic_icons.flagged": "被标记图标", + "generic_icons.help": "帮助图标", + "generic_icons.info": "信息图标", + "generic_icons.join": "加入图标", + "generic_icons.loading": "加载图标", + "generic_icons.logout": "注销图标", "generic_icons.mattermost": "Mattermost Logo", - "generic_icons.member": "Member Icon", - "generic_icons.mention": "Mention Icon", - "generic_icons.menu": "Menu Icon", - "generic_icons.message": "Message Icon", - "generic_icons.muted": "Muted Icon", - "generic_icons.next": "Next Icon", - "generic_icons.pin": "Pin Icon", - "generic_icons.previous": "Previous Icon", - "generic_icons.reload": "Reload Icon", - "generic_icons.remove": "Remove Icon", - "generic_icons.reply": "Reply Icon", - "generic_icons.report": "Report Icon", - "generic_icons.search": "Search Icon", - "generic_icons.searching": "Searching Icon", - "generic_icons.select": "Select Icon", - "generic_icons.settings": "Settings Icon", - "generic_icons.success": "Success Icon", - "generic_icons.testing": "Testing Icon", - "generic_icons.upload": "Upload Icon", - "generic_icons.warning": "Warning Icon", + "generic_icons.member": "成员图标", + "generic_icons.mention": "提及图标", + "generic_icons.menu": "菜单图标", + "generic_icons.message": "消息图标", + "generic_icons.muted": "静音图标", + "generic_icons.next": "下一步图标", + "generic_icons.pin": "置顶图标", + "generic_icons.previous": "上一步图标", + "generic_icons.reload": "重加载图标", + "generic_icons.remove": "移除图标", + "generic_icons.reply": "回复图标", + "generic_icons.report": "举报图标", + "generic_icons.search": "搜索图标", + "generic_icons.searching": "搜索图标", + "generic_icons.select": "选择图标", + "generic_icons.settings": "设置图标", + "generic_icons.success": "成功图标", + "generic_icons.testing": "测试图标", + "generic_icons.upload": "上传图标", + "generic_icons.warning": "警告图标", "get_app.alreadyHaveIt": "已经拥有?", "get_app.androidAppName": "安卓版Mattermost", "get_app.androidHeader": "使用安卓应用获得Mattermost最好的表现", @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "公告", "mobile.channel.markAsRead": "标为已读", "mobile.channel_drawer.search": "转条到...", - "mobile.channel_info.alertMessageDeleteChannel": "您确定要删除{term} {name}?", + "mobile.channel_info.alertMessageDeleteChannel": "您确定要归档 {term} {name}?", "mobile.channel_info.alertMessageLeaveChannel": "您确定要离开{term} {name}?", "mobile.channel_info.alertNo": "否", - "mobile.channel_info.alertTitleDeleteChannel": "删除 {term}", + "mobile.channel_info.alertTitleDeleteChannel": "归档 {term}", "mobile.channel_info.alertTitleLeaveChannel": "离开 {term}", "mobile.channel_info.alertYes": "是", - "mobile.channel_info.delete_failed": "我们无法删除频道 {displayName}。请检查您的网络连接再尝试。", + "mobile.channel_info.delete_failed": "我们无法归档频道 {displayName}。请检查您的网络连接再尝试。", "mobile.channel_info.edit": "编辑频道", "mobile.channel_info.privateChannel": "私有频道", "mobile.channel_info.publicChannel": "公共频道", @@ -2473,8 +2473,8 @@ "mobile.notification_settings.auto_responder.enabled": "已启用", "mobile.notification_settings.auto_responder.footer_message": "设定在私信里自动回复的消息。在公共或私有频道下的提及不会触发自动回复。开启自动回复将设您的状态未离开办公室并停用邮件和推送通知。", "mobile.notification_settings.auto_responder.message_placeholder": "消息", - "mobile.notification_settings.auto_responder.message_title": "CUSTOM MESSAGE", - "mobile.notification_settings.auto_responder_short": "Automatic Replies", + "mobile.notification_settings.auto_responder.message_title": "自定义消息", + "mobile.notification_settings.auto_responder_short": "自动回复", "mobile.notification_settings.email": "电子邮件", "mobile.notification_settings.email_title": "电子邮件通知", "mobile.notification_settings.mentions.channelWide": "频道提及", @@ -2537,12 +2537,12 @@ "mobile.rename_channel.name_required": "网址为必填", "mobile.request.invalid_response": "从服务器收到了无效回应。", "mobile.reset_status.alert_cancel": "取消", - "mobile.reset_status.alert_ok": "Ok", - "mobile.reset_status.title_ooo": "Disable \"Out Of Office\"?", + "mobile.reset_status.alert_ok": "确定", + "mobile.reset_status.title_ooo": "停用 \"不在办公室\"?", "mobile.retry_message": "刷新消息失败。拉上以重试。", "mobile.routes.channelInfo": "信息", "mobile.routes.channelInfo.createdBy": "{creator} 创建于 ", - "mobile.routes.channelInfo.delete_channel": "删除频道", + "mobile.routes.channelInfo.delete_channel": "归档频道", "mobile.routes.channelInfo.favorite": "收藏", "mobile.routes.channel_members.action": "移除成员", "mobile.routes.channel_members.action_message": "您必须至少选择一个要移出频道的成员。", @@ -2566,7 +2566,7 @@ "mobile.routes.thread": "{channelName} 串", "mobile.routes.thread_dm": "私信串", "mobile.routes.user_profile": "个人资料", - "mobile.routes.user_profile.local_time": "LOCAL TIME", + "mobile.routes.user_profile.local_time": "本地时间", "mobile.routes.user_profile.send_message": "发送消息", "mobile.search.from_modifier_description": "从指定用户查找消息", "mobile.search.from_modifier_title": "用户名", @@ -2585,13 +2585,13 @@ "mobile.server_url.invalid_format": "每个 URL 必须以 http:// 或 https:// 开头", "mobile.session_expired": "会话已超时:请登入再继续接收通知。", "mobile.set_status.away": "离开", - "mobile.set_status.away.icon": "Away Icon", + "mobile.set_status.away.icon": "离开图标", "mobile.set_status.dnd": "请勿打扰", - "mobile.set_status.dnd.icon": "请勿打扰提示", + "mobile.set_status.dnd.icon": "请勿打扰图标", "mobile.set_status.offline": "离线", - "mobile.set_status.offline.icon": "Offline Icon", + "mobile.set_status.offline.icon": "离线图标", "mobile.set_status.online": "在线", - "mobile.set_status.online.icon": "Online Icon", + "mobile.set_status.online.icon": "在线图标", "mobile.settings.clear": "清除离线储存", "mobile.settings.clear_button": "清除", "mobile.settings.clear_message": "\n这将清除所有离线数据并重启应用。您将会在应用重启后自动登入。\n", @@ -2602,13 +2602,14 @@ "mobile.share_extension.error_close": "关闭", "mobile.share_extension.error_message": "使用共享扩展时遇到了错误。", "mobile.share_extension.error_title": "扩展错误", - "mobile.share_extension.post_error": "An error has occurred while posting the message. Please try again.", + "mobile.share_extension.post_error": "发送消息时遇到错误。请重试。", "mobile.share_extension.send": "发送", "mobile.share_extension.team": "团队", "mobile.suggestion.members": "成员", "mobile.timezone_settings.automatically": "自动设定", "mobile.timezone_settings.manual": "更改时区", - "mobile.timezone_settings.select": "Select Timezone", + "mobile.timezone_settings.select": "选择时区", + "mobile.user.settings.notifications.email.fifteenMinutes": "每 15 分钟", "mobile.video.save_error_message": "您需要先下载才能保存视频文件。", "mobile.video.save_error_title": "保存视频出错", "mobile.video_playback.failed_description": "尝试播放视频时发送错误。\n", @@ -2667,7 +2668,7 @@ "navbar.addMembers": "添加成员", "navbar.click": "请点击这里", "navbar.clickToAddHeader": "{clickHere} 添加。", - "navbar.delete": "Archive Channel...", + "navbar.delete": "归档频道...", "navbar.leave": "离开频道", "navbar.manageMembers": "成员管理", "navbar.noHeader": "暂无频道标题。", @@ -2684,16 +2685,16 @@ "navbar_dropdown.addMemberToTeam": "添加成员到团队", "navbar_dropdown.console": "系统控制台", "navbar_dropdown.create": "创建一个新的团队", - "navbar_dropdown.create.icon": "创建一个新的团队", + "navbar_dropdown.create.icon": "创建一个新的团队图标", "navbar_dropdown.emoji": "自定义表情符", "navbar_dropdown.help": "帮助", "navbar_dropdown.integrations": "集成", "navbar_dropdown.inviteMember": "发送电子邮件邀请", "navbar_dropdown.join": "加入另一个团队", - "navbar_dropdown.join.icon": "加入另一个团队", + "navbar_dropdown.join.icon": "加入另一个团队图标", "navbar_dropdown.keyboardShortcuts": "键盘快捷键", "navbar_dropdown.leave": "离开团队", - "navbar_dropdown.leave.icon": "Leave Team Icon", + "navbar_dropdown.leave.icon": "离开团队图标", "navbar_dropdown.logout": "注销", "navbar_dropdown.manageMembers": "成员管理", "navbar_dropdown.nativeApps": "下载应用", @@ -2749,6 +2750,8 @@ "post_info.bot": "机器人", "post_info.del": "删除", "post_info.edit": "编辑", + "post_info.message.show_less": "显示更少", + "post_info.message.show_more": "显示更多", "post_info.message.visible": "(只有您可见)", "post_info.message.visible.compact": " (只有您可见)", "post_info.mobile.flag": "标记", @@ -2818,12 +2821,12 @@ "rhs_header.backToResultsTooltip": "回到搜索结果", "rhs_header.closeSidebarTooltip": "关闭侧栏", "rhs_header.closeTooltip": "关闭侧栏", - "rhs_header.closeTooltip.icon": "Close Sidebar Icon", + "rhs_header.closeTooltip.icon": "关闭侧栏图标", "rhs_header.details": "消息详情", "rhs_header.expandSidebarTooltip": "扩展侧边栏", - "rhs_header.expandSidebarTooltip.icon": "Expand Sidebar Icon", + "rhs_header.expandSidebarTooltip.icon": "展开侧栏图标", "rhs_header.expandTooltip": "关闭侧栏", - "rhs_header.expandTooltip.icon": "Shrink Sidebar Icon", + "rhs_header.expandTooltip.icon": "缩小侧栏图标", "rhs_header.shrinkSidebarTooltip": "关闭侧栏", "rhs_root.del": "删除", "rhs_root.direct": "私信", @@ -2861,8 +2864,8 @@ "search_results.usagePin2": "此频道的所有成员可以置顶重要或有用的消息。", "search_results.usagePin3": "置顶消息对所有频道成员可见。", "search_results.usagePin4": "置顶消息:到您想要置顶的消息并点击 [...] > \"置顶到频道\"。", - "select_team.icon": "Select Team Icon", - "select_team.join.icon": "Join Team Icon", + "select_team.icon": "选择团队图标", + "select_team.join.icon": "加入团队图标", "select_team.title": "选择团队", "setting_item_max.cancel": "取消", "setting_item_max.save": "保存", @@ -2948,34 +2951,34 @@ "sidebar_header.tutorial": "

主菜单

在主菜单中您可以邀请新成员,访问您的账户设置和设置您的主题颜色

团队管理员也能通过此菜单访问他们的团队设置

系统管理员将找到一个系统控制台选项管理整个系统。

", "sidebar_right_menu.accountSettings": "账户设置", "sidebar_right_menu.addMemberToTeam": "添加成员到团队", - "sidebar_right_menu.addMemberToTeam.icon": "添加成员到团队", + "sidebar_right_menu.addMemberToTeam.icon": "添加成员到团队图标", "sidebar_right_menu.console": "系统控制台", - "sidebar_right_menu.console.icon": "System Console Icon", + "sidebar_right_menu.console.icon": "系统控制台图标", "sidebar_right_menu.flagged": "已标记的信息", "sidebar_right_menu.help": "帮助", "sidebar_right_menu.inviteNew": "发送电子邮件邀请", - "sidebar_right_menu.inviteNew.icon": "发送电子邮件邀请", + "sidebar_right_menu.inviteNew.icon": "发送电子邮件邀请图标", "sidebar_right_menu.logout": "注销", "sidebar_right_menu.manageMembers": "成员管理", "sidebar_right_menu.nativeApps": "下载应用", - "sidebar_right_menu.nativeApps.icon": "Native Apps Icon", + "sidebar_right_menu.nativeApps.icon": "原生应用图标", "sidebar_right_menu.recentMentions": "最近提及", "sidebar_right_menu.report": "报告问题", "sidebar_right_menu.teamLink": "获取团队邀请链接", - "sidebar_right_menu.teamLink.icon": "获取团队邀请链接", + "sidebar_right_menu.teamLink.icon": "获取团队邀请链接图标", "sidebar_right_menu.teamSettings": "团队设置", "sidebar_right_menu.viewMembers": "查看成员", "signup.email": "电子邮箱和密码", - "signup.email.icon": "Email Icon", + "signup.email.icon": "邮件图标", "signup.gitlab": "GitLab 单一登入", - "signup.gitlab.icon": "GitLab Icon", + "signup.gitlab.icon": "GitLab 图标", "signup.google": "谷歌帐号", - "signup.google.icon": "Google Icon", + "signup.google.icon": "Google 图标", "signup.ldap": "AD/LDAP 登录身份", - "signup.ldap.icon": "AD/LDAP ID", + "signup.ldap.icon": "AD/LDAP 图标", "signup.office365": "Office 365", - "signup.office365.icon": "Office 365 Icon", - "signup.saml.icon": "SAML Icon", + "signup.office365.icon": "Office 365 图标", + "signup.saml.icon": "SAML 图标", "signup.title": "创建一个账户以:", "signup_team.createTeam": "或者创建一个团队", "signup_team.disabled": "团队创建已被禁用。请联系管理员获得权限。", @@ -3044,7 +3047,7 @@ "suggestion.search.private": "私有频道", "suggestion.search.public": "公共频道", "system_notice.adminVisible": "只对系统管理员可见", - "system_notice.adminVisible.icon": "只对系统管理员可见", + "system_notice.adminVisible.icon": "只对系统管理员可见图标", "system_notice.body.api3": "如果您在上两年创建或安装了整合,请了解近期的更改带来的影响。", "system_notice.body.permissions": "一些政策和权限控制台设定已在 Enterprise E10 和 E20 的高级权限发布后转移。", "system_notice.dont_show": "不再显示", @@ -3134,7 +3137,7 @@ "user.settings.advance.enabledFeatures": "已启用 {count, number} 项功能", "user.settings.advance.formattingDesc": "开启时,文章会显示链接,表情符,格式,以及添加断行。默认下,此选项时开启的。修改此设定需要刷新页面。", "user.settings.advance.formattingTitle": "启用帖文格式", - "user.settings.advance.icon": "高级设置", + "user.settings.advance.icon": "高级设置图标", "user.settings.advance.joinLeaveDesc": "当 \"开启\" 时,用户加入或退出频道将会显示系统消息。当 \"关闭\" 时,用户加入或退出频道将不会显示系统消息。不过您加入到一个频道时仍然会显示系统消息而收到通知。", "user.settings.advance.joinLeaveTitle": "开启加入/退出信息", "user.settings.advance.markdown_preview": "在消息输入框中显示markdown预览选项", @@ -3181,7 +3184,7 @@ "user.settings.display.collapseOn": "已展开", "user.settings.display.fixedWidthCentered": "固定宽度,居中", "user.settings.display.fullScreen": "完整宽度", - "user.settings.display.icon": "显示设置", + "user.settings.display.icon": "显示设置图标", "user.settings.display.language": "语言", "user.settings.display.linkPreviewDesc": "当可用时,在消息下方显示第消息里第一个网址的网站内容预览。", "user.settings.display.linkPreviewDisplay": "网站链接预览", @@ -3234,7 +3237,7 @@ "user.settings.general.field_handled_externally": "此栏由您的登入提供商决定。如果您想更改,您需要到您的登入提供者改动。", "user.settings.general.firstName": "名字", "user.settings.general.fullName": "全名", - "user.settings.general.icon": "基本设置", + "user.settings.general.icon": "基本设置图标", "user.settings.general.imageTooLarge": "无法上传头像。文件太大。", "user.settings.general.imageUpdated": "图片上次更新日期{date}", "user.settings.general.lastName": "姓氏", @@ -3326,7 +3329,7 @@ "user.settings.notifications.emailInfo": "当您离开{siteName}超过5分钟或离线,系统将发送提及和私信的电子邮件通知。", "user.settings.notifications.emailNotifications": "邮件通知", "user.settings.notifications.header": "通知", - "user.settings.notifications.icon": "通知设置", + "user.settings.notifications.icon": "通知设置图标", "user.settings.notifications.info": "桌面通知可在 IE11、Edge、Safari、Chrome 以及 Mattermost 桌面应用使用。", "user.settings.notifications.mentionsInfo": "提及会在某人发送含有您的用户名 (\"@{username}\") 或者任何以上选项的消息时被触发。", "user.settings.notifications.never": "从不", @@ -3370,7 +3373,7 @@ "user.settings.security.emailPwd": "邮箱和密码", "user.settings.security.gitlab": "GitLab", "user.settings.security.google": "谷歌", - "user.settings.security.icon": "安全设置", + "user.settings.security.icon": "安全设置图标", "user.settings.security.inactive": "停用", "user.settings.security.lastUpdated": "上次更新时间{date}{time}", "user.settings.security.ldap": "AD/LDAP", @@ -3380,7 +3383,7 @@ "user.settings.security.loginOffice365": "从 Office 365 登入", "user.settings.security.loginSaml": "用 SAML 登录", "user.settings.security.logoutActiveSessions": "查看并退出正在执行的会话", - "user.settings.security.logoutActiveSessions.icon": "活动会话", + "user.settings.security.logoutActiveSessions.icon": "活动会话图标", "user.settings.security.method": "登录方式", "user.settings.security.newPassword": "新密码", "user.settings.security.noApps": "没有任何授权的 OAuth 2.0 应用。", @@ -3423,11 +3426,11 @@ "user.settings.security.switchSaml": "切换到使用 SAML SSO", "user.settings.security.title": "安全设置", "user.settings.security.viewHistory": "查看访问历史", - "user.settings.security.viewHistory.icon": "Access History Icon", + "user.settings.security.viewHistory.icon": "访问历史图标", "user.settings.sidebar.after_seven_days": "7 天没有新消息", "user.settings.sidebar.autoCloseDMDesc": "私信对话可以在侧栏的 “+” 按钮或使用频道切换器 (CTRL+K) 打开。", "user.settings.sidebar.autoCloseDMTitle": "自动关闭私信", - "user.settings.sidebar.icon": "侧边栏设置", + "user.settings.sidebar.icon": "侧栏设置图标", "user.settings.sidebar.never": "从不", "user.settings.sidebar.showUnreadSection": "在频道侧栏顶端", "user.settings.sidebar.title": "侧边栏设置", @@ -3473,7 +3476,7 @@ "user_profile.account.editSettings": "修改账户设置", "user_profile.account.localTime": "本地时间:", "user_profile.send.dm": "发送消息", - "user_profile.send.dm.icon": "Send Message Icon", + "user_profile.send.dm.icon": "发送消息图标", "user_profile.webrtc.call": "开始视频通话", "user_profile.webrtc.offline": "此用户已离线", "user_profile.webrtc.unavailable": "不能在结束当前通话前开新通话", @@ -3491,30 +3494,30 @@ "web.root.signup_info": "所有团队的通讯一站式解决,随时随地可访问和搜索", "webrtc.busy": "{username} 繁忙中。", "webrtc.call": "通话", - "webrtc.call.icon": "Call Icon", + "webrtc.call.icon": "通话图标", "webrtc.callEnded": "已结束与 {username} 的通话。", "webrtc.cancel": "取消通话", - "webrtc.cancel.icon": "Cancel call Icon", + "webrtc.cancel.icon": "取消拨打图标", "webrtc.cancelled": "{username} 已取消通话。", "webrtc.declined": "您的呼叫被 {username} 拒绝。", "webrtc.disabled": "{username} 已禁用 WebRTC,因此无法接听。如想开启此功能,他们需要到帐号设定 > 高级 > 预览预发布功能并开启 WebRTC。", "webrtc.failed": "连接视频通话出现问题。", "webrtc.hangup": "挂断", "webrtc.header": "与 {username} 的通话", - "webrtc.icon": "Webrtc Icon", + "webrtc.icon": "Webrtc 图标", "webrtc.inProgress": "您已经有通话。请先挂断。", "webrtc.mediaError": "无法连接摄像头或麦克风。", "webrtc.mute_audio": "静音麦克风", - "webrtc.mute_audio.icon": "Mute Icon", + "webrtc.mute_audio.icon": "静音图标", "webrtc.noAnswer": "{username} 没有回应。", "webrtc.notification.answer": "接听", - "webrtc.notification.answer.icon": "Answer Icon", + "webrtc.notification.answer.icon": "回应图标", "webrtc.notification.decline": "拒接", "webrtc.notification.incoming_call": "{username} 正在呼叫您。", "webrtc.notification.returnToCall": "返回到与 {username} 的通话", "webrtc.offline": "{username} 离线中。", "webrtc.pause_video": "关闭摄像头", - "webrtc.return.icon": "Return to Call Icon", + "webrtc.return.icon": "回到通话图标", "webrtc.unmute_audio": "取消静音麦克风", "webrtc.unpause_video": "开启摄像头", "webrtc.unsupported": "{username} 客户端不支持视频通话。", diff --git a/assets/base/i18n/zh-TW.json b/assets/base/i18n/zh-TW.json index 2a08811a5..f653828e8 100644 --- a/assets/base/i18n/zh-TW.json +++ b/assets/base/i18n/zh-TW.json @@ -232,7 +232,7 @@ "admin.complianceExport.description": "此功能支援規範匯出成 Actiance XML 與 GlobalRelay EML 格式,目前正在測試階段。Mattermost CSV 格式的支援將會在未來釋出並取代現存的規範 功能。", "admin.complianceExport.exportFormat.actiance": "Actiance XML", "admin.complianceExport.exportFormat.csv": "CSV", - "admin.complianceExport.exportFormat.description": "規範匯出的格式。對應到想要匯入資料的系統。

Actiance XML時規範匯出將把檔案寫至本地儲存目錄下 \"exports\" 子目錄。Global Relay EML時將會被寄送至設定的電子郵件位址。", + "admin.complianceExport.exportFormat.description": "規範匯出的格式。對應到想要匯入資料的系統。

使用 Actiance XML 或 CSV 時規範匯出將把檔案寫至本地儲存目錄下 \"exports\" 子目錄。使用 Global Relay EML 時將會被寄送至設定的電子郵件位址。", "admin.complianceExport.exportFormat.globalrelay": "Global Relay EML", "admin.complianceExport.exportFormat.title": "匯出格式:", "admin.complianceExport.exportJobStartTime.description": "設定每日規範報告匯出工作的開始時間。請選擇一個較少人使用系統的時間。必須為 HH:MM 格式的 24 小時制時間。", @@ -303,14 +303,14 @@ "admin.customization.enableCustomEmojiTitle": "啟用自訂繪文字:", "admin.customization.enableEmojiPickerDesc": "繪文字選擇器讓使用者選擇繪文字作為互動或在訊息中使用。在有大量自動繪文字時啟用繪文字選擇器可能會對效能有不良影響。", "admin.customization.enableEmojiPickerTitle": "啟用繪文字選擇器:", - "admin.customization.enableGifPickerDesc": "Allow users to select GIFs from the emoji picker via a Gfycat integration.", - "admin.customization.enableGifPickerTitle": "啟用繪文字選擇器:", + "admin.customization.enableGifPickerDesc": "允許使用者從繪文字選擇器經由 Gfycat 整合選取 GIF。", + "admin.customization.enableGifPickerTitle": "啟用 GIF 選擇器:", "admin.customization.enableLinkPreviewsDesc": "在可以顯示時,在訊息下方顯示網站預覽。使用者能在 帳號設定 > 顯示 > 網站連結預覽 來關閉預覽。", "admin.customization.enableLinkPreviewsTitle": "啟用連結預覽:", - "admin.customization.gfycatApiKey": "Gfycat API Key:", - "admin.customization.gfycatApiKeyDescription": "Request an API key at https://developers.gfycat.com/signup/#/. Enter the client ID you receive via email to this field. When blank, uses the default API key provided by Gfycat.", - "admin.customization.gfycatApiSecret": "Gfycat API Secret:", - "admin.customization.gfycatApiSecretDescription": "The API secret generated by Gfycat for your API key. When blank, uses the default API secret provided by Gfycat.", + "admin.customization.gfycatApiKey": "Gfycat API 鍵:", + "admin.customization.gfycatApiKeyDescription": "在 https://developers.gfycat.com/signup/#/ 請求 API 鍵。輸入經由郵件收到的 client ID 於此。空白時,使用 Gfycat 提供的預設 API 鍵。", + "admin.customization.gfycatApiSecret": "Gfycat API 金鑰:", + "admin.customization.gfycatApiSecretDescription": "Gfycat 為了 API 鍵產生的 API 金鑰。空白時,使用 Gfycat 提供的預設 API 金鑰。", "admin.customization.gif": "GIF (Beta)", "admin.customization.iosAppDownloadLinkDesc": "新增下載 iOS 應用程式的連結。用行動網頁瀏覽器存取站台的使用者將會看到提示頁面以下載應用程式。此欄留空則不會出現提示頁面。", "admin.customization.iosAppDownloadLinkTitle": "iOS 應用程式下載連結:", @@ -541,7 +541,7 @@ "admin.image.amazonS3EndpointDescription": "相容於 S3 的儲存提供者的主機名稱。預設為`s3.amazonaws.com`。", "admin.image.amazonS3EndpointExample": "如:\"s3.amazonaws.com\"", "admin.image.amazonS3EndpointTitle": "Amazon S3 端點:", - "admin.image.amazonS3IdDescription": "僅在不想用 IAM 角色 與 S3 認證時需要設定。輸入您的 Amazon EC2 管理員所提供的存取金鑰 ID。(非必須)", + "admin.image.amazonS3IdDescription": "僅在不想用 IAM 角色 與 S3 認證時需要設定。輸入您的 Amazon EC2 管理員所提供的存取金鑰 ID。(非必須)", "admin.image.amazonS3IdExample": "如:\"AKIADTOVBGERKLCBV\"", "admin.image.amazonS3IdTitle": "Amazon S3 存取金鑰識別碼:", "admin.image.amazonS3RegionDescription": "建立 S3 儲存貯體時選用的 AWS 區域。如果沒有設定區域,Mattermost 將會嘗試從 AWS 取得適當的區域,如果無法取得時將設為 'us-east-1'。", @@ -565,7 +565,7 @@ "admin.image.proxyOptions": "圖像代理選項:", "admin.image.proxyOptionsDescription": "額外選項如網址簽名金鑰。詳情請參照所使用的圖片代理伺服器文件。", "admin.image.proxyType": "圖像代理類型:", - "admin.image.proxyTypeDescription": "設定圖像代理以在讀取 Markdown 圖片時藉由代理讀取。圖像代理可以防止使用者以不安全的方式讀取圖片、提供快取機制以增進效能以及自動調整影像。請參閱說明文件。", + "admin.image.proxyTypeDescription": "設定圖像代理以在讀取 Markdown 圖片時藉由代理讀取。圖像代理可以防止使用者以不安全的方式讀取圖片、提供快取機制以增進效能以及自動調整影像。請參閱說明文件。", "admin.image.proxyTypeNone": "無", "admin.image.proxyURL": "圖像代理 URL:", "admin.image.proxyURLDescription": "圖像代理伺服器網址。", @@ -765,13 +765,13 @@ "admin.permissions.documentationLinkText": "說明文件", "admin.permissions.group.delete_posts.description": "刪除訊息", "admin.permissions.group.delete_posts.name": "刪除訊息", - "admin.permissions.group.integrations.description": "管理 Oauth,斜線命令,Webhook以及繪文字。", + "admin.permissions.group.integrations.description": "管理 OAuth 2.0,斜線命令,Webhook 以及繪文字。", "admin.permissions.group.integrations.name": "整合與自訂", "admin.permissions.group.posts.description": "寫、編輯以及刪除訊息。", "admin.permissions.group.posts.name": "管理訊息", - "admin.permissions.group.private_channel.description": "建立以及刪除頻道,管理設定與成員。", + "admin.permissions.group.private_channel.description": "建立以及封存頻道,管理設定與成員。", "admin.permissions.group.private_channel.name": "管理私人頻道", - "admin.permissions.group.public_channel.description": "加入、建立以及刪除頻道,管理設定與成員。", + "admin.permissions.group.public_channel.description": "加入、建立以及封存頻道,管理設定與成員。", "admin.permissions.group.public_channel.name": "管理公開頻道", "admin.permissions.group.reactions.description": "新增與刪除訊息互動", "admin.permissions.group.reactions.name": "訊息互動", @@ -780,7 +780,7 @@ "admin.permissions.group.teams.description": "建立團隊與管理成員。", "admin.permissions.group.teams.name": "團隊", "admin.permissions.inherited_from": "繼承自{name}", - "admin.permissions.introBanner": "Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our [documentation](!https://about.mattermost.com/default-advanced-permissions).", + "admin.permissions.introBanner": "權限配置對團隊、頻道管理員以及其他人設定預設權限。詳情請參閱[文件](!https://about.mattermost.com/default-advanced-permissions)。", "admin.permissions.loadMoreSchemes": "讀取更多配置", "admin.permissions.loadingMoreSchemes": "載入中…", "admin.permissions.permission.assign_system_admin_role.description": "指派系統管理員角色", @@ -801,10 +801,10 @@ "admin.permissions.permission.delete_others_posts.name": "刪除其他人的訊息", "admin.permissions.permission.delete_post.description": "作者可以刪除自己的訊息。", "admin.permissions.permission.delete_post.name": "刪除自己的訊息", - "admin.permissions.permission.delete_private_channel.description": "刪除私人頻道", - "admin.permissions.permission.delete_private_channel.name": "Archive Channels", - "admin.permissions.permission.delete_public_channel.description": "刪除私人頻道", - "admin.permissions.permission.delete_public_channel.name": "Archive Channels", + "admin.permissions.permission.delete_private_channel.description": "封存私人頻道", + "admin.permissions.permission.delete_private_channel.name": "封存頻道", + "admin.permissions.permission.delete_public_channel.description": "封存私人頻道", + "admin.permissions.permission.delete_public_channel.name": "封存頻道", "admin.permissions.permission.edit_other_users.description": "編輯其他使用者", "admin.permissions.permission.edit_other_users.name": "編輯其他使用者", "admin.permissions.permission.edit_post.description": "{editTimeLimitButton} 在發布後,允許使用者編輯他們自己的訊息。", @@ -877,7 +877,7 @@ "admin.permissions.systemScheme.allMembersTitle": "全體成員", "admin.permissions.systemScheme.channelAdminsDescription": "授予頻道建立者以及頻道管理員的權限。", "admin.permissions.systemScheme.channelAdminsTitle": "頻道管理員", - "admin.permissions.systemScheme.introBanner": "Configure the default permissions for Team Admins, Channel Admins and other members. This scheme is inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied in specific teams.", + "admin.permissions.systemScheme.introBanner": "設定團隊、頻道管理員以及其他人的預設權限。此配置將被所有團隊繼承,除非個別團隊有[團隊覆蓋配置](!https://about.mattermost.com/default-team-override-scheme)。", "admin.permissions.systemScheme.resetDefaultsButton": "重置為預設值", "admin.permissions.systemScheme.resetDefaultsButtonModalBody": "在此頁所有被選取的將被重置回預設值。請確認要重置。", "admin.permissions.systemScheme.resetDefaultsButtonModalTitle": "重置為預設值?", @@ -887,9 +887,9 @@ "admin.permissions.systemScheme.teamAdminsDescription": "授予團隊建立者以及團隊管理員的權限。", "admin.permissions.systemScheme.teamAdminsTitle": "團隊管理員", "admin.permissions.systemSchemeBannerButton": "編輯配置", - "admin.permissions.systemSchemeBannerText": "Set the default permissions inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied.", + "admin.permissions.systemSchemeBannerText": "設定被所有團隊繼承的預設權限,除非個別團隊有[團隊覆蓋配置](!https://about.mattermost.com/default-team-override-scheme)。 ", "admin.permissions.systemSchemeBannerTitle": "系統配置", - "admin.permissions.teamOverrideSchemesBannerText": "Use when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).", + "admin.permissions.teamOverrideSchemesBannerText": "當特定團隊需要除了[系統配置](!https://about.mattermost.com/default-system-scheme)以外的權限時使用。", "admin.permissions.teamOverrideSchemesInProgress": "移轉工作執行中:在權限移轉完成前無法使用團隊覆蓋配置。詳情請參閱{documentationLink}。", "admin.permissions.teamOverrideSchemesNewButton": "新團隊覆蓋配置", "admin.permissions.teamOverrideSchemesNoJobsEnabled": "移轉工作暫停中:在工作伺服器可以執行權限移轉前無法使用團隊覆蓋配置。此工作將會在啟用工作伺服器時自動開始。詳情請參閱{documentationLink}。", @@ -897,7 +897,7 @@ "admin.permissions.teamOverrideSchemesTitle": "團隊覆蓋配置", "admin.permissions.teamScheme": "團隊配置", "admin.permissions.teamScheme.addTeams": "新增團隊", - "admin.permissions.teamScheme.introBanner": "[Team Override Schemes](!https://about.mattermost.com/default-team-override-scheme) set the permissions for Team Admins, Channel Admins and other members in specific teams. Use a Team Override Scheme when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).", + "admin.permissions.teamScheme.introBanner": "[團隊覆蓋配置](!https://about.mattermost.com/default-team-override-scheme)設定特定團隊中團隊、頻道管理員以及其他人的權限。當特定團隊需要除了[系統配置](!https://about.mattermost.com/default-system-scheme)以外的權限時使用團隊覆蓋配置。 ", "admin.permissions.teamScheme.noTeams": "尚未選取團隊。請新增團隊至此列表。", "admin.permissions.teamScheme.removeTeam": "移除", "admin.permissions.teamScheme.schemeDescriptionLabel": "配置敘述:", @@ -1002,7 +1002,7 @@ "admin.reset_email.cancel": "取消", "admin.reset_email.newEmail": "新的電子郵件", "admin.reset_email.reset": "重置", - "admin.reset_email.titleReset": "重新發送電子郵件", + "admin.reset_email.titleReset": "重置電子郵件", "admin.reset_password.cancel": "取消", "admin.reset_password.curentPassword": "目前的密碼", "admin.reset_password.missing_current": "請輸入目前的密碼。", @@ -1121,7 +1121,7 @@ "admin.service.letsEncryptCertificateCacheFile": "Let's Encrypt 憑證快取檔案:", "admin.service.letsEncryptCertificateCacheFileDescription": "取得的憑證以及其他關於 Let's Encrypt 服務的資料將會儲存於這個檔案。", "admin.service.listenAddress": "監聽位址:", - "admin.service.listenDescription": "綁定並監聽的位址與通訊埠。輸入\":8065\"會跟所有的網路界面綁定。輸入\"127.0.0.1:8065\"會僅與擁有該 IP 位址的網路界面綁定。如果選取了較低的通訊埠(稱為\"系統通訊埠\"或是\"常見通訊埠\",介於 0 到 1023 之間),您必須擁有與該通訊埠綁定的權限。在 Linux 上可以用 \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" 來允許 Mattermost 與那些通訊埠綁定。", + "admin.service.listenDescription": "綁定並監聽的位址與通訊埠。輸入\":8065\"會跟所有的網路界面綁定。輸入\"127.0.0.1:8065\"會僅與擁有該 IP 位址的網路界面綁定。如果選取了較低的通訊埠(稱為\"系統通訊埠\"或是\"常見通訊埠\",介於 0 到 1023 之間),您必須擁有與該通訊埠綁定的權限。在 Linux 上可以用 \"sudo setcap cap_net_bind_service=+ep ./bin/platform\" 來允許 Mattermost 綁定常見的通訊埠。", "admin.service.listenExample": "如:\":8065\"", "admin.service.mfaDesc": "啟用時,使用 AD/LDAP 或 電子郵件登入的使用者可以使用 Google Authenticator 將多重要素驗證加入帳號。", "admin.service.mfaTitle": "啟用多重要素驗證:", @@ -1142,8 +1142,8 @@ "admin.service.sessionIdleTimeoutDesc": "使用者最後一次活動到使用者工作階段失效之間的分鐘數。一旦失效,使用者將需要登入以繼續使用。最小為五分鐘,0 為無限制。

適用於桌面應用程式與瀏覽器。行動裝置請用企業行動管理服務 (EMM) 供應商以在未使用時鎖定該應用程式。在高可用性模式下請啟用 IP 雜湊負載平衡以取得可靠的時間測量結果。", "admin.service.sessionIdleTimeoutEx": "如:\"60\"", "admin.service.siteURL": "站台網址:", - "admin.service.siteURLDescription": "The URL that users will use to access Mattermost. Standard ports, such as 80 and 443, can be omitted, but non-standard ports are required. For example: http://example.com:8065. This setting is required.

Mattermost may be hosted at a subpath. For example: http://example.com:8065/company/mattermost. A restart is required before the server will work correctly.", - "admin.service.siteURLExample": "E.g.: \"http://example.com:8065\"", + "admin.service.siteURLDescription": "使用者用來存取 Mattermost 的網址。標準通訊埠,如 80 跟 443,可以省略,但是非標準通訊埠必須填上。如:http://example.com:8065。此設定必填。

Mattermost 可以使用子路徑。如:http://example.com:8065/company/mattermost。在伺服器能夠正確運作前必須重新啟動。", + "admin.service.siteURLExample": "如:\"http://example.com:8065\"", "admin.service.ssoSessionDays": "SSO 的工作階段長度(以天計):", "admin.service.ssoSessionDaysDesc": "從使用者最後一次輸入他們的認證到工作階段過期之間的天數。如果認證方式是 SAML 或 GitLab 且他們已經登入 SAML 或 GitLab,使用者將會自動再次登入 Mattermost。修改設定之後新的工作階段長度會在下次使用者輸入認證之後開始生效。", "admin.service.testingDescription": "啟用時,將啟用 /test 斜線命令,該命令會載入測試帳號、資料以及文字格式。修改此項需要重啟伺服器以生效。", @@ -1204,7 +1204,7 @@ "admin.sidebar.oauth": "OAuth 2.0", "admin.sidebar.other": "其它", "admin.sidebar.password": "密碼", - "admin.sidebar.permissions": "Advanced Permissions", + "admin.sidebar.permissions": "進階權限", "admin.sidebar.plugins": "模組 (Beta)", "admin.sidebar.plugins.configuration": "設定", "admin.sidebar.plugins.management": "管理", @@ -1230,9 +1230,9 @@ "admin.sidebar.view_statistics": "系統統計", "admin.sidebar.webrtc": "WebRTC (Beta)", "admin.sidebarHeader.systemConsole": "系統控制台", - "admin.sql.connMaxLifetimeDescription": "Maximum lifetime (in milliseconds) for a connection to the database.", - "admin.sql.connMaxLifetimeExample": "如:\"10000\"", - "admin.sql.connMaxLifetimeTitle": "Maximum Connection Lifetime:", + "admin.sql.connMaxLifetimeDescription": "資料庫連線最長時間(毫秒)。", + "admin.sql.connMaxLifetimeExample": "如:\"3600000\"", + "admin.sql.connMaxLifetimeTitle": "最長連線時間:", "admin.sql.dataSource": "資料來源:", "admin.sql.driverName": "驅動程式名稱:", "admin.sql.keyDescription": "32個字元的 Salt 以加密資料庫敏感欄位。", @@ -1286,7 +1286,7 @@ "admin.team.dirTitle": "啟用團隊列表:", "admin.team.enableConfirmNotificationsToChannelDescription": "啟用時,當使用者在超過五人的頻道發布 @channel 跟 @all 訊息時,將會再次確認。停用時不需要確認。", "admin.team.enableConfirmNotificationsToChannelTitle": "顯示 @channel 跟 @all 確認對話欄:", - "admin.team.maxChannelsDescription": "每個團隊最大頻道數,包含啟用跟被刪除的頻道。", + "admin.team.maxChannelsDescription": "每個團隊最大頻道數,包含啟用跟被封存的頻道。", "admin.team.maxChannelsExample": "如:\"100\"", "admin.team.maxChannelsTitle": "團隊最大頻道數:", "admin.team.maxNotificationsPerChannelDescription": "頻道使用者人數在超過此數量後,由於效能考量,使用者輸入訊息、@all、@here 以及 @channel 將不再發送通知。", @@ -1346,7 +1346,7 @@ "admin.user_item.member": "成員", "admin.user_item.mfaNo": "多重要素驗證:無", "admin.user_item.mfaYes": "多重要素驗證:是", - "admin.user_item.resetEmail": "重新發送電子郵件", + "admin.user_item.resetEmail": "重置電子郵件", "admin.user_item.resetMfa": "移除多重要素驗證", "admin.user_item.resetPwd": "重置我的密碼", "admin.user_item.revokeSessions": "撤銷工作階段", @@ -1458,7 +1458,7 @@ "audit_table.by": "由 {username}", "audit_table.byAdmin": "由管理員", "audit_table.channelCreated": "建立 {channelName} 頻道", - "audit_table.channelDeleted": "刪除網址為 {url} 的頻道", + "audit_table.channelDeleted": "封存網址為 {url} 的頻道", "audit_table.establishedDM": "和 {username} 建立直接訊息頻道", "audit_table.failedExpiredLicenseAdd": "授權由於過期或未開始,無法新增", "audit_table.failedInvalidLicenseAdd": "無法新增無效的授權", @@ -1512,7 +1512,7 @@ "backstage_sidebar.integrations.outgoing_webhooks": "外寄 Webhook", "calling_screen": "撥打中", "center_panel.recent": "按這裡跳到最新的訊息。", - "center_panel.recent.icon": "移動至最新的訊息", + "center_panel.recent.icon": "移動至最新的訊息圖示", "change_url.close": "關閉", "change_url.endWithLetter": "網址必須以字元或數字做結尾", "change_url.invalidUrl": "錯誤的網址", @@ -1536,7 +1536,7 @@ "channel_header.channelHeader": "編輯頻道標題", "channel_header.channelMembers": "成員", "channel_header.convert": "變為私人頻道", - "channel_header.delete": "Archive Channel", + "channel_header.delete": "封存頻道", "channel_header.directchannel.you": "{displayname} (你) ", "channel_header.flagged": "被標記的訊息", "channel_header.leave": "離開頻道", @@ -1711,7 +1711,7 @@ "create_post.comment": "註解", "create_post.deactivated": "正以被停用的使用者觀看被封存的頻道。", "create_post.error_message": "訊息過長。字數:{length}/{limit}", - "create_post.icon": "Send Post Icon", + "create_post.icon": "發送訊息圖示", "create_post.post": "訊息", "create_post.read_only": "此為唯讀頻道。僅有具有權限的成員能在此發布訊息。", "create_post.shortcutsNotSupported": "此裝置不支援鍵盤快速鍵。", @@ -1744,9 +1744,9 @@ "deactivate_member_modal.title": "停用 {username}", "default_channel.purpose": "在此張貼希望所有人都可以看到的訊息。每個人在加入團隊的時候會自動成為此頻道的永久成員。", "delete_channel.cancel": "取消", - "delete_channel.confirm": "Confirm ARCHIVE Channel", - "delete_channel.del": "Archive", - "delete_channel.question": "這將會從團隊刪除頻道並且禁止所有使用者存取頻道內容。

您確定要刪除{display_name}頻道?", + "delete_channel.confirm": "確認封存頻道", + "delete_channel.del": "封存", + "delete_channel.question": "這將會從團隊封存頻道並且禁止所有使用者存取頻道內容。

您確定要封存{display_name}頻道?", "delete_post.cancel": "取消", "delete_post.comment": "註解", "delete_post.confirm": "請確認刪除{term}", @@ -1754,10 +1754,10 @@ "delete_post.post": "訊息", "delete_post.question": "確定要刪除{term}嘛?", "delete_post.warning": "此訊息有 {count, number} 個註解。", - "device_icons.android": "Android Icon", - "device_icons.apple": "Apple Icon", - "device_icons.linux": "Linux Icon", - "device_icons.windows": "Windows Icon", + "device_icons.android": "Android 圖示", + "device_icons.apple": "Apple 圖示", + "device_icons.linux": "Linux 圖示", + "device_icons.windows": "Windows 圖示", "discard_changes_modal.leave": "是,放棄它們", "discard_changes_modal.message": "還有未儲存的變更,要放棄它們嘛?", "discard_changes_modal.title": "放棄變更?", @@ -1781,7 +1781,7 @@ "edit_post.edit": "修改 {title}", "edit_post.editPost": "修改訊息...", "edit_post.save": "儲存", - "edit_post.time_limit_button.for_n_seconds": "⚙ 保留{n}秒", + "edit_post.time_limit_button.for_n_seconds": "保留{n}秒", "edit_post.time_limit_button.no_limit": "任何時間", "edit_post.time_limit_modal.description": "對在任意權限配置當中擁有編輯訊息權限的所有使用者設定時間限制。", "edit_post.time_limit_modal.invalid_time_limit": "無效的時間限制", @@ -1827,13 +1827,13 @@ "emoji_picker.people": "人物", "emoji_picker.places": "地方", "emoji_picker.recent": "最近曾使用", - "emoji_picker.search": "Search Emoji", + "emoji_picker.search": "搜尋繪文字", "emoji_picker.searchResults": "搜尋結果", "emoji_picker.symbols": "符號", "ent.cluster.save_config_with_roles.error": "當啟用高可用性且系統主控台為唯讀模式時下列設定無法儲存:{keys}。", - "error.channelNotFound.link": "Back to {defaultChannelName}", - "error.channel_not_found.message": "The channel you're requesting is private or does not exist. Please contact an Administrator to be added to the channel.", - "error.channel_not_found.title": "Channel Not Found", + "error.channelNotFound.link": "回到 {defaultChannelName}", + "error.channel_not_found.message": "尋找的頻道是私人頻道或不存在。請聯絡管理員將您加入頻道。", + "error.channel_not_found.title": "找不到頻道", "error.generic.link": "回到 {siteName}", "error.generic.link_message": "回到 {siteName}", "error.generic.message": "發生錯誤。", @@ -1856,8 +1856,8 @@ "error.oauth_missing_code.office365": "對於 {link},請確定您的微軟組織管理員已啟用 Mattermost 應用程式。", "error.oauth_missing_code.office365.link": "Office 365", "error.oauth_missing_code.title": "Mattermost 需要協助", - "error.team_not_found.message": "The team you're requesting is private or does not exist. Please contact your Administrator for an invitation.", - "error.team_not_found.title": "Team Not Found", + "error.team_not_found.message": "尋找的團隊是私人團隊或不存在。請聯絡管理員將您加入團隊。", + "error.team_not_found.title": "找不到團隊", "error_bar.apiv3_enabled": "API 版本 3 已被取代且將被移除。如何轉移至版本 4。", "error_bar.expired": "企業版授權已過期,某些功能已被關閉。請由此更新。", "error_bar.expiring": "企業版授權將於{date}過期。請由此更新。", @@ -1924,50 +1924,50 @@ "general_tab.teamNameRestrictions": "團隊名字必須在{min}個到{max}個字之間。可以增加較長的團隊敘述。", "general_tab.title": "一般設定", "general_tab.yes": "是", - "generic_icons.add": "Add Icon", - "generic_icons.archive": "Archive Icon", - "generic_icons.arrow.down": "Down Arrow Icon", - "generic_icons.arrow.up": "Up Arrow Icon", - "generic_icons.attach": "Attachment Icon", - "generic_icons.back": "Back Icon", - "generic_icons.breadcrumb": "Breadcrumb Icon", - "generic_icons.channel.private": "私人頻道", - "generic_icons.channel.public": "Public Channel Icon", - "generic_icons.collapse": "Collapse Icon", - "generic_icons.download": "Download Icon", - "generic_icons.dropdown": "Dropdown Icon", - "generic_icons.edit": "Edit Icon", - "generic_icons.email": "Email Icon", - "generic_icons.expand": "Expand Icon", - "generic_icons.failure": "Failure Icon", - "generic_icons.flag": "Flag Icon", - "generic_icons.flagged": "Flagged Icon", - "generic_icons.help": "Help Icon", - "generic_icons.info": "Info Icon", - "generic_icons.join": "Join Icon", - "generic_icons.loading": "Loading Icon", - "generic_icons.logout": "Logout Icon", - "generic_icons.mattermost": "Mattermost Logo", - "generic_icons.member": "Member Icon", - "generic_icons.mention": "Mention Icon", - "generic_icons.menu": "Menu Icon", - "generic_icons.message": "Message Icon", - "generic_icons.muted": "Muted Icon", - "generic_icons.next": "Next Icon", - "generic_icons.pin": "Pin Icon", - "generic_icons.previous": "Previous Icon", - "generic_icons.reload": "Reload Icon", - "generic_icons.remove": "Remove Icon", - "generic_icons.reply": "Reply Icon", - "generic_icons.report": "Report Icon", - "generic_icons.search": "Search Icon", - "generic_icons.searching": "Searching Icon", - "generic_icons.select": "Select Icon", - "generic_icons.settings": "Settings Icon", - "generic_icons.success": "Success Icon", - "generic_icons.testing": "Testing Icon", - "generic_icons.upload": "Upload Icon", - "generic_icons.warning": "Warning Icon", + "generic_icons.add": "新增圖示", + "generic_icons.archive": "封存圖示", + "generic_icons.arrow.down": "下箭頭圖示", + "generic_icons.arrow.up": "上箭頭圖示", + "generic_icons.attach": "附件圖示", + "generic_icons.back": "上一步圖示", + "generic_icons.breadcrumb": "階層連結圖示", + "generic_icons.channel.private": "私人頻道圖示", + "generic_icons.channel.public": "公開頻道圖示", + "generic_icons.collapse": "收起圖示", + "generic_icons.download": "下載圖示", + "generic_icons.dropdown": "下拉式清單圖示", + "generic_icons.edit": "編輯圖示", + "generic_icons.email": "電子郵件圖示", + "generic_icons.expand": "展開圖示", + "generic_icons.failure": "失敗圖示", + "generic_icons.flag": "標記圖示", + "generic_icons.flagged": "被標記圖示", + "generic_icons.help": "幫助圖示", + "generic_icons.info": "訊息圖示", + "generic_icons.join": "加入圖示", + "generic_icons.loading": "讀取中圖示", + "generic_icons.logout": "登出圖示", + "generic_icons.mattermost": "Mattermost 標誌", + "generic_icons.member": "成員圖示", + "generic_icons.mention": "提及圖示", + "generic_icons.menu": "選單圖示", + "generic_icons.message": "訊息圖示", + "generic_icons.muted": "靜音圖示", + "generic_icons.next": "下一個圖示", + "generic_icons.pin": "釘選圖示", + "generic_icons.previous": "前一個圖示", + "generic_icons.reload": "重新讀取圖示", + "generic_icons.remove": "移除圖示", + "generic_icons.reply": "回覆圖示", + "generic_icons.report": "回報圖示", + "generic_icons.search": "搜尋圖示", + "generic_icons.searching": "搜尋中圖示", + "generic_icons.select": "選擇圖示", + "generic_icons.settings": "設定圖示", + "generic_icons.success": "成功圖示", + "generic_icons.testing": "測試中圖示", + "generic_icons.upload": "上傳圖示", + "generic_icons.warning": "警告圖示", "get_app.alreadyHaveIt": "已經擁有了?", "get_app.androidAppName": "Mattermost for Android", "get_app.androidHeader": "使用 Android 應用程式時 Mattermost 能有最好的表現", @@ -2027,7 +2027,7 @@ "help.formatting.headings2Example": "大標題\n-------------", "help.formatting.headingsExample": "## 大標題\n### 小點的標題\n#### 更小的標題", "help.formatting.images": "## 嵌入圖片\n\n建立嵌入圖片:在 `!` 後接著方括號再接著括號,方括號內放替代文字,括號內放圖片連結。在連結後加入用雙引號括起來的文字則可增加動態顯示文字。", - "help.formatting.imagesExample": "![替代文字](連結 \"動態顯示文字\")\n\n跟\n\n[![Build Status](https://travis-ci.org/mattermost/platform.svg?branch=master)](https://travis-ci.org/mattermost/platform) [![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/platform)", + "help.formatting.imagesExample": "![替代文字](連結 \"動態顯示文字\")\n\n跟\n\n[![Build Status](https://travis-ci.org/mattermost//mattermost-server.svg?branch=master)](https://travis-ci.org/mattermost/mattermost-server) [![Github](https://assets-cdn.github.com/favicon.ico)](https://github.com/mattermost/mattermost-server)", "help.formatting.inline": "## 嵌入程式碼\n\n用反引號括起文字用來將等寬文字嵌入普通文字中。", "help.formatting.intro": "Markdown 讓設定訊息格式變得非常輕鬆。您只須如同平時一樣的輸入訊息,然後用以下的規則賦予其特定格式。", "help.formatting.lines": "## 線\n\n用 3 個 `*`、`_` 或 `-` 來建立一條線。", @@ -2311,13 +2311,13 @@ "mobile.announcement_banner.title": "公佈事項", "mobile.channel.markAsRead": "標記為已讀", "mobile.channel_drawer.search": "跳至...", - "mobile.channel_info.alertMessageDeleteChannel": "確定要刪除{term} {name} 嘛?", + "mobile.channel_info.alertMessageDeleteChannel": "確定要封存{term} {name} 嘛?", "mobile.channel_info.alertMessageLeaveChannel": "確定要離開{term} {name} 嘛?", "mobile.channel_info.alertNo": "否", - "mobile.channel_info.alertTitleDeleteChannel": "刪除{term}", + "mobile.channel_info.alertTitleDeleteChannel": "封存{term}", "mobile.channel_info.alertTitleLeaveChannel": "退出{term}", "mobile.channel_info.alertYes": "是", - "mobile.channel_info.delete_failed": "無法刪除頻道 {displayName}。請檢查連線並再試一次。", + "mobile.channel_info.delete_failed": "無法封存頻道 {displayName}。請檢查連線並再試一次。 ", "mobile.channel_info.edit": "編輯頻道", "mobile.channel_info.privateChannel": "私人頻道", "mobile.channel_info.publicChannel": "公開頻道", @@ -2473,8 +2473,8 @@ "mobile.notification_settings.auto_responder.enabled": "已啟用", "mobile.notification_settings.auto_responder.footer_message": "設定用以自動回覆直接傳訊的自訂訊息。在公開及私人頻道的提及不會觸發自動回覆。啟用自動回覆會將狀態設為不在辦公室同時停止郵件與推播通知。", "mobile.notification_settings.auto_responder.message_placeholder": "訊息", - "mobile.notification_settings.auto_responder.message_title": "CUSTOM MESSAGE", - "mobile.notification_settings.auto_responder_short": "Automatic Replies", + "mobile.notification_settings.auto_responder.message_title": "自訂訊息", + "mobile.notification_settings.auto_responder_short": "自動回覆", "mobile.notification_settings.email": "電子郵件", "mobile.notification_settings.email_title": "電子郵件通知", "mobile.notification_settings.mentions.channelWide": "對頻道提及", @@ -2537,12 +2537,12 @@ "mobile.rename_channel.name_required": "需要 URL", "mobile.request.invalid_response": "從伺服器傳來無效的回應。", "mobile.reset_status.alert_cancel": "取消", - "mobile.reset_status.alert_ok": "Ok", - "mobile.reset_status.title_ooo": "Disable \"Out Of Office\"?", + "mobile.reset_status.alert_ok": "確定", + "mobile.reset_status.title_ooo": "停用\"不在辦公室\"?", "mobile.retry_message": "更新訊息失敗。請往上拖動以重新嘗試。", "mobile.routes.channelInfo": "相關資訊", "mobile.routes.channelInfo.createdBy": "由 {creator} 建立於", - "mobile.routes.channelInfo.delete_channel": "刪除頻道", + "mobile.routes.channelInfo.delete_channel": "封存頻道", "mobile.routes.channelInfo.favorite": "我的最愛", "mobile.routes.channel_members.action": "移除成員", "mobile.routes.channel_members.action_message": "必須選取至少一位成員以從頻道移除", @@ -2566,7 +2566,7 @@ "mobile.routes.thread": "{channelName} 討論串", "mobile.routes.thread_dm": "直接傳訊討論串", "mobile.routes.user_profile": "個人檔案", - "mobile.routes.user_profile.local_time": "LOCAL TIME", + "mobile.routes.user_profile.local_time": "本地時間", "mobile.routes.user_profile.send_message": "發送訊息", "mobile.search.from_modifier_description": "尋找由特定使用者張貼的訊息", "mobile.search.from_modifier_title": "使用者名稱", @@ -2585,13 +2585,13 @@ "mobile.server_url.invalid_format": "網址開頭必須是 http:// 或 https://", "mobile.session_expired": "工作階段過期:請登入以繼續接收通知。", "mobile.set_status.away": "離開", - "mobile.set_status.away.icon": "Away Icon", + "mobile.set_status.away.icon": "離開圖示", "mobile.set_status.dnd": "請勿打擾", - "mobile.set_status.dnd.icon": "請勿打擾指示器", + "mobile.set_status.dnd.icon": "請勿打擾圖示", "mobile.set_status.offline": "離線", - "mobile.set_status.offline.icon": "Offline Icon", + "mobile.set_status.offline.icon": "離線圖示", "mobile.set_status.online": "上線", - "mobile.set_status.online.icon": "Online Icon", + "mobile.set_status.online.icon": "線上圖示", "mobile.settings.clear": "清除離線儲存資料", "mobile.settings.clear_button": "清除", "mobile.settings.clear_message": "\n這將會清除所有離線資料並重新啟動 app 。在重啟 app 後會自動重新登入。\n", @@ -2602,13 +2602,14 @@ "mobile.share_extension.error_close": "關閉", "mobile.share_extension.error_message": "使用分享擴充時發生錯誤。", "mobile.share_extension.error_title": "擴充錯誤", - "mobile.share_extension.post_error": "An error has occurred while posting the message. Please try again.", + "mobile.share_extension.post_error": "發布訊息時發生錯誤。請重新嘗試。", "mobile.share_extension.send": "送出", "mobile.share_extension.team": "團隊", "mobile.suggestion.members": "成員", "mobile.timezone_settings.automatically": "自動設定", "mobile.timezone_settings.manual": "更改時區", - "mobile.timezone_settings.select": "Select Timezone", + "mobile.timezone_settings.select": "選擇時區", + "mobile.user.settings.notifications.email.fifteenMinutes": "每 15 分鐘", "mobile.video.save_error_message": "必須先下載影片才能儲存。", "mobile.video.save_error_title": "檔案影片錯誤", "mobile.video_playback.failed_description": "嘗試播放影片時發生錯誤。", @@ -2667,7 +2668,7 @@ "navbar.addMembers": "新增成員", "navbar.click": "請按此處", "navbar.clickToAddHeader": "{clickHere} 以新增。", - "navbar.delete": "Archive Channel...", + "navbar.delete": "封存頻道...", "navbar.leave": "離開頻道", "navbar.manageMembers": "成員管理", "navbar.noHeader": "尚未有頻道標題。", @@ -2684,16 +2685,16 @@ "navbar_dropdown.addMemberToTeam": "新增成員", "navbar_dropdown.console": "系統控制台", "navbar_dropdown.create": "建立團隊", - "navbar_dropdown.create.icon": "建立團隊", + "navbar_dropdown.create.icon": "建立團隊圖示", "navbar_dropdown.emoji": "自訂繪文字", "navbar_dropdown.help": "說明", "navbar_dropdown.integrations": "整合", "navbar_dropdown.inviteMember": "發送電子郵件邀請", "navbar_dropdown.join": "加入其他團隊", - "navbar_dropdown.join.icon": "加入其他團隊", + "navbar_dropdown.join.icon": "加入其他團隊圖示", "navbar_dropdown.keyboardShortcuts": "快速鍵", "navbar_dropdown.leave": "離開團隊", - "navbar_dropdown.leave.icon": "Leave Team Icon", + "navbar_dropdown.leave.icon": "離開團隊圖示", "navbar_dropdown.logout": "登出", "navbar_dropdown.manageMembers": "會員管理", "navbar_dropdown.nativeApps": "下載應用程式", @@ -2749,6 +2750,8 @@ "post_info.bot": "機器人", "post_info.del": "刪除", "post_info.edit": "編輯", + "post_info.message.show_less": "顯示較少內容", + "post_info.message.show_more": "顯示更多", "post_info.message.visible": "(只有您看得見)", "post_info.message.visible.compact": " (只有您看得見)", "post_info.mobile.flag": "標記", @@ -2818,12 +2821,12 @@ "rhs_header.backToResultsTooltip": "回到搜尋結果", "rhs_header.closeSidebarTooltip": "關閉側邊欄", "rhs_header.closeTooltip": "關閉側邊欄", - "rhs_header.closeTooltip.icon": "Close Sidebar Icon", + "rhs_header.closeTooltip.icon": "關閉側邊欄圖示", "rhs_header.details": "詳細訊息", "rhs_header.expandSidebarTooltip": "展開側邊欄", - "rhs_header.expandSidebarTooltip.icon": "Expand Sidebar Icon", + "rhs_header.expandSidebarTooltip.icon": "展開側邊欄圖示", "rhs_header.expandTooltip": "關閉側邊欄", - "rhs_header.expandTooltip.icon": "Shrink Sidebar Icon", + "rhs_header.expandTooltip.icon": "縮小側邊欄圖示", "rhs_header.shrinkSidebarTooltip": "關閉側邊欄", "rhs_root.del": "刪除", "rhs_root.direct": "直接訊息", @@ -2861,8 +2864,8 @@ "search_results.usagePin2": "所有此頻道的成員都可以釘選重要或是有用的訊息。", "search_results.usagePin3": "所有的頻道成員都能看見被釘選的訊息。", "search_results.usagePin4": "釘選訊息:移動到想釘選的訊息,按下 [...] > \"釘選至頻道\"。", - "select_team.icon": "Select Team Icon", - "select_team.join.icon": "Join Team Icon", + "select_team.icon": "選擇團隊圖示", + "select_team.join.icon": "加入團隊圖示", "select_team.title": "選擇團隊", "setting_item_max.cancel": "取消", "setting_item_max.save": "儲存", @@ -2948,34 +2951,34 @@ "sidebar_header.tutorial": "

主選單

主選單可以邀請新成員,存取帳號設定並設定主題顏色

團隊管理員也可以在此存取團隊設定

系統管理員會在此看到系統控制台以管理整個系統。

", "sidebar_right_menu.accountSettings": "帳號設定", "sidebar_right_menu.addMemberToTeam": "新增成員", - "sidebar_right_menu.addMemberToTeam.icon": "新增成員", + "sidebar_right_menu.addMemberToTeam.icon": "新增成員圖示", "sidebar_right_menu.console": "系統控制台", - "sidebar_right_menu.console.icon": "System Console Icon", + "sidebar_right_menu.console.icon": "系統主控台圖示", "sidebar_right_menu.flagged": "被標記的訊息", "sidebar_right_menu.help": "說明", "sidebar_right_menu.inviteNew": "發送電子郵件邀請", - "sidebar_right_menu.inviteNew.icon": "發送電子郵件邀請", + "sidebar_right_menu.inviteNew.icon": "發送電子郵件邀請圖示", "sidebar_right_menu.logout": "登出", "sidebar_right_menu.manageMembers": "成員管理", "sidebar_right_menu.nativeApps": "下載應用程式", - "sidebar_right_menu.nativeApps.icon": "Native Apps Icon", + "sidebar_right_menu.nativeApps.icon": "原生應用程式圖示", "sidebar_right_menu.recentMentions": "最近提及", "sidebar_right_menu.report": "回報錯誤", "sidebar_right_menu.teamLink": "取得團隊邀請連結", - "sidebar_right_menu.teamLink.icon": "取得團隊邀請連結", + "sidebar_right_menu.teamLink.icon": "取得團隊邀請連結圖示", "sidebar_right_menu.teamSettings": "團隊設定", "sidebar_right_menu.viewMembers": "檢視成員", "signup.email": "電子郵件跟密碼", - "signup.email.icon": "Email Icon", + "signup.email.icon": "電子郵件圖示", "signup.gitlab": "GitLab 單一登入", - "signup.gitlab.icon": "GitLab Icon", + "signup.gitlab.icon": "GitLab 圖示", "signup.google": "Google 帳號", - "signup.google.icon": "Google Icon", + "signup.google.icon": "Google 圖示", "signup.ldap": "AD/LDAP 認證", - "signup.ldap.icon": "AD/LDAP ID", + "signup.ldap.icon": "AD/LDAP 圖示", "signup.office365": "Office 365", - "signup.office365.icon": "Office 365 Icon", - "signup.saml.icon": "SAML Icon", + "signup.office365.icon": "Office 365 圖示", + "signup.saml.icon": "SAML 圖示", "signup.title": "用下列之一建立帳號:", "signup_team.createTeam": "或是建立團隊", "signup_team.disabled": "建立團隊功能已被停用。如須使用請聯絡系統管理員。", @@ -3044,7 +3047,7 @@ "suggestion.search.private": "私人頻道", "suggestion.search.public": "公開頻道", "system_notice.adminVisible": "只有系統管理員可見", - "system_notice.adminVisible.icon": "只有系統管理員可見", + "system_notice.adminVisible.icon": "只有系統管理員可見圖示", "system_notice.body.api3": "如果在過去兩年有建立或安裝外部整合,請參閱預定的變更以確認影響。", "system_notice.body.permissions": "系統主控台中部份的政策以及權限設定隨著 Enterprise E10 and E20 版當中進階權限功能的釋出,已被移動到其他地方。", "system_notice.dont_show": "不要再顯示", @@ -3134,7 +3137,7 @@ "user.settings.advance.enabledFeatures": "已啟用 {count, number} 項功能", "user.settings.advance.formattingDesc": "啟用時,文章會顯示連結、顯示繪文字、套用樣式到文字上並自動斷行。此設定預設為開啟。修改此設定後需要重新讀取頁面以生效。", "user.settings.advance.formattingTitle": "啟用文章格式設定", - "user.settings.advance.icon": "進階設定", + "user.settings.advance.icon": "進階設定圖示", "user.settings.advance.joinLeaveDesc": "當\"啟用\"時,頻道會顯示使用者加入或離開的系統訊息。當\"關閉\"時,頻道會隱藏使用者加入或離開的系統訊息。當您被加入頻道時,不論設定如何都會顯示訊息以提醒您。", "user.settings.advance.joinLeaveTitle": "啟用加入/離開訊息", "user.settings.advance.markdown_preview": "在訊息輸入方塊顯示 Markdown 預覽選項", @@ -3181,7 +3184,7 @@ "user.settings.display.collapseOn": "已展開", "user.settings.display.fixedWidthCentered": "固定寬度,置中對齊", "user.settings.display.fullScreen": "全寬", - "user.settings.display.icon": "顯示設定", + "user.settings.display.icon": "顯示設定圖示", "user.settings.display.language": "語言", "user.settings.display.linkPreviewDesc": "當可行時,訊息下方將顯示訊息中的第一個網站連結預覽。", "user.settings.display.linkPreviewDisplay": "網站連結預覽", @@ -3234,7 +3237,7 @@ "user.settings.general.field_handled_externally": "此欄位由您的登入提供者決定。如果想變更它,得經由登入提供者變更。", "user.settings.general.firstName": "名字", "user.settings.general.fullName": "全名", - "user.settings.general.icon": "一般設定", + "user.settings.general.icon": "一般設定圖示", "user.settings.general.imageTooLarge": "無法上傳個人圖像。檔案過大。", "user.settings.general.imageUpdated": "圖像最新更新於 {date}", "user.settings.general.lastName": "姓氏", @@ -3326,7 +3329,7 @@ "user.settings.notifications.emailInfo": "在離線或是離開 {siteName} 超過 5 分鐘時,會發送電子郵件以通知關於您的提及與直接訊息。", "user.settings.notifications.emailNotifications": "電子郵件通知", "user.settings.notifications.header": "通知", - "user.settings.notifications.icon": "通知設定", + "user.settings.notifications.icon": "通知設定圖示", "user.settings.notifications.info": "桌面通知支援 Edge、Firefox、Safari、Chrome 跟 Mattermost 桌面應用程式。", "user.settings.notifications.mentionsInfo": "提及會在某人發送含有您的使用者名稱(\"@{username}\")或上面任何選取的選項時被觸發。", "user.settings.notifications.never": "永不", @@ -3370,7 +3373,7 @@ "user.settings.security.emailPwd": "電子郵件跟密碼", "user.settings.security.gitlab": "GitLab", "user.settings.security.google": "Google", - "user.settings.security.icon": "安全性設定", + "user.settings.security.icon": "安全性設定圖示", "user.settings.security.inactive": "停用", "user.settings.security.lastUpdated": "最後一次更新於 {date} {time}", "user.settings.security.ldap": "AD/LDAP", @@ -3380,7 +3383,7 @@ "user.settings.security.loginOffice365": "經由 Office 365 登入", "user.settings.security.loginSaml": "已經由 SAML 登入", "user.settings.security.logoutActiveSessions": "觀看並登出使用中的工作階段", - "user.settings.security.logoutActiveSessions.icon": "使用中的工作階段", + "user.settings.security.logoutActiveSessions.icon": "使用中的工作階段圖示", "user.settings.security.method": "登入方式", "user.settings.security.newPassword": "新密碼", "user.settings.security.noApps": "尚未授權給任一 OAuth 2.0 應用程式。", @@ -3423,11 +3426,11 @@ "user.settings.security.switchSaml": "改為使用 SAML SSO", "user.settings.security.title": "安全性設定", "user.settings.security.viewHistory": "檢視存取紀錄", - "user.settings.security.viewHistory.icon": "Access History Icon", + "user.settings.security.viewHistory.icon": "存取紀錄圖示", "user.settings.sidebar.after_seven_days": "七天沒有新訊息", "user.settings.sidebar.autoCloseDMDesc": "可以用側邊欄的\"+\"按鈕重新開啟直接傳訊對話或是快速頻道切換(CTRL+K)。", "user.settings.sidebar.autoCloseDMTitle": "自動關閉直接傳訊", - "user.settings.sidebar.icon": "側邊欄設定", + "user.settings.sidebar.icon": "側邊欄設定圖示", "user.settings.sidebar.never": "永不", "user.settings.sidebar.showUnreadSection": "在頻道側邊欄的頂端", "user.settings.sidebar.title": "側邊欄設定", @@ -3473,7 +3476,7 @@ "user_profile.account.editSettings": "帳號設定", "user_profile.account.localTime": "本地時間:", "user_profile.send.dm": "發送訊息", - "user_profile.send.dm.icon": "Send Message Icon", + "user_profile.send.dm.icon": "發送訊息圖示", "user_profile.webrtc.call": "開始視訊通話", "user_profile.webrtc.offline": "使用者離線中", "user_profile.webrtc.unavailable": "在當前通訊結束前不能建立新的通訊", @@ -3491,30 +3494,30 @@ "web.root.signup_info": "團隊溝通皆在同處,隨時隨地皆可搜尋與存取。", "webrtc.busy": "{username} 通話中。", "webrtc.call": "通訊", - "webrtc.call.icon": "Call Icon", + "webrtc.call.icon": "撥打圖示", "webrtc.callEnded": "與 {username} 的通訊結束了。", "webrtc.cancel": "取消通訊", - "webrtc.cancel.icon": "Cancel call Icon", + "webrtc.cancel.icon": "取消撥打圖示", "webrtc.cancelled": "{username} 取消了通訊。", "webrtc.declined": "{username} 拒絕了通訊。", "webrtc.disabled": "{username} 停用了 WebRTC,無法接收通訊。他必須到 帳號設定 > 進階 > 預覽預先發佈功能 啟用 WebRTC 以啟用此功能。", "webrtc.failed": "連接視訊通話時發生錯誤。", "webrtc.hangup": "掛斷", "webrtc.header": "與 {username} 的通訊", - "webrtc.icon": "Webrtc Icon", + "webrtc.icon": "WebRTC 圖示", "webrtc.inProgress": "通訊中。請先掛斷現在的通訊。", "webrtc.mediaError": "無法存取攝影機或麥克風。", "webrtc.mute_audio": "麥克風靜音", - "webrtc.mute_audio.icon": "Mute Icon", + "webrtc.mute_audio.icon": "靜音圖示", "webrtc.noAnswer": "{username} 沒有接聽呼叫。", "webrtc.notification.answer": "接聽", - "webrtc.notification.answer.icon": "Answer Icon", + "webrtc.notification.answer.icon": "回答圖示", "webrtc.notification.decline": "拒絕", "webrtc.notification.incoming_call": "{username} 來電。", "webrtc.notification.returnToCall": "返回到與 {username} 的通訊", "webrtc.offline": "{username} 不在線上。", "webrtc.pause_video": "關閉攝影機", - "webrtc.return.icon": "Return to Call Icon", + "webrtc.return.icon": "回到通話圖示", "webrtc.unmute_audio": "解除麥克風靜音", "webrtc.unpause_video": "開啟攝影機", "webrtc.unsupported": "{username} 的用戶端不支援視訊通話。", From 6458ed871b71b849e527322e199c3d270bed47dd Mon Sep 17 00:00:00 2001 From: Saturnino Abril Date: Tue, 10 Jul 2018 06:32:09 +0800 Subject: [PATCH 05/11] fix profile upload by using RNFetchBlob (#1900) --- app/actions/views/edit_profile.js | 10 +----- app/screens/edit_profile/edit_profile.js | 39 ++++++++++++++++++------ app/screens/edit_profile/index.js | 3 +- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/app/actions/views/edit_profile.js b/app/actions/views/edit_profile.js index c2fc52b6d..844abae30 100644 --- a/app/actions/views/edit_profile.js +++ b/app/actions/views/edit_profile.js @@ -1,8 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {uploadProfileImage, updateMe} from 'mattermost-redux/actions/users'; -import {buildFileUploadData} from 'app/utils/file'; +import {updateMe} from 'mattermost-redux/actions/users'; export function updateUser(user, success, error) { return async (dispatch, getState) => { @@ -16,10 +15,3 @@ export function updateUser(user, success, error) { return result; }; } - -export function handleUploadProfileImage(image, userId) { - return async (dispatch, getState) => { - const imageData = buildFileUploadData(image); - return await uploadProfileImage(userId, imageData)(dispatch, getState); - }; -} diff --git a/app/screens/edit_profile/edit_profile.js b/app/screens/edit_profile/edit_profile.js index c5b2f699c..bb937bbd9 100644 --- a/app/screens/edit_profile/edit_profile.js +++ b/app/screens/edit_profile/edit_profile.js @@ -5,17 +5,21 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {intlShape} from 'react-intl'; import {View} from 'react-native'; - +import RNFetchBlob from 'react-native-fetch-blob'; import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scroll-view'; +import {Client4} from 'mattermost-redux/client'; + +import {buildFileUploadData, encodeHeaderURIStringToUTF8} from 'app/utils/file'; +import {emptyFunction} from 'app/utils/general'; +import {preventDoubleTap} from 'app/utils/tap'; +import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme'; + import Loading from 'app/components/loading'; import ErrorText from 'app/components/error_text'; import StatusBar from 'app/components/status_bar/index'; import ProfilePicture from 'app/components/profile_picture'; import AttachmentButton from 'app/components/attachment_button'; -import {emptyFunction} from 'app/utils/general'; -import {preventDoubleTap} from 'app/utils/tap'; -import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme'; import EditProfileItem from './edit_profile_item'; @@ -49,7 +53,6 @@ const holders = { export default class EditProfile extends PureComponent { static propTypes = { actions: PropTypes.shape({ - handleUploadProfileImage: PropTypes.func.isRequired, updateUser: PropTypes.func.isRequired, }).isRequired, config: PropTypes.object.isRequired, @@ -165,11 +168,7 @@ export default class EditProfile extends PureComponent { }; if (profileImage) { - const {error} = await this.props.actions.handleUploadProfileImage(profileImage, this.props.currentUser.id); - if (error) { - this.handleRequestError(error); - return; - } + this.uploadProfileImage().catch(this.handleUploadError); } if (this.canUpdate()) { @@ -189,6 +188,26 @@ export default class EditProfile extends PureComponent { this.emitCanUpdateAccount(true); }; + uploadProfileImage = () => { + const {profileImage} = this.state; + const {currentUser} = this.props; + const fileData = buildFileUploadData(profileImage); + + const headers = { + Authorization: `Bearer ${Client4.getToken()}`, + 'Content-Type': 'multipart/form-data', + }; + + const fileInfo = { + name: 'image', + filename: encodeHeaderURIStringToUTF8(fileData.name), + data: RNFetchBlob.wrap(profileImage.uri.replace('file://', '')), + type: fileData.type, + }; + + return RNFetchBlob.fetch('POST', `${Client4.getUserRoute(currentUser.id)}/image`, headers, [fileInfo]); + }; + updateField = (field) => { this.setState(field, () => { this.emitCanUpdateAccount(this.canUpdate(field)); diff --git a/app/screens/edit_profile/index.js b/app/screens/edit_profile/index.js index dc54c8715..776430678 100644 --- a/app/screens/edit_profile/index.js +++ b/app/screens/edit_profile/index.js @@ -7,7 +7,7 @@ import {bindActionCreators} from 'redux'; import {getConfig} from 'mattermost-redux/selectors/entities/general'; import {getTheme} from 'mattermost-redux/selectors/entities/preferences'; -import {updateUser, handleUploadProfileImage} from 'app/actions/views/edit_profile'; +import {updateUser} from 'app/actions/views/edit_profile'; import EditProfile from './edit_profile'; @@ -21,7 +21,6 @@ function mapStateToProps(state) { function mapDispatchToProps(dispatch) { return { actions: bindActionCreators({ - handleUploadProfileImage, updateUser, }, dispatch), }; From 360c8cd2e335e0434567763c58432214ce7e63ed Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Mon, 9 Jul 2018 18:32:48 -0400 Subject: [PATCH 06/11] Prevent drawer from swiping to teams when jump to channel is focused (#1902) --- app/components/swiper.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/swiper.js b/app/components/swiper.js index a33fb4e27..d76bf5b9d 100644 --- a/app/components/swiper.js +++ b/app/components/swiper.js @@ -144,9 +144,9 @@ export default class Swiper extends PureComponent { contentContainerStyle={[styles.wrapperIOS, this.props.style]} onScrollBeginDrag={this.onScrollBegin} onMomentumScrollEnd={this.onScrollEnd} - pagingEnabled={true} + pagingEnabled={scrollEnabled} keyboardShouldPersistTaps={keyboardShouldPersistTaps} - scrollEnabled={true} + scrollEnabled={scrollEnabled} > {pages} From 01792f2b54c6bddd359dd77a3128bc67d2750e6b Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Mon, 9 Jul 2018 18:33:13 -0400 Subject: [PATCH 07/11] Handle bad state (#1903) * Upgrade mattermost-redux * Check if url start with http before pinging * Remove required status prop in settings sidebar * Prevent the app to get into a bad state and if that happens try and recover --- app/app.js | 22 +++++++++---- .../sidebars/settings/settings_sidebar.js | 3 +- app/screens/channel/channel.js | 33 ++++++++++++++++--- app/screens/channel/index.js | 3 +- app/store/middleware.js | 15 +++++++++ app/utils/network.js | 2 +- assets/base/i18n/en.json | 2 ++ package-lock.json | 4 +-- package.json | 2 +- 9 files changed, 69 insertions(+), 17 deletions(-) diff --git a/app/app.js b/app/app.js index bd8de9c31..58fd2b263 100644 --- a/app/app.js +++ b/app/app.js @@ -91,12 +91,17 @@ export default class App { const [deviceToken, currentUserId] = usernameParsed; const [token, url] = passwordParsed; - this.deviceToken = deviceToken; - this.currentUserId = currentUserId; - this.token = token; - this.url = url; - Client4.setUrl(url); - Client4.setToken(token); + // if for any case the url and the token aren't valid proceed with re-hydration + if (url && url !== 'undefined' && token && token !== 'undefined') { + this.deviceToken = deviceToken; + this.currentUserId = currentUserId; + this.token = token; + this.url = url; + Client4.setUrl(url); + Client4.setToken(token); + } else { + this.waitForRehydration = true; + } } } } catch (error) { @@ -161,7 +166,10 @@ export default class App { this.url = url; } - setGenericPassword(username, password); + // Only save to keychain if the url and token are set + if (url && token) { + setGenericPassword(username, password); + } }; setStartupThemes = (toolbarBackground, toolbarTextColor, appBackground) => { diff --git a/app/components/sidebars/settings/settings_sidebar.js b/app/components/sidebars/settings/settings_sidebar.js index ceee93d13..f3957bdfa 100644 --- a/app/components/sidebars/settings/settings_sidebar.js +++ b/app/components/sidebars/settings/settings_sidebar.js @@ -41,12 +41,13 @@ export default class SettingsDrawer extends PureComponent { currentUser: PropTypes.object.isRequired, deviceWidth: PropTypes.number.isRequired, navigator: PropTypes.object, - status: PropTypes.string.isRequired, + status: PropTypes.string, theme: PropTypes.object.isRequired, }; static defaultProps = { currentUser: {}, + status: 'offline', }; static contextTypes = { diff --git a/app/screens/channel/channel.js b/app/screens/channel/channel.js index 5f269e47b..a3cd26cbe 100644 --- a/app/screens/channel/channel.js +++ b/app/screens/channel/channel.js @@ -5,6 +5,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {intlShape} from 'react-intl'; import { + Alert, AppState, Dimensions, Platform, @@ -22,6 +23,7 @@ import KeyboardLayout from 'app/components/layout/keyboard_layout'; import OfflineIndicator from 'app/components/offline_indicator'; import SafeAreaView from 'app/components/safe_area_view'; import StatusBar from 'app/components/status_bar'; +import {ViewTypes} from 'app/constants'; import mattermostBucket from 'app/mattermost_bucket'; import {preventDoubleTap} from 'app/utils/tap'; import {makeStyleSheetFromTheme} from 'app/utils/theme'; @@ -33,7 +35,6 @@ import LocalConfig from 'assets/config'; import ChannelNavBar from './channel_nav_bar'; import ChannelPostList from './channel_post_list'; -import {ViewTypes} from 'app/constants'; const { ANDROID_TOP_LANDSCAPE, ANDROID_TOP_PORTRAIT, @@ -50,6 +51,7 @@ export default class Channel extends PureComponent { connection: PropTypes.func.isRequired, loadChannelsIfNecessary: PropTypes.func.isRequired, loadProfilesAndTeamMembersForDMSidebar: PropTypes.func.isRequired, + logout: PropTypes.func.isRequired, selectDefaultTeam: PropTypes.func.isRequired, selectInitialChannel: PropTypes.func.isRequired, initWebSocket: PropTypes.func.isRequired, @@ -236,8 +238,12 @@ export default class Channel extends PureComponent { handleConnectionChange = (isConnected) => { const {connection} = this.props.actions; - this.handleWebSocket(isConnected); - connection(isConnected); + // Prevent for being called more than once. + if (this.isConnected !== isConnected) { + this.isConnected = isConnected; + this.handleWebSocket(isConnected); + connection(isConnected); + } }; handleLeaveTeam = () => { @@ -245,6 +251,7 @@ export default class Channel extends PureComponent { }; initializeWebSocket = async () => { + const {formatMessage} = this.context.intl; const {actions} = this.props; const {initWebSocket} = actions; const platform = Platform.OS; @@ -253,7 +260,25 @@ export default class Channel extends PureComponent { certificate = await mattermostBucket.getPreference('cert', LocalConfig.AppGroupId); } - initWebSocket(platform, null, null, null, {certificate}); + initWebSocket(platform, null, null, null, {certificate}).catch(() => { + // we should dispatch a failure and show the app as disconnected + Alert.alert( + formatMessage({id: 'mobile.authentication_error.title', defaultMessage: 'Authentication Error'}), + formatMessage({ + id: 'mobile.authentication_error.message', + defaultMessage: 'Mattermost has encountered an error. Please re-authenticate to start a new session.', + }), + [{ + text: formatMessage({ + id: 'navbar_dropdown.logout', + defaultMessage: 'Logout', + }), + onPress: actions.logout, + }], + {cancelable: false} + ); + this.props.actions.closeWebSocket(true); + }); }; loadChannels = (teamId) => { diff --git a/app/screens/channel/index.js b/app/screens/channel/index.js index 84340c5b6..05fb3c482 100644 --- a/app/screens/channel/index.js +++ b/app/screens/channel/index.js @@ -4,7 +4,7 @@ import {bindActionCreators} from 'redux'; import {connect} from 'react-redux'; -import {startPeriodicStatusUpdates, stopPeriodicStatusUpdates} from 'mattermost-redux/actions/users'; +import {startPeriodicStatusUpdates, stopPeriodicStatusUpdates, logout} from 'mattermost-redux/actions/users'; import {init as initWebSocket, close as closeWebSocket} from 'mattermost-redux/actions/websocket'; import {RequestStatus} from 'mattermost-redux/constants'; import {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels'; @@ -41,6 +41,7 @@ function mapDispatchToProps(dispatch) { connection, loadChannelsIfNecessary, loadProfilesAndTeamMembersForDMSidebar, + logout, selectDefaultTeam, selectInitialChannel, initWebSocket, diff --git a/app/store/middleware.js b/app/store/middleware.js index 1321a1678..50ef90bb8 100644 --- a/app/store/middleware.js +++ b/app/store/middleware.js @@ -111,6 +111,20 @@ function resetStateForNewVersion(action) { lastTeamId = payload.views.team.lastTeamId; } + const currentChannelId = lastChannelForTeam[lastTeamId] && lastChannelForTeam[lastTeamId].length ? lastChannelForTeam[lastTeamId][0] : ''; + let channels = initialState.entities.channels; + if (payload.entities.channels && currentChannelId) { + channels = { + currentChannelId, + channels: { + [currentChannelId]: payload.entities.channels.channels[currentChannelId], + }, + myMembers: { + [currentChannelId]: payload.entities.channels.myMembers[currentChannelId], + }, + }; + } + let threadDrafts = initialState.views.thread.drafts; if (payload.views.thread && payload.views.thread.drafts) { threadDrafts = payload.views.thread.drafts; @@ -132,6 +146,7 @@ function resetStateForNewVersion(action) { version: DeviceInfo.getVersion(), }, entities: { + channels, general, teams, users, diff --git a/app/utils/network.js b/app/utils/network.js index f54323664..34a6f9b53 100644 --- a/app/utils/network.js +++ b/app/utils/network.js @@ -9,7 +9,7 @@ import {Client4} from 'mattermost-redux/client'; const PING_TIMEOUT = 10000; export async function checkConnection(isConnected) { - if (Client4.getBaseRoute() === '/api/v4') { + if (!Client4.getBaseRoute().startsWith('http')) { // If we don't have a server yet, return the default implementation return isConnected; } diff --git a/assets/base/i18n/en.json b/assets/base/i18n/en.json index b5809fd6d..f4914fce1 100644 --- a/assets/base/i18n/en.json +++ b/assets/base/i18n/en.json @@ -2309,6 +2309,8 @@ "mobile.announcement_banner.dismiss": "Dismiss", "mobile.announcement_banner.ok": "OK", "mobile.announcement_banner.title": "Announcement", + "mobile.authentication_error.title": "Authentication Error", + "mobile.authentication_error.message": "Mattermost has encountered an error. Please re-authenticate to start a new session.", "mobile.channel.markAsRead": "Mark As Read", "mobile.channel_drawer.search": "Jump to...", "mobile.channel_info.alertMessageDeleteChannel": "Are you sure you want to archive the {term} {name}?", diff --git a/package-lock.json b/package-lock.json index 3adb9e8f4..4cff221e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10100,8 +10100,8 @@ } }, "mattermost-redux": { - "version": "github:mattermost/mattermost-redux#9d922ba3f3ed1264f192cbe3c7f0030d249756e3", - "from": "github:mattermost/mattermost-redux#9d922ba3f3ed1264f192cbe3c7f0030d249756e3", + "version": "github:mattermost/mattermost-redux#ade5924a6e509ea76757bd78a2cc193043a584ce", + "from": "github:mattermost/mattermost-redux#ade5924a6e509ea76757bd78a2cc193043a584ce", "requires": { "deep-equal": "1.0.1", "eslint-plugin-header": "1.2.0", diff --git a/package.json b/package.json index 6b383815b..c359db339 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "intl": "1.2.5", "jail-monkey": "1.0.0", "jsc-android": "216113.0.3", - "mattermost-redux": "github:mattermost/mattermost-redux#9d922ba3f3ed1264f192cbe3c7f0030d249756e3", + "mattermost-redux": "github:mattermost/mattermost-redux#ade5924a6e509ea76757bd78a2cc193043a584ce", "mime-db": "1.33.0", "prop-types": "15.6.1", "react": "16.3.2", From ca4d08fc7e9e8c1863e2421b27c1b2527ad52ef7 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Mon, 9 Jul 2018 18:33:31 -0400 Subject: [PATCH 08/11] Use TextInput instead of QuickTextInput on Android (#1904) --- app/components/post_textbox/post_textbox.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/components/post_textbox/post_textbox.js b/app/components/post_textbox/post_textbox.js index c28e081d2..d16b5d97c 100644 --- a/app/components/post_textbox/post_textbox.js +++ b/app/components/post_textbox/post_textbox.js @@ -3,7 +3,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; -import {Alert, BackHandler, Keyboard, Platform, Text, TouchableOpacity, View} from 'react-native'; +import {Alert, BackHandler, Keyboard, Platform, Text, TextInput, TouchableOpacity, View} from 'react-native'; import {intlShape} from 'react-intl'; import {General, RequestStatus} from 'mattermost-redux/constants'; import EventEmitter from 'mattermost-redux/utils/event_emitter'; @@ -507,6 +507,8 @@ export default class PostTextbox extends PureComponent { inputContainerStyle.push(style.inputContainerWithoutFileUpload); } + const InputComponent = Platform.OS === 'android' ? TextInput : QuickTextInput; + return ( @@ -527,7 +529,7 @@ export default class PostTextbox extends PureComponent { {!channelIsReadOnly && attachmentButton} - Date: Mon, 9 Jul 2018 18:35:43 -0400 Subject: [PATCH 09/11] MM-11198: avoid duplicate date line keys (#1901) * MM-11198: avoid duplicate keys in date lines Ensure each dateline rendered as part of search, recent mentions, or flagged post list has a unique key, even if the same date itself appears multiple times. * update post_list.test.js to actually test date boundaries, relying on TZ=utc export in package.json * unit test makePreparePostIdsForSearchPosts * fix eslint issues * try TZ=GMT * encode date lines using timestamps instead This requires a few extra changes to the post list proper, but largely simplifies things anyway. --- .../__snapshots__/date_header.test.js.snap | 641 ++++++++++++++++++ .../post_list/date_header/date_header.js | 14 +- .../post_list/date_header/date_header.test.js | 47 ++ app/components/post_list/date_header/utils.js | 6 + .../post_list/date_header/utils.test.js | 17 + app/components/post_list/post_list.js | 24 +- app/screens/flagged_posts/flagged_posts.js | 11 +- .../recent_mentions/recent_mentions.js | 11 +- app/screens/search/search.js | 24 +- app/selectors/post_list.js | 12 +- app/selectors/post_list.test.js | 273 +++++++- 11 files changed, 1003 insertions(+), 77 deletions(-) create mode 100644 app/components/post_list/date_header/__snapshots__/date_header.test.js.snap create mode 100644 app/components/post_list/date_header/date_header.test.js create mode 100644 app/components/post_list/date_header/utils.js create mode 100644 app/components/post_list/date_header/utils.test.js diff --git a/app/components/post_list/date_header/__snapshots__/date_header.test.js.snap b/app/components/post_list/date_header/__snapshots__/date_header.test.js.snap new file mode 100644 index 000000000..381ea86a7 --- /dev/null +++ b/app/components/post_list/date_header/__snapshots__/date_header.test.js.snap @@ -0,0 +1,641 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`DateHeader component should match snapshot with suffix 1`] = ` +ShallowWrapper { + "length": 1, + Symbol(enzyme.__root__): [Circular], + Symbol(enzyme.__unrendered__): , + Symbol(enzyme.__renderer__): Object { + "batchedUpdates": [Function], + "getNode": [Function], + "render": [Function], + "simulateEvent": [Function], + "unmount": [Function], + }, + Symbol(enzyme.__node__): Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "children": Array [ + , + + + , + , + ], + "style": Array [ + Object { + "alignItems": "center", + "flexDirection": "row", + "height": 28, + }, + undefined, + ], + }, + "ref": null, + "rendered": Array [ + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "style": Object { + "backgroundColor": "#aaa", + "flex": 1, + "height": 1, + "opacity": 0.2, + }, + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "children": , + "style": Object { + "marginHorizontal": 15, + }, + }, + "ref": null, + "rendered": Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "day": "2-digit", + "month": "short", + "style": Object { + "color": "#aaa", + "fontSize": 14, + "fontWeight": "600", + }, + "value": 1970-01-18T17:19:12.392Z, + "weekday": "short", + "year": "numeric", + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + "type": [Function], + }, + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "style": Object { + "backgroundColor": "#aaa", + "flex": 1, + "height": 1, + "opacity": 0.2, + }, + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + ], + "type": [Function], + }, + Symbol(enzyme.__nodes__): Array [ + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "children": Array [ + , + + + , + , + ], + "style": Array [ + Object { + "alignItems": "center", + "flexDirection": "row", + "height": 28, + }, + undefined, + ], + }, + "ref": null, + "rendered": Array [ + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "style": Object { + "backgroundColor": "#aaa", + "flex": 1, + "height": 1, + "opacity": 0.2, + }, + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "children": , + "style": Object { + "marginHorizontal": 15, + }, + }, + "ref": null, + "rendered": Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "day": "2-digit", + "month": "short", + "style": Object { + "color": "#aaa", + "fontSize": 14, + "fontWeight": "600", + }, + "value": 1970-01-18T17:19:12.392Z, + "weekday": "short", + "year": "numeric", + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + "type": [Function], + }, + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "style": Object { + "backgroundColor": "#aaa", + "flex": 1, + "height": 1, + "opacity": 0.2, + }, + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + ], + "type": [Function], + }, + ], + Symbol(enzyme.__options__): Object { + "adapter": ReactSixteenAdapter { + "options": Object { + "enableComponentDidUpdateOnSetState": true, + }, + }, + "context": Object { + "intl": Object { + "formatMessage": [MockFunction], + }, + }, + }, +} +`; + +exports[`DateHeader component should match snapshot without suffix 1`] = ` +ShallowWrapper { + "length": 1, + Symbol(enzyme.__root__): [Circular], + Symbol(enzyme.__unrendered__): , + Symbol(enzyme.__renderer__): Object { + "batchedUpdates": [Function], + "getNode": [Function], + "render": [Function], + "simulateEvent": [Function], + "unmount": [Function], + }, + Symbol(enzyme.__node__): Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "children": Array [ + , + + + , + , + ], + "style": Array [ + Object { + "alignItems": "center", + "flexDirection": "row", + "height": 28, + }, + undefined, + ], + }, + "ref": null, + "rendered": Array [ + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "style": Object { + "backgroundColor": "#aaa", + "flex": 1, + "height": 1, + "opacity": 0.2, + }, + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "children": , + "style": Object { + "marginHorizontal": 15, + }, + }, + "ref": null, + "rendered": Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "day": "2-digit", + "month": "short", + "style": Object { + "color": "#aaa", + "fontSize": 14, + "fontWeight": "600", + }, + "value": 1970-01-18T17:19:12.392Z, + "weekday": "short", + "year": "numeric", + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + "type": [Function], + }, + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "style": Object { + "backgroundColor": "#aaa", + "flex": 1, + "height": 1, + "opacity": 0.2, + }, + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + ], + "type": [Function], + }, + Symbol(enzyme.__nodes__): Array [ + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "children": Array [ + , + + + , + , + ], + "style": Array [ + Object { + "alignItems": "center", + "flexDirection": "row", + "height": 28, + }, + undefined, + ], + }, + "ref": null, + "rendered": Array [ + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "style": Object { + "backgroundColor": "#aaa", + "flex": 1, + "height": 1, + "opacity": 0.2, + }, + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "children": , + "style": Object { + "marginHorizontal": 15, + }, + }, + "ref": null, + "rendered": Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "day": "2-digit", + "month": "short", + "style": Object { + "color": "#aaa", + "fontSize": 14, + "fontWeight": "600", + }, + "value": 1970-01-18T17:19:12.392Z, + "weekday": "short", + "year": "numeric", + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + "type": [Function], + }, + Object { + "instance": null, + "key": undefined, + "nodeType": "class", + "props": Object { + "style": Object { + "backgroundColor": "#aaa", + "flex": 1, + "height": 1, + "opacity": 0.2, + }, + }, + "ref": null, + "rendered": null, + "type": [Function], + }, + ], + "type": [Function], + }, + ], + Symbol(enzyme.__options__): Object { + "adapter": ReactSixteenAdapter { + "options": Object { + "enableComponentDidUpdateOnSetState": true, + }, + }, + "context": Object { + "intl": Object { + "formatMessage": [MockFunction], + }, + }, + }, +} +`; diff --git a/app/components/post_list/date_header/date_header.js b/app/components/post_list/date_header/date_header.js index 9e5d2c47f..1911832b2 100644 --- a/app/components/post_list/date_header/date_header.js +++ b/app/components/post_list/date_header/date_header.js @@ -10,17 +10,27 @@ import { import FormattedDate from 'app/components/formatted_date'; import {makeStyleSheetFromTheme} from 'app/utils/theme'; +import {DATE_LINE, DATE_LINE_SUFFIX} from 'app/selectors/post_list'; +// DateHeader accepts as a timestamp encoded as a string for rendering as part of a post list. export default class DateHeader extends PureComponent { static propTypes = { - date: PropTypes.object.isRequired, + dateLineString: PropTypes.string.isRequired, theme: PropTypes.object.isRequired, style: ViewPropTypes.style, }; render() { - const {date, theme} = this.props; + const {theme, dateLineString} = this.props; const style = getStyleSheet(theme); + const indexSuffix = dateLineString.indexOf(DATE_LINE_SUFFIX); + + let date; + if (indexSuffix >= 0) { + date = new Date(parseInt(dateLineString.substring(DATE_LINE.length, indexSuffix), 10)); + } else { + date = new Date(parseInt(dateLineString.substring(DATE_LINE.length), 10)); + } return ( diff --git a/app/components/post_list/date_header/date_header.test.js b/app/components/post_list/date_header/date_header.test.js new file mode 100644 index 000000000..e7b9e2898 --- /dev/null +++ b/app/components/post_list/date_header/date_header.test.js @@ -0,0 +1,47 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +/* eslint-disable max-nested-callbacks */ + +import React from 'react'; +import {configure, shallow} from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; +configure({adapter: new Adapter()}); + +import DateHeader from './date_header.js'; + +describe('DateHeader', () => { + const baseProps = { + theme: {centerChannelBg: '#aaa', centerChannelColor: '#aaa'}, + }; + + describe('component should match snapshot', () => { + it('without suffix', () => { + const props = { + ...baseProps, + dateLineString: 'date-1531152392', + index: 0, + }; + const wrapper = shallow( + , + {context: {intl: {formatMessage: jest.fn()}}}, + ); + + expect(wrapper).toMatchSnapshot(); + }); + + it('with suffix', () => { + const props = { + ...baseProps, + dateLineString: 'date-1531152392-index-2', + index: 2, + }; + const wrapper = shallow( + , + {context: {intl: {formatMessage: jest.fn()}}}, + ); + + expect(wrapper).toMatchSnapshot(); + }); + }); +}); diff --git a/app/components/post_list/date_header/utils.js b/app/components/post_list/date_header/utils.js new file mode 100644 index 000000000..c08f750da --- /dev/null +++ b/app/components/post_list/date_header/utils.js @@ -0,0 +1,6 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {DATE_LINE} from 'app/selectors/post_list'; + +export const isDateLine = (dateString) => dateString.indexOf(DATE_LINE) === 0; diff --git a/app/components/post_list/date_header/utils.test.js b/app/components/post_list/date_header/utils.test.js new file mode 100644 index 000000000..c27de2ee7 --- /dev/null +++ b/app/components/post_list/date_header/utils.test.js @@ -0,0 +1,17 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import assert from 'assert'; + +import {isDateLine} from './utils.js'; + +describe('DateHeader', () => { + it('isDateLine', () => { + assert.equal(isDateLine(''), false); + assert.equal(isDateLine('date'), false); + assert.equal(isDateLine('date-'), true); + assert.equal(isDateLine('date-0'), true); + assert.equal(isDateLine('date-1531152392'), true); + assert.equal(isDateLine('date-1531152392-index'), true); + }); +}); diff --git a/app/components/post_list/post_list.js b/app/components/post_list/post_list.js index ac8be1af8..51b205317 100644 --- a/app/components/post_list/post_list.js +++ b/app/components/post_list/post_list.js @@ -13,12 +13,13 @@ import { import EventEmitter from 'mattermost-redux/utils/event_emitter'; import Post from 'app/components/post'; -import {DATE_LINE, START_OF_NEW_MESSAGES} from 'app/selectors/post_list'; +import {START_OF_NEW_MESSAGES} from 'app/selectors/post_list'; import mattermostManaged from 'app/mattermost_managed'; import {makeExtraData} from 'app/utils/list_view'; import {changeOpacity} from 'app/utils/theme'; import DateHeader from './date_header'; +import {isDateLine} from './date_header/utils'; import NewMessagesDivider from './new_messages_divider'; import withLayout from './with_layout'; @@ -264,9 +265,14 @@ export default class PostList extends PureComponent { moreMessages={this.moreNewMessages} /> ); - } else if (item.indexOf(DATE_LINE) === 0) { - const date = item.substring(DATE_LINE.length); - return this.renderDateHeader(new Date(date), index); + } else if (isDateLine(item)) { + this.itemMeasurements[index] = DATE_HEADER_HEIGHT; + return ( + + ); } const postId = item; @@ -279,16 +285,6 @@ export default class PostList extends PureComponent { return this.renderPost(postId, previousPostId, nextPostId, index); }; - renderDateHeader = (date, index) => { - this.itemMeasurements[index] = DATE_HEADER_HEIGHT; - return ( - - ); - }; - renderPost = (postId, previousPostId, nextPostId, index) => { const { highlightPostId, diff --git a/app/screens/flagged_posts/flagged_posts.js b/app/screens/flagged_posts/flagged_posts.js index 0b560a3b0..f329083a7 100644 --- a/app/screens/flagged_posts/flagged_posts.js +++ b/app/screens/flagged_posts/flagged_posts.js @@ -14,6 +14,7 @@ import { import ChannelLoader from 'app/components/channel_loader'; import DateHeader from 'app/components/post_list/date_header'; +import {isDateLine} from 'app/components/post_list/date_header/utils'; import FailedNetworkAction from 'app/components/failed_network_action'; import NoResults from 'app/components/no_results'; import PostSeparator from 'app/components/post_separator'; @@ -21,7 +22,6 @@ import StatusBar from 'app/components/status_bar'; import mattermostManaged from 'app/mattermost_managed'; import SearchResultPost from 'app/screens/search/search_result_post'; import ChannelDisplayName from 'app/screens/search/channel_display_name'; -import {DATE_LINE} from 'app/selectors/post_list'; import {changeOpacity} from 'app/utils/theme'; export default class FlaggedPosts extends PureComponent { @@ -150,13 +150,10 @@ export default class FlaggedPosts extends PureComponent { renderPost = ({item, index}) => { const {postIds, theme} = this.props; const {managedConfig} = this.state; - if (item.indexOf(DATE_LINE) === 0) { - const date = new Date(item.substring(DATE_LINE.length)); - + if (isDateLine(item)) { return ( ); @@ -164,7 +161,7 @@ export default class FlaggedPosts extends PureComponent { let separator; const nextPost = postIds[index + 1]; - if (nextPost && nextPost.indexOf(DATE_LINE) === -1) { + if (nextPost && !isDateLine(nextPost)) { separator = ; } diff --git a/app/screens/recent_mentions/recent_mentions.js b/app/screens/recent_mentions/recent_mentions.js index 541b9e452..ed6e3b0f7 100644 --- a/app/screens/recent_mentions/recent_mentions.js +++ b/app/screens/recent_mentions/recent_mentions.js @@ -14,6 +14,7 @@ import { import ChannelLoader from 'app/components/channel_loader'; import DateHeader from 'app/components/post_list/date_header'; +import {isDateLine} from 'app/components/post_list/date_header/utils'; import FailedNetworkAction from 'app/components/failed_network_action'; import NoResults from 'app/components/no_results'; import PostSeparator from 'app/components/post_separator'; @@ -21,7 +22,6 @@ import StatusBar from 'app/components/status_bar'; import mattermostManaged from 'app/mattermost_managed'; import SearchResultPost from 'app/screens/search/search_result_post'; import ChannelDisplayName from 'app/screens/search/channel_display_name'; -import {DATE_LINE} from 'app/selectors/post_list'; import {changeOpacity} from 'app/utils/theme'; export default class RecentMentions extends PureComponent { @@ -150,13 +150,10 @@ export default class RecentMentions extends PureComponent { renderPost = ({item, index}) => { const {postIds, theme} = this.props; const {managedConfig} = this.state; - if (item.indexOf(DATE_LINE) === 0) { - const date = new Date(item.substring(DATE_LINE.length)); - + if (isDateLine(item)) { return ( ); @@ -164,7 +161,7 @@ export default class RecentMentions extends PureComponent { let separator; const nextPost = postIds[index + 1]; - if (nextPost && nextPost.indexOf(DATE_LINE) === -1) { + if (nextPost && !isDateLine(nextPost)) { separator = ; } diff --git a/app/screens/search/search.js b/app/screens/search/search.js index cd16ad81d..7e17ba525 100644 --- a/app/screens/search/search.js +++ b/app/screens/search/search.js @@ -21,6 +21,7 @@ import {RequestStatus} from 'mattermost-redux/constants'; import Autocomplete from 'app/components/autocomplete'; import DateHeader from 'app/components/post_list/date_header'; +import {isDateLine} from 'app/components/post_list/date_header/utils'; import FormattedText from 'app/components/formatted_text'; import Loading from 'app/components/loading'; import PostListRetry from 'app/components/post_list_retry'; @@ -29,7 +30,6 @@ import SafeAreaView from 'app/components/safe_area_view'; import SearchBar from 'app/components/search_bar'; import StatusBar from 'app/components/status_bar'; import mattermostManaged from 'app/mattermost_managed'; -import {DATE_LINE} from 'app/selectors/post_list'; import {preventDoubleTap} from 'app/utils/tap'; import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme'; @@ -260,16 +260,6 @@ export default class Search extends PureComponent { actions.removeSearchTerms(currentTeamId, item.terms); }); - renderDateHeader = (date, index) => { - return ( - - ); - }; - renderModifiers = ({item}) => { const {theme} = this.props; const style = getStyleFromTheme(theme); @@ -317,14 +307,18 @@ export default class Search extends PureComponent { ); } - if (item.indexOf(DATE_LINE) === 0) { - const date = item.substring(DATE_LINE.length); - return this.renderDateHeader(new Date(date), index); + if (isDateLine(item)) { + return ( + + ); } let separator; const nextPost = postIds[index + 1]; - if (nextPost && nextPost.indexOf(DATE_LINE) === -1) { + if (nextPost && !isDateLine(nextPost)) { separator = ; } diff --git a/app/selectors/post_list.js b/app/selectors/post_list.js index b138aa6f8..ab738a329 100644 --- a/app/selectors/post_list.js +++ b/app/selectors/post_list.js @@ -9,6 +9,7 @@ import {createIdsSelector} from 'mattermost-redux/utils/helpers'; import {shouldFilterJoinLeavePost} from 'mattermost-redux/utils/post_utils'; export const DATE_LINE = 'date-'; +export const DATE_LINE_SUFFIX = '-index-'; export const START_OF_NEW_MESSAGES = 'start-of-new-messages'; function shouldShowJoinLeaveMessages(state) { @@ -56,7 +57,7 @@ export function makePreparePostIdsForPostList() { const postDate = new Date(post.create_at); if (!lastDate || lastDate.toDateString() !== postDate.toDateString()) { - out.push(DATE_LINE + postDate.toString()); + out.push(DATE_LINE + post.create_at); lastDate = postDate; } @@ -105,9 +106,14 @@ export function makePreparePostIdsForSearchPosts() { continue; } - const postDate = new Date(post.create_at); + // Render a date line for each post, even if displayed on the same date as the + // previous post. Since we don't deduplicate here like in other views, we need to + // ensure the resulting key is unique, even if the post timestamps (down to the + // second) are identical. The screens know to parse out the index before trying + // to consume the date value. + out.push(DATE_LINE + post.create_at + DATE_LINE_SUFFIX + i); - out.push(DATE_LINE + postDate.toString(), post.id); + out.push(post.id); } return out; diff --git a/app/selectors/post_list.test.js b/app/selectors/post_list.test.js index d72a1ab52..d69965e00 100644 --- a/app/selectors/post_list.test.js +++ b/app/selectors/post_list.test.js @@ -4,15 +4,15 @@ import assert from 'assert'; import { - DATE_LINE, makePreparePostIdsForPostList, + makePreparePostIdsForSearchPosts, START_OF_NEW_MESSAGES, } from 'app/selectors/post_list'; import {Posts, Preferences} from 'mattermost-redux/constants'; import {getPreferenceKey} from 'mattermost-redux/utils/preference_utils'; -/* eslint-disable max-nested-callbacks, no-console */ +/* eslint-disable max-nested-callbacks */ describe('Selectors.PostList', () => { describe('makePreparePostIdsForPostList', () => { @@ -44,7 +44,11 @@ describe('Selectors.PostList', () => { // Defaults to show post let now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages}); - assert.deepEqual(removeDateLines(now), ['1002', '1001']); + assert.deepEqual(now, [ + '1002', + '1001', + 'date-0', + ]); // Show join/leave posts state = { @@ -66,7 +70,11 @@ describe('Selectors.PostList', () => { }; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages}); - assert.deepEqual(removeDateLines(now), ['1002', '1001']); + assert.deepEqual(now, [ + '1002', + '1001', + 'date-0', + ]); // Hide join/leave posts state = { @@ -88,7 +96,10 @@ describe('Selectors.PostList', () => { }; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages}); - assert.deepEqual(removeDateLines(now), ['1001']); + assert.deepEqual(now, [ + '1001', + 'date-0', + ]); // always show join/leave posts for the current user state = { @@ -107,7 +118,11 @@ describe('Selectors.PostList', () => { now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages}); - assert.deepEqual(removeDateLines(now), ['1002', '1001']); + assert.deepEqual(now, [ + '1002', + '1001', + 'date-0', + ]); }); it('new messages indicator', () => { @@ -138,28 +153,66 @@ describe('Selectors.PostList', () => { // Do not show new messages indicator before all posts let now = preparePostIdsForPostList(state, {postIds, lastViewedAt: 0, indicateNewMessages: true}); - assert.deepEqual(removeDateLines(now), ['1010', '1005', '1000']); + assert.deepEqual(now, [ + '1010', + '1005', + '1000', + 'date-1000', + ]); now = preparePostIdsForPostList(state, {postIds, indicateNewMessages: true}); - assert.deepEqual(removeDateLines(now), ['1010', '1005', '1000']); + assert.deepEqual(now, [ + '1010', + '1005', + '1000', + 'date-1000', + ]); now = preparePostIdsForPostList(state, {postIds, lastViewedAt: 999, indicateNewMessages: false}); - assert.deepEqual(removeDateLines(now), ['1010', '1005', '1000']); + assert.deepEqual(now, [ + '1010', + '1005', + '1000', + 'date-1000', + ]); // Show new messages indicator before all posts now = preparePostIdsForPostList(state, {postIds, lastViewedAt: 999, indicateNewMessages: true}); - assert.deepEqual(removeDateLines(now), ['1010', '1005', '1000', START_OF_NEW_MESSAGES]); + assert.deepEqual(now, [ + '1010', + '1005', + '1000', + START_OF_NEW_MESSAGES, + 'date-1000', + ]); // Show indicator between posts now = preparePostIdsForPostList(state, {postIds, lastViewedAt: 1003, indicateNewMessages: true}); - assert.deepEqual(removeDateLines(now), ['1010', '1005', START_OF_NEW_MESSAGES, '1000']); + assert.deepEqual(now, [ + '1010', + '1005', + START_OF_NEW_MESSAGES, + '1000', + 'date-1000', + ]); now = preparePostIdsForPostList(state, {postIds, lastViewedAt: 1006, indicateNewMessages: true}); - assert.deepEqual(removeDateLines(now), ['1010', START_OF_NEW_MESSAGES, '1005', '1000']); + assert.deepEqual(now, [ + '1010', + START_OF_NEW_MESSAGES, + '1005', + '1000', + 'date-1000', + ]); // Don't show indicator when all posts are read now = preparePostIdsForPostList(state, {postIds, lastViewedAt: 1020}); - assert.deepEqual(removeDateLines(now), ['1010', '1005', '1000']); + assert.deepEqual(now, [ + '1010', + '1005', + '1000', + 'date-1000', + ]); }); it('memoization', () => { @@ -197,17 +250,38 @@ describe('Selectors.PostList', () => { }, }; - let postIds = ['1006', '1004', '1003', '1001']; + let postIds = [ + '1006', + '1004', + '1003', + '1001', + ]; let lastViewedAt = initialPosts['1001'].create_at + 1; let now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true}); - assert.deepEqual(removeDateLines(now), ['1006', '1004', '1003', START_OF_NEW_MESSAGES, '1001']); + assert.deepEqual(now, [ + '1006', + '1004', + 'date-90000000', + '1003', + START_OF_NEW_MESSAGES, + '1001', + 'date-3600000', + ]); // No changes let prev = now; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true}); assert.equal(now, prev); - assert.deepEqual(removeDateLines(now), ['1006', '1004', '1003', START_OF_NEW_MESSAGES, '1001']); + assert.deepEqual(now, [ + '1006', + '1004', + 'date-90000000', + '1003', + START_OF_NEW_MESSAGES, + '1001', + 'date-3600000', + ]); // lastViewedAt changed slightly lastViewedAt = initialPosts['1001'].create_at + 2; @@ -215,7 +289,15 @@ describe('Selectors.PostList', () => { prev = now; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true}); assert.equal(now, prev); - assert.deepEqual(removeDateLines(now), ['1006', '1004', '1003', START_OF_NEW_MESSAGES, '1001']); + assert.deepEqual(now, [ + '1006', + '1004', + 'date-90000000', + '1003', + START_OF_NEW_MESSAGES, + '1001', + 'date-3600000', + ]); // lastViewedAt changed a lot lastViewedAt += initialPosts['1003'].create_at + 1; @@ -223,12 +305,28 @@ describe('Selectors.PostList', () => { prev = now; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true}); assert.notEqual(now, prev); - assert.deepEqual(removeDateLines(now), ['1006', '1004', START_OF_NEW_MESSAGES, '1003', '1001']); + assert.deepEqual(now, [ + '1006', + '1004', + START_OF_NEW_MESSAGES, + 'date-90000000', + '1003', + '1001', + 'date-3600000', + ]); prev = now; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true}); assert.equal(now, prev); - assert.deepEqual(removeDateLines(now), ['1006', '1004', START_OF_NEW_MESSAGES, '1003', '1001']); + assert.deepEqual(now, [ + '1006', + '1004', + START_OF_NEW_MESSAGES, + 'date-90000000', + '1003', + '1001', + 'date-3600000', + ]); // postIds changed, but still shallowly equal postIds = [...postIds]; @@ -236,7 +334,15 @@ describe('Selectors.PostList', () => { prev = now; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true}); assert.equal(now, prev); - assert.deepEqual(removeDateLines(now), ['1006', '1004', START_OF_NEW_MESSAGES, '1003', '1001']); + assert.deepEqual(now, [ + '1006', + '1004', + START_OF_NEW_MESSAGES, + 'date-90000000', + '1003', + '1001', + 'date-3600000', + ]); // Post changed, not in postIds state = { @@ -256,7 +362,15 @@ describe('Selectors.PostList', () => { prev = now; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true}); assert.equal(now, prev); - assert.deepEqual(removeDateLines(now), ['1006', '1004', START_OF_NEW_MESSAGES, '1003', '1001']); + assert.deepEqual(now, [ + '1006', + '1004', + START_OF_NEW_MESSAGES, + 'date-90000000', + '1003', + '1001', + 'date-3600000', + ]); // Post changed, in postIds state = { @@ -276,7 +390,15 @@ describe('Selectors.PostList', () => { prev = now; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true}); assert.equal(now, prev); - assert.deepEqual(removeDateLines(now), ['1006', '1004', START_OF_NEW_MESSAGES, '1003', '1001']); + assert.deepEqual(now, [ + '1006', + '1004', + START_OF_NEW_MESSAGES, + 'date-90000000', + '1003', + '1001', + 'date-3600000', + ]); // Filter changed state = { @@ -300,17 +422,110 @@ describe('Selectors.PostList', () => { prev = now; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true}); assert.notEqual(now, prev); - assert.deepEqual(removeDateLines(now), ['1004', START_OF_NEW_MESSAGES, '1003', '1001']); + assert.deepEqual(now, [ + '1004', + START_OF_NEW_MESSAGES, + 'date-90000000', + '1003', + '1001', + 'date-3600000', + ]); prev = now; now = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: true}); assert.equal(now, prev); - assert.deepEqual(removeDateLines(now), ['1004', START_OF_NEW_MESSAGES, '1003', '1001']); + assert.deepEqual(now, [ + '1004', + START_OF_NEW_MESSAGES, + 'date-90000000', + '1003', + '1001', + 'date-3600000', + ]); + }); + }); + + describe('makePreparePostIdsForSearchPosts', () => { + it('should return an empty array if there are no posts specified', () => { + const preparePostIdsForSearchPosts = makePreparePostIdsForSearchPosts(); + + const state = { + entities: { + posts: { + posts: { + 1001: {id: '1001', create_at: 0, type: ''}, + 1002: {id: '1002', create_at: 1, type: ''}, + }, + }, + users: { + currentUserId: '1234', + profiles: { + 1234: {id: '1234', username: 'user'}, + }, + }, + }, + }; + + const postIds = []; + const actual = preparePostIdsForSearchPosts(state, postIds); + assert.deepEqual(actual, []); + }); + + it('should return an empty array if there are no matching posts', () => { + const preparePostIdsForSearchPosts = makePreparePostIdsForSearchPosts(); + + const state = { + entities: { + posts: { + posts: {}, + }, + users: { + currentUserId: '1234', + profiles: { + 1234: {id: '1234', username: 'user'}, + }, + }, + }, + }; + + const postIds = ['1002', '1001']; + const actual = preparePostIdsForSearchPosts(state, postIds); + assert.deepEqual(actual, []); + }); + + it('should return results when there are posts', () => { + const preparePostIdsForSearchPosts = makePreparePostIdsForSearchPosts(); + + const state = { + entities: { + posts: { + posts: { + 1001: {id: '1001', create_at: 0, type: ''}, + 1002: {id: '1002', create_at: 1000, type: ''}, + + // Same timestamp as 1002 + 1003: {id: '1003', create_at: 1000, type: ''}, + }, + }, + users: { + currentUserId: '1234', + profiles: { + 1234: {id: '1234', username: 'user'}, + }, + }, + }, + }; + + const postIds = ['1003', '1002', '1001']; + const actual = preparePostIdsForSearchPosts(state, postIds); + assert.deepEqual(actual, [ + 'date-1000-index-0', + '1003', + 'date-1000-index-1', + '1002', + 'date-0-index-2', + '1001', + ]); }); }); }); - -// Remove date lines when checking equality since those depend on time-zone of the computer running the tests -function removeDateLines(list) { - return list.filter((item) => !item.startsWith(DATE_LINE)); -} From bcf291aa46423a96796d8b7c9ccbb1863b1632d4 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Mon, 9 Jul 2018 18:57:01 -0400 Subject: [PATCH 10/11] Bump iOS build number to 125 (#1906) --- ios/Mattermost.xcodeproj/project.pbxproj | 4 ++-- ios/Mattermost/Info.plist | 2 +- ios/MattermostShare/Info.plist | 2 +- ios/MattermostTests/Info.plist | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ios/Mattermost.xcodeproj/project.pbxproj b/ios/Mattermost.xcodeproj/project.pbxproj index 5a0d11f62..34e7b0bed 100644 --- a/ios/Mattermost.xcodeproj/project.pbxproj +++ b/ios/Mattermost.xcodeproj/project.pbxproj @@ -2531,7 +2531,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 124; + CURRENT_PROJECT_VERSION = 125; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; @@ -2581,7 +2581,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 124; + CURRENT_PROJECT_VERSION = 125; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; diff --git a/ios/Mattermost/Info.plist b/ios/Mattermost/Info.plist index 2c67bea98..3c5bdc90e 100644 --- a/ios/Mattermost/Info.plist +++ b/ios/Mattermost/Info.plist @@ -34,7 +34,7 @@ CFBundleVersion - 124 + 125 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/ios/MattermostShare/Info.plist b/ios/MattermostShare/Info.plist index 603fa9770..e46052cbc 100644 --- a/ios/MattermostShare/Info.plist +++ b/ios/MattermostShare/Info.plist @@ -23,7 +23,7 @@ CFBundleShortVersionString 1.10.0 CFBundleVersion - 124 + 125 NSAppTransportSecurity NSAllowsArbitraryLoads diff --git a/ios/MattermostTests/Info.plist b/ios/MattermostTests/Info.plist index e61244574..c0dfcea9b 100644 --- a/ios/MattermostTests/Info.plist +++ b/ios/MattermostTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 124 + 125 From 8bee2b436c3e5005a3ace56b8986a60da16bc920 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Mon, 9 Jul 2018 19:06:51 -0400 Subject: [PATCH 11/11] Bump Android build number to 125 (#1907) --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index f0bd90b32..db71396c3 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -113,7 +113,7 @@ android { applicationId "com.mattermost.rnbeta" minSdkVersion 21 targetSdkVersion 23 - versionCode 124 + versionCode 125 versionName "1.10.0" ndk { abiFilters "armeabi-v7a", "x86"