diff options
Diffstat (limited to 'web')
-rw-r--r-- | web/react/components/admin_console/license_settings.jsx | 7 | ||||
-rw-r--r-- | web/react/components/channel_members_modal.jsx | 8 | ||||
-rw-r--r-- | web/react/components/create_post.jsx | 10 | ||||
-rw-r--r-- | web/react/components/file_attachment.jsx | 112 | ||||
-rw-r--r-- | web/react/components/file_upload.jsx | 10 | ||||
-rw-r--r-- | web/react/components/get_link_modal.jsx | 23 | ||||
-rw-r--r-- | web/react/components/get_team_invite_link_modal.jsx | 4 | ||||
-rw-r--r-- | web/react/components/invite_member_modal.jsx | 4 | ||||
-rw-r--r-- | web/react/components/navbar_dropdown.jsx | 2 | ||||
-rw-r--r-- | web/react/components/suggestion/search_suggestion_list.jsx | 2 | ||||
-rw-r--r-- | web/react/components/textbox.jsx | 51 | ||||
-rw-r--r-- | web/react/components/user_list_row.jsx | 4 | ||||
-rw-r--r-- | web/react/components/user_settings/user_settings_modal.jsx | 2 | ||||
-rw-r--r-- | web/react/utils/text_formatting.jsx | 13 | ||||
-rw-r--r-- | web/sass-files/sass/partials/_post.scss | 24 | ||||
-rw-r--r-- | web/static/i18n/en.json | 18 | ||||
-rw-r--r-- | web/static/i18n/es.json | 31 | ||||
-rw-r--r-- | web/static/i18n/pt.json | 71 |
18 files changed, 181 insertions, 215 deletions
diff --git a/web/react/components/admin_console/license_settings.jsx b/web/react/components/admin_console/license_settings.jsx index fdbe912ef..d4dfa13f2 100644 --- a/web/react/components/admin_console/license_settings.jsx +++ b/web/react/components/admin_console/license_settings.jsx @@ -120,8 +120,7 @@ class LicenseSettings extends React.Component { expires: Utils.displayDate(parseInt(global.window.mm_license.ExpiresAt, 10)), ldap: global.window.mm_license.LDAP }} - defaultMessage='<div><p>This compiled release of Mattermost platform is provided under a <a href="http://mattermost.com" target="_blank">commercial license</a> - from Mattermost, Inc. based on your subscription level and is subject to the <a href="{terms}" target="_blank">Terms of Service.</a></p> + defaultMessage='<div><p>This compiled release of Mattermost platform is provided under a <a href="http://mattermost.com" target="_blank">commercial license</a> from Mattermost, Inc. based on your subscription level and is subject to the <a href="{terms}" target="_blank">Terms of Service.</a></p> <p>Your subscription details are as follows:</p> Name: {name}<br /> Company or organization name: {company}<br/> @@ -152,9 +151,7 @@ class LicenseSettings extends React.Component { <p className='help-text'> <FormattedHTMLMessage id='admin.licence.keyMigration' - defaultMessage='If you’re migrating servers you may need to remove your license key from this server in order to install it on a new server. To start, - <a href="http://mattermost.com" target="_blank">disable all Enterprise Edition features on this server</a>. - This will enable the ability to remove the license key and downgrade this server from Enterprise Edition to Team Edition.' + defaultMessage='If you’re migrating servers you may need to remove your license key from this server in order to install it on a new server. To start, <a href="http://mattermost.com" target="_blank">disable all Enterprise Edition features on this server</a>. This will enable the ability to remove the license key and downgrade this server from Enterprise Edition to Team Edition.' /> </p> </div> diff --git a/web/react/components/channel_members_modal.jsx b/web/react/components/channel_members_modal.jsx index 688ab7dd2..3ec93a616 100644 --- a/web/react/components/channel_members_modal.jsx +++ b/web/react/components/channel_members_modal.jsx @@ -44,6 +44,7 @@ export default class ChannelMembersModal extends React.Component { } getStateFromStores() { const extraInfo = ChannelStore.getCurrentExtraInfo(); + const profiles = UserStore.getActiveOnlyProfiles(); if (extraInfo.member_count !== extraInfo.members.length) { AsyncClient.getChannelExtraInfo(this.props.channel.id, -1); @@ -53,9 +54,8 @@ export default class ChannelMembersModal extends React.Component { }; } - // clone the member list since we mutate it later on const memberList = extraInfo.members.map((member) => { - return Object.assign({}, member); + return profiles[member.id]; }); function compareByUsername(a, b) { @@ -130,8 +130,8 @@ export default class ChannelMembersModal extends React.Component { onClick={this.handleRemove.bind(this, user)} > <FormattedMessage - id='channel_members_modal.removeMember' - defaultMessage='Remove Member' + id='channel_members_modal.remove' + defaultMessage='Remove' /> </button> ); diff --git a/web/react/components/create_post.jsx b/web/react/components/create_post.jsx index 9d7a19554..62319b1a7 100644 --- a/web/react/components/create_post.jsx +++ b/web/react/components/create_post.jsx @@ -130,7 +130,7 @@ class CreatePost extends React.Component { post.message, false, (data) => { - PostStore.storeDraft(data.channel_id, null); + PostStore.storeDraft(this.state.channelId, null); this.setState({messageText: '', submitting: false, postError: null, previews: [], serverError: null}); if (data.goto_location && data.goto_location.length > 0) { @@ -262,9 +262,7 @@ class CreatePost extends React.Component { message = err.message; } - if (clientId === -1) { - this.setState({serverError: message}); - } else { + if (clientId !== -1) { const draft = PostStore.getDraft(this.state.channelId); const index = draft.uploadsInProgress.indexOf(clientId); @@ -274,8 +272,10 @@ class CreatePost extends React.Component { PostStore.storeDraft(this.state.channelId, draft); - this.setState({uploadsInProgress: draft.uploadsInProgress, serverError: message}); + this.setState({uploadsInProgress: draft.uploadsInProgress}); } + + this.setState({serverError: message}); } removePreview(id) { const previews = Object.assign([], this.state.previews); diff --git a/web/react/components/file_attachment.jsx b/web/react/components/file_attachment.jsx index 810f90b13..6aeae638f 100644 --- a/web/react/components/file_attachment.jsx +++ b/web/react/components/file_attachment.jsx @@ -19,12 +19,10 @@ class FileAttachment extends React.Component { super(props); this.loadFiles = this.loadFiles.bind(this); - this.playGif = this.playGif.bind(this); - this.stopGif = this.stopGif.bind(this); this.addBackgroundImage = this.addBackgroundImage.bind(this); this.canSetState = false; - this.state = {fileSize: -1, mime: '', playing: false, loading: false, format: ''}; + this.state = {fileSize: -1}; } componentDidMount() { this.loadFiles(); @@ -95,42 +93,6 @@ class FileAttachment extends React.Component { return true; } - playGif(e, filename) { - var img = new Image(); - var fileUrl = utils.getFileUrl(filename); - - this.setState({loading: true}); - img.load(fileUrl); - img.onload = () => { - var state = {playing: true, loading: false}; - - switch (true) { - case img.width > img.height: - state.format = 'landscape'; - break; - case img.height > img.width: - state.format = 'portrait'; - break; - default: - state.format = 'quadrat'; - break; - } - - this.setState(state); - - // keep displaying background image for a short moment while browser is - // loading gif, to prevent white background flashing through - setTimeout(() => this.removeBackgroundImage.bind(this)(filename), 100); - }; - img.onError = () => this.setState({loading: false}); - - e.stopPropagation(); - } - stopGif(e, filename) { - this.setState({playing: false}); - this.addBackgroundImage(filename); - e.stopPropagation(); - } getFileInfoFromName(name) { var fileInfo = utils.splitFileLocation(name); @@ -164,74 +126,18 @@ class FileAttachment extends React.Component { var filename = this.props.filename; var fileInfo = utils.splitFileLocation(filename); - var fileUrl = utils.getFileUrl(filename); + var fileUrl = utils.getFileUrl(filename, true); var type = utils.getFileType(fileInfo.ext); - var playbackControls = ''; - var loadedFile = ''; - var loadingIndicator = ''; - if (this.state.mime === 'image/gif') { - playbackControls = ( - <div - className='file-playback-controls play' - onClick={(e) => this.playGif(e, filename)} - > - {"►"} - </div> - ); - } - if (this.state.playing) { - loadedFile = ( - <img - className={'file__loaded ' + this.state.format} - src={fileUrl} - /> - ); - playbackControls = ( + var thumbnail; + if (type === 'image') { + thumbnail = ( <div - className='file-playback-controls stop' - onClick={(e) => this.stopGif(e, filename)} - > - {"■"} - </div> - ); - } - if (this.state.loading) { - loadingIndicator = ( - <img - className='spinner file__loading' - src='/static/images/load.gif' + ref={filename} + className='post__load' + style={{backgroundImage: 'url(/static/images/load.gif)'}} /> ); - playbackControls = ''; - } - - var thumbnail; - if (type === 'image') { - if (this.state.playing) { - thumbnail = ( - <div - ref={filename} - className='post__load' - style={{backgroundImage: 'url(/static/images/load.gif)'}} - > - {playbackControls} - {loadedFile} - </div> - ); - } else { - thumbnail = ( - <div - ref={filename} - className='post__load' - style={{backgroundImage: 'url(/static/images/load.gif)'}} - > - {loadingIndicator} - {playbackControls} - {loadedFile} - </div> - ); - } } else { thumbnail = <div className={'file-icon ' + utils.getIconClassName(type)}/>; } @@ -242,7 +148,7 @@ class FileAttachment extends React.Component { filename, function success(data) { if (this.canSetState) { - this.setState({fileSize: parseInt(data.size, 10), mime: data.mime}); + this.setState({fileSize: parseInt(data.size, 10)}); } }.bind(this), function error() { diff --git a/web/react/components/file_upload.jsx b/web/react/components/file_upload.jsx index cb8ede51b..f8965e13e 100644 --- a/web/react/components/file_upload.jsx +++ b/web/react/components/file_upload.jsx @@ -108,12 +108,12 @@ class FileUpload extends React.Component { } } - handleChange() { - var element = $(ReactDOM.findDOMNode(this.refs.fileInput)); + handleChange(e) { + if (e.target.files.length > 0) { + this.uploadFiles(e.target.files); - this.uploadFiles(element.prop('files')); - - Utils.clearFileInput(element[0]); + Utils.clearFileInput(e.target); + } } handleDrop(e) { diff --git a/web/react/components/get_link_modal.jsx b/web/react/components/get_link_modal.jsx index 6a5c3b588..3309d690c 100644 --- a/web/react/components/get_link_modal.jsx +++ b/web/react/components/get_link_modal.jsx @@ -41,8 +41,6 @@ export default class GetLinkModal extends React.Component { } render() { - const userCreationEnabled = global.window.mm_config.EnableUserCreation === 'true'; - let helpText = null; if (this.props.helpText) { helpText = ( @@ -55,7 +53,7 @@ export default class GetLinkModal extends React.Component { } let copyLink = null; - if (userCreationEnabled && document.queryCommandSupported('copy')) { + if (document.queryCommandSupported('copy')) { copyLink = ( <button data-copy-btn='true' @@ -71,17 +69,14 @@ export default class GetLinkModal extends React.Component { ); } - let linkText = null; - if (userCreationEnabled) { - linkText = ( - <textarea - className='form-control no-resize min-height' - readOnly='true' - ref='textarea' - value={this.props.link} - /> - ); - } + const linkText = ( + <textarea + className='form-control no-resize min-height' + readOnly='true' + ref='textarea' + value={this.props.link} + /> + ); var copyLinkConfirm = null; if (this.state.copiedLink) { diff --git a/web/react/components/get_team_invite_link_modal.jsx b/web/react/components/get_team_invite_link_modal.jsx index 299729250..ba6164dbf 100644 --- a/web/react/components/get_team_invite_link_modal.jsx +++ b/web/react/components/get_team_invite_link_modal.jsx @@ -15,7 +15,7 @@ const holders = defineMessages({ }, help: { id: 'get_team_invite_link_modal.help', - defaultMessage: 'Send teammates the link below for them to sign-up to this team site.' + defaultMessage: 'Send teammates the link below for them to sign-up to this team site. The Team Invite Link can be shared with multiple teammates as it does not change unless it\'s regenerated in Team Settings by a Team Admin.' }, helpDisabled: { id: 'get_team_invite_link_modal.helpDisabled', @@ -73,4 +73,4 @@ GetTeamInviteLinkModal.propTypes = { intl: intlShape.isRequired }; -export default injectIntl(GetTeamInviteLinkModal);
\ No newline at end of file +export default injectIntl(GetTeamInviteLinkModal); diff --git a/web/react/components/invite_member_modal.jsx b/web/react/components/invite_member_modal.jsx index 0c0330c40..184ba1357 100644 --- a/web/react/components/invite_member_modal.jsx +++ b/web/react/components/invite_member_modal.jsx @@ -495,7 +495,7 @@ class InviteMemberModal extends React.Component { <ConfirmModal title={formatMessage(holders.modalTitle)} message={formatMessage(holders.modalMessage)} - confirm_button={formatMessage(holders.modalButton)} + confirmButton={formatMessage(holders.modalButton)} show={this.state.showConfirmModal} onConfirm={this.handleHide.bind(this, false)} onCancel={() => this.setState({showConfirmModal: false})} @@ -512,4 +512,4 @@ InviteMemberModal.propTypes = { intl: intlShape.isRequired }; -export default injectIntl(InviteMemberModal);
\ No newline at end of file +export default injectIntl(InviteMemberModal); diff --git a/web/react/components/navbar_dropdown.jsx b/web/react/components/navbar_dropdown.jsx index e9df03c33..0ddd6ff4f 100644 --- a/web/react/components/navbar_dropdown.jsx +++ b/web/react/components/navbar_dropdown.jsx @@ -107,7 +107,7 @@ export default class NavbarDropdown extends React.Component { </li> ); - if (this.props.teamType === Constants.OPEN_TEAM) { + if (this.props.teamType === Constants.OPEN_TEAM && global.window.mm_config.EnableUserCreation === 'true') { teamLink = ( <li> <a diff --git a/web/react/components/suggestion/search_suggestion_list.jsx b/web/react/components/suggestion/search_suggestion_list.jsx index 40f5d8777..60a5562fa 100644 --- a/web/react/components/suggestion/search_suggestion_list.jsx +++ b/web/react/components/suggestion/search_suggestion_list.jsx @@ -30,7 +30,7 @@ export default class SearchSuggestionList extends SuggestionList { text = ( <FormattedMessage id='suggestion.search.private' - defaultMessage='Public Groups' + defaultMessage='Private Groups' /> ); } diff --git a/web/react/components/textbox.jsx b/web/react/components/textbox.jsx index 23ecfb57b..c119abcbc 100644 --- a/web/react/components/textbox.jsx +++ b/web/react/components/textbox.jsx @@ -129,12 +129,12 @@ export default class Textbox extends React.Component { } render() { + const hasText = this.props.messageText.length > 0; + let previewLink = null; if (Utils.isFeatureEnabled(PreReleaseFeatures.MARKDOWN_PREVIEW)) { - const previewLinkVisible = this.props.messageText.length > 0; previewLink = ( <a - style={{visibility: previewLinkVisible ? 'visible' : 'hidden'}} onClick={this.showPreview} className='textbox-preview-link' > @@ -153,6 +153,51 @@ export default class Textbox extends React.Component { ); } + let helpText = ( + <div + style={{visibility: hasText ? 'visible' : 'hidden', opacity: hasText ? '1' : '0'}} + className='help_format_text' + > + <b> + <FormattedMessage + id='textbox.bold' + defaultMessage='**bold**' + /> + </b> + <i> + <FormattedMessage + id='textbox.italic' + defaultMessage='_italic_' + /> + </i> + <span>~~<strike> + <FormattedMessage + id='textbox.strike' + defaultMessage='strike' + /> + </strike>~~ </span> + <code> + <FormattedMessage + id='textbox.inlinecode' + defaultMessage='`inline code`' + /> + </code> + <code> + <FormattedMessage + id='textbox.preformatted' + defaultMessage='```preformatted```' + /> + </code> + <span> + <FormattedMessage + id='textbox.quote' + defaultMessage='>quote' + /> + </span> + {previewLink} + </div> + ); + return ( <div ref='wrapper' @@ -184,7 +229,7 @@ export default class Textbox extends React.Component { dangerouslySetInnerHTML={{__html: this.state.preview ? TextFormatting.formatText(this.props.messageText) : ''}} > </div> - {previewLink} + {helpText} <a target='_blank' href='http://docs.mattermost.com/help/getting-started/messaging-basics.html' diff --git a/web/react/components/user_list_row.jsx b/web/react/components/user_list_row.jsx index 68b723f35..d8442e770 100644 --- a/web/react/components/user_list_row.jsx +++ b/web/react/components/user_list_row.jsx @@ -10,9 +10,9 @@ export default function UserListRow({user, actions}) { let name = user.username; if (user.nickname && nameFormat === Constants.Preferences.DISPLAY_PREFER_NICKNAME) { - name = `${user.nickname} (${user.username})`; + name = `${user.nickname} (@${user.username})`; } else if ((user.first_name || user.last_name) && (nameFormat === Constants.Preferences.DISPLAY_PREFER_NICKNAME || nameFormat === Constants.Preferences.DISPLAY_PREFER_FULL_NAME)) { - name = `${Utils.getFullName(user)} (${user.username})`; + name = `${Utils.getFullName(user)} (@${user.username})`; } const buttons = actions.map((Action, index) => { diff --git a/web/react/components/user_settings/user_settings_modal.jsx b/web/react/components/user_settings/user_settings_modal.jsx index 80d03d88e..fa3415988 100644 --- a/web/react/components/user_settings/user_settings_modal.jsx +++ b/web/react/components/user_settings/user_settings_modal.jsx @@ -309,7 +309,7 @@ class UserSettingsModal extends React.Component { <ConfirmModal title={formatMessage(holders.confirmTitle)} message={formatMessage(holders.confirmMsg)} - confirm_button={formatMessage(holders.confirmBtns)} + confirmButton={formatMessage(holders.confirmBtns)} show={this.state.showConfirmModal} onConfirm={this.handleConfirm} onCancel={this.handleCancelConfirmation} diff --git a/web/react/utils/text_formatting.jsx b/web/react/utils/text_formatting.jsx index dae2252a6..a930e9ece 100644 --- a/web/react/utils/text_formatting.jsx +++ b/web/react/utils/text_formatting.jsx @@ -123,14 +123,13 @@ function autolinkAtMentions(text, tokens) { return (Constants.SPECIAL_MENTIONS.indexOf(u) !== -1 || UserStore.getProfileByUsername(u)); } - function addToken(username, mention, extraText) { + function addToken(username, mention) { const index = tokens.size; const alias = `MM_ATMENTION${index}`; tokens.set(alias, { value: `<a class='mention-link' href='#' data-mention='${username}'>${mention}</a>`, - originalText: mention, - extraText + originalText: mention }); return alias; } @@ -152,9 +151,9 @@ function autolinkAtMentions(text, tokens) { usernameLower = usernameLower.substring(0, c - 1); if (mentionExists(usernameLower)) { - const extraText = originalUsername.substr(c - 1); - const alias = addToken(usernameLower, '@' + usernameLower, extraText); - return alias; + const suffix = originalUsername.substr(c - 1); + const alias = addToken(usernameLower, '@' + usernameLower); + return alias + suffix; } } else { // If the last character is not punctuation, no point in going any further @@ -188,7 +187,7 @@ function highlightCurrentMentions(text, tokens) { const newAlias = `MM_SELFMENTION${index}`; newTokens.set(newAlias, { - value: `<span class='mention-highlight'>${alias}</span>` + (token.extraText || ''), + value: `<span class='mention-highlight'>${alias}</span>`, originalText: token.originalText }); output = output.replace(alias, newAlias); diff --git a/web/sass-files/sass/partials/_post.scss b/web/sass-files/sass/partials/_post.scss index 4478b3f15..a667a851c 100644 --- a/web/sass-files/sass/partials/_post.scss +++ b/web/sass-files/sass/partials/_post.scss @@ -58,22 +58,38 @@ body.ios { box-shadow: none; white-space: normal; } - .textbox-preview-link, .textbox-help-link { + .textbox-help-link { position: absolute; z-index: 3; bottom: -23px; font-size: 13px; cursor: pointer; } - .textbox-preview-link { - right: 45px; - } .textbox-help-link { right: 0; } min-height:36px; } +.help_format_text { + position: absolute; + z-index: 3; + bottom: -23px; + font-size: 0.7em; + right: 45px; + color: #999; + transition: visibility 0s, opacity 0.5s linear; + + b, i, code { + margin-right: 3px; + } + .textbox-preview-link{ + font-size: 13px; + cursor: pointer; + margin-left: 15px; + } +} + .date-separator, .new-separator { text-align: center; height: 2em; diff --git a/web/static/i18n/en.json b/web/static/i18n/en.json index 7c6a71259..6915f7d26 100644 --- a/web/static/i18n/en.json +++ b/web/static/i18n/en.json @@ -190,10 +190,10 @@ "admin.ldap.uernameAttrDesc": "The attribute in the LDAP server that will be used to populate the username field in Mattermost. This may be the same as the ID Attribute.", "admin.ldap.usernameAttrEx": "Ex \"sAMAccountName\"", "admin.ldap.usernameAttrTitle": "Username Attribute:", - "admin.licence.keyMigration": "If you’re migrating servers you may need to remove your license key from this server in order to install it on a new server. To start,<a href=\"http://mattermost.com\" target=\"_blank\">disable all Enterprise Edition features on this server</a>.This will enable the ability to remove the license key and downgrade this server from Enterprise Edition to Team Edition.", + "admin.licence.keyMigration": "If you’re migrating servers you may need to remove your license key from this server in order to install it on a new server. To start, <a href=\"http://mattermost.com\" target=\"_blank\">disable all Enterprise Edition features on this server</a>. This will enable the ability to remove the license key and downgrade this server from Enterprise Edition to Team Edition.", "admin.license.edition": "Edition: ", "admin.license.enterpriseEdition": "Mattermost Enterprise Edition. Designed for enterprise-scale communication.", - "admin.license.enterpriseType": "<div><p>This compiled release of Mattermost platform is provided under a <a href=\"http://mattermost.com\" target=\"_blank\">commercial license</a>from Mattermost, Inc. based on your subscription level and is subject to the <a href=\"{terms}\" target=\"_blank\">Terms of Service.</a></p><p>Your subscription details are as follows:</p>Name: {name}<br />Company or organization name: {company}<br/>Number of users: {users}<br/>License issued: {issued}<br/>Start date of license: {start}<br/>Expiry date of license: {expires}<br/>LDAP: {ldap}<br/></div>", + "admin.license.enterpriseType": "<div><p>This compiled release of Mattermost platform is provided under a <a href=\"http://mattermost.com\" target=\"_blank\">commercial license</a> from Mattermost, Inc. based on your subscription level and is subject to the <a href=\"{terms}\" target=\"_blank\">Terms of Service.</a></p><p>Your subscription details are as follows:</p>Name: {name}<br />Company or organization name: {company}<br/>Number of users: {users}<br/>License issued: {issued}<br/>Start date of license: {start}<br/>Expiry date of license: {expires}<br/>LDAP: {ldap}<br/></div>", "admin.license.key": "License Key: ", "admin.license.keyRemove": "Remove Enterprise License and Downgrade Server", "admin.license.removing": "Removing License...", @@ -277,8 +277,8 @@ "admin.service.attemptTitle": "Maximum Login Attempts:", "admin.service.cmdsDesc": "When true, user created slash commands will be allowed.", "admin.service.cmdsTitle": "Enable Slash Commands: ", - "admin.service.corsEx": "http://example.com https://example.com", "admin.service.corsDescription": "Enable HTTP Cross origin request from specific domains (separate by a spacebar). Use \"*\" if you want to allow CORS from any domain or leave it blank to disable it.", + "admin.service.corsEx": "http://example.com https://example.com", "admin.service.corsTitle": "Allow Cross-origin Requests from:", "admin.service.developerDesc": "(Developer Option) When true, extra information around errors will be displayed in the UI.", "admin.service.developerTitle": "Enable Developer Mode: ", @@ -561,7 +561,7 @@ "channel_loader.wrote": " wrote: ", "channel_members_modal.addNew": " Add New Members", "channel_members_modal.close": "Close", - "channel_members_modal.removeMember": "Remove Member", + "channel_members_modal.remove": "Remove", "channel_memebers_modal.members": " Members", "channel_modal.cancel": "Cancel", "channel_modal.channel": "Channel", @@ -702,7 +702,7 @@ "get_link.copy": "Copy Link", "get_post_link_modal.help": "The link below allows authorized users to see your post.", "get_post_link_modal.title": "Copy Permalink", - "get_team_invite_link_modal.help": "Send teammates the link below for them to sign-up to this team site.", + "get_team_invite_link_modal.help": "Send teammates the link below for them to sign-up to this team site. The Team Invite Link can be shared with multiple teammates as it does not change unless it's regenerated in Team Settings by a Team Admin.", "get_team_invite_link_modal.helpDisabled": "User creation has been disabled for your team. Please ask your team administrator for details.", "get_team_invite_link_modal.title": "Team Invite Link", "intro_messages.DM": "This is the start of your direct message history with {teammate}.<br />Direct messages and files shared here are not shown to people outside this area.", @@ -966,7 +966,7 @@ "sso_signup.team_error": "Please enter a team name", "suggestion.mention.all": "Notifies everyone in the team", "suggestion.mention.channel": "Notifies everyone in the channel", - "suggestion.search.private": "Public Groups", + "suggestion.search.private": "Private Groups", "suggestion.search.public": "Public Channels", "team_export_tab.download": "download", "team_export_tab.export": "Export", @@ -1054,9 +1054,15 @@ "team_signup_welcome.validEmailError": "Please enter a valid email address", "team_signup_welcome.welcome": "Welcome to:", "team_signup_welcome.yes": "Yes, this address is correct", + "textbox.bold": "**bold**", "textbox.edit": "Edit message", "textbox.help": "Help", + "textbox.inlinecode": "`inline code`", + "textbox.italic": "_italic_", + "textbox.preformatted": "```preformatted```", "textbox.preview": "Preview", + "textbox.quote": ">quote", + "textbox.strike": "strike", "tutorial_intro.allSet": "You’re all set", "tutorial_intro.end": "Click “Next” to enter Town Square. This is the first channel teammates see when they sign up. Use it for posting updates everyone needs to know.", "tutorial_intro.invite": "Invite teammates", diff --git a/web/static/i18n/es.json b/web/static/i18n/es.json index dc012df14..091b1e846 100644 --- a/web/static/i18n/es.json +++ b/web/static/i18n/es.json @@ -190,7 +190,7 @@ "admin.ldap.uernameAttrDesc": "El atributo en el servidor LDAP que se utilizará para poblar el nombre de usuario en Mattermost. Este puede ser igual al Attributo Id.", "admin.ldap.usernameAttrEx": "Ej \"sAMAccountName\"", "admin.ldap.usernameAttrTitle": "Atributo Usuario:", - "admin.licence.keyMigration": "Si estás migrando servidores es posible que necesites remover tu licencia de este servidor para poder instalarlo en un servidor nuevo. Para empezar,<a href=\"http://mattermost.com\" target=\"_blank\">deshabilita todas las características de la Edición Enterprise de este servidor</a>.Esta operación habilitará la opción para remover la licencia y degradar este servidor de la Edición Enterprise a la Edición Team.", + "admin.licence.keyMigration": "Si estás migrando servidores es posible que necesites remover tu licencia de este servidor para poder instalarlo en un servidor nuevo. Para empezar, <a href=\"http://mattermost.com\" target=\"_blank\">deshabilita todas las características de la Edición Enterprise de este servidor</a>. Esta operación habilitará la opción para remover la licencia y degradar este servidor de la Edición Enterprise a la Edición Team.", "admin.license.edition": "Edición: ", "admin.license.enterpriseEdition": "Mattermost Edición Enterprise. Diseñada para comunicación de escala empresarial.", "admin.license.enterpriseType": "<div><p>Esta versión compilada de la plataforma de Mattermost es provista bajo una <a href=\"http://mattermost.com\" target=\"_blank\">licencia comercial</a> de Mattermost, Inc. en función en su nivel de subscripción y bajo los <a href=\"{terms}\" target=\"_blank\">Términos del Servicio.</a></p><p>Los detalles de tu subscripción son los siguientes:</p>Nombre: {name}<br />Nombre compañía u organización: {company}<br/>Cantidad de usuarios: {users}<br/>Licencia emitida: {issued}<br/>Fecha de inicio: {start}<br/>Fecha de expiración: {expires}<br/>LDAP: {ldap}<br/></div>", @@ -277,8 +277,8 @@ "admin.service.attemptTitle": "Máximo de intentos de conexión:", "admin.service.cmdsDesc": "Cuando es verdadero, se permite la creación de comandos de barra por usuarios.", "admin.service.cmdsTitle": "Habilitar Comandos de Barra: ", - "admin.service.corsEx": "http://ejemplo.com https://ejemplo.com", "admin.service.corsDescription": "Habilita las solicitudes HTTP de origen cruzado para dominios en específico (separados por un espacio). Utiliza \"*\" si quieres habilitar CORS desde cualquier dominio o deja el campo en blanco para deshabilitarlo.", + "admin.service.corsEx": "http://ejemplo.com https://ejemplo.com", "admin.service.corsTitle": "Permitir Solicitudes de Origen Cruzado desde:", "admin.service.developerDesc": "(Opción de Desarrollador) Cuando está asignado en verdadero, información extra sobre errores se muestra en el UI.", "admin.service.developerTitle": "Habilitar modo de Desarrollador: ", @@ -561,7 +561,6 @@ "channel_loader.wrote": " escribió: ", "channel_members_modal.addNew": " Agregar nuevos Miembros", "channel_members_modal.close": "Cerrar", - "channel_members_modal.removeMember": "Elminar Miembro", "channel_memebers_modal.members": " Miembros", "channel_modal.cancel": "Cancelar", "channel_modal.channel": "Canal", @@ -702,7 +701,7 @@ "get_link.copy": "Copiar Enlace", "get_post_link_modal.help": "En enlace de abajo permite a los usuarios autorizados a ver tu mensaje.", "get_post_link_modal.title": "Copiar enlace Permanente", - "get_team_invite_link_modal.help": "Enviar a los compañeros de equipo el enlace que se muestra a continuación para permitirles registrarse a este equipo.", + "get_team_invite_link_modal.help": "Envía el siguiente enlace a tus compañeros para que se registren a este equipo. El enlace de invitación al equipo puede ser compartido con multiples compañeros y el mismo no cambiará a menos que sea regenerado en la Configuración del Equipo por un Administrador del Equipo.", "get_team_invite_link_modal.helpDisabled": "La creación de usuario ha sido deshabilitada para tu equipo. Por favor solicita más detalles a tu administrador de equipo.", "get_team_invite_link_modal.title": "Enlace de Invitación al Equipo", "intro_messages.DM": "Este es el inicio de tu historial de mensajes directos con {teammate}.<br />Los mensajes directos y archivos que se comparten aquí no son mostrados a personas fuera de esta área.", @@ -983,18 +982,18 @@ "team_import_tab.summary": "Ver Resumen", "team_member_modal.close": "Cerrar", "team_member_modal.members": "{team} Miembros", - "team_members_modal.confirmDemoteDescription": "Si te degradas a ti mismo de la función de Administrador de Sistema y no hay otro usuario con privilegios de Administrador de Sistema, tendrás que volver a asignar un Administrador del Sistema accediendo al servidor de Mattermost a través de un terminal y ejecutar el siguiente comando.", - "team_members_modal.confirmDemoteRoleTitle": "Confirmar el decenso del rol de Administrador de Sistema", - "team_members_modal.confirmDemotion": "Confirmar decenso", - "team_members_modal.confirmDemotionCmd": "platform -assign_role -team_name=\"tuequipo\" -email=\"nombre@tuempresa.com\" -role=\"system_admin\"", - "team_members_modal.inactive": "Inactivo", - "team_members_modal.makeActive": "Activar", - "team_members_modal.makeAdmin": "Convertir a Admin de Equipo", - "team_members_modal.makeInactive": "Desactivar", - "team_members_modal.makeMember": "Convertir en Miembro", - "team_members_modal.member": "Miembro", - "team_members_modal.systemAdmin": "Administrador de Sistema", - "team_members_modal.teamAdmin": "Admin de Equipo", + "team_members_dropdown.confirmDemoteDescription": "Si te degradas a ti mismo de la función de Administrador de Sistema y no hay otro usuario con privilegios de Administrador de Sistema, tendrás que volver a asignar un Administrador del Sistema accediendo al servidor de Mattermost a través de un terminal y ejecutar el siguiente comando.", + "team_members_dropdown.confirmDemoteRoleTitle": "Confirmar el decenso del rol de Administrador de Sistema", + "team_members_dropdown.confirmDemotion": "Confirmar decenso", + "team_members_dropdown.confirmDemotionCmd": "platform -assign_role -team_name=\"tuequipo\" -email=\"nombre@tuempresa.com\" -role=\"system_admin\"", + "team_members_dropdown.inactive": "Inactivo", + "team_members_dropdown.makeActive": "Activar", + "team_members_dropdown.makeAdmin": "Hacer Admin de Equipo", + "team_members_dropdown.makeInactive": "Inactivar", + "team_members_dropdown.makeMember": "Hacer Miembro", + "team_members_dropdown.member": "Miembro", + "team_members_dropdown.systemAdmin": "Admin del Sistema", + "team_members_dropdown.teamAdmin": "Admin del Equipo", "team_settings_modal.exportTab": "Exportar", "team_settings_modal.generalTab": "General", "team_settings_modal.importTab": "Importar", diff --git a/web/static/i18n/pt.json b/web/static/i18n/pt.json index ef5b9a2ab..99ef71b35 100644 --- a/web/static/i18n/pt.json +++ b/web/static/i18n/pt.json @@ -21,33 +21,6 @@ "activity_log_modal.android": "Android", "activity_log_modal.androidNativeApp": "App Nativo Android", "activity_log_modal.iphoneNativeApp": "App Nativo para iPhone", - "analytics.chart.loading": "Carregando...", - "analytics.chart.meaningful": "Não há dados suficientes para uma representação significativa.", - "analytics.system.activeUsers": "Usuários Ativos Com Posts", - "analytics.system.channelTypes": "Tipos de Canal", - "analytics.system.postTypes": "Posts, Arquivos e Hashtags", - "analytics.system.privateGroups": "Grupos Privados", - "analytics.system.publicChannels": "Canais Públicos", - "analytics.system.textPosts": "Post com Texto somente", - "analytics.system.title": "Estatísticas do Sistema", - "analytics.system.totalFilePosts": "Posts com Arquivos", - "analytics.system.totalHashtagPosts": "Posts com Hashtags", - "analytics.system.totalIncomingWebhooks": "Webhooks Entrada", - "analytics.system.totalOutgoingWebhooks": "Webhooks Saída", - "analytics.system.totalCommands": "Total de Comandos", - "analytics.system.totalSessions": "Total de Sessões", - "analytics.system.totalPosts": "Total Posts", - "analytics.system.totalUsers": "Total de Usuários", - "analytics.system.totalTeams": "Total de Equipes", - "analytics.system.totalChannels": "Total de Canais", - "analytics.team.activeUsers": "Usuários Ativos Com Posts", - "analytics.team.recentActive": "Usuários Ativos Recentes", - "analytics.team.newlyCreated": "Novos Usuários Criados", - "analytics.team.privateGroups": "Grupos Privados", - "analytics.team.publicChannels": "Canais Públicos", - "analytics.team.title": "Estatísticas de Equipe para {team}", - "analytics.team.totalPosts": "Total Posts", - "analytics.team.totalUsers": "Total de Usuários", "admin.audits.reload": "Recarregar", "admin.audits.title": "Atividade de Usuário", "admin.email.allowEmailSignInDescription": "Quando verdadeiro, Mattermost permite aos usuários fazer login usando o e-mail e senha.", @@ -217,10 +190,10 @@ "admin.ldap.uernameAttrDesc": "O atributo no servidor LDAP que será usado para preencher o campo nome de usuário no Mattermost. Este pode ser o mesmo que o Atributo ID.", "admin.ldap.usernameAttrEx": "Ex \"sAMAccountName\"", "admin.ldap.usernameAttrTitle": "Atributo do Usuário:", - "admin.licence.keyMigration": "Se você estiver migrando seu servidor você pode precisar remover sua chave da licença deste servidor a pedido para instala-la em um novo servidor. Para iniciar,<a href=\"http://mattermost.com\" target=\"_blank\">desativar todos os recursos Enterprise Edition deste servidor</a>.Isto irá habilitar para remover a chave da licença e fazer downgrade deste servidor Enterprise Edition para Team Edition.", + "admin.licence.keyMigration": "Se você estiver migrando seu servidor você pode precisar remover sua chave da licença deste servidor a pedido para instala-la em um novo servidor. Para iniciar, <a href=\"http://mattermost.com\" target=\"_blank\">desativar todos os recursos Enterprise Edition deste servidor</a>. Isto irá habilitar para remover a chave da licença e fazer downgrade deste servidor Enterprise Edition para Team Edition.", "admin.license.edition": "Edição: ", "admin.license.enterpriseEdition": "Mattermost Enterprise Edition. Desenvolvido para escala empresarial de comunicação.", - "admin.license.enterpriseType": "<div><p>Esta versão compilada da plataforma Mattermost é fornecida sob a <a href=\"http://mattermost.com\" target=\"_blank\">licença comercial</a>para Mattermost, Inc. com base em seu nível de subscrição e está sujeito a <a href=\"{terms}\" target=\"_blank\">Termos de Serviço.</a></p><p>Os detalhes de sua assinatura, são como segue:</p>Nome: {name}<br />Nome da Empresa ou organização: {company}<br/>Número de usuários: {users}<br/>Licença emitida: {issued}<br/>Data de Início da licença: {start}<br/>Data de expiração da licença: {expires}<br/>LDAP: {ldap}<br/></div>", + "admin.license.enterpriseType": "<div><p>Esta versão compilada da plataforma Mattermost é fornecida sob a <a href=\"http://mattermost.com\" target=\"_blank\">licença comercial</a> para Mattermost, Inc. com base em seu nível de subscrição e está sujeito a <a href=\"{terms}\" target=\"_blank\">Termos de Serviço.</a></p><p>Os detalhes de sua assinatura, são como segue:</p>Nome: {name}<br />Nome da Empresa ou organização: {company}<br/>Número de usuários: {users}<br/>Licença emitida: {issued}<br/>Data de Início da licença: {start}<br/>Data de expiração da licença: {expires}<br/>LDAP: {ldap}<br/></div>", "admin.license.key": "Chave da Licença: ", "admin.license.keyRemove": "Remover a Licença Enterprise e fazer Downgrade do Servidor", "admin.license.removing": "Removendo a Licença...", @@ -451,6 +424,33 @@ "admin.user_item.resetPwd": "Resetar Senha", "admin.user_item.sysAdmin": "Admin do Sistema", "admin.user_item.teamAdmin": "Admin Equipe", + "analytics.chart.loading": "Carregando...", + "analytics.chart.meaningful": "Não há dados suficientes para uma representação significativa.", + "analytics.system.activeUsers": "Usuários Ativos Com Posts", + "analytics.system.channelTypes": "Tipos de Canal", + "analytics.system.postTypes": "Posts, Arquivos e Hashtags", + "analytics.system.privateGroups": "Grupos Privados", + "analytics.system.publicChannels": "Canais Públicos", + "analytics.system.textPosts": "Post com Texto somente", + "analytics.system.title": "Estatísticas do Sistema", + "analytics.system.totalChannels": "Total de Canais", + "analytics.system.totalCommands": "Total de Comandos", + "analytics.system.totalFilePosts": "Posts com Arquivos", + "analytics.system.totalHashtagPosts": "Posts com Hashtags", + "analytics.system.totalIncomingWebhooks": "Webhooks Entrada", + "analytics.system.totalOutgoingWebhooks": "Webhooks Saída", + "analytics.system.totalPosts": "Total Posts", + "analytics.system.totalSessions": "Total de Sessões", + "analytics.system.totalTeams": "Total de Equipes", + "analytics.system.totalUsers": "Total de Usuários", + "analytics.team.activeUsers": "Usuários Ativos Com Posts", + "analytics.team.newlyCreated": "Novos Usuários Criados", + "analytics.team.privateGroups": "Grupos Privados", + "analytics.team.publicChannels": "Canais Públicos", + "analytics.team.recentActive": "Usuários Ativos Recentes", + "analytics.team.title": "Estatísticas de Equipe para {team}", + "analytics.team.totalPosts": "Total Posts", + "analytics.team.totalUsers": "Total de Usuários", "audit_table.accountActive": "Conta inativada", "audit_table.accountInactive": "Conta inativada", "audit_table.action": "Ação", @@ -547,18 +547,17 @@ "channel_invite.add": " Adicionar", "channel_invite.addNewMembers": "Adicionar Novo Membro para ", "channel_invite.close": "Fechar", + "channel_loader.connection_error": "Parece existir um problema com a sua conexão de internet.", "channel_loader.posted": "Postado", "channel_loader.socketError": "Por favor verifique sua conexão, Mattermost está inalcançável. Se este problema persistir, peça ao administrador para verificar a porta WebSocket.", "channel_loader.someone": "Alguém", "channel_loader.something": " fez algo novo", + "channel_loader.unknown_error": "Recebido um código de status inesperado do servidor.", "channel_loader.uploadedFile": " enviado um arquivo", "channel_loader.uploadedImage": " enviado uma imagem", "channel_loader.wrote": " escreveu: ", - "channel_loader.connection_error": "Parece existir um problema com a sua conexão de internet.", - "channel_loader.unknown_error": "Recebido um código de status inesperado do servidor.", "channel_members_modal.addNew": " Adicionar Novos Membros", "channel_members_modal.close": "Fechar", - "channel_members_modal.removeMember": "Remover Membro", "channel_memebers_modal.members": " Membros", "channel_modal.cancel": "Cancelar", "channel_modal.channel": "Canal", @@ -699,7 +698,6 @@ "get_link.copy": "Copiar Link", "get_post_link_modal.help": "O link abaixo permite que usuários autorizados possam ver seus posts.", "get_post_link_modal.title": "Copiar Permalink", - "get_team_invite_link_modal.help": "Enviar a equipe de trabalho o link abaixo para eles se inscreverem nesta equipe.", "get_team_invite_link_modal.helpDisabled": "Criação de usuários está desabilitada para sua equipe. Por favor peça ao administrador de equipe por detalhes.", "get_team_invite_link_modal.title": "Link para Convite de Equipe", "intro_messages.DM": "Este é o início do seu histórico de mensagens diretas com {teammate}.<br />Mensagens diretas e arquivos compartilhados aqui não são mostrados para pessoas de fora desta área.", @@ -962,7 +960,6 @@ "sso_signup.team_error": "Por favor entre o nome da equipe", "suggestion.mention.all": "Notificar todo mundo na equipe", "suggestion.mention.channel": "Notifica todos no canal", - "suggestion.search.private": "Grupos Públicos", "suggestion.search.public": "Canais Públicos", "team_export_tab.download": "download", "team_export_tab.export": "Exportar", @@ -1050,9 +1047,15 @@ "team_signup_welcome.validEmailError": "Por favor entre um endereço de e-mail válido", "team_signup_welcome.welcome": "Bem-vindo:", "team_signup_welcome.yes": "Sim, este endereço de email está correto", + "textbox.bold": "**negrito**", "textbox.edit": "Editar mensagem", "textbox.help": "Ajuda", + "textbox.inlinecode": "`código`", + "textbox.italic": "_itálico_", + "textbox.preformatted": "```pre-formatado```", "textbox.preview": "Pré-visualização", + "textbox.quote": ">citado", + "textbox.strike": "tachado", "tutorial_intro.allSet": "Está tudo pronto", "tutorial_intro.end": "Clique em “Próximo” para entrar Town Square. Este é o primeiro canal que sua equipe de trabalho vê quando eles se inscrevem. Use para postar atualizações que todos precisam saber.", "tutorial_intro.invite": "Convidar pessoas para equipe", |