diff --git a/core/js/js.js b/core/js/js.js index 12c47d546c..880b986e17 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -770,6 +770,16 @@ var OCP = {}, return false; }, + /** + * Returns the user's locale as a BCP 47 compliant language tag + * + * @return {String} locale string + */ + getCanonicalLocale: function() { + var locale = this.getLocale(); + return typeof locale === 'string' ? locale.replace(/_/g, '-') : locale; + }, + /** * Returns the user's locale * @@ -1843,6 +1853,9 @@ function humanFileSize(size, skipSmallSizes) { else if(relativeSize.substr(relativeSize.length-2,2)==='.0'){ relativeSize=relativeSize.substr(0,relativeSize.length-2); } + else{ + relativeSize = parseFloat(relativeSize).toLocaleString(OC.getCanonicalLocale()); + } return relativeSize + ' ' + readableFormat; } diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js index 96c8e3f99e..67b7d77be6 100644 --- a/core/js/tests/specs/coreSpec.js +++ b/core/js/tests/specs/coreSpec.js @@ -273,6 +273,29 @@ describe('Core base tests', function() { expect(OC.filePath('files', 'ajax', 'test.php')).toEqual('http://localhost/index.php/apps/files/ajax/test.php'); }); }); + describe('getCanonicalLocale', function() { + var localeStub; + + beforeEach(function() { + localeStub = sinon.stub(OC, 'getLocale'); + }); + afterEach(function() { + localeStub.restore(); + }); + + it("Returns primary locales as is", function() { + localeStub.returns('de'); + expect(OC.getCanonicalLocale()).toEqual('de'); + localeStub.returns('zu'); + expect(OC.getCanonicalLocale()).toEqual('zu'); + }); + it("Returns extended locales with hyphens", function() { + localeStub.returns('az_Cyrl_AZ'); + expect(OC.getCanonicalLocale()).toEqual('az-Cyrl-AZ'); + localeStub.returns('de_DE'); + expect(OC.getCanonicalLocale()).toEqual('de-DE'); + }); + }); describe('Link functions', function() { var TESTAPP = 'testapp'; var TESTAPP_ROOT = OC.getRootPath() + '/appsx/testapp'; @@ -560,7 +583,26 @@ describe('Core base tests', function() { }); }); describe('Util', function() { + var locale; + var localeStub; + + beforeEach(function() { + locale = OC.getCanonicalLocale(); + localeStub = sinon.stub(OC, 'getCanonicalLocale'); + localeStub.returns(locale); + }); + + afterEach(function() { + localeStub.restore(); + }); + describe('humanFileSize', function() { + // cit() will skip tests if toLocaleString() is not supported. + // See https://github.com/ariya/phantomjs/issues/12581 + // + // Please run these tests in Chrome/Firefox manually. + var cit = 4.2.toLocaleString("de") !== "4,2" ? xit : it; + it('renders file sizes with the correct unit', function() { var data = [ [0, '0 B'], @@ -589,6 +631,22 @@ describe('Core base tests', function() { expect(OC.Util.humanFileSize(data[i][0], true)).toEqual(data[i][1]); } }); + cit('renders file sizes with the correct locale', function() { + localeStub.returns("de"); + var data = [ + [0, '0 B'], + ["0", '0 B'], + ["A", 'NaN B'], + [125, '125 B'], + [128000, '125 KB'], + [128000000, '122,1 MB'], + [128000000000, '119,2 GB'], + [128000000000000, '116,4 TB'] + ]; + for (var i = 0; i < data.length; i++) { + expect(OC.Util.humanFileSize(data[i][0])).toEqual(data[i][1]); + } + }); }); describe('computerFileSize', function() { it('correctly parses file sizes from a human readable formated string', function() {