diff options
author | Vincent Petry <pvince81@owncloud.com> | 2014-11-20 12:53:46 +0300 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2014-11-20 12:53:46 +0300 |
commit | 10d0883da9fdaab5c13bb9dd52f7fb180310a5bc (patch) | |
tree | d56175d3e6657411625f63f7e2fc91b64a79e3c4 /core | |
parent | fffc5bc002133d6b3ee9c2dbe50a5044db83ede0 (diff) | |
parent | ffe57d89e425771a5c027a3484d772319919d15d (diff) |
Merge pull request #12257 from owncloud/l10n-loadtranslationsfromjs
Added function to load translations from JS
Diffstat (limited to 'core')
-rw-r--r-- | core/js/js.js | 24 | ||||
-rw-r--r-- | core/js/l10n.js | 32 | ||||
-rw-r--r-- | core/js/tests/specs/l10nSpec.js | 52 |
3 files changed, 106 insertions, 2 deletions
diff --git a/core/js/js.js b/core/js/js.js index 39e382b544b..eb2f10b51f0 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -253,6 +253,17 @@ var OC={ }, /** + * Loads translations for the given app asynchronously. + * + * @param {String} app app name + * @param {Function} callback callback to call after loading + * @return {Promise} + */ + addTranslations: function(app, callback) { + return OC.L10N.load(app, callback); + }, + + /** * Returns the base name of the given path. * For example for "/abc/somefile.txt" it will return "somefile.txt" * @@ -475,6 +486,15 @@ var OC={ return window.matchMedia(media); } return false; + }, + + /** + * Returns the user's locale + * + * @return {String} locale string + */ + getLocale: function() { + return $('html').prop('lang'); } }; @@ -869,9 +889,9 @@ function object(o) { function initCore() { /** - * Set users local to moment.js as soon as possible + * Set users locale to moment.js as soon as possible */ - moment.locale($('html').prop('lang')); + moment.locale(OC.getLocale()); /** diff --git a/core/js/l10n.js b/core/js/l10n.js index e375b7eca80..0c660584322 100644 --- a/core/js/l10n.js +++ b/core/js/l10n.js @@ -27,6 +27,38 @@ OC.L10N = { _pluralFunctions: {}, /** + * Load an app's translation bundle if not loaded already. + * + * @param {String} appName name of the app + * @param {Function} callback callback to be called when + * the translations are loaded + * @return {Promise} promise + */ + load: function(appName, callback) { + // already available ? + if (this._bundles[appName] || OC.getLocale() === 'en') { + var deferred = $.Deferred(); + var promise = deferred.promise(); + promise.then(callback); + deferred.resolve(); + return promise; + } + + var self = this; + var url = OC.filePath(appName, 'l10n', OC.getLocale() + '.json'); + + // load JSON translation bundle per AJAX + return $.get(url) + .then( + function(result) { + if (result.translations) { + self.register(appName, result.translations, result.pluralForm); + } + }) + .then(callback); + }, + + /** * Register an app's translation bundle. * * @param {String} appName name of the app diff --git a/core/js/tests/specs/l10nSpec.js b/core/js/tests/specs/l10nSpec.js index d5b0363ea38..cf7c8b11b1c 100644 --- a/core/js/tests/specs/l10nSpec.js +++ b/core/js/tests/specs/l10nSpec.js @@ -11,8 +11,12 @@ describe('OC.L10N tests', function() { var TEST_APP = 'jsunittestapp'; + beforeEach(function() { + OC.appswebroots[TEST_APP] = OC.webroot + '/apps3/jsunittestapp'; + }); afterEach(function() { delete OC.L10N._bundles[TEST_APP]; + delete OC.appswebroots[TEST_APP]; }); describe('text translation', function() { @@ -98,4 +102,52 @@ describe('OC.L10N tests', function() { checkPlurals(); }); }); + describe('async loading of translations', function() { + it('loads bundle for given app and calls callback', function() { + var localeStub = sinon.stub(OC, 'getLocale').returns('zh_CN'); + var callbackStub = sinon.stub(); + var promiseStub = sinon.stub(); + OC.L10N.load(TEST_APP, callbackStub).then(promiseStub); + expect(callbackStub.notCalled).toEqual(true); + expect(promiseStub.notCalled).toEqual(true); + expect(fakeServer.requests.length).toEqual(1); + var req = fakeServer.requests[0]; + expect(req.url).toEqual( + OC.webroot + '/apps3/' + TEST_APP + '/l10n/zh_CN.json' + ); + req.respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify({ + translations: {'Hello world!': '你好世界!'}, + pluralForm: 'nplurals=2; plural=(n != 1);' + }) + ); + + expect(callbackStub.calledOnce).toEqual(true); + expect(promiseStub.calledOnce).toEqual(true); + expect(t(TEST_APP, 'Hello world!')).toEqual('你好世界!'); + localeStub.restore(); + }); + it('calls callback if translation already available', function() { + var promiseStub = sinon.stub(); + var callbackStub = sinon.stub(); + OC.L10N.register(TEST_APP, { + 'Hello world!': 'Hallo Welt!' + }); + OC.L10N.load(TEST_APP, callbackStub).then(promiseStub); + expect(callbackStub.calledOnce).toEqual(true); + expect(promiseStub.calledOnce).toEqual(true); + expect(fakeServer.requests.length).toEqual(0); + }); + it('calls callback if locale is en', function() { + var localeStub = sinon.stub(OC, 'getLocale').returns('en'); + var promiseStub = sinon.stub(); + var callbackStub = sinon.stub(); + OC.L10N.load(TEST_APP, callbackStub).then(promiseStub); + expect(callbackStub.calledOnce).toEqual(true); + expect(promiseStub.calledOnce).toEqual(true); + expect(fakeServer.requests.length).toEqual(0); + }); + }); }); |