|
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