angular-translate-rails-tf 2.6.3 → 2.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/vendor/assets/javascripts/angular-translate.js +660 -115
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 929573be32a74bd2cfa7fadf2d62f16c567d6b4a
|
4
|
+
data.tar.gz: 20a8c41c0be0ba48985362db226cb2ee6c45eac2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e3170d3f54cdca476c86e5dd91a3e6982458a93ce4087a00487f07f9247c455886304f0dd9215122459b3ef1dcfa2d947efd1558103f6d2a4126ac0625586b8
|
7
|
+
data.tar.gz: ca1b828a283907b022dedcf6857b537e3ea1ca2b21fe351410e9c60b295afb217660aaac28c7ae8c30820835ed0fcf7b479dfb543c132422ca4e2309dfc6456f
|
@@ -1,8 +1,24 @@
|
|
1
1
|
/*!
|
2
|
-
* angular-translate - v2.
|
2
|
+
* angular-translate - v2.7.2 - 2015-06-01
|
3
3
|
* http://github.com/angular-translate/angular-translate
|
4
4
|
* Copyright (c) 2015 ; Licensed MIT
|
5
5
|
*/
|
6
|
+
(function (root, factory) {
|
7
|
+
if (typeof define === 'function' && define.amd) {
|
8
|
+
// AMD. Register as an anonymous module unless amdModuleId is set
|
9
|
+
define([], function () {
|
10
|
+
return (factory());
|
11
|
+
});
|
12
|
+
} else if (typeof exports === 'object') {
|
13
|
+
// Node. Does not work with strict CommonJS, but
|
14
|
+
// only CommonJS-like environments that support module.exports,
|
15
|
+
// like Node.
|
16
|
+
module.exports = factory();
|
17
|
+
} else {
|
18
|
+
factory();
|
19
|
+
}
|
20
|
+
}(this, function () {
|
21
|
+
|
6
22
|
/**
|
7
23
|
* @ngdoc overview
|
8
24
|
* @name pascalprecht.translate
|
@@ -11,13 +27,16 @@
|
|
11
27
|
* The main module which holds everything together.
|
12
28
|
*/
|
13
29
|
angular.module('pascalprecht.translate', ['ng'])
|
30
|
+
.run(runTranslate);
|
31
|
+
|
32
|
+
function runTranslate($translate) {
|
14
33
|
|
15
|
-
|
34
|
+
'use strict';
|
16
35
|
|
17
36
|
var key = $translate.storageKey(),
|
18
|
-
|
37
|
+
storage = $translate.storage();
|
19
38
|
|
20
|
-
var fallbackFromIncorrectStorageValue = function() {
|
39
|
+
var fallbackFromIncorrectStorageValue = function () {
|
21
40
|
var preferred = $translate.preferredLanguage();
|
22
41
|
if (angular.isString(preferred)) {
|
23
42
|
$translate.use(preferred);
|
@@ -28,6 +47,8 @@ angular.module('pascalprecht.translate', ['ng'])
|
|
28
47
|
}
|
29
48
|
};
|
30
49
|
|
50
|
+
fallbackFromIncorrectStorageValue.displayName = 'fallbackFromIncorrectStorageValue';
|
51
|
+
|
31
52
|
if (storage) {
|
32
53
|
if (!storage.get(key)) {
|
33
54
|
fallbackFromIncorrectStorageValue();
|
@@ -37,7 +58,256 @@ angular.module('pascalprecht.translate', ['ng'])
|
|
37
58
|
} else if (angular.isString($translate.preferredLanguage())) {
|
38
59
|
$translate.use($translate.preferredLanguage());
|
39
60
|
}
|
40
|
-
}
|
61
|
+
}
|
62
|
+
runTranslate.$inject = ['$translate'];
|
63
|
+
|
64
|
+
runTranslate.displayName = 'runTranslate';
|
65
|
+
|
66
|
+
/**
|
67
|
+
* @ngdoc object
|
68
|
+
* @name pascalprecht.translate.$translateSanitizationProvider
|
69
|
+
*
|
70
|
+
* @description
|
71
|
+
*
|
72
|
+
* Configurations for $translateSanitization
|
73
|
+
*/
|
74
|
+
angular.module('pascalprecht.translate').provider('$translateSanitization', $translateSanitizationProvider);
|
75
|
+
|
76
|
+
function $translateSanitizationProvider () {
|
77
|
+
|
78
|
+
'use strict';
|
79
|
+
|
80
|
+
var $sanitize,
|
81
|
+
currentStrategy = null, // TODO change to either 'sanitize', 'escape' or ['sanitize', 'escapeParameters'] in 3.0.
|
82
|
+
hasConfiguredStrategy = false,
|
83
|
+
hasShownNoStrategyConfiguredWarning = false,
|
84
|
+
strategies;
|
85
|
+
|
86
|
+
/**
|
87
|
+
* Definition of a sanitization strategy function
|
88
|
+
* @callback StrategyFunction
|
89
|
+
* @param {string|object} value - value to be sanitized (either a string or an interpolated value map)
|
90
|
+
* @param {string} mode - either 'text' for a string (translation) or 'params' for the interpolated params
|
91
|
+
* @return {string|object}
|
92
|
+
*/
|
93
|
+
|
94
|
+
/**
|
95
|
+
* @ngdoc property
|
96
|
+
* @name strategies
|
97
|
+
* @propertyOf pascalprecht.translate.$translateSanitizationProvider
|
98
|
+
*
|
99
|
+
* @description
|
100
|
+
* Following strategies are built-in:
|
101
|
+
* <dl>
|
102
|
+
* <dt>sanitize</dt>
|
103
|
+
* <dd>Sanitizes HTML in the translation text using $sanitize</dd>
|
104
|
+
* <dt>escape</dt>
|
105
|
+
* <dd>Escapes HTML in the translation</dd>
|
106
|
+
* <dt>sanitizeParameters</dt>
|
107
|
+
* <dd>Sanitizes HTML in the values of the interpolation parameters using $sanitize</dd>
|
108
|
+
* <dt>escapeParameters</dt>
|
109
|
+
* <dd>Escapes HTML in the values of the interpolation parameters</dd>
|
110
|
+
* <dt>escaped</dt>
|
111
|
+
* <dd>Support legacy strategy name 'escaped' for backwards compatibility (will be removed in 3.0)</dd>
|
112
|
+
* </dl>
|
113
|
+
*
|
114
|
+
*/
|
115
|
+
|
116
|
+
strategies = {
|
117
|
+
sanitize: function (value, mode) {
|
118
|
+
if (mode === 'text') {
|
119
|
+
value = htmlSanitizeValue(value);
|
120
|
+
}
|
121
|
+
return value;
|
122
|
+
},
|
123
|
+
escape: function (value, mode) {
|
124
|
+
if (mode === 'text') {
|
125
|
+
value = htmlEscapeValue(value);
|
126
|
+
}
|
127
|
+
return value;
|
128
|
+
},
|
129
|
+
sanitizeParameters: function (value, mode) {
|
130
|
+
if (mode === 'params') {
|
131
|
+
value = mapInterpolationParameters(value, htmlSanitizeValue);
|
132
|
+
}
|
133
|
+
return value;
|
134
|
+
},
|
135
|
+
escapeParameters: function (value, mode) {
|
136
|
+
if (mode === 'params') {
|
137
|
+
value = mapInterpolationParameters(value, htmlEscapeValue);
|
138
|
+
}
|
139
|
+
return value;
|
140
|
+
}
|
141
|
+
};
|
142
|
+
// Support legacy strategy name 'escaped' for backwards compatibility.
|
143
|
+
// TODO should be removed in 3.0
|
144
|
+
strategies.escaped = strategies.escapeParameters;
|
145
|
+
|
146
|
+
/**
|
147
|
+
* @ngdoc function
|
148
|
+
* @name pascalprecht.translate.$translateSanitizationProvider#addStrategy
|
149
|
+
* @methodOf pascalprecht.translate.$translateSanitizationProvider
|
150
|
+
*
|
151
|
+
* @description
|
152
|
+
* Adds a sanitization strategy to the list of known strategies.
|
153
|
+
*
|
154
|
+
* @param {string} strategyName - unique key for a strategy
|
155
|
+
* @param {StrategyFunction} strategyFunction - strategy function
|
156
|
+
* @returns {object} this
|
157
|
+
*/
|
158
|
+
this.addStrategy = function (strategyName, strategyFunction) {
|
159
|
+
strategies[strategyName] = strategyFunction;
|
160
|
+
return this;
|
161
|
+
};
|
162
|
+
|
163
|
+
/**
|
164
|
+
* @ngdoc function
|
165
|
+
* @name pascalprecht.translate.$translateSanitizationProvider#removeStrategy
|
166
|
+
* @methodOf pascalprecht.translate.$translateSanitizationProvider
|
167
|
+
*
|
168
|
+
* @description
|
169
|
+
* Removes a sanitization strategy from the list of known strategies.
|
170
|
+
*
|
171
|
+
* @param {string} strategyName - unique key for a strategy
|
172
|
+
* @returns {object} this
|
173
|
+
*/
|
174
|
+
this.removeStrategy = function (strategyName) {
|
175
|
+
delete strategies[strategyName];
|
176
|
+
return this;
|
177
|
+
};
|
178
|
+
|
179
|
+
/**
|
180
|
+
* @ngdoc function
|
181
|
+
* @name pascalprecht.translate.$translateSanitizationProvider#useStrategy
|
182
|
+
* @methodOf pascalprecht.translate.$translateSanitizationProvider
|
183
|
+
*
|
184
|
+
* @description
|
185
|
+
* Selects a sanitization strategy. When an array is provided the strategies will be executed in order.
|
186
|
+
*
|
187
|
+
* @param {string|StrategyFunction|array} strategy The sanitization strategy / strategies which should be used. Either a name of an existing strategy, a custom strategy function, or an array consisting of multiple names and / or custom functions.
|
188
|
+
* @returns {object} this
|
189
|
+
*/
|
190
|
+
this.useStrategy = function (strategy) {
|
191
|
+
hasConfiguredStrategy = true;
|
192
|
+
currentStrategy = strategy;
|
193
|
+
return this;
|
194
|
+
};
|
195
|
+
|
196
|
+
/**
|
197
|
+
* @ngdoc object
|
198
|
+
* @name pascalprecht.translate.$translateSanitization
|
199
|
+
* @requires $injector
|
200
|
+
* @requires $log
|
201
|
+
*
|
202
|
+
* @description
|
203
|
+
* Sanitizes interpolation parameters and translated texts.
|
204
|
+
*
|
205
|
+
*/
|
206
|
+
this.$get = ['$injector', '$log', function ($injector, $log) {
|
207
|
+
|
208
|
+
var applyStrategies = function (value, mode, selectedStrategies) {
|
209
|
+
angular.forEach(selectedStrategies, function (selectedStrategy) {
|
210
|
+
if (angular.isFunction(selectedStrategy)) {
|
211
|
+
value = selectedStrategy(value, mode);
|
212
|
+
} else if (angular.isFunction(strategies[selectedStrategy])) {
|
213
|
+
value = strategies[selectedStrategy](value, mode);
|
214
|
+
} else {
|
215
|
+
throw new Error('pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: \'' + selectedStrategy + '\'');
|
216
|
+
}
|
217
|
+
});
|
218
|
+
return value;
|
219
|
+
};
|
220
|
+
|
221
|
+
// TODO: should be removed in 3.0
|
222
|
+
var showNoStrategyConfiguredWarning = function () {
|
223
|
+
if (!hasConfiguredStrategy && !hasShownNoStrategyConfiguredWarning) {
|
224
|
+
$log.warn('pascalprecht.translate.$translateSanitization: No sanitization strategy has been configured. This can have serious security implications. See http://angular-translate.github.io/docs/#/guide/19_security for details.');
|
225
|
+
hasShownNoStrategyConfiguredWarning = true;
|
226
|
+
}
|
227
|
+
};
|
228
|
+
|
229
|
+
if ($injector.has('$sanitize')) {
|
230
|
+
$sanitize = $injector.get('$sanitize');
|
231
|
+
}
|
232
|
+
|
233
|
+
return {
|
234
|
+
/**
|
235
|
+
* @ngdoc function
|
236
|
+
* @name pascalprecht.translate.$translateSanitization#useStrategy
|
237
|
+
* @methodOf pascalprecht.translate.$translateSanitization
|
238
|
+
*
|
239
|
+
* @description
|
240
|
+
* Selects a sanitization strategy. When an array is provided the strategies will be executed in order.
|
241
|
+
*
|
242
|
+
* @param {string|StrategyFunction|array} strategy The sanitization strategy / strategies which should be used. Either a name of an existing strategy, a custom strategy function, or an array consisting of multiple names and / or custom functions.
|
243
|
+
*/
|
244
|
+
useStrategy: (function (self) {
|
245
|
+
return function (strategy) {
|
246
|
+
self.useStrategy(strategy);
|
247
|
+
};
|
248
|
+
})(this),
|
249
|
+
|
250
|
+
/**
|
251
|
+
* @ngdoc function
|
252
|
+
* @name pascalprecht.translate.$translateSanitization#sanitize
|
253
|
+
* @methodOf pascalprecht.translate.$translateSanitization
|
254
|
+
*
|
255
|
+
* @description
|
256
|
+
* Sanitizes a value.
|
257
|
+
*
|
258
|
+
* @param {string|object} value The value which should be sanitized.
|
259
|
+
* @param {string} mode The current sanitization mode, either 'params' or 'text'.
|
260
|
+
* @param {string|StrategyFunction|array} [strategy] Optional custom strategy which should be used instead of the currently selected strategy.
|
261
|
+
* @returns {string|object} sanitized value
|
262
|
+
*/
|
263
|
+
sanitize: function (value, mode, strategy) {
|
264
|
+
if (!currentStrategy) {
|
265
|
+
showNoStrategyConfiguredWarning();
|
266
|
+
}
|
267
|
+
|
268
|
+
if (arguments.length < 3) {
|
269
|
+
strategy = currentStrategy;
|
270
|
+
}
|
271
|
+
|
272
|
+
if (!strategy) {
|
273
|
+
return value;
|
274
|
+
}
|
275
|
+
|
276
|
+
var selectedStrategies = angular.isArray(strategy) ? strategy : [strategy];
|
277
|
+
return applyStrategies(value, mode, selectedStrategies);
|
278
|
+
}
|
279
|
+
};
|
280
|
+
}];
|
281
|
+
|
282
|
+
var htmlEscapeValue = function (value) {
|
283
|
+
var element = angular.element('<div></div>');
|
284
|
+
element.text(value); // not chainable, see #1044
|
285
|
+
return element.html();
|
286
|
+
};
|
287
|
+
|
288
|
+
var htmlSanitizeValue = function (value) {
|
289
|
+
if (!$sanitize) {
|
290
|
+
throw new Error('pascalprecht.translate.$translateSanitization: Error cannot find $sanitize service. Either include the ngSanitize module (https://docs.angularjs.org/api/ngSanitize) or use a sanitization strategy which does not depend on $sanitize, such as \'escape\'.');
|
291
|
+
}
|
292
|
+
return $sanitize(value);
|
293
|
+
};
|
294
|
+
|
295
|
+
var mapInterpolationParameters = function (value, iteratee) {
|
296
|
+
if (angular.isObject(value)) {
|
297
|
+
var result = angular.isArray(value) ? [] : {};
|
298
|
+
|
299
|
+
angular.forEach(value, function (propertyValue, propertyKey) {
|
300
|
+
result[propertyKey] = mapInterpolationParameters(propertyValue, iteratee);
|
301
|
+
});
|
302
|
+
|
303
|
+
return result;
|
304
|
+
} else if (angular.isNumber(value)) {
|
305
|
+
return value;
|
306
|
+
} else {
|
307
|
+
return iteratee(value);
|
308
|
+
}
|
309
|
+
};
|
310
|
+
}
|
41
311
|
|
42
312
|
/**
|
43
313
|
* @ngdoc object
|
@@ -48,7 +318,13 @@ angular.module('pascalprecht.translate', ['ng'])
|
|
48
318
|
* and similar to configure translation behavior directly inside of a module.
|
49
319
|
*
|
50
320
|
*/
|
51
|
-
angular.module('pascalprecht.translate')
|
321
|
+
angular.module('pascalprecht.translate')
|
322
|
+
.constant('pascalprechtTranslateOverrider', {})
|
323
|
+
.provider('$translate', $translate);
|
324
|
+
|
325
|
+
function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvider, pascalprechtTranslateOverrider) {
|
326
|
+
|
327
|
+
'use strict';
|
52
328
|
|
53
329
|
var $translationTable = {},
|
54
330
|
$preferredLanguage,
|
@@ -64,21 +340,44 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
64
340
|
$missingTranslationHandlerFactory,
|
65
341
|
$interpolationFactory,
|
66
342
|
$interpolatorFactories = [],
|
67
|
-
$interpolationSanitizationStrategy = false,
|
68
343
|
$loaderFactory,
|
69
344
|
$cloakClassName = 'translate-cloak',
|
70
345
|
$loaderOptions,
|
71
346
|
$notFoundIndicatorLeft,
|
72
347
|
$notFoundIndicatorRight,
|
73
348
|
$postCompilingEnabled = false,
|
349
|
+
$forceAsyncReloadEnabled = false,
|
74
350
|
NESTED_OBJECT_DELIMITER = '.',
|
75
351
|
loaderCache,
|
76
|
-
directivePriority = 0
|
352
|
+
directivePriority = 0,
|
353
|
+
statefulFilter = true,
|
354
|
+
uniformLanguageTagResolver = 'default',
|
355
|
+
languageTagResolver = {
|
356
|
+
'default': function (tag) {
|
357
|
+
return (tag || '').split('-').join('_');
|
358
|
+
},
|
359
|
+
java: function (tag) {
|
360
|
+
var temp = (tag || '').split('-').join('_');
|
361
|
+
var parts = temp.split('_');
|
362
|
+
return parts.length > 1 ? (parts[0].toLowerCase() + '_' + parts[1].toUpperCase()) : temp;
|
363
|
+
},
|
364
|
+
bcp47: function (tag) {
|
365
|
+
var temp = (tag || '').split('_').join('-');
|
366
|
+
var parts = temp.split('-');
|
367
|
+
return parts.length > 1 ? (parts[0].toLowerCase() + '-' + parts[1].toUpperCase()) : temp;
|
368
|
+
}
|
369
|
+
};
|
77
370
|
|
78
|
-
var version = '2.
|
371
|
+
var version = '2.7.2';
|
79
372
|
|
80
373
|
// tries to determine the browsers language
|
81
374
|
var getFirstBrowserLanguage = function () {
|
375
|
+
|
376
|
+
// internal purpose only
|
377
|
+
if (angular.isFunction(pascalprechtTranslateOverrider.getLocale)) {
|
378
|
+
return pascalprechtTranslateOverrider.getLocale();
|
379
|
+
}
|
380
|
+
|
82
381
|
var nav = $windowProvider.$get().navigator,
|
83
382
|
browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],
|
84
383
|
i,
|
@@ -108,7 +407,11 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
108
407
|
|
109
408
|
// tries to determine the browsers locale
|
110
409
|
var getLocale = function () {
|
111
|
-
|
410
|
+
var locale = getFirstBrowserLanguage() || '';
|
411
|
+
if (languageTagResolver[uniformLanguageTagResolver]) {
|
412
|
+
locale = languageTagResolver[uniformLanguageTagResolver](locale);
|
413
|
+
}
|
414
|
+
return locale;
|
112
415
|
};
|
113
416
|
getLocale.displayName = 'angular-translate/service: getLocale';
|
114
417
|
|
@@ -180,10 +483,12 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
180
483
|
}
|
181
484
|
}
|
182
485
|
|
183
|
-
|
486
|
+
if (preferred) {
|
487
|
+
var parts = preferred.split('_');
|
184
488
|
|
185
|
-
|
186
|
-
|
489
|
+
if (parts.length > 1 && indexOf(avail, angular.lowercase(parts[0])) > -1) {
|
490
|
+
return parts[0];
|
491
|
+
}
|
187
492
|
}
|
188
493
|
|
189
494
|
// If everything fails, just return the preferred, unchanged.
|
@@ -304,6 +609,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
304
609
|
}
|
305
610
|
return result;
|
306
611
|
};
|
612
|
+
flatObject.displayName = 'flatObject';
|
307
613
|
|
308
614
|
/**
|
309
615
|
* @ngdoc function
|
@@ -361,7 +667,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
361
667
|
* @param {string} value Strategy type.
|
362
668
|
*/
|
363
669
|
this.useSanitizeValueStrategy = function (value) {
|
364
|
-
$
|
670
|
+
$translateSanitizationProvider.useStrategy(value);
|
365
671
|
return this;
|
366
672
|
};
|
367
673
|
|
@@ -511,7 +817,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
511
817
|
if (langKey) {
|
512
818
|
if (!$translationTable[langKey] && (!$loaderFactory)) {
|
513
819
|
// only throw an error, when not loading translation data asynchronously
|
514
|
-
throw new Error(
|
820
|
+
throw new Error('$translateProvider couldn\'t find translationTable for langKey: \'' + langKey + '\'');
|
515
821
|
}
|
516
822
|
$uses = langKey;
|
517
823
|
return this;
|
@@ -537,6 +843,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
537
843
|
return $storageKey;
|
538
844
|
}
|
539
845
|
$storageKey = key;
|
846
|
+
return this;
|
540
847
|
};
|
541
848
|
|
542
849
|
this.storageKey = storageKey;
|
@@ -713,6 +1020,86 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
713
1020
|
return this;
|
714
1021
|
};
|
715
1022
|
|
1023
|
+
/**
|
1024
|
+
* @ngdoc function
|
1025
|
+
* @name pascalprecht.translate.$translateProvider#forceAsyncReload
|
1026
|
+
* @methodOf pascalprecht.translate.$translateProvider
|
1027
|
+
*
|
1028
|
+
* @description
|
1029
|
+
* If force async reload is enabled, async loader will always be called
|
1030
|
+
* even if $translationTable already contains the language key, adding
|
1031
|
+
* possible new entries to the $translationTable.
|
1032
|
+
*
|
1033
|
+
* Example:
|
1034
|
+
* <pre>
|
1035
|
+
* app.config(function ($translateProvider) {
|
1036
|
+
* $translateProvider.forceAsyncReload(true);
|
1037
|
+
* });
|
1038
|
+
* </pre>
|
1039
|
+
*
|
1040
|
+
* @param {boolean} value - valid values are true or false
|
1041
|
+
*/
|
1042
|
+
this.forceAsyncReload = function (value) {
|
1043
|
+
$forceAsyncReloadEnabled = !(!value);
|
1044
|
+
return this;
|
1045
|
+
};
|
1046
|
+
|
1047
|
+
/**
|
1048
|
+
* @ngdoc function
|
1049
|
+
* @name pascalprecht.translate.$translateProvider#uniformLanguageTag
|
1050
|
+
* @methodOf pascalprecht.translate.$translateProvider
|
1051
|
+
*
|
1052
|
+
* @description
|
1053
|
+
* Tells angular-translate which language tag should be used as a result when determining
|
1054
|
+
* the current browser language.
|
1055
|
+
*
|
1056
|
+
* This setting must be set before invoking {@link pascalprecht.translate.$translateProvider#methods_determinePreferredLanguage determinePreferredLanguage()}.
|
1057
|
+
*
|
1058
|
+
* <pre>
|
1059
|
+
* $translateProvider
|
1060
|
+
* .uniformLanguageTag('bcp47')
|
1061
|
+
* .determinePreferredLanguage()
|
1062
|
+
* </pre>
|
1063
|
+
*
|
1064
|
+
* The resolver currently supports:
|
1065
|
+
* * default
|
1066
|
+
* (traditionally: hyphens will be converted into underscores, i.e. en-US => en_US)
|
1067
|
+
* en-US => en_US
|
1068
|
+
* en_US => en_US
|
1069
|
+
* en-us => en_us
|
1070
|
+
* * java
|
1071
|
+
* like default, but the second part will be always in uppercase
|
1072
|
+
* en-US => en_US
|
1073
|
+
* en_US => en_US
|
1074
|
+
* en-us => en_US
|
1075
|
+
* * BCP 47 (RFC 4646 & 4647)
|
1076
|
+
* en-US => en-US
|
1077
|
+
* en_US => en-US
|
1078
|
+
* en-us => en-US
|
1079
|
+
*
|
1080
|
+
* See also:
|
1081
|
+
* * http://en.wikipedia.org/wiki/IETF_language_tag
|
1082
|
+
* * http://www.w3.org/International/core/langtags/
|
1083
|
+
* * http://tools.ietf.org/html/bcp47
|
1084
|
+
*
|
1085
|
+
* @param {string|object} options - options (or standard)
|
1086
|
+
* @param {string} options.standard - valid values are 'default', 'bcp47', 'java'
|
1087
|
+
*/
|
1088
|
+
this.uniformLanguageTag = function (options) {
|
1089
|
+
|
1090
|
+
if (!options) {
|
1091
|
+
options = {};
|
1092
|
+
} else if (angular.isString(options)) {
|
1093
|
+
options = {
|
1094
|
+
standard: options
|
1095
|
+
};
|
1096
|
+
}
|
1097
|
+
|
1098
|
+
uniformLanguageTagResolver = options.standard;
|
1099
|
+
|
1100
|
+
return this;
|
1101
|
+
};
|
1102
|
+
|
716
1103
|
/**
|
717
1104
|
* @ngdoc function
|
718
1105
|
* @name pascalprecht.translate.$translateProvider#determinePreferredLanguage
|
@@ -728,9 +1115,9 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
728
1115
|
* `[lang]` depending on what the browser provides.
|
729
1116
|
*
|
730
1117
|
* Use this method at your own risk, since not all browsers return a valid
|
731
|
-
* locale.
|
1118
|
+
* locale (see {@link pascalprecht.translate.$translateProvider#methods_uniformLanguageTag uniformLanguageTag()}).
|
732
1119
|
*
|
733
|
-
* @param {
|
1120
|
+
* @param {Function=} fn Function to determine a browser's locale
|
734
1121
|
*/
|
735
1122
|
this.determinePreferredLanguage = function (fn) {
|
736
1123
|
|
@@ -825,6 +1212,31 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
825
1212
|
}
|
826
1213
|
};
|
827
1214
|
|
1215
|
+
/**
|
1216
|
+
* @ngdoc function
|
1217
|
+
* @name pascalprecht.translate.$translateProvider#statefulFilter
|
1218
|
+
* @methodOf pascalprecht.translate.$translateProvider
|
1219
|
+
*
|
1220
|
+
* @description
|
1221
|
+
* Since AngularJS 1.3, filters which are not stateless (depending at the scope)
|
1222
|
+
* have to explicit define this behavior.
|
1223
|
+
* Sets whether the translate filter should be stateful or stateless. The standard value is `true`
|
1224
|
+
* meaning being stateful.
|
1225
|
+
* Calling this function without an argument will return the current value.
|
1226
|
+
*
|
1227
|
+
* @param {boolean} state - defines the state of the filter
|
1228
|
+
*/
|
1229
|
+
this.statefulFilter = function (state) {
|
1230
|
+
if (state === undefined) {
|
1231
|
+
// getter
|
1232
|
+
return statefulFilter;
|
1233
|
+
} else {
|
1234
|
+
// setter with chaining
|
1235
|
+
statefulFilter = state;
|
1236
|
+
return this;
|
1237
|
+
}
|
1238
|
+
};
|
1239
|
+
|
828
1240
|
/**
|
829
1241
|
* @ngdoc object
|
830
1242
|
* @name pascalprecht.translate.$translate
|
@@ -944,9 +1356,12 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
944
1356
|
// We can just translate.
|
945
1357
|
determineTranslation(translationId, interpolateParams, interpolationId, defaultTranslationText).then(deferred.resolve, deferred.reject);
|
946
1358
|
} else {
|
947
|
-
|
1359
|
+
var promiseResolved = function () {
|
948
1360
|
determineTranslation(translationId, interpolateParams, interpolationId, defaultTranslationText).then(deferred.resolve, deferred.reject);
|
949
|
-
}
|
1361
|
+
};
|
1362
|
+
promiseResolved.displayName = 'promiseResolved';
|
1363
|
+
|
1364
|
+
promiseToWaitFor['finally'](promiseResolved, deferred.reject);
|
950
1365
|
}
|
951
1366
|
return deferred.promise;
|
952
1367
|
};
|
@@ -995,10 +1410,14 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
995
1410
|
}
|
996
1411
|
// inform default interpolator
|
997
1412
|
defaultInterpolator.setLocale($uses);
|
998
|
-
|
999
|
-
|
1413
|
+
|
1414
|
+
var eachInterpolator = function (interpolator, id) {
|
1000
1415
|
interpolatorHashMap[id].setLocale($uses);
|
1001
|
-
}
|
1416
|
+
};
|
1417
|
+
eachInterpolator.displayName = 'eachInterpolatorLocaleSetter';
|
1418
|
+
|
1419
|
+
// inform all others too!
|
1420
|
+
angular.forEach(interpolatorHashMap, eachInterpolator);
|
1002
1421
|
$rootScope.$emit('$translateChangeEnd', {language: key});
|
1003
1422
|
};
|
1004
1423
|
|
@@ -1037,7 +1456,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1037
1456
|
}, $loaderOptions.$http)
|
1038
1457
|
});
|
1039
1458
|
|
1040
|
-
|
1459
|
+
var onLoaderSuccess = function (data) {
|
1041
1460
|
var translationTable = {};
|
1042
1461
|
$rootScope.$emit('$translateLoadingSuccess', {language: key});
|
1043
1462
|
|
@@ -1054,11 +1473,19 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1054
1473
|
table: translationTable
|
1055
1474
|
});
|
1056
1475
|
$rootScope.$emit('$translateLoadingEnd', {language: key});
|
1057
|
-
}
|
1476
|
+
};
|
1477
|
+
onLoaderSuccess.displayName = 'onLoaderSuccess';
|
1478
|
+
|
1479
|
+
var onLoaderError = function (key) {
|
1058
1480
|
$rootScope.$emit('$translateLoadingError', {language: key});
|
1059
1481
|
deferred.reject(key);
|
1060
1482
|
$rootScope.$emit('$translateLoadingEnd', {language: key});
|
1061
|
-
}
|
1483
|
+
};
|
1484
|
+
onLoaderError.displayName = 'onLoaderError';
|
1485
|
+
|
1486
|
+
$injector.get($loaderFactory)(loaderOptions)
|
1487
|
+
.then(onLoaderSuccess, onLoaderError);
|
1488
|
+
|
1062
1489
|
return deferred.promise;
|
1063
1490
|
};
|
1064
1491
|
|
@@ -1070,25 +1497,19 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1070
1497
|
}
|
1071
1498
|
}
|
1072
1499
|
|
1073
|
-
// apply additional settings
|
1074
|
-
if (angular.isFunction(defaultInterpolator.useSanitizeValueStrategy)) {
|
1075
|
-
defaultInterpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy);
|
1076
|
-
}
|
1077
|
-
|
1078
1500
|
// if we have additional interpolations that were added via
|
1079
1501
|
// $translateProvider.addInterpolation(), we have to map'em
|
1080
1502
|
if ($interpolatorFactories.length) {
|
1081
|
-
|
1503
|
+
var eachInterpolationFactory = function (interpolatorFactory) {
|
1082
1504
|
var interpolator = $injector.get(interpolatorFactory);
|
1083
1505
|
// setting initial locale for each interpolation service
|
1084
1506
|
interpolator.setLocale($preferredLanguage || $uses);
|
1085
|
-
// apply additional settings
|
1086
|
-
if (angular.isFunction(interpolator.useSanitizeValueStrategy)) {
|
1087
|
-
interpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy);
|
1088
|
-
}
|
1089
1507
|
// make'em recognizable through id
|
1090
1508
|
interpolatorHashMap[interpolator.getInterpolationIdentifier()] = interpolator;
|
1091
|
-
}
|
1509
|
+
};
|
1510
|
+
eachInterpolationFactory.displayName = 'interpolationFactoryAdder';
|
1511
|
+
|
1512
|
+
angular.forEach($interpolatorFactories, eachInterpolationFactory);
|
1092
1513
|
}
|
1093
1514
|
|
1094
1515
|
/**
|
@@ -1107,10 +1528,12 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1107
1528
|
if (Object.prototype.hasOwnProperty.call($translationTable, langKey)) {
|
1108
1529
|
deferred.resolve($translationTable[langKey]);
|
1109
1530
|
} else if (langPromises[langKey]) {
|
1110
|
-
|
1531
|
+
var onResolve = function (data) {
|
1111
1532
|
translations(data.key, data.table);
|
1112
1533
|
deferred.resolve(data.table);
|
1113
|
-
}
|
1534
|
+
};
|
1535
|
+
onResolve.displayName = 'translationTableResolver';
|
1536
|
+
langPromises[langKey].then(onResolve, deferred.reject);
|
1114
1537
|
} else {
|
1115
1538
|
deferred.reject();
|
1116
1539
|
}
|
@@ -1135,7 +1558,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1135
1558
|
var getFallbackTranslation = function (langKey, translationId, interpolateParams, Interpolator) {
|
1136
1559
|
var deferred = $q.defer();
|
1137
1560
|
|
1138
|
-
|
1561
|
+
var onResolve = function (translationTable) {
|
1139
1562
|
if (Object.prototype.hasOwnProperty.call(translationTable, translationId)) {
|
1140
1563
|
Interpolator.setLocale(langKey);
|
1141
1564
|
var translation = translationTable[translationId];
|
@@ -1149,7 +1572,10 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1149
1572
|
} else {
|
1150
1573
|
deferred.reject();
|
1151
1574
|
}
|
1152
|
-
}
|
1575
|
+
};
|
1576
|
+
onResolve.displayName = 'fallbackTranslationResolver';
|
1577
|
+
|
1578
|
+
getTranslationTable(langKey).then(onResolve, deferred.reject);
|
1153
1579
|
|
1154
1580
|
return deferred.promise;
|
1155
1581
|
};
|
@@ -1194,11 +1620,11 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1194
1620
|
* @returns translation created by $missingTranslationHandler or translationId is $missingTranslationHandler is
|
1195
1621
|
* absent
|
1196
1622
|
*/
|
1197
|
-
var translateByHandler = function (translationId) {
|
1623
|
+
var translateByHandler = function (translationId, interpolateParams) {
|
1198
1624
|
// If we have a handler factory - we might also call it here to determine if it provides
|
1199
1625
|
// a default text for a translationid that can't be found anywhere in our tables
|
1200
1626
|
if ($missingTranslationHandlerFactory) {
|
1201
|
-
var resultString = $injector.get($missingTranslationHandlerFactory)(translationId, $uses);
|
1627
|
+
var resultString = $injector.get($missingTranslationHandlerFactory)(translationId, $uses, interpolateParams);
|
1202
1628
|
if (resultString !== undefined) {
|
1203
1629
|
return resultString;
|
1204
1630
|
} else {
|
@@ -1243,7 +1669,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1243
1669
|
} else {
|
1244
1670
|
// if no default translation is set and an error handler is defined, send it to the handler
|
1245
1671
|
// and then return the result
|
1246
|
-
deferred.resolve(translateByHandler(translationId));
|
1672
|
+
deferred.resolve(translateByHandler(translationId, interpolateParams));
|
1247
1673
|
}
|
1248
1674
|
}
|
1249
1675
|
return deferred.promise;
|
@@ -1324,7 +1750,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1324
1750
|
var missingTranslationHandlerTranslation;
|
1325
1751
|
// for logging purposes only (as in $translateMissingTranslationHandlerLog), value is not returned to promise
|
1326
1752
|
if ($missingTranslationHandlerFactory && !pendingLoader) {
|
1327
|
-
missingTranslationHandlerTranslation = translateByHandler(translationId);
|
1753
|
+
missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams);
|
1328
1754
|
}
|
1329
1755
|
|
1330
1756
|
// since we couldn't translate the inital requested translation id,
|
@@ -1381,7 +1807,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1381
1807
|
var missingTranslationHandlerTranslation;
|
1382
1808
|
// for logging purposes only (as in $translateMissingTranslationHandlerLog), value is not returned to promise
|
1383
1809
|
if ($missingTranslationHandlerFactory && !pendingLoader) {
|
1384
|
-
missingTranslationHandlerTranslation = translateByHandler(translationId);
|
1810
|
+
missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams);
|
1385
1811
|
}
|
1386
1812
|
|
1387
1813
|
// since we couldn't translate the inital requested translation id,
|
@@ -1403,6 +1829,13 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1403
1829
|
return result;
|
1404
1830
|
};
|
1405
1831
|
|
1832
|
+
var clearNextLangAndPromise = function(key) {
|
1833
|
+
if ($nextLang === key) {
|
1834
|
+
$nextLang = undefined;
|
1835
|
+
}
|
1836
|
+
langPromises[key] = undefined;
|
1837
|
+
};
|
1838
|
+
|
1406
1839
|
/**
|
1407
1840
|
* @ngdoc function
|
1408
1841
|
* @name pascalprecht.translate.$translate#preferredLanguage
|
@@ -1567,24 +2000,31 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1567
2000
|
|
1568
2001
|
// if there isn't a translation table for the language we've requested,
|
1569
2002
|
// we load it asynchronously
|
1570
|
-
if (!$translationTable[key] && $loaderFactory && !langPromises[key]) {
|
2003
|
+
if (($forceAsyncReloadEnabled || !$translationTable[key]) && $loaderFactory && !langPromises[key]) {
|
1571
2004
|
$nextLang = key;
|
1572
2005
|
langPromises[key] = loadAsync(key).then(function (translation) {
|
1573
2006
|
translations(translation.key, translation.table);
|
1574
2007
|
deferred.resolve(translation.key);
|
1575
|
-
|
1576
2008
|
useLanguage(translation.key);
|
1577
|
-
if ($nextLang === key) {
|
1578
|
-
$nextLang = undefined;
|
1579
|
-
}
|
1580
2009
|
return translation;
|
1581
2010
|
}, function (key) {
|
1582
|
-
if ($nextLang === key) {
|
1583
|
-
$nextLang = undefined;
|
1584
|
-
}
|
1585
2011
|
$rootScope.$emit('$translateChangeError', {language: key});
|
1586
2012
|
deferred.reject(key);
|
1587
2013
|
$rootScope.$emit('$translateChangeEnd', {language: key});
|
2014
|
+
return $q.reject(key);
|
2015
|
+
});
|
2016
|
+
langPromises[key]['finally'](function () {
|
2017
|
+
clearNextLangAndPromise(key);
|
2018
|
+
});
|
2019
|
+
} else if ($nextLang === key && langPromises[key]) {
|
2020
|
+
// we are already loading this asynchronously
|
2021
|
+
// resolve our new deferred when the old langPromise is resolved
|
2022
|
+
langPromises[key].then(function (translation) {
|
2023
|
+
deferred.resolve(translation.key);
|
2024
|
+
return translation;
|
2025
|
+
}, function (key) {
|
2026
|
+
deferred.reject(key);
|
2027
|
+
return $q.reject(key);
|
1588
2028
|
});
|
1589
2029
|
} else {
|
1590
2030
|
deferred.resolve(key);
|
@@ -1622,6 +2062,20 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1622
2062
|
return $postCompilingEnabled;
|
1623
2063
|
};
|
1624
2064
|
|
2065
|
+
/**
|
2066
|
+
* @ngdoc function
|
2067
|
+
* @name pascalprecht.translate.$translate#isForceAsyncReloadEnabled
|
2068
|
+
* @methodOf pascalprecht.translate.$translate
|
2069
|
+
*
|
2070
|
+
* @description
|
2071
|
+
* Returns whether force async reload is enabled or not
|
2072
|
+
*
|
2073
|
+
* @return {boolean} forceAsyncReload value
|
2074
|
+
*/
|
2075
|
+
$translate.isForceAsyncReloadEnabled = function () {
|
2076
|
+
return $forceAsyncReloadEnabled;
|
2077
|
+
};
|
2078
|
+
|
1625
2079
|
/**
|
1626
2080
|
* @ngdoc function
|
1627
2081
|
* @name pascalprecht.translate.$translate#refresh
|
@@ -1687,28 +2141,32 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1687
2141
|
tables.push(loadAsync($uses));
|
1688
2142
|
}
|
1689
2143
|
|
1690
|
-
|
2144
|
+
var allTranslationsLoaded = function (tableData) {
|
2145
|
+
$translationTable = {};
|
1691
2146
|
angular.forEach(tableData, function (data) {
|
1692
|
-
if ($translationTable[data.key]) {
|
1693
|
-
delete $translationTable[data.key];
|
1694
|
-
}
|
1695
2147
|
translations(data.key, data.table);
|
1696
2148
|
});
|
1697
2149
|
if ($uses) {
|
1698
2150
|
useLanguage($uses);
|
1699
2151
|
}
|
1700
2152
|
resolve();
|
1701
|
-
}
|
2153
|
+
};
|
2154
|
+
allTranslationsLoaded.displayName = 'refreshPostProcessor';
|
2155
|
+
|
2156
|
+
$q.all(tables).then(allTranslationsLoaded, reject);
|
1702
2157
|
|
1703
2158
|
} else if ($translationTable[langKey]) {
|
1704
2159
|
|
1705
|
-
|
2160
|
+
var oneTranslationsLoaded = function (data) {
|
1706
2161
|
translations(data.key, data.table);
|
1707
2162
|
if (langKey === $uses) {
|
1708
2163
|
useLanguage($uses);
|
1709
2164
|
}
|
1710
2165
|
resolve();
|
1711
|
-
}
|
2166
|
+
};
|
2167
|
+
oneTranslationsLoaded.displayName = 'refreshPostProcessor';
|
2168
|
+
|
2169
|
+
loadAsync(langKey).then(oneTranslationsLoaded, reject);
|
1712
2170
|
|
1713
2171
|
} else {
|
1714
2172
|
reject();
|
@@ -1734,7 +2192,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1734
2192
|
* @param {object} interpolateParams Params
|
1735
2193
|
* @param {string} interpolationId The id of the interpolation to use
|
1736
2194
|
*
|
1737
|
-
* @return {string} translation
|
2195
|
+
* @return {string|object} translation
|
1738
2196
|
*/
|
1739
2197
|
$translate.instant = function (translationId, interpolateParams, interpolationId) {
|
1740
2198
|
|
@@ -1791,7 +2249,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1791
2249
|
// Return translation of default interpolator if not found anything.
|
1792
2250
|
result = defaultInterpolator.interpolate(translationId, interpolateParams);
|
1793
2251
|
if ($missingTranslationHandlerFactory && !pendingLoader) {
|
1794
|
-
result = translateByHandler(translationId);
|
2252
|
+
result = translateByHandler(translationId, interpolateParams);
|
1795
2253
|
}
|
1796
2254
|
}
|
1797
2255
|
|
@@ -1831,6 +2289,11 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1831
2289
|
return directivePriority;
|
1832
2290
|
};
|
1833
2291
|
|
2292
|
+
// internal purpose only
|
2293
|
+
$translate.statefulFilter = function () {
|
2294
|
+
return statefulFilter;
|
2295
|
+
};
|
2296
|
+
|
1834
2297
|
if ($loaderFactory) {
|
1835
2298
|
|
1836
2299
|
// If at least one async loader is defined and there are no
|
@@ -1848,7 +2311,10 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1848
2311
|
return translation;
|
1849
2312
|
};
|
1850
2313
|
for (var i = 0, len = $fallbackLanguage.length; i < len; i++) {
|
1851
|
-
|
2314
|
+
var fallbackLanguageId = $fallbackLanguage[i];
|
2315
|
+
if ($forceAsyncReloadEnabled || !$translationTable[fallbackLanguageId]) {
|
2316
|
+
langPromises[fallbackLanguageId] = loadAsync(fallbackLanguageId).then(processAsyncResult);
|
2317
|
+
}
|
1852
2318
|
}
|
1853
2319
|
}
|
1854
2320
|
}
|
@@ -1856,7 +2322,10 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1856
2322
|
return $translate;
|
1857
2323
|
}
|
1858
2324
|
];
|
1859
|
-
}
|
2325
|
+
}
|
2326
|
+
$translate.$inject = ['$STORAGE_KEY', '$windowProvider', '$translateSanitizationProvider', 'pascalprechtTranslateOverrider'];
|
2327
|
+
|
2328
|
+
$translate.displayName = 'displayName';
|
1860
2329
|
|
1861
2330
|
/**
|
1862
2331
|
* @ngdoc object
|
@@ -1866,40 +2335,22 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
|
|
1866
2335
|
* @description
|
1867
2336
|
* Uses angular's `$interpolate` services to interpolate strings against some values.
|
1868
2337
|
*
|
1869
|
-
*
|
2338
|
+
* Be aware to configure a proper sanitization strategy.
|
2339
|
+
*
|
2340
|
+
* See also:
|
2341
|
+
* * {@link pascalprecht.translate.$translateSanitization}
|
2342
|
+
*
|
2343
|
+
* @return {object} $translateDefaultInterpolation Interpolator service
|
1870
2344
|
*/
|
1871
|
-
angular.module('pascalprecht.translate').factory('$translateDefaultInterpolation',
|
2345
|
+
angular.module('pascalprecht.translate').factory('$translateDefaultInterpolation', $translateDefaultInterpolation);
|
2346
|
+
|
2347
|
+
function $translateDefaultInterpolation ($interpolate, $translateSanitization) {
|
2348
|
+
|
2349
|
+
'use strict';
|
1872
2350
|
|
1873
2351
|
var $translateInterpolator = {},
|
1874
2352
|
$locale,
|
1875
|
-
$identifier = 'default'
|
1876
|
-
$sanitizeValueStrategy = null,
|
1877
|
-
// map of all sanitize strategies
|
1878
|
-
sanitizeValueStrategies = {
|
1879
|
-
escaped: function (params) {
|
1880
|
-
var result = {};
|
1881
|
-
for (var key in params) {
|
1882
|
-
if (Object.prototype.hasOwnProperty.call(params, key)) {
|
1883
|
-
if (angular.isNumber(params[key])) {
|
1884
|
-
result[key] = params[key];
|
1885
|
-
} else {
|
1886
|
-
result[key] = angular.element('<div></div>').text(params[key]).html();
|
1887
|
-
}
|
1888
|
-
}
|
1889
|
-
}
|
1890
|
-
return result;
|
1891
|
-
}
|
1892
|
-
};
|
1893
|
-
|
1894
|
-
var sanitizeParams = function (params) {
|
1895
|
-
var result;
|
1896
|
-
if (angular.isFunction(sanitizeValueStrategies[$sanitizeValueStrategy])) {
|
1897
|
-
result = sanitizeValueStrategies[$sanitizeValueStrategy](params);
|
1898
|
-
} else {
|
1899
|
-
result = params;
|
1900
|
-
}
|
1901
|
-
return result;
|
1902
|
-
};
|
2353
|
+
$identifier = 'default';
|
1903
2354
|
|
1904
2355
|
/**
|
1905
2356
|
* @ngdoc function
|
@@ -1929,8 +2380,12 @@ angular.module('pascalprecht.translate').factory('$translateDefaultInterpolation
|
|
1929
2380
|
return $identifier;
|
1930
2381
|
};
|
1931
2382
|
|
2383
|
+
/**
|
2384
|
+
* @deprecated will be removed in 3.0
|
2385
|
+
* @see {@link pascalprecht.translate.$translateSanitization}
|
2386
|
+
*/
|
1932
2387
|
$translateInterpolator.useSanitizeValueStrategy = function (value) {
|
1933
|
-
$
|
2388
|
+
$translateSanitization.useStrategy(value);
|
1934
2389
|
return this;
|
1935
2390
|
};
|
1936
2391
|
|
@@ -1945,15 +2400,21 @@ angular.module('pascalprecht.translate').factory('$translateDefaultInterpolation
|
|
1945
2400
|
*
|
1946
2401
|
* @returns {string} interpolated string.
|
1947
2402
|
*/
|
1948
|
-
$translateInterpolator.interpolate = function (string,
|
1949
|
-
|
1950
|
-
|
1951
|
-
|
1952
|
-
|
2403
|
+
$translateInterpolator.interpolate = function (string, interpolationParams) {
|
2404
|
+
interpolationParams = interpolationParams || {};
|
2405
|
+
interpolationParams = $translateSanitization.sanitize(interpolationParams, 'params');
|
2406
|
+
|
2407
|
+
var interpolatedText = $interpolate(string)(interpolationParams);
|
2408
|
+
interpolatedText = $translateSanitization.sanitize(interpolatedText, 'text');
|
2409
|
+
|
2410
|
+
return interpolatedText;
|
1953
2411
|
};
|
1954
2412
|
|
1955
2413
|
return $translateInterpolator;
|
1956
|
-
}
|
2414
|
+
}
|
2415
|
+
$translateDefaultInterpolation.$inject = ['$interpolate', '$translateSanitization'];
|
2416
|
+
|
2417
|
+
$translateDefaultInterpolation.displayName = '$translateDefaultInterpolation';
|
1957
2418
|
|
1958
2419
|
angular.module('pascalprecht.translate').constant('$STORAGE_KEY', 'NG_TRANSLATE_LANG_KEY');
|
1959
2420
|
|
@@ -1975,7 +2436,7 @@ angular.module('pascalprecht.translate')
|
|
1975
2436
|
* @param {string=} translate-values Values to pass into translation id. Can be passed as object literal string or interpolated object.
|
1976
2437
|
* @param {string=} translate-attr-ATTR translate Translation id and put it into ATTR attribute.
|
1977
2438
|
* @param {string=} translate-default will be used unless translation was successful
|
1978
|
-
* @param {boolean=} translate-compile (default true if present) defines locally activation of {@link pascalprecht.translate.$
|
2439
|
+
* @param {boolean=} translate-compile (default true if present) defines locally activation of {@link pascalprecht.translate.$translateProvider#methods_usePostCompiling}
|
1979
2440
|
*
|
1980
2441
|
* @example
|
1981
2442
|
<example module="ngView">
|
@@ -2044,7 +2505,10 @@ angular.module('pascalprecht.translate')
|
|
2044
2505
|
</file>
|
2045
2506
|
</example>
|
2046
2507
|
*/
|
2047
|
-
.directive('translate',
|
2508
|
+
.directive('translate', translateDirective);
|
2509
|
+
function translateDirective($translate, $q, $interpolate, $compile, $parse, $rootScope) {
|
2510
|
+
|
2511
|
+
'use strict';
|
2048
2512
|
|
2049
2513
|
/**
|
2050
2514
|
* @name trim
|
@@ -2083,6 +2547,22 @@ angular.module('pascalprecht.translate')
|
|
2083
2547
|
scope.postText = '';
|
2084
2548
|
var translationIds = {};
|
2085
2549
|
|
2550
|
+
var initInterpolationParams = function (interpolateParams, iAttr, tAttr) {
|
2551
|
+
// initial setup
|
2552
|
+
if (iAttr.translateValues) {
|
2553
|
+
angular.extend(interpolateParams, $parse(iAttr.translateValues)(scope.$parent));
|
2554
|
+
}
|
2555
|
+
// initially fetch all attributes if existing and fill the params
|
2556
|
+
if (translateValueExist) {
|
2557
|
+
for (var attr in tAttr) {
|
2558
|
+
if (Object.prototype.hasOwnProperty.call(iAttr, attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') {
|
2559
|
+
var attributeName = angular.lowercase(attr.substr(14, 1)) + attr.substr(15);
|
2560
|
+
interpolateParams[attributeName] = tAttr[attr];
|
2561
|
+
}
|
2562
|
+
}
|
2563
|
+
}
|
2564
|
+
};
|
2565
|
+
|
2086
2566
|
// Ensures any change of the attribute "translate" containing the id will
|
2087
2567
|
// be re-stored to the scope's "translationId".
|
2088
2568
|
// If the attribute has no content, the element's text value (white spaces trimmed off) will be used.
|
@@ -2125,6 +2605,9 @@ angular.module('pascalprecht.translate')
|
|
2125
2605
|
});
|
2126
2606
|
};
|
2127
2607
|
|
2608
|
+
// initial setup with values
|
2609
|
+
initInterpolationParams(scope.interpolateParams, iAttr, tAttr);
|
2610
|
+
|
2128
2611
|
var firstAttributeChangedEvent = true;
|
2129
2612
|
iAttr.$observe('translate', function (translationId) {
|
2130
2613
|
if (typeof translationId === 'undefined') {
|
@@ -2177,7 +2660,8 @@ angular.module('pascalprecht.translate')
|
|
2177
2660
|
// Master update function
|
2178
2661
|
var updateTranslations = function () {
|
2179
2662
|
for (var key in translationIds) {
|
2180
|
-
|
2663
|
+
|
2664
|
+
if (translationIds.hasOwnProperty(key) && translationIds[key] !== undefined) {
|
2181
2665
|
updateTranslation(key, translationIds[key], scope, scope.interpolateParams, scope.defaultText);
|
2182
2666
|
}
|
2183
2667
|
}
|
@@ -2216,12 +2700,19 @@ angular.module('pascalprecht.translate')
|
|
2216
2700
|
if (!successful && typeof scope.defaultText !== 'undefined') {
|
2217
2701
|
value = scope.defaultText;
|
2218
2702
|
}
|
2219
|
-
var attributeName = iAttr.$attr[translateAttr]
|
2703
|
+
var attributeName = iAttr.$attr[translateAttr];
|
2704
|
+
if (attributeName.substr(0, 5) === 'data-') {
|
2705
|
+
// ensure html5 data prefix is stripped
|
2706
|
+
attributeName = attributeName.substr(5);
|
2707
|
+
}
|
2708
|
+
attributeName = attributeName.substr(15);
|
2220
2709
|
iElement.attr(attributeName, value);
|
2221
2710
|
}
|
2222
2711
|
};
|
2223
2712
|
|
2224
|
-
|
2713
|
+
if (translateValuesExist || translateValueExist || iAttr.translateDefault) {
|
2714
|
+
scope.$watch('interpolateParams', updateTranslations, true);
|
2715
|
+
}
|
2225
2716
|
|
2226
2717
|
// Ensures the text will be refreshed after the current language was changed
|
2227
2718
|
// w/ $translate.use(...)
|
@@ -2229,14 +2720,24 @@ angular.module('pascalprecht.translate')
|
|
2229
2720
|
|
2230
2721
|
// ensure translation will be looked up at least one
|
2231
2722
|
if (iElement.text().length) {
|
2232
|
-
|
2723
|
+
if (iAttr.translate) {
|
2724
|
+
observeElementTranslation(iAttr.translate);
|
2725
|
+
} else {
|
2726
|
+
observeElementTranslation('');
|
2727
|
+
}
|
2728
|
+
} else if (iAttr.translate) {
|
2729
|
+
// ensure attribute will be not skipped
|
2730
|
+
observeElementTranslation(iAttr.translate);
|
2233
2731
|
}
|
2234
2732
|
updateTranslations();
|
2235
2733
|
scope.$on('$destroy', unbind);
|
2236
2734
|
};
|
2237
2735
|
}
|
2238
2736
|
};
|
2239
|
-
}
|
2737
|
+
}
|
2738
|
+
translateDirective.$inject = ['$translate', '$q', '$interpolate', '$compile', '$parse', '$rootScope'];
|
2739
|
+
|
2740
|
+
translateDirective.displayName = 'translateDirective';
|
2240
2741
|
|
2241
2742
|
angular.module('pascalprecht.translate')
|
2242
2743
|
/**
|
@@ -2260,7 +2761,11 @@ angular.module('pascalprecht.translate')
|
|
2260
2761
|
* or hiding the cloak. Basically it relies on the translation
|
2261
2762
|
* resolve.
|
2262
2763
|
*/
|
2263
|
-
.directive('translateCloak',
|
2764
|
+
.directive('translateCloak', translateCloakDirective);
|
2765
|
+
|
2766
|
+
function translateCloakDirective($rootScope, $translate) {
|
2767
|
+
|
2768
|
+
'use strict';
|
2264
2769
|
|
2265
2770
|
return {
|
2266
2771
|
compile: function (tElement) {
|
@@ -2287,7 +2792,10 @@ angular.module('pascalprecht.translate')
|
|
2287
2792
|
};
|
2288
2793
|
}
|
2289
2794
|
};
|
2290
|
-
}
|
2795
|
+
}
|
2796
|
+
translateCloakDirective.$inject = ['$rootScope', '$translate'];
|
2797
|
+
|
2798
|
+
translateCloakDirective.displayName = 'translateCloakDirective';
|
2291
2799
|
|
2292
2800
|
angular.module('pascalprecht.translate')
|
2293
2801
|
/**
|
@@ -2341,7 +2849,12 @@ angular.module('pascalprecht.translate')
|
|
2341
2849
|
</file>
|
2342
2850
|
</example>
|
2343
2851
|
*/
|
2344
|
-
.filter('translate',
|
2852
|
+
.filter('translate', translateFilterFactory);
|
2853
|
+
|
2854
|
+
function translateFilterFactory($parse, $translate) {
|
2855
|
+
|
2856
|
+
'use strict';
|
2857
|
+
|
2345
2858
|
var translateFilter = function (translationId, interpolateParams, interpolation) {
|
2346
2859
|
|
2347
2860
|
if (!angular.isObject(interpolateParams)) {
|
@@ -2351,9 +2864,41 @@ angular.module('pascalprecht.translate')
|
|
2351
2864
|
return $translate.instant(translationId, interpolateParams, interpolation);
|
2352
2865
|
};
|
2353
2866
|
|
2354
|
-
|
2355
|
-
|
2356
|
-
|
2867
|
+
if ($translate.statefulFilter()) {
|
2868
|
+
translateFilter.$stateful = true;
|
2869
|
+
}
|
2357
2870
|
|
2358
2871
|
return translateFilter;
|
2359
|
-
}
|
2872
|
+
}
|
2873
|
+
translateFilterFactory.$inject = ['$parse', '$translate'];
|
2874
|
+
|
2875
|
+
translateFilterFactory.displayName = 'translateFilterFactory';
|
2876
|
+
|
2877
|
+
angular.module('pascalprecht.translate')
|
2878
|
+
|
2879
|
+
/**
|
2880
|
+
* @ngdoc object
|
2881
|
+
* @name pascalprecht.translate.$translationCache
|
2882
|
+
* @requires $cacheFactory
|
2883
|
+
*
|
2884
|
+
* @description
|
2885
|
+
* The first time a translation table is used, it is loaded in the translation cache for quick retrieval. You
|
2886
|
+
* can load translation tables directly into the cache by consuming the
|
2887
|
+
* `$translationCache` service directly.
|
2888
|
+
*
|
2889
|
+
* @return {object} $cacheFactory object.
|
2890
|
+
*/
|
2891
|
+
.factory('$translationCache', $translationCache);
|
2892
|
+
|
2893
|
+
function $translationCache($cacheFactory) {
|
2894
|
+
|
2895
|
+
'use strict';
|
2896
|
+
|
2897
|
+
return $cacheFactory('translations');
|
2898
|
+
}
|
2899
|
+
$translationCache.$inject = ['$cacheFactory'];
|
2900
|
+
|
2901
|
+
$translationCache.displayName = '$translationCache';
|
2902
|
+
return 'pascalprecht.translate';
|
2903
|
+
|
2904
|
+
}));
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: angular-translate-rails-tf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kanwaldeep Singh Arneja
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-10-
|
12
|
+
date: 2017-10-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|