diff --git a/locales/en/app.json b/locales/en/app.json new file mode 100644 index 0000000000..b704d9bf3b --- /dev/null +++ b/locales/en/app.json @@ -0,0 +1,7 @@ +{ + "languageName": "English", + "1": "server", + "clientSideStrings": { + "1": "client" + } +} \ No newline at end of file diff --git a/public/js/controllers/settingsCtrl.js b/public/js/controllers/settingsCtrl.js index e0747ba473..18141336a4 100644 --- a/public/js/controllers/settingsCtrl.js +++ b/public/js/controllers/settingsCtrl.js @@ -40,6 +40,7 @@ habitrpg.controller('SettingsCtrl', $rootScope.$on('userSynced', function(){ location.reload(); }); + console.log($scope.language); User.set('preferences.language', $scope.language); } diff --git a/src/middleware.js b/src/middleware.js index d2f273066b..f9c07caf9c 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -87,30 +87,47 @@ fs.readdirSync(path.join(__dirname, "/../locales")).forEach(function(file) { translations[file] = require(path.join(__dirname, "/../locales/", file, 'app.json')) }); +var langCodes = Object.keys(translations); + var getTranslatedString = function(locale, string){ if(!locale || !string) throw new Error("Missing locale and/or string argument."); - if(!translations[locale]) throw new Error("Missing locale '" + locale + "'"); + // Should never be called + //if(!translations[locale]) throw new Error("Missing locale '" + locale + "'"); // TODO support nested dot-separated strings if(translations[locale][string]) return translations[locale][string]; if(translations['en'][string]) return translations['en'][string]; - return 'String not found!'; + return 'String not found.'; } +var avalaibleLanguages = _.map(langCodes, function(langCode){ + return { + code: langCode, + name: translations[langCode].languageName + } +}); + var getUserLanguage = function(req, callback){ var getFromBrowser = function(){ - return _(req.acceptedLanguages).map(function(lang){ + var acceptable = _(req.acceptedLanguages).map(function(lang){ return lang.slice(0, 2); - }).uniq().value()[0]; + }).uniq().value(); + + var matches = _.intersection(acceptable, langCodes); + return matches.length > 0 ? matches[0] : 'en'; }; if(req.session && req.session.userId){ User.findOne({_id: req.session.userId}, function(err, user){ if(err) return callback(err); - return callback(null, user.preferences.language || getFromBrowser()); + if(user && user.preferences.language && translations[user.preferences.language]){ + return callback(null, _.find(avalaibleLanguages, {code: user.preferences.language})); + }else{ + return callback(null, _.find(avalaibleLanguages, {code: getFromBrowser()})) + } }); }else{ - return callback(null, getFromBrowser()); + return callback(null, _.find(avalaibleLanguages, {code: getFromBrowser()})); } } @@ -126,11 +143,11 @@ module.exports.locals = function(req, res, next) { STRIPE_PUB_KEY: nconf.get('STRIPE_PUB_KEY'), getManifestFiles: getManifestFiles, getBuildUrl: getBuildUrl, - avalaibleLanguages: Object.keys(translations), - // should send something like {en: "English"} instead of [en, it, ...] + avalaibleLanguages: avalaibleLanguages, language: language, + translations: translations[language.code].clientSideStrings, t: function(string){ - return getTranslatedString(language, string); + return getTranslatedString(language.code, string); } } diff --git a/views/options/settings.jade b/views/options/settings.jade index 36fa72b489..0b587fc567 100644 --- a/views/options/settings.jade +++ b/views/options/settings.jade @@ -11,7 +11,7 @@ script(type='text/ng-template', id='partials/options.settings.html') | Habit defaults to check and reset your dailies at midnight in your time zone each day. You can customize the hour here (enter a number between 0 and 24). hr h4 Language - select(ng-model='language', ng-options='language for language in avalaibleLanguages', ng-change='changeLanguage()') + select(ng-model='language.code', ng-options='lang.code as lang.name for lang in avalaibleLanguages', ng-change='changeLanguage()') hr h4 Misc button.btn(ng-hide='user.preferences.hideHeader', ng-click='set("preferences.hideHeader",true)') Hide Header