From 499fbe21fdd5b7f2735a27e76a300f69039cfbd3 Mon Sep 17 00:00:00 2001
From: Peter Jaszkowiak
Date: Mon, 5 Sep 2016 12:24:40 -0600
Subject: [PATCH] Use new translator API where it makes sense
---
public/src/admin/admin.js | 51 +++---
public/src/admin/appearance/themes.js | 2 +-
public/src/admin/general/navigation.js | 6 +-
public/src/admin/manage/categories.js | 6 +-
public/src/admin/manage/groups.js | 16 +-
public/src/app.js | 205 ++++++++++++-------------
public/src/client/account/edit.js | 10 +-
public/src/client/categories.js | 1 -
public/src/client/category.js | 2 +-
public/src/client/chats/messages.js | 7 +-
public/src/client/register.js | 18 +--
public/src/client/topic/postTools.js | 19 +--
public/src/client/topic/threadTools.js | 7 +-
public/src/modules/alerts.js | 7 +-
public/src/modules/chat.js | 10 +-
public/src/modules/translator.d.ts | 106 +++++++++++++
16 files changed, 286 insertions(+), 187 deletions(-)
create mode 100644 public/src/modules/translator.d.ts
diff --git a/public/src/admin/admin.js b/public/src/admin/admin.js
index add13c30cc..0836c94bb1 100644
--- a/public/src/admin/admin.js
+++ b/public/src/admin/admin.js
@@ -1,7 +1,9 @@
"use strict";
-/*global config, translator, componentHandler, define, socket, app, ajaxify, utils, bootbox, Slideout, NProgress, RELATIVE_PATH*/
+/*global config, componentHandler, socket, app, bootbox, Slideout, NProgress*/
+
+require(['translator'], function (trans) {
+ var translator = trans.Translator.create();
-(function() {
var logoutTimer = 0;
function startLogoutTimer() {
if (logoutTimer) {
@@ -9,15 +11,13 @@
}
logoutTimer = setTimeout(function() {
- require(['translator'], function(translator) {
- translator.translate('[[login:logged-out-due-to-inactivity]]', function(translated) {
- bootbox.alert({
- closeButton: false,
- message: translated,
- callback: function(){
- window.location.reload();
- }
- });
+ translator.translate('[[login:logged-out-due-to-inactivity]]').then(function(translated) {
+ bootbox.alert({
+ closeButton: false,
+ message: translated,
+ callback: function(){
+ window.location.reload();
+ }
});
});
}, 3600000);
@@ -52,8 +52,6 @@
});
$(window).on('action:ajaxify.contentLoaded', function(ev, data) {
- var url = data.url;
-
selectMenuItem(data.url);
setupRestartLinks();
@@ -65,7 +63,7 @@
NProgress.set(0.7);
});
- $(window).on('action:ajaxify.end', function(ev, data) {
+ $(window).on('action:ajaxify.end', function() {
NProgress.done();
});
}
@@ -82,7 +80,7 @@
socket.emit('admin.restart');
});
- mousetrap.bind('/', function(event) {
+ mousetrap.bind('/', function() {
$('#acp-search input').focus();
return false;
@@ -145,19 +143,16 @@
function launchSnackbar(params) {
var message = (params.title ? "" + params.title + "" : '') + (params.message ? params.message : '');
-
- require(['translator'], function(translator) {
- translator.translate(message, function(html) {
- var bar = $.snackbar({
- content: html,
- timeout: 3000,
- htmlAllowed: true
- });
-
- if (params.clickfn) {
- bar.on('click', params.clickfn);
- }
+ translator.translate(message).then(function(html) {
+ var bar = $.snackbar({
+ content: html,
+ timeout: 3000,
+ htmlAllowed: true
});
+
+ if (params.clickfn) {
+ bar.on('click', params.clickfn);
+ }
});
}
@@ -199,4 +194,4 @@
});
});
}
-}());
\ No newline at end of file
+});
\ No newline at end of file
diff --git a/public/src/admin/appearance/themes.js b/public/src/admin/appearance/themes.js
index 901f64b688..cc156ba127 100644
--- a/public/src/admin/appearance/themes.js
+++ b/public/src/admin/appearance/themes.js
@@ -1,7 +1,7 @@
"use strict";
/* global define, app, socket, bootbox, templates, config */
-define('admin/appearance/themes', function() {
+define('admin/appearance/themes', ['translator'], function(translator) {
var Themes = {};
Themes.init = function() {
diff --git a/public/src/admin/general/navigation.js b/public/src/admin/general/navigation.js
index 1837fc590f..f6be591842 100644
--- a/public/src/admin/general/navigation.js
+++ b/public/src/admin/general/navigation.js
@@ -1,7 +1,7 @@
"use strict";
-/* global define, app, ajaxify, socket, templates */
+/* global define, app, ajaxify, socket, templates, componentHandler */
-define('admin/general/navigation', ['translator', 'iconSelect', 'jqueryui'], function(translator, iconSelect, jqueryui) {
+define('admin/general/navigation', ['translator', 'iconSelect', 'jqueryui'], function(translator, iconSelect) {
var navigation = {},
available;
@@ -77,7 +77,7 @@ define('admin/general/navigation', ['translator', 'iconSelect', 'jqueryui'], fun
templates.parse('admin/general/navigation', 'enabled', {enabled: [data]}, function(li) {
li = $(translator.unescape(li));
$('#enabled').append(li);
- componentHandler.upgradeDom()
+ componentHandler.upgradeDom();
});
}
diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js
index 4683d20e60..f4a65d8ca7 100644
--- a/public/src/admin/manage/categories.js
+++ b/public/src/admin/manage/categories.js
@@ -1,7 +1,7 @@
"use strict";
/*global define, socket, app, bootbox, templates, ajaxify, Sortable */
-define('admin/manage/categories', ['vendor/jquery/serializeObject/jquery.ba-serializeobject.min'], function() {
+define('admin/manage/categories', ['translator', 'vendor/jquery/serializeObject/jquery.ba-serializeobject.min'], function(translator) {
var Categories = {}, newCategoryId = -1, sortables;
Categories.init = function() {
@@ -121,10 +121,10 @@ define('admin/manage/categories', ['vendor/jquery/serializeObject/jquery.ba-seri
}
function itemDragDidEnd(e) {
- var isCategoryUpdate = (newCategoryId != -1);
+ var isCategoryUpdate = parseInt(newCategoryId, 10) !== -1;
//Update needed?
- if((e.newIndex != undefined && e.oldIndex != e.newIndex) || isCategoryUpdate){
+ if((typeof e.newIndex !== 'undefined' && parseInt(e.oldIndex, 10) !== parseInt(e.newIndex), 10) || isCategoryUpdate){
var parentCategory = isCategoryUpdate ? sortables[newCategoryId] : sortables[e.from.dataset.cid],
modified = {}, i = 0, list = parentCategory.toArray(), len = list.length;
diff --git a/public/src/admin/manage/groups.js b/public/src/admin/manage/groups.js
index 3eee1ca08c..595bd7e026 100644
--- a/public/src/admin/manage/groups.js
+++ b/public/src/admin/manage/groups.js
@@ -1,10 +1,9 @@
"use strict";
-/*global define, templates, socket, ajaxify, app, admin, bootbox, utils, config */
+/*global define, templates, socket, ajaxify, app, bootbox, utils, config */
define('admin/manage/groups', [
- 'translator',
- 'components'
-], function(translator, components) {
+ 'translator'
+], function(translator) {
var Groups = {};
var intervalId = 0;
@@ -32,10 +31,9 @@ define('admin/manage/groups', [
createModalGo.on('click', function() {
var submitObj = {
- name: createGroupName.val(),
- description: $('#create-group-desc').val()
- },
- errorText;
+ name: createGroupName.val(),
+ description: $('#create-group-desc').val()
+ };
socket.emit('admin.groups.create', submitObj, function(err) {
if (err) {
@@ -68,7 +66,7 @@ define('admin/manage/groups', [
if (confirm) {
socket.emit('groups.delete', {
groupName: groupName
- }, function(err, data) {
+ }, function(err) {
if(err) {
return app.alertError(err.message);
}
diff --git a/public/src/app.js b/public/src/app.js
index 0e357dc50e..788ab87446 100644
--- a/public/src/app.js
+++ b/public/src/app.js
@@ -130,28 +130,6 @@ app.cacheBuster = null;
});
};
- app.handleInvalidSession = function() {
- if (app.flags && app.flags._sessionRefresh) {
- return;
- }
-
- app.flags = app.flags || {};
- app.flags._sessionRefresh = true;
-
- require(['translator'], function(translator) {
- translator.translate('[[error:invalid-session-text]]', function(translated) {
- bootbox.alert({
- title: '[[error:invalid-session]]',
- message: translated,
- closeButton: false,
- callback: function() {
- window.location.reload();
- }
- });
- });
- });
- };
-
app.enterRoom = function (room, callback) {
callback = callback || function() {};
if (socket && app.user.uid && app.currentRoom !== room) {
@@ -309,63 +287,6 @@ app.cacheBuster = null;
});
};
- var titleObj = {
- active: false,
- interval: undefined,
- titles: []
- };
-
- app.alternatingTitle = function (title) {
- if (typeof title !== 'string') {
- return;
- }
-
- if (title.length > 0 && !app.isFocused) {
- if (!titleObj.titles[0]) {
- titleObj.titles[0] = window.document.title;
- }
-
- require(['translator'], function(translator) {
- translator.translate(title, function(translated) {
- titleObj.titles[1] = translated;
- if (titleObj.interval) {
- clearInterval(titleObj.interval);
- }
-
- titleObj.interval = setInterval(function() {
- var title = titleObj.titles[titleObj.titles.indexOf(window.document.title) ^ 1];
- if (title) {
- window.document.title = $('').html(title).text();
- }
- }, 2000);
- });
- });
- } else {
- if (titleObj.interval) {
- clearInterval(titleObj.interval);
- }
- if (titleObj.titles[0]) {
- window.document.title = $('').html(titleObj.titles[0]).text();
- }
- }
- };
-
- app.refreshTitle = function(title) {
- if (!title) {
- return;
- }
- require(['translator'], function(translator) {
- title = config.titleLayout.replace(/{/g, '{').replace(/}/g, '}')
- .replace('{pageTitle}', function() { return title; })
- .replace('{browserTitle}', function() { return config.browserTitle; });
-
- translator.translate(title, function(translated) {
- titleObj.titles[0] = translated;
- app.alternatingTitle('');
- });
- });
- };
-
app.toggleNavbar = function(state) {
var navbarEl = $('.navbar');
if (navbarEl) {
@@ -473,21 +394,6 @@ app.cacheBuster = null;
});
}
- app.updateUserStatus = function(el, status) {
- if (!el.length) {
- return;
- }
-
- require(['translator'], function(translator) {
- translator.translate('[[global:' + status + ']]', function(translated) {
- el.removeClass('online offline dnd away')
- .addClass(status)
- .attr('title', translated)
- .attr('data-original-title', translated);
- });
- });
- };
-
app.newTopic = function (cid) {
$(window).trigger('action:composer.topic.new', {
cid: cid || ajaxify.data.cid || 0
@@ -542,10 +448,20 @@ app.cacheBuster = null;
}
};
- app.parseAndTranslate = function(template, blockName, data, callback) {
- require(['translator'], function(translator) {
+ app.loadProgressiveStylesheet = function() {
+ var linkEl = document.createElement('link');
+ linkEl.rel = 'stylesheet';
+ linkEl.href = config.relative_path + '/js-enabled.css';
+
+ document.head.appendChild(linkEl);
+ };
+
+ require(['translator'], function(trans) {
+ var translator = trans.Translator.create();
+
+ app.parseAndTranslate = function(template, blockName, data, callback) {
function translate(html, callback) {
- translator.translate(html, function(translatedHTML) {
+ translator.translate(html).then(function(translatedHTML) {
translatedHTML = translator.unescape(translatedHTML);
callback($(translatedHTML));
});
@@ -562,14 +478,93 @@ app.cacheBuster = null;
translate(html, callback);
});
}
- });
- };
+ };
- app.loadProgressiveStylesheet = function() {
- var linkEl = document.createElement('link');
- linkEl.rel = 'stylesheet';
- linkEl.href = config.relative_path + '/js-enabled.css';
+ app.handleInvalidSession = function() {
+ if (app.flags && app.flags._sessionRefresh) {
+ return;
+ }
- document.head.appendChild(linkEl);
- };
+ app.flags = app.flags || {};
+ app.flags._sessionRefresh = true;
+
+ translator.translate('[[error:invalid-session-text]]').then(function(translated) {
+ bootbox.alert({
+ title: '[[error:invalid-session]]',
+ message: translated,
+ closeButton: false,
+ callback: function() {
+ window.location.reload();
+ }
+ });
+ });
+ };
+
+ var titleObj = {
+ active: false,
+ interval: undefined,
+ titles: []
+ };
+
+ app.alternatingTitle = function (title) {
+ if (typeof title !== 'string') {
+ return;
+ }
+
+ if (title.length > 0 && !app.isFocused) {
+ if (!titleObj.titles[0]) {
+ titleObj.titles[0] = window.document.title;
+ }
+
+
+ translator.translate(title).then(function(translated) {
+ titleObj.titles[1] = translated;
+ if (titleObj.interval) {
+ clearInterval(titleObj.interval);
+ }
+
+ titleObj.interval = setInterval(function() {
+ var title = titleObj.titles[titleObj.titles.indexOf(window.document.title) ^ 1];
+ if (title) {
+ window.document.title = $('').html(title).text();
+ }
+ }, 2000);
+ });
+ } else {
+ if (titleObj.interval) {
+ clearInterval(titleObj.interval);
+ }
+ if (titleObj.titles[0]) {
+ window.document.title = $('').html(titleObj.titles[0]).text();
+ }
+ }
+ };
+
+ app.refreshTitle = function(title) {
+ if (!title) {
+ return;
+ }
+ title = config.titleLayout.replace(/{/g, '{').replace(/}/g, '}')
+ .replace('{pageTitle}', function() { return title; })
+ .replace('{browserTitle}', function() { return config.browserTitle; });
+
+ translator.translate(title).then(function(translated) {
+ titleObj.titles[0] = translated;
+ app.alternatingTitle('');
+ });
+ };
+
+ app.updateUserStatus = function(el, status) {
+ if (!el.length) {
+ return;
+ }
+
+ translator.translate('[[global:' + status + ']]').then(function(translated) {
+ el.removeClass('online offline dnd away')
+ .addClass(status)
+ .attr('title', translated)
+ .attr('data-original-title', translated);
+ });
+ };
+ });
}());
diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js
index 6cbea282d0..9f4a57b4c8 100644
--- a/public/src/client/account/edit.js
+++ b/public/src/client/account/edit.js
@@ -2,7 +2,9 @@
/* globals define, ajaxify, socket, app, config, templates, bootbox */
-define('forum/account/edit', ['forum/account/header', 'uploader', 'translator', 'components'], function(header, uploader, translator, components) {
+define('forum/account/edit', ['forum/account/header', 'uploader', 'translator', 'components'], function(header, uploader, trans, components) {
+ var translator = trans.Translator.create();
+
var AccountEdit = {};
AccountEdit.init = function() {
@@ -86,7 +88,7 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator',
uploaded: uploaded,
allowProfileImageUploads: ajaxify.data.allowProfileImageUploads
}, function(html) {
- translator.translate(html, function(html) {
+ translator.translate(html).then(function(html) {
var modal = bootbox.dialog({
className: 'picture-switcher',
title: '[[user:change_picture]]',
@@ -158,7 +160,7 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator',
function handleAccountDelete() {
$('#deleteAccountBtn').on('click', function() {
- translator.translate('[[user:delete_account_confirm]]', function(translated) {
+ translator.translate('[[user:delete_account_confirm]]').then(function(translated) {
var modal = bootbox.confirm(translated + '', function(confirm) {
if (!confirm) {
return;
@@ -229,7 +231,7 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator',
modal.find('[data-action="upload-url"]').on('click', function() {
modal.modal('hide');
templates.parse('partials/modals/upload_picture_from_url_modal', {}, function(html) {
- translator.translate(html, function(html) {
+ translator.translate(html).then(function(html) {
var uploadModal = $(html);
uploadModal.modal('show');
diff --git a/public/src/client/categories.js b/public/src/client/categories.js
index a73ed617bb..d65f12ab46 100644
--- a/public/src/client/categories.js
+++ b/public/src/client/categories.js
@@ -36,7 +36,6 @@ define('forum/categories', ['components', 'translator'], function(components, tr
}
var recentPosts = category.find('[component="category/posts"]');
- var insertBefore = recentPosts.first();
parseAndTranslate([post], function(html) {
html.hide();
diff --git a/public/src/client/category.js b/public/src/client/category.js
index 80d8d10539..1de3031964 100644
--- a/public/src/client/category.js
+++ b/public/src/client/category.js
@@ -99,7 +99,7 @@ define('forum/category', [
});
};
- Category.navigatorCallback = function(topIndex, bottomIndex, elementCount) {
+ Category.navigatorCallback = function(topIndex, bottomIndex) {
return bottomIndex;
};
diff --git a/public/src/client/chats/messages.js b/public/src/client/chats/messages.js
index ab444e36a4..8a8fe0fdbe 100644
--- a/public/src/client/chats/messages.js
+++ b/public/src/client/chats/messages.js
@@ -2,7 +2,8 @@
/* globals define, socket, app, ajaxify, templates, bootbox */
-define('forum/chats/messages', ['components', 'sounds', 'translator'], function(components, sounds, translator) {
+define('forum/chats/messages', ['components', 'sounds', 'translator'], function(components, sounds, trans) {
+ var translator = trans.Translator.create();
var messages = {};
@@ -74,7 +75,7 @@ define('forum/chats/messages', ['components', 'sounds', 'translator'], function(
templates.parse('partials/chat_message' + (Array.isArray(data) ? 's' : ''), {
messages: data
}, function(html) {
- translator.translate(html, callback);
+ translator.translate(html).then(callback);
});
};
@@ -119,7 +120,7 @@ define('forum/chats/messages', ['components', 'sounds', 'translator'], function(
};
messages.delete = function(messageId, roomId) {
- translator.translate('[[modules:chat.delete_message_confirm]]', function(translated) {
+ translator.translate('[[modules:chat.delete_message_confirm]]').then(function(translated) {
bootbox.confirm(translated, function(ok) {
if (!ok) {
return;
diff --git a/public/src/client/register.js b/public/src/client/register.js
index 4b5d5a02d6..4167246e4f 100644
--- a/public/src/client/register.js
+++ b/public/src/client/register.js
@@ -3,7 +3,9 @@
/* globals define, app, utils, socket, config, ajaxify, bootbox */
-define('forum/register', ['translator'], function(translator) {
+define('forum/register', ['translator'], function(trans) {
+ var translator = trans.Translator.create();
+
var Register = {},
validationError = false,
successIcon = '';
@@ -88,16 +90,14 @@ define('forum/register', ['translator'], function(translator) {
if (data.referrer) {
window.location.href = data.referrer;
} else if (data.message) {
- require(['translator'], function(translator) {
- translator.translate(data.message, function(msg) {
- bootbox.alert(msg);
- ajaxify.go('/');
- });
+ translator.translate(data.message).then(function(msg) {
+ bootbox.alert(msg);
+ ajaxify.go('/');
});
}
},
error: function(data) {
- translator.translate(data.responseText, config.defaultLang, function(translated) {
+ translator.translate(data.responseText).then(function(translated) {
if (data.status === 403 && data.responseText === 'Forbidden') {
window.location.href = config.relative_path + '/register?error=csrf-invalid';
} else {
@@ -208,7 +208,7 @@ define('forum/register', ['translator'], function(translator) {
}
function showError(element, msg) {
- translator.translate(msg, function(msg) {
+ translator.translate(msg).then(function(msg) {
element.html(msg);
element.parent()
.removeClass('register-success')
@@ -219,7 +219,7 @@ define('forum/register', ['translator'], function(translator) {
}
function showSuccess(element, msg) {
- translator.translate(msg, function(msg) {
+ translator.translate(msg).then(function(msg) {
element.html(msg);
element.parent()
.removeClass('register-danger')
diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js
index 86fe03ce03..f5168baca8 100644
--- a/public/src/client/topic/postTools.js
+++ b/public/src/client/topic/postTools.js
@@ -2,7 +2,8 @@
/* globals define, app, ajaxify, bootbox, socket, templates, utils, config */
-define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator'], function(share, navigator, components, translator) {
+define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator'], function(share, navigator, components, trans) {
+ var translator = trans.Translator.create();
var PostTools = {};
@@ -40,7 +41,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
data.posts.display_move_tools = data.posts.display_move_tools && index !== 0;
templates.parse('partials/topic/post-menu-list', data, function(html) {
- translator.translate(html, function(html) {
+ translator.translate(html).then(function(html) {
dropdownMenu.html(html);
$(window).trigger('action:post.tools.load');
});
@@ -115,7 +116,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
}
if (usernames.length + data.otherCount > 6) {
usernames = usernames.join(', ').replace(/,/g, '|');
- translator.translate('[[topic:users_and_others, ' + usernames + ', ' + data.otherCount + ']]', function(translated) {
+ translator.translate('[[topic:users_and_others, ' + usernames + ', ' + data.otherCount + ']]').then(function(translated) {
translated = translated.replace(/\|/g, ',');
doCreateTooltip(translated);
});
@@ -141,7 +142,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
});
$('.topic').on('click', '[component="topic/reply-as-topic"]', function() {
- translator.translate('[[topic:link_back, ' + ajaxify.data.titleRaw + ', ' + config.relative_path + '/topic/' + ajaxify.data.slug + ']]', function(body) {
+ translator.translate('[[topic:link_back, ' + ajaxify.data.titleRaw + ', ' + config.relative_path + '/topic/' + ajaxify.data.slug + ']]').then(function(body) {
$(window).trigger('action:composer.topic.new', {
cid: ajaxify.data.cid,
body: body
@@ -377,7 +378,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
}
templates.parse('partials/modals/votes_modal', data, function(html) {
- translator.translate(html, function(translated) {
+ translator.translate(html).then(function(translated) {
var dialog = bootbox.dialog({
title: 'Voters',
message: translated,
@@ -429,7 +430,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
}
function postAction(action, pid, tid) {
- translator.translate('[[topic:post_' + action + '_confirm]]', function(msg) {
+ translator.translate('[[topic:post_' + action + '_confirm]]').then(function(msg) {
bootbox.confirm(msg, function(confirm) {
if (!confirm) {
return;
@@ -480,7 +481,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
function parseMoveModal(callback) {
templates.parse('partials/move_post_modal', {}, function(html) {
- translator.translate(html, callback);
+ translator.translate(html).then(callback);
});
}
@@ -521,7 +522,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
return callback();
}
- translator.translate('[[topic:stale.warning]]', function(translated) {
+ translator.translate('[[topic:stale.warning]]').then(function(translated) {
var warning = bootbox.dialog({
title: '[[topic:stale.title]]',
message: translated,
@@ -538,7 +539,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
label: '[[topic:stale.create]]',
className: 'btn-primary',
callback: function() {
- translator.translate('[[topic:link_back, ' + ajaxify.data.title + ', ' + config.relative_path + '/topic/' + ajaxify.data.slug + ']]', function(body) {
+ translator.translate('[[topic:link_back, ' + ajaxify.data.title + ', ' + config.relative_path + '/topic/' + ajaxify.data.slug + ']]').then(function(body) {
$(window).trigger('action:composer.topic.new', {
cid: ajaxify.data.cid,
body: body
diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js
index a18c069cd5..51b8411971 100644
--- a/public/src/client/topic/threadTools.js
+++ b/public/src/client/topic/threadTools.js
@@ -8,7 +8,8 @@ define('forum/topic/threadTools', [
'forum/topic/delete-posts',
'components',
'translator'
-], function(fork, move, deletePosts, components, translator) {
+], function(fork, move, deletePosts, components, trans) {
+ var translator = trans.Translator.create();
var ThreadTools = {};
@@ -142,7 +143,7 @@ define('forum/topic/threadTools', [
}
templates.parse('partials/topic/topic-menu-list', data, function(html) {
- translator.translate(html, function(html) {
+ translator.translate(html).then(function(html) {
dropdownMenu.html(html);
$(window).trigger('action:topic.tools.load');
});
@@ -152,7 +153,7 @@ define('forum/topic/threadTools', [
}
function topicCommand(command, tid) {
- translator.translate('[[topic:thread_tools.' + command + '_confirm]]', function(msg) {
+ translator.translate('[[topic:thread_tools.' + command + '_confirm]]').then(function(msg) {
bootbox.confirm(msg, function(confirm) {
if (!confirm) {
return;
diff --git a/public/src/modules/alerts.js b/public/src/modules/alerts.js
index 3700b64e0d..069b71f421 100644
--- a/public/src/modules/alerts.js
+++ b/public/src/modules/alerts.js
@@ -1,7 +1,8 @@
'use strict';
/* globals define, templates */
-define('alerts', ['translator', 'components'], function(translator, components) {
+define('alerts', ['translator', 'components'], function(trans, components) {
+ var translator = trans.Translator.create();
var module = {};
module.alert = function (params) {
@@ -20,7 +21,7 @@ define('alerts', ['translator', 'components'], function(translator, components)
function createNew(params) {
templates.parse('alert', params, function(alertTpl) {
- translator.translate(alertTpl, function(translatedHTML) {
+ translator.translate(alertTpl).then(function(translatedHTML) {
var alert = $('#' + params.alert_id);
if (alert.length) {
return updateAlert(alert, params);
@@ -71,7 +72,7 @@ define('alerts', ['translator', 'components'], function(translator, components)
}
alert.children().fadeOut(100);
- translator.translate(alert.html(), function(translatedHTML) {
+ translator.translate(alert.html()).then(function(translatedHTML) {
alert.children().fadeIn(100);
alert.html(translatedHTML);
});
diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js
index 8e0b435434..e1b8e5055b 100644
--- a/public/src/modules/chat.js
+++ b/public/src/modules/chat.js
@@ -9,7 +9,8 @@ define('chat', [
'forum/chats',
'forum/chats/messages',
'translator'
-], function(components, taskbar, S, sounds, Chats, ChatsMessages, translator) {
+], function(components, taskbar, S, sounds, Chats, ChatsMessages, trans) {
+ var translator = trans.Translator.create();
var module = {};
var newMessage = false;
@@ -116,7 +117,7 @@ define('chat', [
templates.parse('partials/chat_dropdown', {
rooms: rooms
}, function(html) {
- translator.translate(html, function(translated) {
+ translator.translate(html).then(function(translated) {
chatsListEl.empty().html(translated);
app.createUserTooltips(chatsListEl, 'right');
});
@@ -162,7 +163,7 @@ define('chat', [
module.createModal = function(data, callback) {
templates.parse('chat', data, function(chatTpl) {
- translator.translate(chatTpl, function (chatTpl) {
+ translator.translate(chatTpl).then(function (chatTpl) {
var chatModal = $(chatTpl),
uuid = utils.generateUUID(),
@@ -337,7 +338,7 @@ define('chat', [
});
};
- module.disableMobileBehaviour = function(modalEl) {
+ module.disableMobileBehaviour = function() {
app.toggleNavbar(true);
};
@@ -345,7 +346,6 @@ define('chat', [
var totalHeight = modalEl.find('.modal-content').outerHeight() - modalEl.find('.modal-header').outerHeight();
var padding = parseInt(modalEl.find('.modal-body').css('padding-top'), 10) + parseInt(modalEl.find('.modal-body').css('padding-bottom'), 10);
var contentMargin = parseInt(modalEl.find('.chat-content').css('margin-top'), 10) + parseInt(modalEl.find('.chat-content').css('margin-bottom'), 10);
- var sinceHeight = modalEl.find('.since-bar').outerHeight(true);
var inputGroupHeight = modalEl.find('.input-group').outerHeight();
return totalHeight - padding - contentMargin - inputGroupHeight;
diff --git a/public/src/modules/translator.d.ts b/public/src/modules/translator.d.ts
new file mode 100644
index 0000000000..7f75fd1403
--- /dev/null
+++ b/public/src/modules/translator.d.ts
@@ -0,0 +1,106 @@
+
+///
+
+interface Translator {
+ /**
+ * Parse the translation instructions into the language of the Translator instance
+ * @param str - Source string
+ */
+ translate(str: string): Promise;
+
+ /**
+ * Translates a specific key and array of arguments
+ * @param name - Translation key (ex. 'global:home')
+ * @param args - Arguments for `%1`, `%2`, etc
+ */
+ translateKey(name: string, args: string[]): Promise;
+
+ /**
+ * Load translation file (or use a cached version), and optionally return the translation of a certain key
+ * @param namespace - The file name of the translation namespace
+ * @param key - The key of the specific translation to getJSON
+ */
+ getTranslation(namespace: string, key?:string): Promise