add sample app.json for new translations, send client side strings to the browser, send languages to the browser with a language name and code

This commit is contained in:
Matteo Pagliazzi
2013-11-12 22:01:27 +01:00
parent 7351697cbb
commit be2010b0a2
4 changed files with 35 additions and 10 deletions

7
locales/en/app.json Normal file
View File

@@ -0,0 +1,7 @@
{
"languageName": "English",
"1": "server",
"clientSideStrings": {
"1": "client"
}
}

View File

@@ -40,6 +40,7 @@ habitrpg.controller('SettingsCtrl',
$rootScope.$on('userSynced', function(){
location.reload();
});
console.log($scope.language);
User.set('preferences.language', $scope.language);
}

View File

@@ -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);
}
}

View File

@@ -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