Revert "PLT-1800 Load server side locale from the config.json (#3076)"

This reverts commit 34beaa569b.
Этот коммит содержится в:
Christopher Speller
2016-05-24 10:39:56 -04:00
родитель 3b5a5110c7
Коммит 4ae7128ecb
24 изменённых файлов: 51 добавлений и 376 удалений

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

@@ -30,7 +30,7 @@ type TestHelper struct {
func SetupEnterprise() *TestHelper { func SetupEnterprise() *TestHelper {
if Srv == nil { if Srv == nil {
utils.LoadConfig("config.json") utils.LoadConfig("config.json")
utils.InitTranslations(utils.Cfg.LocalizationSettings) utils.InitTranslations()
utils.Cfg.TeamSettings.MaxUsersPerTeam = 50 utils.Cfg.TeamSettings.MaxUsersPerTeam = 50
utils.DisableDebugLogForTest() utils.DisableDebugLogForTest()
utils.License.Features.SetDefaults() utils.License.Features.SetDefaults()
@@ -50,7 +50,7 @@ func SetupEnterprise() *TestHelper {
func Setup() *TestHelper { func Setup() *TestHelper {
if Srv == nil { if Srv == nil {
utils.LoadConfig("config.json") utils.LoadConfig("config.json")
utils.InitTranslations(utils.Cfg.LocalizationSettings) utils.InitTranslations()
utils.Cfg.TeamSettings.MaxUsersPerTeam = 50 utils.Cfg.TeamSettings.MaxUsersPerTeam = 50
utils.DisableDebugLogForTest() utils.DisableDebugLogForTest()
NewServer() NewServer()

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

@@ -239,7 +239,6 @@ func CreateUser(user *model.User) (*model.User, *model.AppError) {
} }
user.MakeNonNil() user.MakeNonNil()
user.Locale = *utils.Cfg.LocalizationSettings.DefaultClientLocale
if result := <-Srv.Store.User().Save(user); result.Err != nil { if result := <-Srv.Store.User().Save(user); result.Err != nil {
l4g.Error(utils.T("api.user.create_user.save.error"), result.Err) l4g.Error(utils.T("api.user.create_user.save.error"), result.Err)

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

@@ -155,10 +155,5 @@
"Enable": false, "Enable": false,
"Directory": "./data/", "Directory": "./data/",
"EnableDaily": false "EnableDaily": false
},
"LocalizationSettings": {
"DefaultServerLocale": "en",
"DefaultClientLocale": "en",
"AvailableLocales": "en,es,fr,ja,pt-BR"
} }
} }

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

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

@@ -77,6 +77,7 @@ func main() {
parseCmds() parseCmds()
utils.InitTranslations()
if errstr := doLoadConfig(flagConfigFile); errstr != "" { if errstr := doLoadConfig(flagConfigFile); errstr != "" {
l4g.Exit(utils.T("mattermost.unable_to_load_config"), errstr) l4g.Exit(utils.T("mattermost.unable_to_load_config"), errstr)
return return
@@ -85,7 +86,6 @@ func main() {
if flagRunCmds { if flagRunCmds {
utils.ConfigureCmdLineLog() utils.ConfigureCmdLineLog()
} }
utils.InitTranslations(utils.Cfg.LocalizationSettings)
pwd, _ := os.Getwd() pwd, _ := os.Getwd()
l4g.Info(utils.T("mattermost.current_version"), model.CurrentVersion, model.BuildNumber, model.BuildDate, model.BuildHash, model.BuildHashEnterprise) l4g.Info(utils.T("mattermost.current_version"), model.CurrentVersion, model.BuildNumber, model.BuildDate, model.BuildHash, model.BuildHashEnterprise)

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

@@ -204,27 +204,20 @@ type ComplianceSettings struct {
EnableDaily *bool EnableDaily *bool
} }
type LocalizationSettings struct {
DefaultServerLocale *string
DefaultClientLocale *string
AvailableLocales *string
}
type Config struct { type Config struct {
ServiceSettings ServiceSettings ServiceSettings ServiceSettings
TeamSettings TeamSettings TeamSettings TeamSettings
SqlSettings SqlSettings SqlSettings SqlSettings
LogSettings LogSettings LogSettings LogSettings
FileSettings FileSettings FileSettings FileSettings
EmailSettings EmailSettings EmailSettings EmailSettings
RateLimitSettings RateLimitSettings RateLimitSettings RateLimitSettings
PrivacySettings PrivacySettings PrivacySettings PrivacySettings
SupportSettings SupportSettings SupportSettings SupportSettings
GitLabSettings SSOSettings GitLabSettings SSOSettings
GoogleSettings SSOSettings GoogleSettings SSOSettings
LdapSettings LdapSettings LdapSettings LdapSettings
ComplianceSettings ComplianceSettings ComplianceSettings ComplianceSettings
LocalizationSettings LocalizationSettings
} }
func (o *Config) ToJson() string { func (o *Config) ToJson() string {
@@ -520,21 +513,6 @@ func (o *Config) SetDefaults() {
o.LdapSettings.NicknameAttribute = new(string) o.LdapSettings.NicknameAttribute = new(string)
*o.LdapSettings.NicknameAttribute = "" *o.LdapSettings.NicknameAttribute = ""
} }
if o.LocalizationSettings.DefaultServerLocale == nil {
o.LocalizationSettings.DefaultServerLocale = new(string)
*o.LocalizationSettings.DefaultServerLocale = DEFAULT_LOCALE
}
if o.LocalizationSettings.DefaultClientLocale == nil {
o.LocalizationSettings.DefaultClientLocale = new(string)
*o.LocalizationSettings.DefaultClientLocale = DEFAULT_LOCALE
}
if o.LocalizationSettings.AvailableLocales == nil {
o.LocalizationSettings.AvailableLocales = new(string)
*o.LocalizationSettings.AvailableLocales = *o.LocalizationSettings.DefaultClientLocale
}
} }
func (o *Config) IsValid() *AppError { func (o *Config) IsValid() *AppError {

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

@@ -136,6 +136,7 @@ func (u *User) PreSave() {
u.Username = strings.ToLower(u.Username) u.Username = strings.ToLower(u.Username)
u.Email = strings.ToLower(u.Email) u.Email = strings.ToLower(u.Email)
u.Locale = strings.ToLower(u.Locale)
u.CreateAt = GetMillis() u.CreateAt = GetMillis()
u.UpdateAt = u.CreateAt u.UpdateAt = u.CreateAt
@@ -165,6 +166,7 @@ func (u *User) PreSave() {
func (u *User) PreUpdate() { func (u *User) PreUpdate() {
u.Username = strings.ToLower(u.Username) u.Username = strings.ToLower(u.Username)
u.Email = strings.ToLower(u.Email) u.Email = strings.ToLower(u.Email)
u.Locale = strings.ToLower(u.Locale)
u.UpdateAt = GetMillis() u.UpdateAt = GetMillis()
if u.AuthData != nil && *u.AuthData == "" { if u.AuthData != nil && *u.AuthData == "" {

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

@@ -16,7 +16,7 @@ var store Store
func Setup() { func Setup() {
if store == nil { if store == nil {
utils.LoadConfig("config.json") utils.LoadConfig("config.json")
utils.InitTranslations(utils.Cfg.LocalizationSettings) utils.InitTranslations()
store = NewSqlStore() store = NewSqlStore()
store.MarkSystemRanUnitTests() store.MarkSystemRanUnitTests()

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

@@ -246,8 +246,7 @@ func getClientConfig(c *model.Config) map[string]string {
props["WebsocketPort"] = fmt.Sprintf("%v", *c.ServiceSettings.WebsocketPort) props["WebsocketPort"] = fmt.Sprintf("%v", *c.ServiceSettings.WebsocketPort)
props["WebsocketSecurePort"] = fmt.Sprintf("%v", *c.ServiceSettings.WebsocketSecurePort) props["WebsocketSecurePort"] = fmt.Sprintf("%v", *c.ServiceSettings.WebsocketSecurePort)
props["DefaultClientLocale"] = *c.LocalizationSettings.DefaultClientLocale props["AllowCorsFrom"] = *c.ServiceSettings.AllowCorsFrom
props["AvailableLocales"] = *c.LocalizationSettings.AvailableLocales
if IsLicensed { if IsLicensed {
if *License.Features.CustomBrand { if *License.Features.CustomBrand {

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

@@ -9,5 +9,5 @@ import (
func TestConfig(t *testing.T) { func TestConfig(t *testing.T) {
LoadConfig("config.json") LoadConfig("config.json")
InitTranslations(Cfg.LocalizationSettings) InitTranslations()
} }

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

@@ -7,17 +7,15 @@ import (
"strings" "strings"
l4g "github.com/alecthomas/log4go" l4g "github.com/alecthomas/log4go"
//"github.com/cloudfoundry/jibber_jabber" "github.com/cloudfoundry/jibber_jabber"
"github.com/mattermost/platform/model" "github.com/mattermost/platform/model"
"github.com/nicksnyder/go-i18n/i18n" "github.com/nicksnyder/go-i18n/i18n"
) )
var T i18n.TranslateFunc var T i18n.TranslateFunc
var locales map[string]string = make(map[string]string) var locales map[string]string = make(map[string]string)
var settings model.LocalizationSettings
func InitTranslations(localizationSettings model.LocalizationSettings) { func InitTranslations() {
settings = localizationSettings
InitTranslationsWithDir("i18n") InitTranslationsWithDir("i18n")
} }
@@ -36,10 +34,14 @@ func InitTranslationsWithDir(dir string) {
} }
func GetTranslationsBySystemLocale() i18n.TranslateFunc { func GetTranslationsBySystemLocale() i18n.TranslateFunc {
locale := *settings.DefaultServerLocale locale := model.DEFAULT_LOCALE
if _, ok := locales[locale]; !ok { if userLanguage, err := jibber_jabber.DetectLanguage(); err == nil {
l4g.Error("Failed to load system translations for '%v' attempting to fall back to '%v'", locale, model.DEFAULT_LOCALE) if _, ok := locales[userLanguage]; ok {
locale = model.DEFAULT_LOCALE locale = userLanguage
} else {
l4g.Error("Failed to load system translations for '%v' attempting to fall back to '%v'", locale, model.DEFAULT_LOCALE)
locale = model.DEFAULT_LOCALE
}
} }
if locales[locale] == "" { if locales[locale] == "" {
@@ -70,20 +72,10 @@ func SetTranslations(locale string) i18n.TranslateFunc {
} }
func GetTranslationsAndLocale(w http.ResponseWriter, r *http.Request) (i18n.TranslateFunc, string) { func GetTranslationsAndLocale(w http.ResponseWriter, r *http.Request) (i18n.TranslateFunc, string) {
// This is for checking against locales like pt_BR or zn_CN
headerLocaleFull := strings.Split(r.Header.Get("Accept-Language"), ",")[0]
// This is for checking agains locales like en, es
headerLocale := strings.Split(strings.Split(r.Header.Get("Accept-Language"), ",")[0], "-")[0] headerLocale := strings.Split(strings.Split(r.Header.Get("Accept-Language"), ",")[0], "-")[0]
defaultLocale := *settings.DefaultClientLocale if locales[headerLocale] != "" {
if locales[headerLocaleFull] != "" {
translations := TfuncWithFallback(headerLocaleFull)
return translations, headerLocaleFull
} else if locales[headerLocale] != "" {
translations := TfuncWithFallback(headerLocale) translations := TfuncWithFallback(headerLocale)
return translations, headerLocale return translations, headerLocale
} else if locales[defaultLocale] != "" {
translations := TfuncWithFallback(defaultLocale)
return translations, headerLocale
} }
translations := TfuncWithFallback(model.DEFAULT_LOCALE) translations := TfuncWithFallback(model.DEFAULT_LOCALE)
@@ -97,7 +89,7 @@ func TfuncWithFallback(pref string) i18n.TranslateFunc {
return translated return translated
} }
t, _ := i18n.Tfunc(model.DEFAULT_LOCALE) t, _ := i18n.Tfunc("en")
return t(translationID, args...) return t(translationID, args...)
} }
} }

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

@@ -21,7 +21,7 @@ var URL string
func Setup() { func Setup() {
if api.Srv == nil { if api.Srv == nil {
utils.LoadConfig("config.json") utils.LoadConfig("config.json")
utils.InitTranslations(utils.Cfg.LocalizationSettings) utils.InitTranslations()
api.NewServer() api.NewServer()
api.StartServer() api.StartServer()
api.InitApi() api.InitApi()

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

@@ -390,10 +390,8 @@ export function newLocalizationSelected(locale) {
translations: en translations: en
}); });
} else { } else {
const localeInfo = I18n.getLanguageInfo(locale) || I18n.getLanguageInfo(global.window.mm_config.DefaultClientLocale);
Client.getTranslations( Client.getTranslations(
localeInfo.url, I18n.getLanguageInfo(locale).url,
(data) => { (data) => {
AppDispatcher.handleServerAction({ AppDispatcher.handleServerAction({
type: ActionTypes.RECEIVED_LOCALE, type: ActionTypes.RECEIVED_LOCALE,
@@ -408,11 +406,10 @@ export function newLocalizationSelected(locale) {
} }
} }
export function loadDefaultLocale() { export function loadBrowserLocale() {
const defaultLocale = global.window.mm_config.DefaultClientLocale; let locale = (navigator.languages && navigator.languages.length > 0 ? navigator.languages[0] :
let locale = global.window.mm_user ? global.window.mm_user.locale || defaultLocale : defaultLocale; (navigator.language || navigator.userLanguage)).split('-')[0];
if (!I18n.getLanguages()[locale]) {
if (!I18n.getLanguageInfo(locale)) {
locale = 'en'; locale = 'en';
} }
return newLocalizationSelected(locale); return newLocalizationSelected(locale);

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

@@ -292,15 +292,6 @@ export default class AdminSidebar extends React.Component {
/> />
} }
/> />
<AdminSidebarSection
name='localization'
title={
<FormattedMessage
id='admin.sidebar.localization'
defaultMessage='Localization'
/>
}
/>
<AdminSidebarSection <AdminSidebarSection
name='users_and_teams' name='users_and_teams'
title={ title={

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

@@ -1,145 +0,0 @@
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import React from 'react';
import * as I18n from 'i18n/i18n.jsx';
import AdminSettings from './admin_settings.jsx';
import {FormattedMessage} from 'react-intl';
import SettingsGroup from './settings_group.jsx';
import DropdownSetting from './dropdown_setting.jsx';
import MultiSelectSetting from './multiselect_settings.jsx';
export default class LocalizationSettings extends AdminSettings {
constructor(props) {
super(props);
this.getConfigFromState = this.getConfigFromState.bind(this);
this.renderSettings = this.renderSettings.bind(this);
this.canSave = this.canSave.bind(this);
const locales = I18n.getAllLanguages();
this.state = Object.assign(this.state, {
hasErrors: false,
defaultServerLocale: props.config.LocalizationSettings.DefaultServerLocale,
defaultClientLocale: props.config.LocalizationSettings.DefaultClientLocale,
availableLocales: props.config.LocalizationSettings.AvailableLocales.split(','),
languages: Object.keys(locales).map((l) => {
return {value: locales[l].value, text: locales[l].name};
})
});
}
canSave() {
return this.state.availableLocales.join(',').indexOf(this.state.defaultClientLocale) !== -1;
}
getConfigFromState(config) {
config.LocalizationSettings.DefaultServerLocale = this.state.defaultServerLocale;
config.LocalizationSettings.DefaultClientLocale = this.state.defaultClientLocale;
config.LocalizationSettings.AvailableLocales = this.state.availableLocales.join(',');
return config;
}
renderTitle() {
return (
<h3>
<FormattedMessage
id='admin.general.title'
defaultMessage='General Settings'
/>
</h3>
);
}
renderSettings() {
return (
<SettingsGroup
header={
<FormattedMessage
id='admin.general.localization'
defaultMessage='Localization'
/>
}
>
<DropdownSetting
id='defaultServerLocale'
values={this.state.languages}
label={
<FormattedMessage
id='admin.general.localization.serverLocaleTitle'
defaultMessage='Default Server Language:'
/>
}
value={this.state.defaultServerLocale}
onChange={this.handleChange}
helpText={
<FormattedMessage
id='admin.general.localization.serverLocaleDescription'
defaultMessage='This setting sets the default language for the system messages and logs. (NEED SERVER RESTART)'
/>
}
/>
<DropdownSetting
id='defaultClientLocale'
values={this.state.languages}
label={
<FormattedMessage
id='admin.general.localization.clientLocaleTitle'
defaultMessage='Default Client Language:'
/>
}
value={this.state.defaultClientLocale}
onChange={this.handleChange}
helpText={
<FormattedMessage
id='admin.general.localization.clientLocaleDescription'
defaultMessage="This setting sets the Default language for newly created users and for pages where the user hasn't loggged in."
/>
}
/>
<MultiSelectSetting
id='availableLocales'
values={this.state.languages}
label={
<FormattedMessage
id='admin.general.localization.availableLocalesTitle'
defaultMessage='Available Languages:'
/>
}
selected={this.state.availableLocales}
mustBePresent={this.state.defaultClientLocale}
onChange={this.handleChange}
helpText={
<FormattedMessage
id='admin.general.localization.availableLocalesDescription'
defaultMessage='This setting determines the available languages that a user can set using the Account Settings.'
/>
}
noResultText={
<FormattedMessage
id='admin.general.localization.availableLocalesNoResults'
defaultMessage='No results found'
/>
}
errorText={
<FormattedMessage
id='admin.general.localization.availableLocalesError'
defaultMessage='There has to be at least one language available'
/>
}
notPresent={
<FormattedMessage
id='admin.general.localization.availableLocalesNotPresent'
defaultMessage='The default client language must be included in the available list'
/>
}
/>
</SettingsGroup>
);
}
}

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

@@ -1,80 +0,0 @@
// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import React from 'react';
import ReactSelect from 'react-select';
import Setting from './setting.jsx';
import FormError from 'components/form_error.jsx';
export default class MultiSelectSetting extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.state = {error: false};
}
handleChange(newValue) {
const values = newValue.map((n) => {
return n.value;
});
if (!newValue || newValue.length === 0) {
this.setState({error: this.props.errorText});
} else if (this.props.mustBePresent && values.join(',').indexOf(this.props.mustBePresent) === -1) {
this.setState({error: this.props.notPresent});
} else {
this.props.onChange(this.props.id, values);
this.setState({error: false});
}
}
componentWillReceiveProps(newProps) {
if (newProps.mustBePresent && newProps.selected.join(',').indexOf(newProps.mustBePresent) === -1) {
this.setState({error: this.props.notPresent});
} else {
this.setState({error: false});
}
}
render() {
return (
<Setting
label={this.props.label}
inputId={this.props.id}
helpText={this.props.helpText}
>
<ReactSelect
id={this.props.id}
multi={true}
labelKey='text'
options={this.props.values}
joinValues={true}
disabled={this.props.disabled}
noResultsText={this.props.noResultText}
onChange={this.handleChange}
value={this.props.selected}
/>
<FormError error={this.state.error}/>
</Setting>
);
}
}
MultiSelectSetting.defaultProps = {
disabled: false
};
MultiSelectSetting.propTypes = {
id: React.PropTypes.string.isRequired,
values: React.PropTypes.array.isRequired,
label: React.PropTypes.node.isRequired,
selected: React.PropTypes.array.isRequired,
mustBePresent: React.PropTypes.string,
onChange: React.PropTypes.func.isRequired,
disabled: React.PropTypes.bool,
helpText: React.PropTypes.node,
noResultText: React.PropTypes.node,
errorText: React.PropTypes.node,
notPresent: React.PropTypes.node
};

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

@@ -6,7 +6,6 @@
import * as GlobalActions from 'action_creators/global_actions.jsx'; import * as GlobalActions from 'action_creators/global_actions.jsx';
import LocalizationStore from 'stores/localization_store.jsx'; import LocalizationStore from 'stores/localization_store.jsx';
import Client from 'utils/web_client.jsx';
import {IntlProvider} from 'react-intl'; import {IntlProvider} from 'react-intl';
@@ -29,10 +28,7 @@ export default class Root extends React.Component {
this.redirectIfNecessary = this.redirectIfNecessary.bind(this); this.redirectIfNecessary = this.redirectIfNecessary.bind(this);
} }
localizationChanged() { localizationChanged() {
const locale = LocalizationStore.getLocale(); this.setState({locale: LocalizationStore.getLocale(), translations: LocalizationStore.getTranslations()});
Client.setAcceptLanguage(locale);
this.setState({locale, translations: LocalizationStore.getTranslations()});
} }
redirectIfNecessary(props) { redirectIfNecessary(props) {
@@ -67,7 +63,7 @@ export default class Root extends React.Component {
FastClick.attach(document.body); FastClick.attach(document.body);
// Get our localizaiton // Get our localizaiton
GlobalActions.loadDefaultLocale(); GlobalActions.loadBrowserLocale();
// Redirect if Necessary // Redirect if Necessary
this.redirectIfNecessary(this.props); this.redirectIfNecessary(this.props);

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

@@ -632,11 +632,7 @@ export default class UserSettingsDisplay extends React.Component {
); );
} }
const userLocale = this.props.user.locale;
if (this.props.activeSection === 'languages') { if (this.props.activeSection === 'languages') {
if (!I18n.isLanguageAvailable(userLocale)) {
this.props.user.locale = global.window.mm_config.DefaultClientLocale;
}
languagesSection = ( languagesSection = (
<ManageLanguages <ManageLanguages
user={this.props.user} user={this.props.user}
@@ -647,12 +643,7 @@ export default class UserSettingsDisplay extends React.Component {
/> />
); );
} else { } else {
let locale; var locale = I18n.getLanguageInfo(this.props.user.locale).name;
if (I18n.isLanguageAvailable(userLocale)) {
locale = I18n.getLanguageInfo(userLocale).name;
} else {
locale = I18n.getLanguageInfo(global.window.mm_config.DefaultClientLocale).name;
}
languagesSection = ( languagesSection = (
<SettingItemMin <SettingItemMin

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

@@ -4,7 +4,7 @@
const es = require('!!file?name=i18n/[name].[ext]!./es.json'); const es = require('!!file?name=i18n/[name].[ext]!./es.json');
const fr = require('!!file?name=i18n/[name].[ext]!./fr.json'); const fr = require('!!file?name=i18n/[name].[ext]!./fr.json');
const ja = require('!!file?name=i18n/[name].[ext]!./ja.json'); const ja = require('!!file?name=i18n/[name].[ext]!./ja.json');
const pt_BR = require('!!file?name=i18n/[name].[ext]!./pt-BR.json'); //eslint-disable-line camelcase const pt = require('!!file?name=i18n/[name].[ext]!./pt.json');
import {addLocaleData} from 'react-intl'; import {addLocaleData} from 'react-intl';
import enLocaleData from 'react-intl/locale-data/en'; import enLocaleData from 'react-intl/locale-data/en';
@@ -34,47 +34,19 @@ const languages = {
name: '日本語 (Beta)', name: '日本語 (Beta)',
url: ja url: ja
}, },
'pt-BR': { pt: {
value: 'pt-BR', value: 'pt',
name: 'Portugues (Beta)', name: 'Portugues (Beta)',
url: pt_BR url: pt
} }
}; };
let availableLanguages = null; export function getLanguages() {
function setAvailableLanguages() {
const available = global.window.mm_config.AvailableLocales.split(',');
availableLanguages = {};
available.forEach((l) => {
if (languages[l]) {
availableLanguages[l] = languages[l];
}
});
}
export function getAllLanguages() {
return languages; return languages;
} }
export function getLanguages() {
if (!availableLanguages) {
setAvailableLanguages();
}
return availableLanguages;
}
export function getLanguageInfo(locale) { export function getLanguageInfo(locale) {
if (!availableLanguages) { return languages[locale];
setAvailableLanguages();
}
return availableLanguages[locale];
}
export function isLanguageAvailable(locale) {
return !!availableLanguages[locale];
} }
export function safariFix(callback) { export function safariFix(callback) {

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

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

@@ -19,6 +19,7 @@
"marked": "mattermost/marked#cb85e5cc81bc7937dbb73c3c53d9532b1b97e3ca", "marked": "mattermost/marked#cb85e5cc81bc7937dbb73c3c53d9532b1b97e3ca",
"match-at": "0.1.0", "match-at": "0.1.0",
"mattermost": "mattermost/mattermost-javascript#master", "mattermost": "mattermost/mattermost-javascript#master",
"match-at": "0.1.0",
"object-assign": "4.1.0", "object-assign": "4.1.0",
"perfect-scrollbar": "0.6.11", "perfect-scrollbar": "0.6.11",
"react": "15.0.2", "react": "15.0.2",
@@ -26,9 +27,8 @@
"react-bootstrap": "0.29.3", "react-bootstrap": "0.29.3",
"react-custom-scrollbars": "4.0.0-beta.1", "react-custom-scrollbars": "4.0.0-beta.1",
"react-dom": "15.0.2", "react-dom": "15.0.2",
"react-intl": "2.1.2", "react-intl": "2.0.0-rc-1",
"react-router": "2.4.0", "react-router": "2.4.0",
"react-select": "1.0.0-beta13",
"react-textarea-autosize": "4.0.1", "react-textarea-autosize": "4.0.1",
"superagent": "1.8.3", "superagent": "1.8.3",
"twemoji": "2.0.5", "twemoji": "2.0.5",

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

@@ -53,7 +53,6 @@ const ActionTypes = Constants.ActionTypes;
import AdminConsole from 'components/admin_console/admin_console.jsx'; import AdminConsole from 'components/admin_console/admin_console.jsx';
import SystemAnalytics from 'components/analytics/system_analytics.jsx'; import SystemAnalytics from 'components/analytics/system_analytics.jsx';
import ConfigurationSettings from 'components/admin_console/configuration_settings.jsx'; import ConfigurationSettings from 'components/admin_console/configuration_settings.jsx';
import LocalizationSettings from 'components/admin_console/localization_settings.jsx';
import UsersAndTeamsSettings from 'components/admin_console/users_and_teams_settings.jsx'; import UsersAndTeamsSettings from 'components/admin_console/users_and_teams_settings.jsx';
import PrivacySettings from 'components/admin_console/privacy_settings.jsx'; import PrivacySettings from 'components/admin_console/privacy_settings.jsx';
import LogSettings from 'components/admin_console/log_settings.jsx'; import LogSettings from 'components/admin_console/log_settings.jsx';
@@ -143,8 +142,8 @@ function preRenderSetup(callwhendone) {
); );
function afterIntl() { function afterIntl() {
I18n.doAddLocaleData();
$.when(d1).done(() => { $.when(d1).done(() => {
I18n.doAddLocaleData();
callwhendone(); callwhendone();
}); });
} }
@@ -363,10 +362,6 @@ function renderRootComponent() {
path='configuration' path='configuration'
component={ConfigurationSettings} component={ConfigurationSettings}
/> />
<Route
path='localization'
component={LocalizationSettings}
/>
<Route <Route
path='users_and_teams' path='users_and_teams'
component={UsersAndTeamsSettings} component={UsersAndTeamsSettings}

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

@@ -9,7 +9,6 @@
@import '~perfect-scrollbar/dist/css/perfect-scrollbar.css'; @import '~perfect-scrollbar/dist/css/perfect-scrollbar.css';
@import '~font-awesome/css/font-awesome.css'; @import '~font-awesome/css/font-awesome.css';
@import '~bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css'; @import '~bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css';
@import '~react-select/dist/react-select.css';
// styles.scss // styles.scss
@import 'utils/module'; @import 'utils/module';

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

@@ -4,9 +4,6 @@
import AppDispatcher from '../dispatcher/app_dispatcher.jsx'; import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
import EventEmitter from 'events'; import EventEmitter from 'events';
import * as GlobalActions from 'action_creators/global_actions.jsx';
import LocalizationStore from './localization_store.jsx';
import Constants from 'utils/constants.jsx'; import Constants from 'utils/constants.jsx';
const ActionTypes = Constants.ActionTypes; const ActionTypes = Constants.ActionTypes;
@@ -103,9 +100,6 @@ class UserStoreClass extends EventEmitter {
this.saveProfile(user); this.saveProfile(user);
this.currentUserId = user.id; this.currentUserId = user.id;
global.window.mm_current_user_id = this.currentUserId; global.window.mm_current_user_id = this.currentUserId;
if (LocalizationStore.getLocale() !== user.locale) {
GlobalActions.newLocalizationSelected(user.locale);
}
} }
getCurrentId() { getCurrentId() {