big locale logic switchover

This commit is contained in:
Peter Cottle 2015-03-28 10:59:46 -07:00
parent c1e7274c72
commit 811b9c1b0e
8 changed files with 121 additions and 46 deletions

View file

@ -1,31 +1,43 @@
var CasperUtils = require('./casperUtils').CasperUtils; var CasperUtils = require('./casperUtils').CasperUtils;
var intl = require('../../js/intl/index.js');
var langLocaleMap = intl.langLocaleMap;
casper.start( casper.start(
CasperUtils.getUrl(), CasperUtils.getUrl(),
function() { function() {
this.test.assertTitle('Learn Git Branching'); this.test.assertTitle('Learn Git Branching');
casper.waitFor(CasperUtils.waits.jsMount) casper.waitFor(CasperUtils.waits.jsMount)
.then(CasperUtils.multiAssert( .then(CasperUtils.asserts.visibleIDs([
CasperUtils.asserts.visibleIDs([ 'commandLineHistory',
'commandLineHistory', ]))
'terminal', .then(function() {
'interfaceWrapper',
'mainVisSpace',
'commandLineBar'
]),
CasperUtils.asserts.visibleSelectors([
'div.visBackgroundColor',
'p.commandLine'
])
))
.waitFor(CasperUtils.waits.allCommandsFinished) Object.keys(langLocaleMap).forEach(function(lang) {
var locale = langLocaleMap[lang];
.then( this.test.assertEvalEquals(function(lang) {
CasperUtils.asserts.visibleSelectors(['p.finished']) debug_App_changeLocaleFromHeaders(lang);
) return debug_Intl_getLocale();
},
locale,
'Testing changing the locale from ' + lang +
' to ' + locale,
{ lang: lang }
);
this.test.assertEvalEquals(function(lang) {
debug_App_changeLocaleFromHeaders(lang);
return debug_Intl_getLocale();
},
locale,
'Testing changing the locale from ' + lang +
' to ' + locale,
{ lang: lang }
);
}.bind(this));
})
.then(CasperUtils.testDone); .then(CasperUtils.testDone);
}).run(); }).run();

View file

@ -12,4 +12,24 @@ describe('LocaleStore', function() {
LocaleActions.changeLocale('ja_JP'); LocaleActions.changeLocale('ja_JP');
expect(LocaleStore.getLocale()).toEqual('ja_JP'); expect(LocaleStore.getLocale()).toEqual('ja_JP');
}); });
it('changes locales from headers', function() {
var headerLocaleMap = LocaleStore.getHeaderLocaleMap();
Object.keys(headerLocaleMap).forEach(function(header) {
LocaleActions.changeLocaleFromHeader(header);
expect(LocaleStore.getLocale()).toEqual(
headerLocaleMap[header]
);
});
});
it('changes locales from languages', function() {
var langLocaleMap = LocaleStore.getLangLocaleMap();
Object.keys(langLocaleMap).forEach(function(lang) {
LocaleActions.changeLocaleFromHeader(lang);
expect(LocaleStore.getLocale()).toEqual(
langLocaleMap[lang]
);
});
});
}); });

View file

@ -13,6 +13,13 @@ var LocaleActions = {
locale: newLocale locale: newLocale
}); });
}, },
changeLocaleFromHeader: function(header) {
AppDispatcher.handleViewAction({
type: ActionTypes.CHANGE_LOCALE_FROM_HEADER,
header: header
});
}
}; };
module.exports = LocaleActions; module.exports = LocaleActions;

View file

@ -5,6 +5,8 @@ var constants = require('../util/constants');
var util = require('../util'); var util = require('../util');
var intl = require('../intl'); var intl = require('../intl');
var GlobalState = require('../util/globalState'); var GlobalState = require('../util/globalState');
var LocaleStore = require('../stores/LocaleStore');
var LocaleActions = require('../actions/LocaleActions');
/** /**
* Globals * Globals
@ -42,6 +44,7 @@ var init = function() {
wait: true wait: true
}); });
LocaleStore.subscribe('change', intlRefresh);
events.on('localeChanged', intlRefresh); events.on('localeChanged', intlRefresh);
events.on('vcsModeChange', vcsModeRefresh); events.on('vcsModeChange', vcsModeRefresh);
@ -250,32 +253,9 @@ function tryLocaleDetect() {
} }
function changeLocaleFromHeaders(langString) { function changeLocaleFromHeaders(langString) {
try { LocaleActions.changeLocaleFromHeaders(langString);
var languages = langString.split(','); GlobalState.locale = LocaleStore.getLocale();
var desiredLocale; events.trigger('localeChanged');
for (var i = 0; i < languages.length; i++) {
var header = languages[i].split(';')[0];
// first check the full string raw
if (intl.headerLocaleMap[header]) {
desiredLocale = intl.headerLocaleMap[header];
break;
}
var lang = header.slice(0, 2);
if (intl.langLocaleMap[lang]) {
desiredLocale = intl.langLocaleMap[lang];
break;
}
}
if (!desiredLocale || desiredLocale == intl.getLocale()) {
return;
}
// actually change it here
GlobalState.locale = desiredLocale;
events.trigger('localeChanged');
} catch (e) {
console.warn('locale change fail', e);
}
} }
if (require('../util').isBrowser()) { if (require('../util').isBrowser()) {

View file

@ -6,7 +6,8 @@ module.exports = {
ActionTypes: keyMirror({ ActionTypes: keyMirror({
SUBMIT_COMMAND: null, SUBMIT_COMMAND: null,
CHANGE_LOCALE: null CHANGE_LOCALE: null,
CHANGE_LOCALE_FROM_HEADER: null
}), }),
PayloadSources: keyMirror({ PayloadSources: keyMirror({

View file

@ -25,7 +25,7 @@ var langLocaleMap = exports.langLocaleMap = {
es: 'es_AR', es: 'es_AR',
fr: 'fr_FR', fr: 'fr_FR',
de: 'de_DE', de: 'de_DE',
pt: 'pt_BR', pt: 'pt_BR'
}; };
var fallbackMap = { var fallbackMap = {

View file

@ -9,9 +9,56 @@ var assign = require('object-assign');
var ActionTypes = AppConstants.ActionTypes; var ActionTypes = AppConstants.ActionTypes;
var CHANGE_EVENT = 'change'; var CHANGE_EVENT = 'change';
// resolve the messy mapping between browser language
// and our supported locales
var langLocaleMap = {
en: 'en_US',
zh: 'zh_CN',
ja: 'ja',
ko: 'ko',
es: 'es_AR',
fr: 'fr_FR',
de: 'de_DE',
pt: 'pt_BR'
};
var headerLocaleMap = {
'zh-CN': 'zh_CN',
'zh-TW': 'zh_TW',
'pt-BR': 'pt_BR'
};
function _getLocaleFromHeader(langString) {
var languages = langString.split(',');
var desiredLocale;
for (var i = 0; i < languages.length; i++) {
var header = languages[i].split(';')[0];
// first check the full string raw
if (headerLocaleMap[header]) {
desiredLocale = headerLocaleMap[header];
break;
}
var lang = header.slice(0, 2);
if (langLocaleMap[lang]) {
desiredLocale = langLocaleMap[lang];
break;
}
}
return desiredLocale;
}
var _locale = 'en_US'; var _locale = 'en_US';
var LocaleStore = assign({}, EventEmitter.prototype, { var LocaleStore = assign({}, EventEmitter.prototype, {
getLangLocaleMap: function() {
return assign({}, langLocaleMap);
},
getHeaderLocaleMap: function() {
return assign({}, headerLocaleMap);
},
subscribe: function(cb) { subscribe: function(cb) {
this.on(CHANGE_EVENT, cb); this.on(CHANGE_EVENT, cb);
}, },
@ -33,6 +80,13 @@ var LocaleStore = assign({}, EventEmitter.prototype, {
_locale = action.locale; _locale = action.locale;
shouldInform = true; shouldInform = true;
break; break;
case ActionTypes.CHANGE_LOCALE_FROM_HEADER:
var value = _getLocaleFromHeader(action.header);
if (value) {
_locale = value;
shouldInform = true;
}
break;
} }
if (shouldInform) { if (shouldInform) {

View file

@ -6,6 +6,7 @@ var toGlobalize = {
Visuals: require('../visuals'), Visuals: require('../visuals'),
Git: require('../git'), Git: require('../git'),
CommandModel: require('../models/commandModel'), CommandModel: require('../models/commandModel'),
LocaleStore: require('../stores/LocaleStore'),
Levels: require('../graph/treeCompare'), Levels: require('../graph/treeCompare'),
Constants: require('../util/constants'), Constants: require('../util/constants'),
Commands: require('../commands'), Commands: require('../commands'),