diff --git a/bower.json b/bower.json index d020be5..253d8b4 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "angular-localization", - "version": "1.3.1", + "version": "1.4.0", "homepage": "https://github.com/doshprompt/angular-localization", "description": "angularjs localization done right", "main": [ diff --git a/dist/angular-localization.css b/dist/angular-localization.css index aad3cdd..401135c 100644 --- a/dist/angular-localization.css +++ b/dist/angular-localization.css @@ -1,5 +1,5 @@ /*! - * angular-localization :: v1.2.2 :: 2015-07-15 + * angular-localization :: v1.4.0 :: 2015-09-14 * web: http://doshprompt.github.io/angular-localization * * Copyright (c) 2015 | Rahul Doshi diff --git a/dist/angular-localization.js b/dist/angular-localization.js index 3f19de6..9feeed6 100644 --- a/dist/angular-localization.js +++ b/dist/angular-localization.js @@ -1,5 +1,5 @@ /*! - * angular-localization :: v1.2.2 :: 2015-07-15 + * angular-localization :: v1.4.0 :: 2015-09-14 * web: http://doshprompt.github.io/angular-localization * * Copyright (c) 2015 | Rahul Doshi @@ -9,7 +9,7 @@ 'use strict'; angular.module('ngLocalize.Version', []) - .constant('localeVer', '1.2.2'); + .constant('localeVer', '1.4.0'); angular.module('ngLocalize', ['ngSanitize', 'ngLocalize.Config', 'ngLocalize.Events', 'ngLocalize.InstalledLanguages']); angular.module('ngLocalize.InstalledLanguages', []) @@ -23,6 +23,7 @@ angular.module('ngLocalize') .service('locale', function ($injector, $http, $q, $log, $rootScope, $window, localeConf, localeEvents, localeSupported, localeFallbacks) { var TOKEN_REGEX = new RegExp('^[\\w\\.-]+\\.[\\w\\s\\.-]+\\w(:.*)?$'), + $html = angular.element(document.body).parent(), currentLocale, deferrences, bundles, @@ -248,6 +249,12 @@ angular.module('ngLocalize') return result; } + function updateHtmlTagLangAttr(lang) { + lang = lang.split('-')[0]; + + $html.attr('lang', lang); + } + function setLocale(value) { var lang; @@ -270,6 +277,8 @@ angular.module('ngLocalize') deferrences = {}; currentLocale = lang; + updateHtmlTagLangAttr(lang); + $rootScope.$broadcast(localeEvents.localeChanges, currentLocale); $rootScope.$broadcast(localeEvents.resourceUpdates); @@ -283,7 +292,7 @@ angular.module('ngLocalize') return currentLocale; } - setLocale(cookieStore ? cookieStore.get(localeConf.cookieName) : $window.navigator.userLanguage || $window.navigator.language); + setLocale(cookieStore && cookieStore.get(localeConf.cookieName) ? cookieStore.get(localeConf.cookieName) : $window.navigator.userLanguage || $window.navigator.language); return { ready: ready, @@ -382,7 +391,7 @@ angular.module('ngLocalize') exp = values[key]; value = locale.getString(exp); if (lastValues[key] !== value) { - attrs.$set(key, lastValues[key] = value); + attrs.$set(attrs.$normalize(key), lastValues[key] = value); } } }); diff --git a/dist/angular-localization.min.css b/dist/angular-localization.min.css index 756f3e3..7c1d942 100644 --- a/dist/angular-localization.min.css +++ b/dist/angular-localization.min.css @@ -1,5 +1,5 @@ /*! - * angular-localization :: v1.2.2 :: 2015-07-15 + * angular-localization :: v1.4.0 :: 2015-09-14 * web: http://doshprompt.github.io/angular-localization * * Copyright (c) 2015 | Rahul Doshi diff --git a/dist/angular-localization.min.css.map b/dist/angular-localization.min.css.map index a41fecd..36408a7 100644 --- a/dist/angular-localization.min.css.map +++ b/dist/angular-localization.min.css.map @@ -1 +1 @@ -{"version":3,"sources":["localization.directions.less","localization.helpers.less","localization.transforms.less"],"names":[],"mappings":"AAIA,CAAC;EACG,cAAA;EACA,mBAAA;;AAEJ,CAAC;EACG,cAAA;EACA,mBAAA;;AAMJ,GAAG;EACC,cAAA;EACA,2BAAA;;AAEJ,GAAG;EACC,cAAA;EACA,2BAAA;;;ACnBJ;EACI,WAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;;;ACJJ;EACI,yBAAA;;AAEJ;EACI,yBAAA;;AAEJ;EACI,0BAAA;;AAQJ,sBAAsB;EAClB,yBAAA;;AAEJ,sBAAsB;EAClB,yBAAA;;AAEJ,uBAAuB;EACnB,0BAAA;;AAIJ,sBAAsB;EAClB,yBAAA;;AAEJ,sBAAsB;EAClB,yBAAA;;AAEJ,uBAAuB;EACnB,0BAAA;;AAIJ,sBAAsB;EAClB,yBAAA;;AAEJ,sBAAsB;EAClB,yBAAA;;AAEJ,uBAAuB;EACnB,0BAAA;;AAIJ,sBAAsB;EAClB,yBAAA;;AAEJ,sBAAsB;EAClB,yBAAA;;AAEJ,uBAAuB;EACnB,0BAAA","file":"angular-localization.min.css","sourcesContent":["// Language Text Direction\n// --------------------------------------------------\n// https://css-tricks.com/almanac/properties/d/direction/\n\n*[dir=\"ltr\"] {\n direction: ltr;\n unicode-bidi: embed;\n}\n*[dir=\"rtl\"] {\n direction: rtl;\n unicode-bidi: embed;\n}\n\n// Inline Element Overrides\n// -------------------------\n\nbdo[dir=\"ltr\"] {\n direction: ltr;\n unicode-bidi: bidi-override;\n}\nbdo[dir=\"rtl\"] {\n direction: rtl;\n unicode-bidi: bidi-override;\n}","// Text Overflow Truncate\n// -------------------------\n\n.overflow-ellipsis {\n width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}","// CSS Text Transforms\n// -------------------------\n\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n\n// HTML5 Placeholder Text Transformation Classes\n// --------------------------------------------------\n// http://davidwalsh.name/html5-placeholder-css\n\n// Firefox 19+\n.placeholder-lowercase::-moz-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase::-moz-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize::-moz-placeholder {\n text-transform: capitalize;\n}\n\n// Firefox 18-4\n.placeholder-lowercase:-moz-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase:-moz-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize:-moz-placeholder {\n text-transform: capitalize;\n}\n\n// WebKit\n.placeholder-lowercase::-webkit-input-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase::-webkit-input-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize::-webkit-input-placeholder {\n text-transform: capitalize;\n}\n\n// IE 10+\n.placeholder-lowercase::-ms-input-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase::-ms-input-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize::-ms-input-placeholder {\n text-transform: capitalize;\n}"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["angular-localization.css","localization.directions.less","localization.helpers.less","localization.transforms.less"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACHA,CAAC;EACG,cAAA;EACA,mBAAA;;AAEJ,CAAC;EACG,cAAA;EACA,mBAAA;;AAMJ,GAAG;EACC,cAAA;EACA,2BAAA;;AAEJ,GAAG;EACC,cAAA;EACA,2BAAA;;;ACnBJ;EACI,WAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;;;ACJJ;EACI,yBAAA;;AAEJ;EACI,yBAAA;;AAEJ;EACI,0BAAA;;AAQJ,sBAAsB;EAClB,yBAAA;;AAEJ,sBAAsB;EAClB,yBAAA;;AAEJ,uBAAuB;EACnB,0BAAA;;AAIJ,sBAAsB;EAClB,yBAAA;;AAEJ,sBAAsB;EAClB,yBAAA;;AAEJ,uBAAuB;EACnB,0BAAA;;AAIJ,sBAAsB;EAClB,yBAAA;;AAEJ,sBAAsB;EAClB,yBAAA;;AAEJ,uBAAuB;EACnB,0BAAA;;AAIJ,sBAAsB;EAClB,yBAAA;;AAEJ,sBAAsB;EAClB,yBAAA;;AAEJ,uBAAuB;EACnB,0BAAA","file":"angular-localization.min.css","sourcesContent":["/*!\n * angular-localization :: v1.4.0 :: 2015-09-14\n * web: http://doshprompt.github.io/angular-localization\n *\n * Copyright (c) 2015 | Rahul Doshi\n * License: MIT\n */\n*[dir=\"ltr\"] {\n direction: ltr;\n unicode-bidi: embed;\n}\n*[dir=\"rtl\"] {\n direction: rtl;\n unicode-bidi: embed;\n}\nbdo[dir=\"ltr\"] {\n direction: ltr;\n unicode-bidi: bidi-override;\n}\nbdo[dir=\"rtl\"] {\n direction: rtl;\n unicode-bidi: bidi-override;\n}\n\n.overflow-ellipsis {\n width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.placeholder-lowercase::-moz-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase::-moz-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize::-moz-placeholder {\n text-transform: capitalize;\n}\n.placeholder-lowercase:-moz-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase:-moz-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize:-moz-placeholder {\n text-transform: capitalize;\n}\n.placeholder-lowercase::-webkit-input-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase::-webkit-input-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize::-webkit-input-placeholder {\n text-transform: capitalize;\n}\n.placeholder-lowercase::-ms-input-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase::-ms-input-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize::-ms-input-placeholder {\n text-transform: capitalize;\n}\n","// Language Text Direction\n// --------------------------------------------------\n// https://css-tricks.com/almanac/properties/d/direction/\n\n*[dir=\"ltr\"] {\n direction: ltr;\n unicode-bidi: embed;\n}\n*[dir=\"rtl\"] {\n direction: rtl;\n unicode-bidi: embed;\n}\n\n// Inline Element Overrides\n// -------------------------\n\nbdo[dir=\"ltr\"] {\n direction: ltr;\n unicode-bidi: bidi-override;\n}\nbdo[dir=\"rtl\"] {\n direction: rtl;\n unicode-bidi: bidi-override;\n}","// Text Overflow Truncate\n// -------------------------\n\n.overflow-ellipsis {\n width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}","// CSS Text Transforms\n// -------------------------\n\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n\n// HTML5 Placeholder Text Transformation Classes\n// --------------------------------------------------\n// http://davidwalsh.name/html5-placeholder-css\n\n// Firefox 19+\n.placeholder-lowercase::-moz-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase::-moz-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize::-moz-placeholder {\n text-transform: capitalize;\n}\n\n// Firefox 18-4\n.placeholder-lowercase:-moz-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase:-moz-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize:-moz-placeholder {\n text-transform: capitalize;\n}\n\n// WebKit\n.placeholder-lowercase::-webkit-input-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase::-webkit-input-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize::-webkit-input-placeholder {\n text-transform: capitalize;\n}\n\n// IE 10+\n.placeholder-lowercase::-ms-input-placeholder {\n text-transform: lowercase;\n}\n.placeholder-uppercase::-ms-input-placeholder {\n text-transform: uppercase;\n}\n.placeholder-capitalize::-ms-input-placeholder {\n text-transform: capitalize;\n}"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/dist/angular-localization.min.js b/dist/angular-localization.min.js index 023694f..009291e 100644 --- a/dist/angular-localization.min.js +++ b/dist/angular-localization.min.js @@ -1,9 +1,9 @@ /*! - * angular-localization :: v1.2.2 :: 2015-07-15 + * angular-localization :: v1.4.0 :: 2015-09-14 * web: http://doshprompt.github.io/angular-localization * * Copyright (c) 2015 | Rahul Doshi * License: MIT */ -!function(e,n,t,o){"use strict";e.module("ngLocalize.Version",[]).constant("localeVer","1.2.2"),e.module("ngLocalize",["ngSanitize","ngLocalize.Config","ngLocalize.Events","ngLocalize.InstalledLanguages"]),e.module("ngLocalize.InstalledLanguages",[]).value("localeSupported",["en-US"]).value("localeFallbacks",{en:"en-US"}),e.module("ngLocalize").service("locale",["$injector","$http","$q","$log","$rootScope","$window","localeConf","localeEvents","localeSupported","localeFallbacks",function(n,t,o,a,i,r,l,c,s,u){function g(e){return e&&e.length&&U.test(e)}function f(e){var n=e?e.split("."):"",t="";return n.length>1&&(t=n.slice(0,-1).join(".")),t}function d(e){var n=e?e.split("."):[],t="";return n.length&&(t=n[n.length-1]),t}function v(e){var n,t=null,o=e?e.split("."):[];if(o.length>1)for(t=C,n=0;n1){for(n=0;n1?(i=[],t.forEach(function(e){i.push(p(e))}),a=o.all(i)):a=p(n),a}function m(n,t){var o=n,a=0;return t&&(e.isArray(t)?e.forEach(t,function(e,n){o=o.replace("%"+(n+1),e),o=o.replace("{"+(n+1)+"}",e)}):e.forEach(t,function(e,n){++a,o=o.replace("{"+n+"}",e),o=o.replace("%"+n,e),o=o.replace("%"+a,e),o=o.replace("{"+a+"}",e)})),o=o.replace(/\n/g,"
")}function $(n,t){var o,i,r,c="",s=!1;return e.isString(n)&&!t&&-1!==n.indexOf(l.delimiter)&&(r=n.split(l.delimiter),n=r[0],t=e.fromJson(r[1])),s=g(n),s?(e.isObject(t)||(t=[t]),o=v(n),o&&!o._loading?(i=d(n),o[i]?c=m(o[i],t):(a.info("[localizationService] Key not found: "+n),c="%%KEY_NOT_FOUND%%")):o||h(n)):c=n,c}function S(n){var t;e.isString(n)?(n=n.trim(),-1!==s.indexOf(n)?t=n:(t=u[n.split("-")[0]],e.isUndefined(t)&&(t=l.defaultLocale))):t=l.defaultLocale,t!==b&&(C={},z={},b=t,i.$broadcast(c.localeChanges,b),i.$broadcast(c.resourceUpdates),O&&O.put(l.cookieName,t))}function E(){return b}var b,z,C,O,U=new RegExp("^[\\w\\.-]+\\.[\\w\\s\\.-]+\\w(:.*)?$");return l.persistSelection&&n.has("$cookieStore")&&(O=n.get("$cookieStore")),S(O?O.get(l.cookieName):r.navigator.userLanguage||r.navigator.language),{ready:L,isToken:g,getPath:f,getKey:d,setLocale:S,getLocale:E,getString:$}}]),e.module("ngLocalize").filter("i18n",["locale",function(e){var n=function(n,t){return e.getString(n,t)};return n.$stateful=!0,n}]),e.module("ngLocalize.Events",[]).constant("localeEvents",{resourceUpdates:"ngLocalizeResourcesUpdated",localeChanges:"ngLocalizeLocaleChanged"}),e.module("ngLocalize").directive("i18n",["$sce","locale","localeEvents","localeConf",function(n,t,o,a){function i(e,t){t!==e.html()&&e.html(n.getTrustedHtml(t))}function r(e,n,o){t.isToken(n)?t.ready(t.getPath(n)).then(function(){i(e,t.getString(n,o))}):i(e,n)}return function(n,t,i){var l;i.$observe("i18n",function(e,n){e&&e!==n&&r(t,e,l)}),e.forEach(i.$attr,function(e,n){a.observableAttrs.test(e)&&i.$observe(n,function(e){!e&&l&&l[n]||(l=l||{},l[n]=i[n],r(t,i.i18n,l))})}),n.$on(o.resourceUpdates,function(){r(t,i.i18n,l)}),n.$on(o.localeChanges,function(){r(t,i.i18n,l)})}}]).directive("i18nAttr",["locale","localeEvents",function(e,n){return function(t,o,a){function i(n,o){var i,l=t.$eval(o),c=[];for(var s in l)i=l[s],e.isToken(i)&&-1===c.indexOf(e.getPath(i))&&c.push(e.getPath(i));e.ready(c).then(function(){var n="";for(var t in l)i=l[t],n=e.getString(i),r[t]!==n&&a.$set(t,r[t]=n)})}var r={};a.$observe("i18nAttr",function(e){e&&i(o,e)}),t.$on(n.resourceUpdates,function(){i(o,a.i18nAttr)}),t.$on(n.localeChanges,function(){i(o,a.i18nAttr)})}}]),e.module("ngLocalize.Config",[]).value("localeConf",{basePath:"languages",defaultLocale:"en-US",sharedDictionary:"common",fileExtension:".lang.json",persistSelection:!0,cookieName:"COOKIE_LOCALE_LANG",observableAttrs:new RegExp("^data-(?!ng-|i18n)"),delimiter:"::"})}(this.angular,this,this.document); +!function(e,n,t,o){"use strict";e.module("ngLocalize.Version",[]).constant("localeVer","1.4.0"),e.module("ngLocalize",["ngSanitize","ngLocalize.Config","ngLocalize.Events","ngLocalize.InstalledLanguages"]),e.module("ngLocalize.InstalledLanguages",[]).value("localeSupported",["en-US"]).value("localeFallbacks",{en:"en-US"}),e.module("ngLocalize").service("locale",["$injector","$http","$q","$log","$rootScope","$window","localeConf","localeEvents","localeSupported","localeFallbacks",function(n,o,a,i,r,l,c,s,u,g){function f(e){return e&&e.length&&U.test(e)}function d(e){var n=e?e.split("."):"",t="";return n.length>1&&(t=n.slice(0,-1).join(".")),t}function v(e){var n=e?e.split("."):[],t="";return n.length&&(t=n[n.length-1]),t}function h(e){var n,t=null,o=e?e.split("."):[];if(o.length>1)for(t=C,n=0;n1){for(n=0;n1?(i=[],t.forEach(function(e){i.push(m(e))}),o=a.all(i)):o=m(n),o}function $(n,t){var o=n,a=0;return t&&(e.isArray(t)?e.forEach(t,function(e,n){o=o.replace("%"+(n+1),e),o=o.replace("{"+(n+1)+"}",e)}):e.forEach(t,function(e,n){++a,o=o.replace("{"+n+"}",e),o=o.replace("%"+n,e),o=o.replace("%"+a,e),o=o.replace("{"+a+"}",e)})),o=o.replace(/\n/g,"
")}function S(n,t){var o,a,r,l="",s=!1;return e.isString(n)&&!t&&-1!==n.indexOf(c.delimiter)&&(r=n.split(c.delimiter),n=r[0],t=e.fromJson(r[1])),s=f(n),s?(e.isObject(t)||(t=[t]),o=h(n),o&&!o._loading?(a=v(n),o[a]?l=$(o[a],t):(i.info("[localizationService] Key not found: "+n),l="%%KEY_NOT_FOUND%%")):o||p(n)):l=n,l}function b(e){e=e.split("-")[0],_.attr("lang",e)}function E(n){var t;e.isString(n)?(n=n.trim(),-1!==u.indexOf(n)?t=n:(t=g[n.split("-")[0]],e.isUndefined(t)&&(t=c.defaultLocale))):t=c.defaultLocale,t!==k&&(C={},y={},k=t,b(t),r.$broadcast(s.localeChanges,k),r.$broadcast(s.resourceUpdates),O&&O.put(c.cookieName,t))}function z(){return k}var k,y,C,O,U=new RegExp("^[\\w\\.-]+\\.[\\w\\s\\.-]+\\w(:.*)?$"),_=e.element(t.body).parent();return c.persistSelection&&n.has("$cookieStore")&&(O=n.get("$cookieStore")),E(O&&O.get(c.cookieName)?O.get(c.cookieName):l.navigator.userLanguage||l.navigator.language),{ready:L,isToken:f,getPath:d,getKey:v,setLocale:E,getLocale:z,getString:S}}]),e.module("ngLocalize").filter("i18n",["locale",function(e){var n=function(n,t){return e.getString(n,t)};return n.$stateful=!0,n}]),e.module("ngLocalize.Events",[]).constant("localeEvents",{resourceUpdates:"ngLocalizeResourcesUpdated",localeChanges:"ngLocalizeLocaleChanged"}),e.module("ngLocalize").directive("i18n",["$sce","locale","localeEvents","localeConf",function(n,t,o,a){function i(e,t){t!==e.html()&&e.html(n.getTrustedHtml(t))}function r(e,n,o){t.isToken(n)?t.ready(t.getPath(n)).then(function(){i(e,t.getString(n,o))}):i(e,n)}return function(n,t,i){var l;i.$observe("i18n",function(e,n){e&&e!==n&&r(t,e,l)}),e.forEach(i.$attr,function(e,n){a.observableAttrs.test(e)&&i.$observe(n,function(e){!e&&l&&l[n]||(l=l||{},l[n]=i[n],r(t,i.i18n,l))})}),n.$on(o.resourceUpdates,function(){r(t,i.i18n,l)}),n.$on(o.localeChanges,function(){r(t,i.i18n,l)})}}]).directive("i18nAttr",["locale","localeEvents",function(e,n){return function(t,o,a){function i(n,o){var i,l=t.$eval(o),c=[];for(var s in l)i=l[s],e.isToken(i)&&-1===c.indexOf(e.getPath(i))&&c.push(e.getPath(i));e.ready(c).then(function(){var n="";for(var t in l)i=l[t],n=e.getString(i),r[t]!==n&&a.$set(a.$normalize(t),r[t]=n)})}var r={};a.$observe("i18nAttr",function(e){e&&i(o,e)}),t.$on(n.resourceUpdates,function(){i(o,a.i18nAttr)}),t.$on(n.localeChanges,function(){i(o,a.i18nAttr)})}}]),e.module("ngLocalize.Config",[]).value("localeConf",{basePath:"languages",defaultLocale:"en-US",sharedDictionary:"common",fileExtension:".lang.json",persistSelection:!0,cookieName:"COOKIE_LOCALE_LANG",observableAttrs:new RegExp("^data-(?!ng-|i18n)"),delimiter:"::"})}(this.angular,this,this.document); //# sourceMappingURL=angular-localization.min.js.map \ No newline at end of file diff --git a/dist/angular-localization.min.js.map b/dist/angular-localization.min.js.map index ee89498..18b183d 100644 --- a/dist/angular-localization.min.js.map +++ b/dist/angular-localization.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["angular-localization.js"],"names":["angular","window","document","undefined","module","constant","value","en","service","$injector","$http","$q","$log","$rootScope","$window","localeConf","localeEvents","localeSupported","localeFallbacks","isToken","str","length","TOKEN_REGEX","test","getPath","tok","path","split","result","slice","join","getKey","getBundle","i","bundles","loadBundle","token","root","url","basePath","currentLocale","_loading","fileExtension","get","success","data","key","hasOwnProperty","$broadcast","resourceUpdates","deferrences","resolve","error","bundleReady","bundle","langFile","defer","promise","ready","paths","deferred","outstanding","isString","isArray","Error","forEach","push","all","applySubstitutions","text","subs","res","firstOfKind","sub","replace","v","k","getLocalizedString","txt","A","isValidToken","indexOf","delimiter","fromJson","isObject","info","setLocale","lang","trim","isUndefined","defaultLocale","localeChanges","cookieStore","put","cookieName","getLocale","RegExp","persistSelection","has","navigator","userLanguage","language","getString","filter","locale","i18nFilter","input","args","$stateful","directive","$sce","setText","elm","tag","html","getTrustedHtml","update","string","optArgs","then","scope","attrs","hasObservers","$observe","newVal","oldVal","$attr","attr","normAttr","observableAttrs","i18n","$on","elem","updateText","target","attributes","exp","values","$eval","langFiles","lastValues","$set","i18nAttr","sharedDictionary","this"],"mappings":"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","file":"angular-localization.min.js","sourcesContent":["/*!\n * angular-localization :: v1.2.2 :: 2015-07-15\n * web: http://doshprompt.github.io/angular-localization\n *\n * Copyright (c) 2015 | Rahul Doshi\n * License: MIT\n */\n;(function (angular, window, document, undefined) {\n 'use strict';\n\nangular.module('ngLocalize.Version', [])\n .constant('localeVer', '1.2.2');\nangular.module('ngLocalize', ['ngSanitize', 'ngLocalize.Config', 'ngLocalize.Events', 'ngLocalize.InstalledLanguages']);\n\nangular.module('ngLocalize.InstalledLanguages', [])\n .value('localeSupported', [\n 'en-US'\n ])\n .value('localeFallbacks', {\n 'en': 'en-US'\n });\nangular.module('ngLocalize')\n .service('locale', ['$injector', '$http', '$q', '$log', '$rootScope', '$window', 'localeConf', 'localeEvents', 'localeSupported', 'localeFallbacks', function ($injector, $http, $q, $log, $rootScope, $window, localeConf, localeEvents, localeSupported, localeFallbacks) {\n var TOKEN_REGEX = new RegExp('^[\\\\w\\\\.-]+\\\\.[\\\\w\\\\s\\\\.-]+\\\\w(:.*)?$'),\n\n currentLocale,\n deferrences,\n bundles,\n cookieStore;\n\n if (localeConf.persistSelection && $injector.has('$cookieStore')) {\n cookieStore = $injector.get('$cookieStore');\n }\n\n function isToken(str) {\n return (str && str.length && TOKEN_REGEX.test(str));\n }\n\n function getPath(tok) {\n var path = tok ? tok.split('.') : '',\n result = '';\n\n if (path.length > 1) {\n result = path.slice(0, -1).join('.');\n }\n\n return result;\n }\n\n function getKey(tok) {\n var path = tok ? tok.split('.') : [],\n result = '';\n\n if (path.length) {\n result = path[path.length - 1];\n }\n\n return result;\n }\n\n function getBundle(tok) {\n var result = null,\n path = tok ? tok.split('.') : [],\n i;\n\n if (path.length > 1) {\n result = bundles;\n\n for (i = 0; i < path.length - 1; i++) {\n if (result[path[i]]) {\n result = result[path[i]];\n } else {\n result = null;\n break;\n }\n }\n }\n\n return result;\n }\n\n function loadBundle(token) {\n var path = token ? token.split('.') : '',\n root = bundles,\n url = localeConf.basePath + '/' + currentLocale,\n i;\n\n if (path.length > 1) {\n for (i = 0; i < path.length - 1; i++) {\n if (!root[path[i]]) {\n root[path[i]] = {};\n }\n root = root[path[i]];\n url += '/' + path[i];\n }\n\n if (!root._loading) {\n root._loading = true;\n\n url += localeConf.fileExtension;\n\n $http.get(url)\n .success(function (data) {\n var key,\n path = getPath(token);\n // Merge the contents of the obtained data into the stored bundle.\n for (key in data) {\n if (data.hasOwnProperty(key)) {\n root[key] = data[key];\n }\n }\n\n // Mark the bundle as having been \"loaded\".\n delete root._loading;\n\n // Notify anyone who cares to know about this event.\n $rootScope.$broadcast(localeEvents.resourceUpdates);\n\n // If we issued a Promise for this file, resolve it now.\n if (deferrences[path]) {\n deferrences[path].resolve(path);\n }\n })\n .error(function () {\n $log.error('[localizationService] Failed to load: ' + url);\n\n // We can try it again later.\n delete root._loading;\n });\n }\n }\n }\n\n function bundleReady(path) {\n var bundle,\n token;\n\n path = path || localeConf.langFile;\n token = path + '._LOOKUP_';\n\n bundle = getBundle(token);\n\n if (!deferrences[path]) {\n deferrences[path] = $q.defer();\n }\n\n if (bundle && !bundle._loading) {\n deferrences[path].resolve(path);\n } else {\n if (!bundle) {\n loadBundle(token);\n }\n }\n\n return deferrences[path].promise;\n }\n\n function ready(path) {\n var paths,\n deferred,\n outstanding;\n\n if (angular.isString(path)) {\n paths = path.split(',');\n } else if (angular.isArray(path)) {\n paths = path;\n } else {\n throw new Error('locale.ready requires either an Array or comma-separated list.');\n }\n\n if (paths.length > 1) {\n outstanding = [];\n paths.forEach(function (path) {\n outstanding.push(bundleReady(path));\n });\n deferred = $q.all(outstanding);\n } else {\n deferred = bundleReady(path);\n }\n\n return deferred;\n }\n\n function applySubstitutions(text, subs) {\n var res = text,\n firstOfKind = 0;\n\n if (subs) {\n if (angular.isArray(subs)) {\n angular.forEach(subs, function (sub, i) {\n res = res.replace('%' + (i + 1), sub);\n res = res.replace('{' + (i + 1) + '}', sub);\n });\n } else {\n angular.forEach(subs, function (v, k) {\n ++firstOfKind;\n\n res = res.replace('{' + k + '}', v);\n res = res.replace('%' + k, v);\n res = res.replace('%' + (firstOfKind), v);\n res = res.replace('{' + (firstOfKind) + '}', v);\n });\n }\n }\n res = res.replace(/\\n/g, '
');\n\n return res;\n }\n\n function getLocalizedString(txt, subs) {\n var result = '',\n bundle,\n key,\n A,\n isValidToken = false;\n\n if (angular.isString(txt) && !subs && txt.indexOf(localeConf.delimiter) !== -1) {\n A = txt.split(localeConf.delimiter);\n txt = A[0];\n subs = angular.fromJson(A[1]);\n }\n\n isValidToken = isToken(txt);\n if (isValidToken) {\n if (!angular.isObject(subs)) {\n subs = [subs];\n }\n\n bundle = getBundle(txt);\n if (bundle && !bundle._loading) {\n key = getKey(txt);\n\n if (bundle[key]) {\n result = applySubstitutions(bundle[key], subs);\n } else {\n $log.info('[localizationService] Key not found: ' + txt);\n result = '%%KEY_NOT_FOUND%%';\n }\n } else {\n if (!bundle) {\n loadBundle(txt);\n }\n }\n } else {\n result = txt;\n }\n\n return result;\n }\n\n function setLocale(value) {\n var lang;\n\n if (angular.isString(value)) {\n value = value.trim();\n if (localeSupported.indexOf(value) !== -1) {\n lang = value;\n } else {\n lang = localeFallbacks[value.split('-')[0]];\n if (angular.isUndefined(lang)) {\n lang = localeConf.defaultLocale;\n }\n }\n } else {\n lang = localeConf.defaultLocale;\n }\n\n if (lang !== currentLocale) {\n bundles = {};\n deferrences = {};\n currentLocale = lang;\n\n $rootScope.$broadcast(localeEvents.localeChanges, currentLocale);\n $rootScope.$broadcast(localeEvents.resourceUpdates);\n\n if (cookieStore) {\n cookieStore.put(localeConf.cookieName, lang);\n }\n }\n }\n\n function getLocale() {\n return currentLocale;\n }\n\n setLocale(cookieStore ? cookieStore.get(localeConf.cookieName) : $window.navigator.userLanguage || $window.navigator.language);\n\n return {\n ready: ready,\n isToken: isToken,\n getPath: getPath,\n getKey: getKey,\n setLocale: setLocale,\n getLocale: getLocale,\n getString: getLocalizedString\n };\n }]);\n\nangular.module('ngLocalize')\n .filter('i18n', ['locale', function (locale) {\n var i18nFilter = function (input, args) {\n return locale.getString(input, args);\n };\n\n i18nFilter.$stateful = true;\n\n return i18nFilter;\n }]);\n\nangular.module('ngLocalize.Events', [])\n .constant('localeEvents', {\n resourceUpdates: 'ngLocalizeResourcesUpdated',\n localeChanges: 'ngLocalizeLocaleChanged'\n });\nangular.module('ngLocalize')\n .directive('i18n', ['$sce', 'locale', 'localeEvents', 'localeConf', function ($sce, locale, localeEvents, localeConf) {\n function setText(elm, tag) {\n if (tag !== elm.html()) {\n elm.html($sce.getTrustedHtml(tag));\n }\n }\n\n function update(elm, string, optArgs) {\n if (locale.isToken(string)) {\n locale.ready(locale.getPath(string)).then(function () {\n setText(elm, locale.getString(string, optArgs));\n });\n } else {\n setText(elm, string);\n }\n }\n\n return function (scope, elm, attrs) {\n var hasObservers;\n\n attrs.$observe('i18n', function (newVal, oldVal) {\n if (newVal && newVal !== oldVal) {\n update(elm, newVal, hasObservers); \n }\n });\n\n angular.forEach(attrs.$attr, function (attr, normAttr) {\n if (localeConf.observableAttrs.test(attr)) {\n attrs.$observe(normAttr, function (newVal) {\n if (newVal || !hasObservers || !hasObservers[normAttr]) {\n hasObservers = hasObservers || {};\n hasObservers[normAttr] = attrs[normAttr];\n update(elm, attrs.i18n, hasObservers);\n }\n });\n }\n });\n\n scope.$on(localeEvents.resourceUpdates, function () {\n update(elm, attrs.i18n, hasObservers);\n });\n scope.$on(localeEvents.localeChanges, function () {\n update(elm, attrs.i18n, hasObservers);\n });\n };\n }])\n .directive('i18nAttr', ['locale', 'localeEvents', function (locale, localeEvents) {\n return function (scope, elem, attrs) {\n var lastValues = {};\n\n function updateText(target, attributes) {\n var values = scope.$eval(attributes),\n langFiles = [],\n exp;\n\n for(var key in values) {\n exp = values[key];\n if (locale.isToken(exp) && langFiles.indexOf(locale.getPath(exp)) === -1) {\n langFiles.push(locale.getPath(exp));\n }\n }\n\n locale.ready(langFiles).then(function () {\n var value = '';\n\n for(var key in values) {\n exp = values[key];\n value = locale.getString(exp);\n if (lastValues[key] !== value) {\n attrs.$set(key, lastValues[key] = value);\n }\n }\n });\n }\n\n attrs.$observe('i18nAttr', function (newVal) {\n if (newVal) {\n updateText(elem, newVal); \n }\n });\n\n scope.$on(localeEvents.resourceUpdates, function () {\n updateText(elem, attrs.i18nAttr);\n });\n scope.$on(localeEvents.localeChanges, function () {\n updateText(elem, attrs.i18nAttr);\n });\n };\n }]);\n\nangular.module('ngLocalize.Config', [])\n .value('localeConf', {\n basePath: 'languages',\n defaultLocale: 'en-US',\n sharedDictionary: 'common',\n fileExtension: '.lang.json',\n persistSelection: true,\n cookieName: 'COOKIE_LOCALE_LANG',\n observableAttrs: new RegExp('^data-(?!ng-|i18n)'),\n delimiter: '::'\n });\n}(this.angular, this, this.document));\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["angular-localization.js"],"names":["angular","window","document","undefined","module","constant","value","en","service","$injector","$http","$q","$log","$rootScope","$window","localeConf","localeEvents","localeSupported","localeFallbacks","isToken","str","length","TOKEN_REGEX","test","getPath","tok","path","split","result","slice","join","getKey","getBundle","i","bundles","loadBundle","token","root","url","basePath","currentLocale","_loading","fileExtension","get","success","data","key","hasOwnProperty","$broadcast","resourceUpdates","deferrences","resolve","error","bundleReady","bundle","langFile","defer","promise","ready","paths","deferred","outstanding","isString","isArray","Error","forEach","push","all","applySubstitutions","text","subs","res","firstOfKind","sub","replace","v","k","getLocalizedString","txt","A","isValidToken","indexOf","delimiter","fromJson","isObject","info","updateHtmlTagLangAttr","lang","$html","attr","setLocale","trim","isUndefined","defaultLocale","localeChanges","cookieStore","put","cookieName","getLocale","RegExp","element","body","parent","persistSelection","has","navigator","userLanguage","language","getString","filter","locale","i18nFilter","input","args","$stateful","directive","$sce","setText","elm","tag","html","getTrustedHtml","update","string","optArgs","then","scope","attrs","hasObservers","$observe","newVal","oldVal","$attr","normAttr","observableAttrs","i18n","$on","elem","updateText","target","attributes","exp","values","$eval","langFiles","lastValues","$set","$normalize","i18nAttr","sharedDictionary","this"],"mappings":"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","file":"angular-localization.min.js","sourcesContent":["/*!\n * angular-localization :: v1.4.0 :: 2015-09-14\n * web: http://doshprompt.github.io/angular-localization\n *\n * Copyright (c) 2015 | Rahul Doshi\n * License: MIT\n */\n;(function (angular, window, document, undefined) {\n 'use strict';\n\nangular.module('ngLocalize.Version', [])\n .constant('localeVer', '1.4.0');\nangular.module('ngLocalize', ['ngSanitize', 'ngLocalize.Config', 'ngLocalize.Events', 'ngLocalize.InstalledLanguages']);\n\nangular.module('ngLocalize.InstalledLanguages', [])\n .value('localeSupported', [\n 'en-US'\n ])\n .value('localeFallbacks', {\n 'en': 'en-US'\n });\nangular.module('ngLocalize')\n .service('locale', ['$injector', '$http', '$q', '$log', '$rootScope', '$window', 'localeConf', 'localeEvents', 'localeSupported', 'localeFallbacks', function ($injector, $http, $q, $log, $rootScope, $window, localeConf, localeEvents, localeSupported, localeFallbacks) {\n var TOKEN_REGEX = new RegExp('^[\\\\w\\\\.-]+\\\\.[\\\\w\\\\s\\\\.-]+\\\\w(:.*)?$'),\n\n $html = angular.element(document.body).parent(),\n currentLocale,\n deferrences,\n bundles,\n cookieStore;\n\n if (localeConf.persistSelection && $injector.has('$cookieStore')) {\n cookieStore = $injector.get('$cookieStore');\n }\n\n function isToken(str) {\n return (str && str.length && TOKEN_REGEX.test(str));\n }\n\n function getPath(tok) {\n var path = tok ? tok.split('.') : '',\n result = '';\n\n if (path.length > 1) {\n result = path.slice(0, -1).join('.');\n }\n\n return result;\n }\n\n function getKey(tok) {\n var path = tok ? tok.split('.') : [],\n result = '';\n\n if (path.length) {\n result = path[path.length - 1];\n }\n\n return result;\n }\n\n function getBundle(tok) {\n var result = null,\n path = tok ? tok.split('.') : [],\n i;\n\n if (path.length > 1) {\n result = bundles;\n\n for (i = 0; i < path.length - 1; i++) {\n if (result[path[i]]) {\n result = result[path[i]];\n } else {\n result = null;\n break;\n }\n }\n }\n\n return result;\n }\n\n function loadBundle(token) {\n var path = token ? token.split('.') : '',\n root = bundles,\n url = localeConf.basePath + '/' + currentLocale,\n i;\n\n if (path.length > 1) {\n for (i = 0; i < path.length - 1; i++) {\n if (!root[path[i]]) {\n root[path[i]] = {};\n }\n root = root[path[i]];\n url += '/' + path[i];\n }\n\n if (!root._loading) {\n root._loading = true;\n\n url += localeConf.fileExtension;\n\n $http.get(url)\n .success(function (data) {\n var key,\n path = getPath(token);\n // Merge the contents of the obtained data into the stored bundle.\n for (key in data) {\n if (data.hasOwnProperty(key)) {\n root[key] = data[key];\n }\n }\n\n // Mark the bundle as having been \"loaded\".\n delete root._loading;\n\n // Notify anyone who cares to know about this event.\n $rootScope.$broadcast(localeEvents.resourceUpdates);\n\n // If we issued a Promise for this file, resolve it now.\n if (deferrences[path]) {\n deferrences[path].resolve(path);\n }\n })\n .error(function () {\n $log.error('[localizationService] Failed to load: ' + url);\n\n // We can try it again later.\n delete root._loading;\n });\n }\n }\n }\n\n function bundleReady(path) {\n var bundle,\n token;\n\n path = path || localeConf.langFile;\n token = path + '._LOOKUP_';\n\n bundle = getBundle(token);\n\n if (!deferrences[path]) {\n deferrences[path] = $q.defer();\n }\n\n if (bundle && !bundle._loading) {\n deferrences[path].resolve(path);\n } else {\n if (!bundle) {\n loadBundle(token);\n }\n }\n\n return deferrences[path].promise;\n }\n\n function ready(path) {\n var paths,\n deferred,\n outstanding;\n\n if (angular.isString(path)) {\n paths = path.split(',');\n } else if (angular.isArray(path)) {\n paths = path;\n } else {\n throw new Error('locale.ready requires either an Array or comma-separated list.');\n }\n\n if (paths.length > 1) {\n outstanding = [];\n paths.forEach(function (path) {\n outstanding.push(bundleReady(path));\n });\n deferred = $q.all(outstanding);\n } else {\n deferred = bundleReady(path);\n }\n\n return deferred;\n }\n\n function applySubstitutions(text, subs) {\n var res = text,\n firstOfKind = 0;\n\n if (subs) {\n if (angular.isArray(subs)) {\n angular.forEach(subs, function (sub, i) {\n res = res.replace('%' + (i + 1), sub);\n res = res.replace('{' + (i + 1) + '}', sub);\n });\n } else {\n angular.forEach(subs, function (v, k) {\n ++firstOfKind;\n\n res = res.replace('{' + k + '}', v);\n res = res.replace('%' + k, v);\n res = res.replace('%' + (firstOfKind), v);\n res = res.replace('{' + (firstOfKind) + '}', v);\n });\n }\n }\n res = res.replace(/\\n/g, '
');\n\n return res;\n }\n\n function getLocalizedString(txt, subs) {\n var result = '',\n bundle,\n key,\n A,\n isValidToken = false;\n\n if (angular.isString(txt) && !subs && txt.indexOf(localeConf.delimiter) !== -1) {\n A = txt.split(localeConf.delimiter);\n txt = A[0];\n subs = angular.fromJson(A[1]);\n }\n\n isValidToken = isToken(txt);\n if (isValidToken) {\n if (!angular.isObject(subs)) {\n subs = [subs];\n }\n\n bundle = getBundle(txt);\n if (bundle && !bundle._loading) {\n key = getKey(txt);\n\n if (bundle[key]) {\n result = applySubstitutions(bundle[key], subs);\n } else {\n $log.info('[localizationService] Key not found: ' + txt);\n result = '%%KEY_NOT_FOUND%%';\n }\n } else {\n if (!bundle) {\n loadBundle(txt);\n }\n }\n } else {\n result = txt;\n }\n\n return result;\n }\n\n function updateHtmlTagLangAttr(lang) {\n lang = lang.split('-')[0];\n\n $html.attr('lang', lang);\n }\n\n function setLocale(value) {\n var lang;\n\n if (angular.isString(value)) {\n value = value.trim();\n if (localeSupported.indexOf(value) !== -1) {\n lang = value;\n } else {\n lang = localeFallbacks[value.split('-')[0]];\n if (angular.isUndefined(lang)) {\n lang = localeConf.defaultLocale;\n }\n }\n } else {\n lang = localeConf.defaultLocale;\n }\n\n if (lang !== currentLocale) {\n bundles = {};\n deferrences = {};\n currentLocale = lang;\n\n updateHtmlTagLangAttr(lang);\n\n $rootScope.$broadcast(localeEvents.localeChanges, currentLocale);\n $rootScope.$broadcast(localeEvents.resourceUpdates);\n\n if (cookieStore) {\n cookieStore.put(localeConf.cookieName, lang);\n }\n }\n }\n\n function getLocale() {\n return currentLocale;\n }\n\n setLocale(cookieStore && cookieStore.get(localeConf.cookieName) ? cookieStore.get(localeConf.cookieName) : $window.navigator.userLanguage || $window.navigator.language);\n\n return {\n ready: ready,\n isToken: isToken,\n getPath: getPath,\n getKey: getKey,\n setLocale: setLocale,\n getLocale: getLocale,\n getString: getLocalizedString\n };\n }]);\n\nangular.module('ngLocalize')\n .filter('i18n', ['locale', function (locale) {\n var i18nFilter = function (input, args) {\n return locale.getString(input, args);\n };\n\n i18nFilter.$stateful = true;\n\n return i18nFilter;\n }]);\n\nangular.module('ngLocalize.Events', [])\n .constant('localeEvents', {\n resourceUpdates: 'ngLocalizeResourcesUpdated',\n localeChanges: 'ngLocalizeLocaleChanged'\n });\nangular.module('ngLocalize')\n .directive('i18n', ['$sce', 'locale', 'localeEvents', 'localeConf', function ($sce, locale, localeEvents, localeConf) {\n function setText(elm, tag) {\n if (tag !== elm.html()) {\n elm.html($sce.getTrustedHtml(tag));\n }\n }\n\n function update(elm, string, optArgs) {\n if (locale.isToken(string)) {\n locale.ready(locale.getPath(string)).then(function () {\n setText(elm, locale.getString(string, optArgs));\n });\n } else {\n setText(elm, string);\n }\n }\n\n return function (scope, elm, attrs) {\n var hasObservers;\n\n attrs.$observe('i18n', function (newVal, oldVal) {\n if (newVal && newVal !== oldVal) {\n update(elm, newVal, hasObservers); \n }\n });\n\n angular.forEach(attrs.$attr, function (attr, normAttr) {\n if (localeConf.observableAttrs.test(attr)) {\n attrs.$observe(normAttr, function (newVal) {\n if (newVal || !hasObservers || !hasObservers[normAttr]) {\n hasObservers = hasObservers || {};\n hasObservers[normAttr] = attrs[normAttr];\n update(elm, attrs.i18n, hasObservers);\n }\n });\n }\n });\n\n scope.$on(localeEvents.resourceUpdates, function () {\n update(elm, attrs.i18n, hasObservers);\n });\n scope.$on(localeEvents.localeChanges, function () {\n update(elm, attrs.i18n, hasObservers);\n });\n };\n }])\n .directive('i18nAttr', ['locale', 'localeEvents', function (locale, localeEvents) {\n return function (scope, elem, attrs) {\n var lastValues = {};\n\n function updateText(target, attributes) {\n var values = scope.$eval(attributes),\n langFiles = [],\n exp;\n\n for(var key in values) {\n exp = values[key];\n if (locale.isToken(exp) && langFiles.indexOf(locale.getPath(exp)) === -1) {\n langFiles.push(locale.getPath(exp));\n }\n }\n\n locale.ready(langFiles).then(function () {\n var value = '';\n\n for(var key in values) {\n exp = values[key];\n value = locale.getString(exp);\n if (lastValues[key] !== value) {\n attrs.$set(attrs.$normalize(key), lastValues[key] = value);\n }\n }\n });\n }\n\n attrs.$observe('i18nAttr', function (newVal) {\n if (newVal) {\n updateText(elem, newVal); \n }\n });\n\n scope.$on(localeEvents.resourceUpdates, function () {\n updateText(elem, attrs.i18nAttr);\n });\n scope.$on(localeEvents.localeChanges, function () {\n updateText(elem, attrs.i18nAttr);\n });\n };\n }]);\n\nangular.module('ngLocalize.Config', [])\n .value('localeConf', {\n basePath: 'languages',\n defaultLocale: 'en-US',\n sharedDictionary: 'common',\n fileExtension: '.lang.json',\n persistSelection: true,\n cookieName: 'COOKIE_LOCALE_LANG',\n observableAttrs: new RegExp('^data-(?!ng-|i18n)'),\n delimiter: '::'\n });\n}(this.angular, this, this.document));\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/package.json b/package.json index 2d86f15..578eb66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-localization", - "version": "1.3.1", + "version": "1.4.0", "description": "angularjs localization done right.", "main": [ "dist/angular-localization.js",