diff --git a/src/js/app/index.js b/src/js/app/index.js index cf7a7548..ef6e6fac 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -198,6 +198,8 @@ var initDemo = function(sandbox) { if (params.locale !== undefined && params.locale.length) { GlobalState.locale = params.locale; events.trigger('localeChanged'); + } else { + tryLocaleDetect(); } if (params.command) { @@ -209,6 +211,45 @@ var initDemo = function(sandbox) { }; +function tryLocaleDetect() { + // lets fire off a request to get our headers which then + // can help us identify what locale the browser is in. + // wrap everything in a try since this is a third party service + try { + $.ajax({ + url: 'http://ajaxhttpheaders.appspot.com', + dataType: 'jsonp', + success: function(headers) { + changeLocaleFromHeaders(headers['Accept-Language']); + } + }); + } catch (e) { + console.warn('locale detect fail', e); + } +} + +function changeLocaleFromHeaders(langString) { + try { + var languages = langString.split(','); + var desiredLocale; + for (var i = 0; i < languages.length; i++) { + var lang = languages[i].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()) { // this file gets included via node sometimes as well $(document).ready(init); diff --git a/src/js/intl/index.js b/src/js/intl/index.js index 31e5d490..2f299be7 100644 --- a/src/js/intl/index.js +++ b/src/js/intl/index.js @@ -9,6 +9,18 @@ var getDefaultLocale = exports.getDefaultLocale = function() { return 'en_US'; }; +// resolve the messy mapping between browser language +// and our supported locales +var langLocaleMap = exports.langLocaleMap = { + en: 'en_US', + zh: 'zh_CN', + ja: 'ja', + ko: 'ko', + es: 'es_AR', + fr: 'fr_FR', + de: 'de_DE', +}; + var fallbackMap = { 'zh_TW': 'zh_CN' };