浏览代码

humanFileSize: use toLocaleString

humanFileSize: add test with locale
humanFileSize: use canonical locale
humanFileSize: skip test w/o toLocaleString support
humanFileSize: stub getCanonicalLocale
OC.getCanonicalLocale: cover undefined case
humanFileSize: fix getCanonicalLocale stub

Signed-off-by: Claas Augner <git@caugner.de>
Claas Augner 5 年之前
父节点
当前提交
00b8be60f2
共有 2 个文件被更改,包括 67 次插入0 次删除
  1. 13 0
      core/js/js.js
  2. 54 0
      core/js/tests/specs/coreSpec.js

+ 13 - 0
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;
 }
 

+ 54 - 0
core/js/tests/specs/coreSpec.js

@@ -273,6 +273,25 @@ 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() {
+			expect(OC.getCanonicalLocale('de')).toEqual('de');
+			expect(OC.getCanonicalLocale('zu')).toEqual('zu');
+		});
+		it("Returns extended locales with hyphens", function() {
+			expect(OC.getCanonicalLocale('az_Cyrl_AZ')).toEqual('az-Cyrl-AZ');
+			expect(OC.getCanonicalLocale('de_DE')).toEqual('de-DE');
+		});
+	});
 	describe('Link functions', function() {
 		var TESTAPP = 'testapp';
 		var TESTAPP_ROOT = OC.getRootPath() + '/appsx/testapp';
@@ -560,7 +579,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 +627,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() {