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; +} + +interface TranslatorFactory { + /** + * Construct a new Translator object + * @param language - Language code for this Translator instance + */ + new(language: string): Translator; + + /** + * Get the language of the current environment, falling back to defaults + */ + getLanguage(): string; + + /** + * Create and cache a new Translator instance, or return a cached one + * @param language - Language code + */ + create(language?: string): Translator; + + cache: { [key: string]: Translator; }; +} + +interface Callback { + (err: Error, data: any): void; +} + +interface TranslatorAdaptor { + /** + * The Translator class + */ + Translator: TranslatorFactory; + + /** + * Legacy translator function for backwards compatibility + */ + translate(text: string, language: string, callback: Callback); + translate(text: string, callback: Callback); + + /** + * Construct a translator pattern + * @param name - Translation name + * @param args - Optional arguments for the pattern + */ + compile(name: string, ...args: string[]): string; + + /** + * Escape translation patterns from text + */ + escape(text): string; + + /** + * Unescape translation patterns from text + */ + unescape(text): string; + + /** + * Add translations to the cache + */ + addTranslation(language: string, filename: string, translation: { [key: string]: string }); + + /** + * Get the translations object + */ + getTranslations(language: string, filename: string, callback?: Callback); + + /** + * Alias of TranslatorAdaptor.getTranslations + */ + load(language: string, filename: string, callback?: Callback); + + /** + * Get the language of the current environment, falling back to defaults + */ + getLanguage(): string; + + toggleTimeagoShorthand(); + prepareDOM(); +} + +declare var adaptor: TranslatorAdaptor; + +export = adaptor;