Merge pull request #2089 from mattermost/plt-1205

PLT-1205 Remove appearance settings tab and move theme management to display s…
Этот коммит содержится в:
Joram Wilander
2016-02-08 07:57:21 -05:00
родитель be70bbc2f0 39b35b7b39
Коммит 96cb7345da
10 изменённых файлов: 179 добавлений и 161 удалений

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

@@ -46,9 +46,14 @@ export default class SettingItemMax extends React.Component {
widthClass = 'col-sm-9 col-sm-offset-3'; widthClass = 'col-sm-9 col-sm-offset-3';
} }
let title;
if (this.props.title) {
title = <li className='col-sm-12 section-title'>{this.props.title}</li>;
}
return ( return (
<ul className='section-max form-horizontal'> <ul className='section-max form-horizontal'>
<li className='col-sm-12 section-title'>{this.props.title}</li> {title}
<li className={widthClass}> <li className={widthClass}>
<ul className='setting-list'> <ul className='setting-list'>
<li className='setting-list-item'> <li className='setting-list-item'>

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

@@ -222,7 +222,7 @@ class CustomThemeChooser extends React.Component {
} else { } else {
elements.push( elements.push(
<div <div
className='col-sm-4 form-group' className='col-sm-4 form-group element'
key={'custom-theme-key' + index} key={'custom-theme-key' + index}
> >
<label className='custom-label'>{formatMessage(messages[element.id])}</label> <label className='custom-label'>{formatMessage(messages[element.id])}</label>
@@ -265,8 +265,8 @@ class CustomThemeChooser extends React.Component {
); );
return ( return (
<div> <div className='appearance-section'>
<div className='row form-group'> <div className='theme-elements row form-group'>
{elements} {elements}
</div> </div>
<div className='row'> <div className='row'>
@@ -283,4 +283,4 @@ CustomThemeChooser.propTypes = {
updateTheme: React.PropTypes.func.isRequired updateTheme: React.PropTypes.func.isRequired
}; };
export default injectIntl(CustomThemeChooser); export default injectIntl(CustomThemeChooser);

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

@@ -45,7 +45,7 @@ export default class PremadeThemeChooser extends React.Component {
} }
return ( return (
<div className='row'> <div className='row appearance-section'>
{premadeThemes} {premadeThemes}
</div> </div>
); );

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

@@ -6,7 +6,6 @@ import * as utils from '../../utils/utils.jsx';
import NotificationsTab from './user_settings_notifications.jsx'; import NotificationsTab from './user_settings_notifications.jsx';
import SecurityTab from './user_settings_security.jsx'; import SecurityTab from './user_settings_security.jsx';
import GeneralTab from './user_settings_general.jsx'; import GeneralTab from './user_settings_general.jsx';
import AppearanceTab from './user_settings_appearance.jsx';
import DeveloperTab from './user_settings_developer.jsx'; import DeveloperTab from './user_settings_developer.jsx';
import IntegrationsTab from './user_settings_integrations.jsx'; import IntegrationsTab from './user_settings_integrations.jsx';
import DisplayTab from './user_settings_display.jsx'; import DisplayTab from './user_settings_display.jsx';
@@ -85,21 +84,6 @@ export default class UserSettings extends React.Component {
/> />
</div> </div>
); );
} else if (this.props.activeTab === 'appearance') {
return (
<div>
<AppearanceTab
ref='activeTab'
activeSection={this.props.activeSection}
updateSection={this.props.updateSection}
updateTab={this.props.updateTab}
closeModal={this.props.closeModal}
collapseModal={this.props.collapseModal}
setEnforceFocus={this.props.setEnforceFocus}
setRequireConfirm={this.props.setRequireConfirm}
/>
</div>
);
} else if (this.props.activeTab === 'developer') { } else if (this.props.activeTab === 'developer') {
return ( return (
<div> <div>
@@ -137,6 +121,8 @@ export default class UserSettings extends React.Component {
updateTab={this.props.updateTab} updateTab={this.props.updateTab}
closeModal={this.props.closeModal} closeModal={this.props.closeModal}
collapseModal={this.props.collapseModal} collapseModal={this.props.collapseModal}
setEnforceFocus={this.props.setEnforceFocus}
setRequireConfirm={this.props.setRequireConfirm}
/> />
</div> </div>
); );

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

@@ -1,15 +1,18 @@
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
import {savePreferences} from '../../utils/client.jsx';
import SettingItemMin from '../setting_item_min.jsx'; import SettingItemMin from '../setting_item_min.jsx';
import SettingItemMax from '../setting_item_max.jsx'; import SettingItemMax from '../setting_item_max.jsx';
import Constants from '../../utils/constants.jsx';
const PreReleaseFeatures = Constants.PRE_RELEASE_FEATURES;
import PreferenceStore from '../../stores/preference_store.jsx';
import ManageLanguages from './manage_languages.jsx'; import ManageLanguages from './manage_languages.jsx';
import ThemeSetting from './user_settings_theme.jsx';
import PreferenceStore from '../../stores/preference_store.jsx';
import * as Utils from '../../utils/utils.jsx'; import * as Utils from '../../utils/utils.jsx';
import Constants from '../../utils/constants.jsx';
const PreReleaseFeatures = Constants.PRE_RELEASE_FEATURES;
import {savePreferences} from '../../utils/client.jsx';
import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'mm-intl'; import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'mm-intl';
const holders = defineMessages({ const holders = defineMessages({
@@ -452,6 +455,13 @@ class UserSettingsDisplay extends React.Component {
/> />
</h3> </h3>
<div className='divider-dark first'/> <div className='divider-dark first'/>
<ThemeSetting
selected={this.props.activeSection === 'theme'}
updateSection={this.updateSection}
setRequireConfirm={this.props.setRequireConfirm}
setEnforceFocus={this.props.setEnforceFocus}
/>
<div className='divider-dark'/>
{fontSection} {fontSection}
<div className='divider-dark'/> <div className='divider-dark'/>
{clockSection} {clockSection}
@@ -472,7 +482,9 @@ UserSettingsDisplay.propTypes = {
updateTab: React.PropTypes.func, updateTab: React.PropTypes.func,
activeSection: React.PropTypes.string, activeSection: React.PropTypes.string,
closeModal: React.PropTypes.func.isRequired, closeModal: React.PropTypes.func.isRequired,
collapseModal: React.PropTypes.func.isRequired collapseModal: React.PropTypes.func.isRequired,
setRequireConfirm: React.PropTypes.func.isRequired,
setEnforceFocus: React.PropTypes.func.isRequired
}; };
export default injectIntl(UserSettingsDisplay); export default injectIntl(UserSettingsDisplay);

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

@@ -2,9 +2,13 @@
// See License.txt for license information. // See License.txt for license information.
import ConfirmModal from '../confirm_modal.jsx'; import ConfirmModal from '../confirm_modal.jsx';
const Modal = ReactBootstrap.Modal;
import SettingsSidebar from '../settings_sidebar.jsx';
import UserSettings from './user_settings.jsx'; import UserSettings from './user_settings.jsx';
import SettingsSidebar from '../settings_sidebar.jsx';
import UserStore from '../../stores/user_store.jsx';
import * as Utils from '../../utils/utils.jsx';
const Modal = ReactBootstrap.Modal;
import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'mm-intl'; import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'mm-intl';
@@ -21,10 +25,6 @@ const holders = defineMessages({
id: 'user.settings.modal.notifications', id: 'user.settings.modal.notifications',
defaultMessage: 'Notifications' defaultMessage: 'Notifications'
}, },
appearance: {
id: 'user.settings.modal.appearance',
defaultMessage: 'Appearance'
},
developer: { developer: {
id: 'user.settings.modal.developer', id: 'user.settings.modal.developer',
defaultMessage: 'Developer' defaultMessage: 'Developer'
@@ -214,6 +214,12 @@ class UserSettingsModal extends React.Component {
if (!skipConfirm && this.requireConfirm) { if (!skipConfirm && this.requireConfirm) {
this.showConfirmModal(() => this.updateSection(section, true)); this.showConfirmModal(() => this.updateSection(section, true));
} else { } else {
if (this.state.active_section === 'theme' && section !== 'theme') {
const user = UserStore.getCurrentUser();
if (user.theme_props != null) {
Utils.applyTheme(user.theme_props);
}
}
this.setState({active_section: section}); this.setState({active_section: section});
} }
} }
@@ -224,7 +230,6 @@ class UserSettingsModal extends React.Component {
tabs.push({name: 'general', uiName: formatMessage(holders.general), icon: 'glyphicon glyphicon-cog'}); tabs.push({name: 'general', uiName: formatMessage(holders.general), icon: 'glyphicon glyphicon-cog'});
tabs.push({name: 'security', uiName: formatMessage(holders.security), icon: 'glyphicon glyphicon-lock'}); tabs.push({name: 'security', uiName: formatMessage(holders.security), icon: 'glyphicon glyphicon-lock'});
tabs.push({name: 'notifications', uiName: formatMessage(holders.notifications), icon: 'glyphicon glyphicon-exclamation-sign'}); tabs.push({name: 'notifications', uiName: formatMessage(holders.notifications), icon: 'glyphicon glyphicon-exclamation-sign'});
tabs.push({name: 'appearance', uiName: formatMessage(holders.appearance), icon: 'glyphicon glyphicon-wrench'});
if (global.window.mm_config.EnableOAuthServiceProvider === 'true') { if (global.window.mm_config.EnableOAuthServiceProvider === 'true') {
tabs.push({name: 'developer', uiName: formatMessage(holders.developer), icon: 'glyphicon glyphicon-th'}); tabs.push({name: 'developer', uiName: formatMessage(holders.developer), icon: 'glyphicon glyphicon-th'});
} }
@@ -294,4 +299,4 @@ UserSettingsModal.propTypes = {
onModalDismissed: React.PropTypes.func.isRequired onModalDismissed: React.PropTypes.func.isRequired
}; };
export default injectIntl(UserSettingsModal); export default injectIntl(UserSettingsModal);

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

@@ -1,8 +1,10 @@
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
import CustomThemeChooser from './custom_theme_chooser.jsx'; import CustomThemeChooser from './custom_theme_chooser.jsx';
import PremadeThemeChooser from './premade_theme_chooser.jsx'; import PremadeThemeChooser from './premade_theme_chooser.jsx';
import SettingItemMin from '../setting_item_min.jsx';
import SettingItemMax from '../setting_item_max.jsx';
import UserStore from '../../stores/user_store.jsx'; import UserStore from '../../stores/user_store.jsx';
@@ -12,11 +14,22 @@ import * as Utils from '../../utils/utils.jsx';
import Constants from '../../utils/constants.jsx'; import Constants from '../../utils/constants.jsx';
import {FormattedMessage} from 'mm-intl'; import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'mm-intl';
const ActionTypes = Constants.ActionTypes; const ActionTypes = Constants.ActionTypes;
export default class UserSettingsAppearance extends React.Component { const holders = defineMessages({
themeTitle: {
id: 'user.settings.display.theme.title',
defaultMessage: 'Theme'
},
themeDescribe: {
id: 'user.settings.display.theme.describe',
defaultMessage: 'Open to manage your theme'
}
});
export default class ThemeSetting extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
@@ -34,16 +47,21 @@ export default class UserSettingsAppearance extends React.Component {
componentDidMount() { componentDidMount() {
UserStore.addChangeListener(this.onChange); UserStore.addChangeListener(this.onChange);
if (this.props.activeSection === 'theme') { if (this.props.selected) {
$(ReactDOM.findDOMNode(this.refs[this.state.theme])).addClass('active-border'); $(ReactDOM.findDOMNode(this.refs[this.state.theme])).addClass('active-border');
} }
} }
componentDidUpdate() { componentDidUpdate() {
if (this.props.activeSection === 'theme') { if (this.props.selected) {
$('.color-btn').removeClass('active-border'); $('.color-btn').removeClass('active-border');
$(ReactDOM.findDOMNode(this.refs[this.state.theme])).addClass('active-border'); $(ReactDOM.findDOMNode(this.refs[this.state.theme])).addClass('active-border');
} }
} }
componentWillReceiveProps(nextProps) {
if (!this.props.selected && nextProps.selected) {
this.resetFields();
}
}
componentWillUnmount() { componentWillUnmount() {
UserStore.removeChangeListener(this.onChange); UserStore.removeChangeListener(this.onChange);
} }
@@ -96,6 +114,7 @@ export default class UserSettingsAppearance extends React.Component {
this.props.setRequireConfirm(false); this.props.setRequireConfirm(false);
this.originalTheme = Object.assign({}, this.state.theme); this.originalTheme = Object.assign({}, this.state.theme);
this.scrollToTop(); this.scrollToTop();
this.props.updateSection('');
}, },
(err) => { (err) => {
var state = this.getStateFromStores(); var state = this.getStateFromStores();
@@ -149,6 +168,8 @@ export default class UserSettingsAppearance extends React.Component {
this.props.setEnforceFocus(false); this.props.setEnforceFocus(false);
} }
render() { render() {
const {formatMessage} = this.props.intl;
var serverError; var serverError;
if (this.state.serverError) { if (this.state.serverError) {
serverError = this.state.serverError; serverError = this.state.serverError;
@@ -160,136 +181,121 @@ export default class UserSettingsAppearance extends React.Component {
let premade; let premade;
if (displayCustom) { if (displayCustom) {
custom = ( custom = (
<CustomThemeChooser <div key='customThemeChooser'>
theme={this.state.theme} <br/>
updateTheme={this.updateTheme} <CustomThemeChooser
/> theme={this.state.theme}
updateTheme={this.updateTheme}
/>
</div>
); );
} else { } else {
premade = ( premade = (
<PremadeThemeChooser <div key='premadeThemeChooser'>
theme={this.state.theme} <br/>
updateTheme={this.updateTheme} <PremadeThemeChooser
/> theme={this.state.theme}
updateTheme={this.updateTheme}
/>
</div>
); );
} }
const themeUI = ( let themeUI;
<div className='section-max appearance-section'> if (this.props.selected) {
<div className='col-sm-12'> let inputs = [];
<div className='radio'>
<label>
<input type='radio'
checked={!displayCustom}
onChange={this.updateType.bind(this, 'premade')}
/>
<FormattedMessage
id='user.settings.appearance.themeColors'
defaultMessage='Theme Colors'
/>
</label>
<br/>
</div>
{premade}
<div className='radio'>
<label>
<input type='radio'
checked={displayCustom}
onChange={this.updateType.bind(this, 'custom')}
/>
<FormattedMessage
id='user.settings.appearance.customTheme'
defaultMessage='Custom Theme'
/>
</label>
<br/>
</div>
{custom}
<hr />
{serverError}
<a
className='btn btn-sm btn-primary'
href='#'
onClick={this.submitTheme}
>
<FormattedMessage
id='user.settings.appearance.save'
defaultMessage='Save'
/>
</a>
<a
className='btn btn-sm theme'
href='#'
onClick={this.resetFields}
>
<FormattedMessage
id='user.settings.appearance.cancel'
defaultMessage='Cancel'
/>
</a>
</div>
</div>
);
return ( inputs.push(
<div> <div
<div className='modal-header'> className='radio'
<button key='premadeThemeColorLabel'
type='button' >
className='close' <label>
aria-label='Close' <input type='radio'
onClick={this.props.closeModal} checked={!displayCustom}
> onChange={this.updateType.bind(this, 'premade')}
<span aria-hidden='true'>{'×'}</span>
</button>
<h4
className='modal-title'
ref='title'
>
<i
className='modal-back'
onClick={this.props.collapseModal}
/> />
<FormattedMessage <FormattedMessage
id='user.settings.appearance.title' id='user.settings.display.theme.themeColors'
defaultMessage='Appearance Settings' defaultMessage='Theme Colors'
/> />
</h4> </label>
<br/>
</div> </div>
<div className='user-settings'> );
<h3 className='tab-header'>
<FormattedMessage inputs.push(premade);
id='user.settings.appearance.title'
defaultMessage='Appearance Settings' inputs.push(
<div
className='radio'
key='customThemeColorLabel'
>
<label>
<input type='radio'
checked={displayCustom}
onChange={this.updateType.bind(this, 'custom')}
/> />
</h3> <FormattedMessage
<div className='divider-dark first'/> id='user.settings.display.theme.customTheme'
{themeUI} defaultMessage='Custom Theme'
<div className='divider-dark'/> />
</label>
<br/>
</div>
);
inputs.push(custom);
inputs.push(
<div key='importSlackThemeButton'>
<br/> <br/>
<a <a
className='theme' className='theme'
onClick={this.handleImportModal} onClick={this.handleImportModal}
> >
<FormattedMessage <FormattedMessage
id='user.settings.appearance.import' id='user.settings.display.theme.import'
defaultMessage='Import theme colors from Slack' defaultMessage='Import theme colors from Slack'
/> />
</a> </a>
</div> </div>
</div> );
);
themeUI = (
<SettingItemMax
inputs={inputs}
submit={this.submitTheme}
server_error={serverError}
width='full'
updateSection={(e) => {
this.props.updateSection('');
e.preventDefault();
}}
/>
);
} else {
themeUI = (
<SettingItemMin
title={formatMessage(holders.themeTitle)}
describe={formatMessage(holders.themeDescribe)}
updateSection={() => {
this.props.updateSection('theme');
}}
/>
);
}
return themeUI;
} }
} }
UserSettingsAppearance.defaultProps = { ThemeSetting.propTypes = {
activeSection: '' intl: intlShape.isRequired,
}; selected: React.PropTypes.bool.isRequired,
UserSettingsAppearance.propTypes = { updateSection: React.PropTypes.func.isRequired,
activeSection: React.PropTypes.string,
updateTab: React.PropTypes.func,
closeModal: React.PropTypes.func.isRequired,
collapseModal: React.PropTypes.func.isRequired,
setRequireConfirm: React.PropTypes.func.isRequired, setRequireConfirm: React.PropTypes.func.isRequired,
setEnforceFocus: React.PropTypes.func.isRequired setEnforceFocus: React.PropTypes.func.isRequired
}; };
export default injectIntl(ThemeSetting);

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

@@ -178,9 +178,17 @@
} }
} }
} }
.theme-elements {
padding-left:15px;
.element {
margin-right:10px;
}
}
.custom-label { .custom-label {
font-weight: normal; font-weight: normal;
font-size: 13px; font-size: 12px;
width: 100%; width: 100%;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;

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

@@ -1130,12 +1130,6 @@
"user.settings.advance.sendDesc": "If enabled 'Enter' inserts a new line and 'Ctrl + Enter' submits the message.", "user.settings.advance.sendDesc": "If enabled 'Enter' inserts a new line and 'Ctrl + Enter' submits the message.",
"user.settings.advance.preReleaseDesc": "Check any pre-released features you'd like to preview. You may also need to refresh the page before the setting will take effect.", "user.settings.advance.preReleaseDesc": "Check any pre-released features you'd like to preview. You may also need to refresh the page before the setting will take effect.",
"user.settings.advance.title": "Advanced Settings", "user.settings.advance.title": "Advanced Settings",
"user.settings.appearance.themeColors": "Theme Colors",
"user.settings.appearance.customTheme": "Custom Theme",
"user.settings.appearance.save": "Save",
"user.settings.appearance.cancel": "Cancel",
"user.settings.appearance.title": "Appearance Settings",
"user.settings.appearance.import": "Import theme colors from Slack",
"user.settings.developer.applicationsPreview": "Applications (Preview)", "user.settings.developer.applicationsPreview": "Applications (Preview)",
"user.settings.developer.thirdParty": "Open to register a new third-party application", "user.settings.developer.thirdParty": "Open to register a new third-party application",
"user.settings.developer.register": "Register New Application", "user.settings.developer.register": "Register New Application",
@@ -1153,6 +1147,11 @@
"user.settings.display.nameOptsDesc": "Set how to display other user's names in posts and the Direct Messages list.", "user.settings.display.nameOptsDesc": "Set how to display other user's names in posts and the Direct Messages list.",
"user.settings.display.fontDesc": "Select the font displayed in the Mattermost user interface.", "user.settings.display.fontDesc": "Select the font displayed in the Mattermost user interface.",
"user.settings.display.title": "Display Settings", "user.settings.display.title": "Display Settings",
"user.settings.display.theme.themeColors": "Theme Colors",
"user.settings.display.theme.customTheme": "Custom Theme",
"user.settings.display.theme.import": "Import theme colors from Slack",
"user.settings.display.theme.title": "Theme",
"user.settings.display.theme.describe": "Open to manage your theme",
"user.settings.general.usernameReserved": "This username is reserved, please choose a new one.", "user.settings.general.usernameReserved": "This username is reserved, please choose a new one.",
"user.settings.general.usernameRestrictions": "'Username must begin with a letter, and contain between {min} to {max} lowercase characters made up of numbers, letters, and the symbols '.', '-' and '_'.", "user.settings.general.usernameRestrictions": "'Username must begin with a letter, and contain between {min} to {max} lowercase characters made up of numbers, letters, and the symbols '.', '-' and '_'.",
"user.settings.general.validEmail": "Please enter a valid email address", "user.settings.general.validEmail": "Please enter a valid email address",
@@ -1254,7 +1253,7 @@
"intro_messages.teammate": "This is the start of your direct message history with this teammate. Direct messages and files shared here are not shown to people outside this area.", "intro_messages.teammate": "This is the start of your direct message history with this teammate. Direct messages and files shared here are not shown to people outside this area.",
"intro_messages.offTopic": "<h4 class=\"channel-intro__title\">Beginning of {display_name}</h4><p class=\"channel-intro__content\">This is the start of {display_name}, a channel for non-work-related conversations.<br/></p>", "intro_messages.offTopic": "<h4 class=\"channel-intro__title\">Beginning of {display_name}</h4><p class=\"channel-intro__content\">This is the start of {display_name}, a channel for non-work-related conversations.<br/></p>",
"intro_messages.inviteOthers": "Invite others to this team", "intro_messages.inviteOthers": "Invite others to this team",
"intro_messages.default": "<h4 class='channel-intro__title'>Beginning of {display_name}</h4><p class='channel-intro__content'><strong>Welcome to {display_name}!'</strong><br/><br/>This is the first channel teammates see when they sign up - use it for posting updates everyone needs to know.</p>", "intro_messages.default": "<h4 class='channel-intro__title'>Beginning of {display_name}</h4><p class='channel-intro__content'><strong>Welcome to {display_name}!</strong><br/><br/>This is the first channel teammates see when they sign up - use it for posting updates everyone needs to know.</p>",
"intro_messages.group": "private group", "intro_messages.group": "private group",
"intro_messages.onlyInvited": " Only invited members can see this private group.", "intro_messages.onlyInvited": " Only invited members can see this private group.",
"intro_messages.channel": "channel", "intro_messages.channel": "channel",

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

@@ -1057,12 +1057,6 @@
"user.settings.advance.sendDesc": "Si está habilitado 'Retorno' inserta una nueva linea y 'Ctrl + Retorno' envía el mensaje.", "user.settings.advance.sendDesc": "Si está habilitado 'Retorno' inserta una nueva linea y 'Ctrl + Retorno' envía el mensaje.",
"user.settings.advance.sendTitle": "Enviar mensajes con Ctrl + Retorno", "user.settings.advance.sendTitle": "Enviar mensajes con Ctrl + Retorno",
"user.settings.advance.title": "Configuración Avanzada", "user.settings.advance.title": "Configuración Avanzada",
"user.settings.appearance.cancel": "Cancelar",
"user.settings.appearance.customTheme": "Tema personalizado",
"user.settings.appearance.import": "Importar los colores de tema de Slack",
"user.settings.appearance.save": "Guardar",
"user.settings.appearance.themeColors": "Selecciona un Tema",
"user.settings.appearance.title": "Configuraciones de Apariencia",
"user.settings.cmds.add": "Agregar", "user.settings.cmds.add": "Agregar",
"user.settings.cmds.add_desc": "Crea comandos que permitan enviar eventos a integraciones externas. Por favor revisa <a href=\"http://mattermost.org/commands\">http://mattermost.org/commands</a> para aprender más.", "user.settings.cmds.add_desc": "Crea comandos que permitan enviar eventos a integraciones externas. Por favor revisa <a href=\"http://mattermost.org/commands\">http://mattermost.org/commands</a> para aprender más.",
"user.settings.cmds.add_display_name.placeholder": "Nombre a mostrar", "user.settings.cmds.add_display_name.placeholder": "Nombre a mostrar",
@@ -1136,6 +1130,9 @@
"user.settings.display.showUsername": "Mostrar el nombre de usuario (predeterminado)", "user.settings.display.showUsername": "Mostrar el nombre de usuario (predeterminado)",
"user.settings.display.teammateDisplay": "Visualización del nombre de los integrantes", "user.settings.display.teammateDisplay": "Visualización del nombre de los integrantes",
"user.settings.display.title": "Configuración de Visualización", "user.settings.display.title": "Configuración de Visualización",
"user.settings.display.theme.customTheme": "Tema personalizado",
"user.settings.display.theme.import": "Importar los colores de tema de Slack",
"user.settings.display.theme.themeColors": "Selecciona un Tema",
"user.settings.general.checkEmail": "Revisa tu correo electrónico {email} para verificar la dirección.", "user.settings.general.checkEmail": "Revisa tu correo electrónico {email} para verificar la dirección.",
"user.settings.general.checkEmailNoAddress": "Revisa tu correo electrónico para verificar la dirección", "user.settings.general.checkEmailNoAddress": "Revisa tu correo electrónico para verificar la dirección",
"user.settings.general.close": "Cerrar", "user.settings.general.close": "Cerrar",
@@ -1262,4 +1259,4 @@
"view_image_popover.download": "Descargar", "view_image_popover.download": "Descargar",
"view_image_popover.file": "Archivo {count} de {total}", "view_image_popover.file": "Archivo {count} de {total}",
"view_image_popover.publicLink": "Obtener Enlace Público" "view_image_popover.publicLink": "Obtener Enlace Público"
} }