Skip to content

Commit

Permalink
Merge branch 'develop' of https://github.com/HabitRPG/habitrpg into d…
Browse files Browse the repository at this point in the history
…evelop
  • Loading branch information
paglias committed May 7, 2014
2 parents 5666ced + f2ad6f7 commit facdca4
Show file tree
Hide file tree
Showing 35 changed files with 344 additions and 311 deletions.
2 changes: 1 addition & 1 deletion bower.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"bootstrap": "~3.1.0",
"bootstrap-growl": "git://github.com/ifightcrime/bootstrap-growl.git#master",
"bootstrap-tour": "~0.8.1",
"habitrpg-shared": "git://github.com/HabitRPG/habitrpg-shared.git#develop",
"habitrpg-shared": "git://github.com/HabitRPG/habitrpg-shared.git",
"BrowserQuest": "git://github.com/mozilla/BrowserQuest.git",
"github-buttons": "git://github.com/mdo/github-buttons.git",
"marked": "~0.2.9",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"version": "0.0.0-152",
"main": "./src/server.js",
"dependencies": {
"habitrpg-shared": "git://github.com/HabitRPG/habitrpg-shared#develop",
"habitrpg-shared": "git://github.com/HabitRPG/habitrpg-shared",
"connect-mongo": "*",
"express": "3.5.x",
"gzippo": "*",
Expand Down
4 changes: 2 additions & 2 deletions public/js/controllers/groupsCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
"public": Groups.publicGuilds()
}
$scope.type = 'guild';
$scope.text = 'Guild';
$scope.text = window.env.t('guild');
var newGroup = function(){
return new Groups.Group({type:'guild', privacy:'private'});
}
Expand Down Expand Up @@ -316,7 +316,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
.controller("PartyCtrl", ['$rootScope','$scope', 'Groups', 'User', 'Challenges', '$state', '$compile',
function($rootScope,$scope, Groups, User, Challenges, $state, $compile) {
$scope.type = 'party';
$scope.text = 'Party';
$scope.text = window.env.t('party');
$scope.group = $rootScope.party = Groups.party();
$scope.newGroup = new Groups.Group({type:'party'});

Expand Down
4 changes: 2 additions & 2 deletions public/js/controllers/inventoryCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User',
var food = $scope.selectedFood
if (food.key == 'Saddle') {
if (!$window.confirm(window.env.t('useSaddle', {pet: pet}))) return;
} else if (!$window.confirm(window.env.t('feedPet', {name: petDisplayName, article: food.article, text: food.text}))) {
} else if (!$window.confirm(window.env.t('feedPet', {name: petDisplayName, article: food.article, text: food.text()}))) {
return;
}
User.user.ops.feed({params:{pet: pet, food: food.key}});
Expand All @@ -124,7 +124,7 @@ habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User',
var item = Content.quests[quest];
var completedPrevious = !item.previous || (User.user.achievements.quests && User.user.achievements.quests[item.previous]);
if (!completedPrevious)
return alert(window.env.t('mustComplete', {quest: $rootScope.Content.quests[item.previous].text}));
return alert(window.env.t('mustComplete', {quest: $rootScope.Content.quests[item.previous].text()}));
if (item.lvl && item.lvl > user.stats.lvl)
return alert(window.env.t('mustLevel', {level: item.lvl}));
$rootScope.selectedQuest = item;
Expand Down
8 changes: 4 additions & 4 deletions public/js/controllers/rootCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -204,11 +204,11 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$

$http.post('/api/v2/user/class/cast/'+spell.key+'?targetType='+type+'&targetId='+targetId)
.success(function(){
var msg = window.env.t('youCast', {spell: spell.text});
var msg = window.env.t('youCast', {spell: spell.text()});
switch (type) {
case 'task': msg = window.env.t('youCastTarget', {spell: spell.text, target: target.text});break;
case 'user': msg = window.env.t('youCastTarget', {spell: spell.text, target: target.profile.name});break;
case 'party': msg = window.env.t('youCastParty', {spell: spell.text});break;
case 'task': msg = window.env.t('youCastTarget', {spell: spell.text(), target: target.text});break;
case 'user': msg = window.env.t('youCastTarget', {spell: spell.text(), target: target.profile.name});break;
case 'party': msg = window.env.t('youCastParty', {spell: spell.text()});break;
}
Notification.text(msg);
});
Expand Down
8 changes: 2 additions & 6 deletions public/js/env.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,5 @@ if(window.moment && window.env.language && window.env.language.momentLang && win
window.moment.lang(window.env.language.momentLangCode);
}

window.env.t = function(stringName, vars){
var string = window.env.translations[stringName];
if(!string) return window._.template(window.env.translations.stringNotFound, {string: stringName});

return vars === undefined ? string : window._.template(string, vars);
}
window.habitrpgShared.i18n.strings = window.env.translations;
window.env.t = window.habitrpgShared.i18n.t;
7 changes: 7 additions & 0 deletions public/js/services/guideServices.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,13 @@ angular.module('guideServices', []).
});
$('.main-herobox').popover('destroy');
var tour = new Tour({
template: "<div class='popover'>" +
"<div class='arrow'></div><h3 class='popover-title'></h3><div class='popover-content'></div>" +
"<div class='popover-navigation'><div class='btn-group'>" +
"<button class='btn btn-sm btn-default' data-role='prev'>&laquo;</button>" +
"<button class='btn btn-sm btn-default' data-role='next'>&raquo;</button>" +
"<button class='btn btn-sm btn-default' data-role='pause-resume' data-pause-text='Pause' data-resume-text='Resume'>Pause</button></div>" +
"<button class='btn btn-sm btn-default' data-role='end'>" + window.env.t('endTour') + "</button></div></div>",
onEnd: function(){
User.set({'flags.showTour': false});
}
Expand Down
6 changes: 6 additions & 0 deletions src/controllers/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ api.registerUser = function(req, res, next) {
timestamps: {created: +new Date(), loggedIn: +new Date()}
}
};
newUser.preferences = newUser.preferences || {};
newUser.preferences.language = req.language; // User language detected from browser, not saved
user = new User(newUser);

// temporary for conventions
Expand Down Expand Up @@ -255,7 +257,11 @@ api.setupPassport = function(router) {
},
function(user, cb){
if (user) return cb(null, user);

user = new User({
preferences: {
language: req.language // User language detected from browser, not saved
},
auth: {
facebook: req.user,
timestamps: {created: +new Date(), loggedIn: +new Date()}
Expand Down
6 changes: 4 additions & 2 deletions src/controllers/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ api.score = function(req, res, next) {
if (task.type === 'daily' || task.type === 'todo')
task.completed = direction === 'up';
}
var delta = user.ops.score({params:{id:task.id, direction:direction}});
var delta = user.ops.score({params:{id:task.id, direction:direction}, language: req.language});

user.save(function(err,saved){
if (err) return next(err);
Expand Down Expand Up @@ -336,7 +336,7 @@ api.cast = function(req, res, next) {

if (group) {
series.push(function(cb2){
var message = '`'+user.profile.name+' casts '+spell.text + (targetType=='user' ? ' on '+found.profile.name : ' for the party')+'.`';
var message = '`'+user.profile.name+' casts '+spell.text() + (targetType=='user' ? ' on '+found.profile.name : ' for the party')+'.`';
group.sendChat(message);
group.save(cb2);
})
Expand Down Expand Up @@ -397,6 +397,8 @@ api.batchUpdate = function(req, res, next) {
res.locals.ops = [];
var ops = _.transform(req.body, function(m,_req){
if (_.isEmpty(_req)) return;
_req.language = req.language;

m.push(function() {
var cb = arguments[arguments.length-1];
res.locals.ops.push(_req);
Expand Down
97 changes: 97 additions & 0 deletions src/i18n.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
var fs = require('fs'),
path = require('path'),
_ = require('lodash'),
User = require('./models/user').model,
shared = require('habitrpg-shared'),
translations = {};

var loadTranslations = function(locale){
var files = fs.readdirSync(path.join(__dirname, "/../node_modules/habitrpg-shared/locales/", locale));
translations[locale] = {};
_.each(files, function(file){
_.merge(translations[locale], require(path.join(__dirname, "/../node_modules/habitrpg-shared/locales/", locale, file)));
});
};

// First fetch english so we can merge with missing strings in other languages
loadTranslations('en');

fs.readdirSync(path.join(__dirname, "/../node_modules/habitrpg-shared/locales/")).forEach(function(file) {
if(file === 'en' || file === 'README.md') return;
loadTranslations(file);
// Merge missing strings from english
_.defaults(translations[file], translations.en);
});

var langCodes = Object.keys(translations);

var avalaibleLanguages = _.map(langCodes, function(langCode){
return {
code: langCode,
name: translations[langCode].languageName
}
});

// Load MomentJS localization files
var momentLangs = {};

// Handle different language codes from MomentJS and /locales
var momentLangsMapping = {
'en': 'en-gb',
'no': 'nn'
};

var momentLangs = {};

_.each(langCodes, function(code){
var lang = _.find(avalaibleLanguages, {code: code});
lang.momentLangCode = (momentLangsMapping[code] || code);
try{
// MomentJS lang files are JS files that has to be executed in the browser so we load them as plain text files
var f = fs.readFileSync(path.join(__dirname, '/../node_modules/moment/lang/' + lang.momentLangCode + '.js'), 'utf8');
momentLangs[code] = f;
}catch (e){}
});

var getUserLanguage = function(req, res, next){
var getFromBrowser = function(){
var acceptable = _(req.acceptedLanguages).map(function(lang){
return lang.slice(0, 2);
}).uniq().value();
var matches = _.intersection(acceptable, langCodes);
return matches.length > 0 ? matches[0] : 'en';
};

var getFromUser = function(user){
var lang;
if(user && user.preferences.language && translations[user.preferences.language]){
lang = user.preferences.language;
}else{
var preferred = getFromBrowser();
lang = translations[preferred] ? preferred : 'en';
}
req.language = lang;
next();
};

if(req.locals && req.locals.user){
getFromUser(req.locals.user);
}else if(req.session && req.session.userId){
User.findOne({_id: req.session.userId}, function(err, user){
if(err) return callback(err);
getFromUser(user);
});
}else{
getFromUser(null);
}
};

shared.i18n.translations = translations;

module.exports = {
translations: translations,
avalaibleLanguages: avalaibleLanguages,
langCodes: langCodes,
getUserLanguage: getUserLanguage,
momentLangs: momentLangs
};
Loading

0 comments on commit facdca4

Please sign in to comment.