|
53 | 53 | var langCache = {
|
54 | 54 | _langs: {},
|
55 | 55 | current: null,
|
| 56 | + fallback: i18nConstants.DEFAULT_LANG, |
56 | 57 | get: function (lang) {
|
57 |
| - return this._langs[lang.toLowerCase()]; |
| 58 | + var self = this, |
| 59 | + fallbackLang = self.getFallbackLang(); |
| 60 | + |
| 61 | + if (lang !== self.fallback) { |
| 62 | + return angular.merge({}, self._langs[fallbackLang], |
| 63 | + self._langs[lang.toLowerCase()]); |
| 64 | + } |
| 65 | + |
| 66 | + return self._langs[lang.toLowerCase()]; |
58 | 67 | },
|
59 | 68 | add: function (lang, strings) {
|
60 | 69 | var lower = lang.toLowerCase();
|
|
78 | 87 | setCurrent: function (lang) {
|
79 | 88 | this.current = lang.toLowerCase();
|
80 | 89 | },
|
| 90 | + setFallback: function (lang) { |
| 91 | + this.fallback = lang.toLowerCase(); |
| 92 | + }, |
81 | 93 | getCurrentLang: function () {
|
82 | 94 | return this.current;
|
| 95 | + }, |
| 96 | + getFallbackLang: function () { |
| 97 | + return this.fallback.toLowerCase(); |
83 | 98 | }
|
84 | 99 | };
|
85 | 100 |
|
|
157 | 172 | * </pre>
|
158 | 173 | */
|
159 | 174 | getSafeText: function (path, lang) {
|
160 |
| - var language = lang || service.getCurrentLang(); |
161 |
| - var trans = langCache.get(language); |
| 175 | + var language = lang || service.getCurrentLang(), |
| 176 | + trans = langCache.get(language), |
| 177 | + missing = i18nConstants.MISSING + path; |
162 | 178 |
|
163 | 179 | if (!trans) {
|
164 |
| - return i18nConstants.MISSING; |
| 180 | + return missing; |
165 | 181 | }
|
166 | 182 |
|
167 | 183 | var paths = path.split('.');
|
168 | 184 | var current = trans;
|
169 | 185 |
|
170 | 186 | for (var i = 0; i < paths.length; ++i) {
|
171 | 187 | if (current[paths[i]] === undefined || current[paths[i]] === null) {
|
172 |
| - return i18nConstants.MISSING; |
| 188 | + return missing; |
173 | 189 | } else {
|
174 | 190 | current = current[paths[i]];
|
175 | 191 | }
|
176 | 192 | }
|
177 | 193 |
|
178 | 194 | return current;
|
179 |
| - |
180 | 195 | },
|
181 | 196 |
|
182 | 197 | /**
|
183 | 198 | * @ngdoc service
|
184 | 199 | * @name setCurrentLang
|
185 | 200 | * @methodOf ui.grid.i18n.service:i18nService
|
186 | 201 | * @description sets the current language to use in the application
|
187 |
| - * $broadcasts the i18nConstants.UPDATE_EVENT on the $rootScope |
| 202 | + * $broadcasts and $emits the i18nConstants.UPDATE_EVENT on the $rootScope |
188 | 203 | * @param {string} lang to set
|
189 | 204 | * @example
|
190 | 205 | * <pre>
|
191 | 206 | * i18nService.setCurrentLang('fr');
|
192 | 207 | * </pre>
|
193 | 208 | */
|
194 |
| - |
195 | 209 | setCurrentLang: function (lang) {
|
196 | 210 | if (lang) {
|
197 | 211 | langCache.setCurrent(lang);
|
198 | 212 | $rootScope.$broadcast(i18nConstants.UPDATE_EVENT);
|
| 213 | + $rootScope.$emit(i18nConstants.UPDATE_EVENT); |
| 214 | + } |
| 215 | + }, |
| 216 | + |
| 217 | + /** |
| 218 | + * @ngdoc service |
| 219 | + * @name setFallbackLang |
| 220 | + * @methodOf ui.grid.i18n.service:i18nService |
| 221 | + * @description sets the fallback language to use in the application. |
| 222 | + * The default fallback language is english. |
| 223 | + * @param {string} lang to set |
| 224 | + * @example |
| 225 | + * <pre> |
| 226 | + * i18nService.setFallbackLang('en'); |
| 227 | + * </pre> |
| 228 | + */ |
| 229 | + setFallbackLang: function (lang) { |
| 230 | + if (lang) { |
| 231 | + langCache.setFallback(lang); |
199 | 232 | }
|
200 | 233 | },
|
201 | 234 |
|
|
212 | 245 | langCache.setCurrent(lang);
|
213 | 246 | }
|
214 | 247 | return lang;
|
215 |
| - } |
| 248 | + }, |
216 | 249 |
|
| 250 | + /** |
| 251 | + * @ngdoc service |
| 252 | + * @name getFallbackLang |
| 253 | + * @methodOf ui.grid.i18n.service:i18nService |
| 254 | + * @description returns the fallback language used in the application |
| 255 | + */ |
| 256 | + getFallbackLang: function () { |
| 257 | + return langCache.getFallbackLang(); |
| 258 | + } |
217 | 259 | };
|
218 | 260 |
|
219 | 261 | return service;
|
220 |
| - |
221 | 262 | }]);
|
222 | 263 |
|
223 |
| - var localeDirective = function (i18nService, i18nConstants) { |
| 264 | + function localeDirective(i18nService, i18nConstants) { |
224 | 265 | return {
|
225 | 266 | compile: function () {
|
226 | 267 | return {
|
|
241 | 282 | };
|
242 | 283 | }
|
243 | 284 | };
|
244 |
| - }; |
| 285 | + } |
245 | 286 |
|
246 | 287 | module.directive('uiI18n', ['i18nService', 'i18nConstants', localeDirective]);
|
247 | 288 |
|
248 | 289 | // directive syntax
|
249 |
| - var uitDirective = function ($parse, i18nService, i18nConstants) { |
| 290 | + function uitDirective(i18nService, i18nConstants) { |
250 | 291 | return {
|
251 | 292 | restrict: 'EA',
|
252 | 293 | compile: function () {
|
253 | 294 | return {
|
254 | 295 | pre: function ($scope, $elm, $attrs) {
|
255 |
| - var alias1 = DIRECTIVE_ALIASES[0], |
256 |
| - alias2 = DIRECTIVE_ALIASES[1]; |
257 |
| - var token = $attrs[alias1] || $attrs[alias2] || $elm.html(); |
258 |
| - var missing = i18nConstants.MISSING + token; |
259 |
| - var observer; |
| 296 | + var listener, observer, prop, |
| 297 | + alias1 = DIRECTIVE_ALIASES[0], |
| 298 | + alias2 = DIRECTIVE_ALIASES[1], |
| 299 | + token = $attrs[alias1] || $attrs[alias2] || $elm.html(); |
| 300 | + |
| 301 | + function translateToken(property) { |
| 302 | + var safeText = i18nService.getSafeText(property); |
| 303 | + |
| 304 | + $elm.html(safeText); |
| 305 | + } |
| 306 | + |
260 | 307 | if ($attrs.$$observers) {
|
261 |
| - var prop = $attrs[alias1] ? alias1 : alias2; |
| 308 | + prop = $attrs[alias1] ? alias1 : alias2; |
262 | 309 | observer = $attrs.$observe(prop, function (result) {
|
263 | 310 | if (result) {
|
264 |
| - $elm.html($parse(result)(i18nService.getCurrentLang()) || missing); |
| 311 | + translateToken(result); |
265 | 312 | }
|
266 | 313 | });
|
267 | 314 | }
|
268 |
| - var getter = $parse(token); |
269 |
| - var listener = $scope.$on(i18nConstants.UPDATE_EVENT, function (evt) { |
| 315 | + |
| 316 | + listener = $scope.$on(i18nConstants.UPDATE_EVENT, function() { |
270 | 317 | if (observer) {
|
271 | 318 | observer($attrs[alias1] || $attrs[alias2]);
|
272 | 319 | } else {
|
273 | 320 | // set text based on i18n current language
|
274 |
| - $elm.html(getter(i18nService.get()) || missing); |
| 321 | + translateToken(token); |
275 | 322 | }
|
276 | 323 | });
|
277 | 324 | $scope.$on('$destroy', listener);
|
278 | 325 |
|
279 |
| - $elm.html(getter(i18nService.get()) || missing); |
| 326 | + translateToken(token); |
280 | 327 | }
|
281 | 328 | };
|
282 | 329 | }
|
283 | 330 | };
|
284 |
| - }; |
| 331 | + } |
285 | 332 |
|
286 |
| - angular.forEach( DIRECTIVE_ALIASES, function ( alias ) { |
287 |
| - module.directive( alias, ['$parse', 'i18nService', 'i18nConstants', uitDirective] ); |
288 |
| - } ); |
| 333 | + angular.forEach(DIRECTIVE_ALIASES, function ( alias ) { |
| 334 | + module.directive(alias, ['i18nService', 'i18nConstants', uitDirective]); |
| 335 | + }); |
289 | 336 |
|
290 | 337 | // optional filter syntax
|
291 |
| - var uitFilter = function ($parse, i18nService, i18nConstants) { |
292 |
| - return function (data) { |
293 |
| - var getter = $parse(data); |
| 338 | + function uitFilter(i18nService) { |
| 339 | + return function (data, lang) { |
294 | 340 | // set text based on i18n current language
|
295 |
| - return getter(i18nService.get()) || i18nConstants.MISSING + data; |
| 341 | + return i18nService.getSafeText(data, lang); |
296 | 342 | };
|
297 |
| - }; |
298 |
| - |
299 |
| - angular.forEach( FILTER_ALIASES, function ( alias ) { |
300 |
| - module.filter( alias, ['$parse', 'i18nService', 'i18nConstants', uitFilter] ); |
301 |
| - } ); |
302 |
| - |
| 343 | + } |
303 | 344 |
|
| 345 | + angular.forEach(FILTER_ALIASES, function ( alias ) { |
| 346 | + module.filter(alias, ['i18nService', uitFilter]); |
| 347 | + }); |
304 | 348 | })();
|
0 commit comments