From fbd877e7c763ef1bcef5bae11d81f8c995bbeaa1 Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Fri, 27 Nov 2020 16:28:19 +0300 Subject: [PATCH 1/4] feat(no-vue): ability to use interpolation outside without vue --- dist/vue-gettext.js | 253 +++++++++++++++++++++------------------- dist/vue-gettext.min.js | 2 +- src/interpolate.js | 2 +- src/translate.js | 14 +++ 4 files changed, 149 insertions(+), 122 deletions(-) diff --git a/dist/vue-gettext.js b/dist/vue-gettext.js index fa18da6..3c39c2d 100644 --- a/dist/vue-gettext.js +++ b/dist/vue-gettext.js @@ -184,6 +184,126 @@ }; + // Ensure to always use the same Vue instance throughout the plugin. + // + // This was previously done in `index.js` using both named and default exports. + // However, this currently must be kept in a separate file because we are using + // Rollup to build the dist files and it has a drawback when using named and + // default exports together, see: + // https://github.com/rollup/rollup/blob/fca14d/src/utils/getExportMode.js#L27 + // https://github.com/rollup/rollup/wiki/JavaScript-API#exports + // + // If we had kept named and default exports in `index.js`, a user would have to + // do something like this to access the default export: GetTextPlugin['default'] + + var _Vue; + + function shareVueInstance (Vue) { + _Vue = Vue; + } + + var EVALUATION_RE = /[[\].]{1,2}/g; + + /* Interpolation RegExp. + * + * Because interpolation inside attributes are deprecated in Vue 2 we have to + * use another set of delimiters to be able to use `translate-plural` etc. + * We use %{ } delimiters. + * + * / + * %\{ => Starting delimiter: `%{` + * ( => Start capture + * (?:.|\n) => Non-capturing group: any character or newline + * +? => One or more times (ungreedy) + * ) => End capture + * \} => Ending delimiter: `}` + * /g => Global: don't return after first match + */ + var INTERPOLATION_RE = /%\{((?:.|\n)+?)\}/g; + + var MUSTACHE_SYNTAX_RE = /\{\{((?:.|\n)+?)\}\}/g; + + /** + * Evaluate a piece of template string containing %{ } placeholders. + * E.g.: 'Hi %{ user.name }' => 'Hi Bob' + * + * This is a vm.$interpolate alternative for Vue 2. + * https://vuejs.org/v2/guide/migration.html#vm-interpolate-removed + * + * @param {String} msgid - The translation key containing %{ } placeholders + * @param {Object} context - An object whose elements are put in their corresponding placeholders + * + * @return {String} The interpolated string + */ + var interpolate = function (msgid, context, disableHtmlEscaping) { + if ( context === void 0 ) context = {}; + if ( disableHtmlEscaping === void 0 ) disableHtmlEscaping = false; + + + if (_Vue && !_Vue.config.getTextPluginSilent && MUSTACHE_SYNTAX_RE.test(msgid)) { + console.warn(("Mustache syntax cannot be used with vue-gettext. Please use \"%{}\" instead of \"{{}}\" in: " + msgid)); + } + + var result = msgid.replace(INTERPOLATION_RE, function (match, token) { + + var expression = token.trim(); + var evaluated; + + var escapeHtmlMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + }; + + // Avoid eval() by splitting `expression` and looping through its different properties if any, see #55. + function getProps (obj, expression) { + var arr = expression.split(EVALUATION_RE).filter(function (x) { return x; }); + while (arr.length) { + obj = obj[arr.shift()]; + } + return obj + } + + function evalInContext (expression) { + try { + evaluated = getProps(this, expression); + } catch (e) { + // Ignore errors, because this function may be called recursively later. + } + if (evaluated === undefined) { + if (this.$parent) { + // Recursively climb the $parent chain to allow evaluation inside nested components, see #23 and #24. + return evalInContext.call(this.$parent, expression) + } else { + console.warn(("Cannot evaluate expression: " + expression)); + evaluated = expression; + } + } + var result = evaluated.toString(); + if (disableHtmlEscaping) { + // Do not escape HTML, see #78. + return result + } + // Escape HTML, see #78. + return result.replace(/[&<>"']/g, function (m) { return escapeHtmlMap[m] }) + } + + return evalInContext.call(context, expression) + + }); + + return result + + }; + + // Store this values as function attributes for easy access elsewhere to bypass a Rollup + // weak point with `export`: + // https://github.com/rollup/rollup/blob/fca14d/src/utils/getExportMode.js#L27 + interpolate.INTERPOLATION_RE = INTERPOLATION_RE; + interpolate.INTERPOLATION_PREFIX = '%{'; + var SPACING_RE = /\s{2,}/g; // Default configuration if only the translation is passed. @@ -371,6 +491,19 @@ } }, + /** + * Allows to use interpolation outside the Vue + * + * @example + * import {translate} from 'vue-gettext'; + * + * const {gettext, gettextInterpolate} = translate; + * + * let translated = gettext('%{ n } foos', n) + * let interpolated = gettextInterpolate(translated, {n: 5}) + */ + gettextInterpolate: interpolate.bind(interpolate), + }; // UUID v4 generator (RFC4122 compliant). @@ -395,24 +528,6 @@ } - // Ensure to always use the same Vue instance throughout the plugin. - // - // This was previously done in `index.js` using both named and default exports. - // However, this currently must be kept in a separate file because we are using - // Rollup to build the dist files and it has a drawback when using named and - // default exports together, see: - // https://github.com/rollup/rollup/blob/fca14d/src/utils/getExportMode.js#L27 - // https://github.com/rollup/rollup/wiki/JavaScript-API#exports - // - // If we had kept named and default exports in `index.js`, a user would have to - // do something like this to access the default export: GetTextPlugin['default'] - - var _Vue; - - function shareVueInstance (Vue) { - _Vue = Vue; - } - /** * Translate content according to the current language. */ @@ -510,108 +625,6 @@ }; - var EVALUATION_RE = /[[\].]{1,2}/g; - - /* Interpolation RegExp. - * - * Because interpolation inside attributes are deprecated in Vue 2 we have to - * use another set of delimiters to be able to use `translate-plural` etc. - * We use %{ } delimiters. - * - * / - * %\{ => Starting delimiter: `%{` - * ( => Start capture - * (?:.|\n) => Non-capturing group: any character or newline - * +? => One or more times (ungreedy) - * ) => End capture - * \} => Ending delimiter: `}` - * /g => Global: don't return after first match - */ - var INTERPOLATION_RE = /%\{((?:.|\n)+?)\}/g; - - var MUSTACHE_SYNTAX_RE = /\{\{((?:.|\n)+?)\}\}/g; - - /** - * Evaluate a piece of template string containing %{ } placeholders. - * E.g.: 'Hi %{ user.name }' => 'Hi Bob' - * - * This is a vm.$interpolate alternative for Vue 2. - * https://vuejs.org/v2/guide/migration.html#vm-interpolate-removed - * - * @param {String} msgid - The translation key containing %{ } placeholders - * @param {Object} context - An object whose elements are put in their corresponding placeholders - * - * @return {String} The interpolated string - */ - var interpolate = function (msgid, context, disableHtmlEscaping) { - if ( context === void 0 ) context = {}; - if ( disableHtmlEscaping === void 0 ) disableHtmlEscaping = false; - - - if (!_Vue.config.getTextPluginSilent && MUSTACHE_SYNTAX_RE.test(msgid)) { - console.warn(("Mustache syntax cannot be used with vue-gettext. Please use \"%{}\" instead of \"{{}}\" in: " + msgid)); - } - - var result = msgid.replace(INTERPOLATION_RE, function (match, token) { - - var expression = token.trim(); - var evaluated; - - var escapeHtmlMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - }; - - // Avoid eval() by splitting `expression` and looping through its different properties if any, see #55. - function getProps (obj, expression) { - var arr = expression.split(EVALUATION_RE).filter(function (x) { return x; }); - while (arr.length) { - obj = obj[arr.shift()]; - } - return obj - } - - function evalInContext (expression) { - try { - evaluated = getProps(this, expression); - } catch (e) { - // Ignore errors, because this function may be called recursively later. - } - if (evaluated === undefined) { - if (this.$parent) { - // Recursively climb the $parent chain to allow evaluation inside nested components, see #23 and #24. - return evalInContext.call(this.$parent, expression) - } else { - console.warn(("Cannot evaluate expression: " + expression)); - evaluated = expression; - } - } - var result = evaluated.toString(); - if (disableHtmlEscaping) { - // Do not escape HTML, see #78. - return result - } - // Escape HTML, see #78. - return result.replace(/[&<>"']/g, function (m) { return escapeHtmlMap[m] }) - } - - return evalInContext.call(context, expression) - - }); - - return result - - }; - - // Store this values as function attributes for easy access elsewhere to bypass a Rollup - // weak point with `export`: - // https://github.com/rollup/rollup/blob/fca14d/src/utils/getExportMode.js#L27 - interpolate.INTERPOLATION_RE = INTERPOLATION_RE; - interpolate.INTERPOLATION_PREFIX = '%{'; - // Check if two values are loosely equal - that is, // if they are plain objects, do they have the same shape? // https://github.com/vuejs/vue/blob/v2.6.11/src/shared/util.js#L285 diff --git a/dist/vue-gettext.min.js b/dist/vue-gettext.min.js index ba7b143..b7d49b7 100644 --- a/dist/vue-gettext.min.js +++ b/dist/vue-gettext.min.js @@ -3,4 +3,4 @@ * (c) 2020 Polyconseil * @license MIT */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):(t=t||self,e(t.VueGettext={}))}(this,function(t){"use strict";function e(){var t,e,n="";for(t=0;t<32;t++)e=16*Math.random()|0,8!==t&&12!==t&&16!==t&&20!==t||(n+="-"),n+=(12===t?4:16===t?3&e|8:e).toString(16);return n}function n(t){s=t}function a(t,e){if(t===e)return!0;var n=null!==t&&"object"==typeof t,r=null!==e&&"object"==typeof e;if(!n||!r)return!n&&!r&&String(t)===String(e);try{var i=Array.isArray(t),s=Array.isArray(e);if(i&&s)return t.length===e.length&&t.every(function(t,n){return a(t,e[n])});if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();if(i||s)return!1;var o=Object.keys(t),u=Object.keys(e);return o.length===u.length&&o.every(function(n){return a(t[n],e[n])})}catch(t){return!1}}function r(t,e,n,a,r){Object.defineProperty(t.config,"language",{enumerable:!0,configurable:!0,get:function(){return e.current},set:function(t){e.current=t}}),Object.defineProperty(t.config,"getTextPluginSilent",{enumerable:!0,writable:!0,value:n}),Object.defineProperty(t.config,"autoAddKeyAttributes",{enumerable:!0,writable:!0,value:a}),Object.defineProperty(t.config,"getTextPluginMuteLanguages",{enumerable:!0,writable:!0,value:r})}function i(t,e){var n=t.prototype._init;t.prototype._init=function(t){void 0===t&&(t={});var a=t._parent||t.parent||this;this.$language=a.$language||e,n.call(this,t)};var a=t.prototype._destroy;t.prototype._destroy=function(){this.$language=null,a.apply(this,arguments)}}"function"!=typeof Object.assign&&function(){Object.assign=function(t){var e,n,a,r,i=arguments;if(void 0===t||null===t)throw new TypeError("Cannot convert undefined or null to object");for(e=Object(t),n=1;n2&&"pt_BR"!==t&&(t=t.split("_")[0]),t){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return e%10!=1||e%100==11?1:0;case"jv":return 0!==e?1:0;case"mk":return 1===e||e%10==1?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"pt_BR":case"tg":case"ti":case"tr":case"uz":case"wa":case"zh":return e>1?1:0;case"lv":return e%10==1&&e%100!=11?0:0!==e?1:2;case"lt":return e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"mnk":return 0===e?0:1===e?1:2;case"ro":return 1===e?0:0===e||e%100>0&&e%100<20?1:2;case"pl":return 1===e?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"cs":case"sk":return 1===e?0:e>=2&&e<=4?1:2;case"csb":return 1===e?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"sl":return e%100==1?0:e%100==2?1:e%100==3||e%100==4?2:3;case"mt":return 1===e?0:0===e||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3;case"gd":return 1===e||11===e?0:2===e||12===e?1:e>2&&e<20?2:3;case"cy":return 1===e?0:2===e?1:8!==e&&11!==e?2:3;case"kw":return 1===e?0:2===e?1:3===e?2:3;case"ga":return 1===e?0:2===e?1:e>2&&e<7?2:e>6&&e<11?3:4;case"ar":return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5;default:return 1!==e?1:0}}},u=/\s{2,}/g,l={language:"",getTextPluginSilent:!1,getTextPluginMuteLanguages:[],silent:!1},c={},g={getTranslation:function(t,e,n,a,r){if(void 0===e&&(e=1),void 0===n&&(n=null),void 0===a&&(a=null),void 0===r&&(r=l.language),!t)return"";var i=l.getTextPluginSilent||-1!==l.getTextPluginMuteLanguages.indexOf(r),s=a&&o.getTranslationIndex(r,e)>0?a:t,g=c[r]||c[r.split("_")[0]];if(!g)return i||console.warn("No translations found for "+r),s;t=t.trim();var f=g[t];if(!f&&u.test(t)&&Object.keys(g).some(function(e){if(e.replace(u," ")===t.replace(u," "))return f=g[e]}),f&&n&&(f=f[n]),!f){if(!i){var d="Untranslated "+r+" key found: "+t;n&&(d+=" (with context: "+n+")"),console.warn(d)}return s}f instanceof Array||!f.hasOwnProperty("")||(f=f[""]),"string"==typeof f&&(f=[f]);var p=o.getTranslationIndex(r,e);return 1===f.length&&1===e&&(p=0),f[p]},gettext:function(t){return g.getTranslation(t)},pgettext:function(t,e){return g.getTranslation(e,1,t)},ngettext:function(t,e,n){return g.getTranslation(t,n,null,e)},npgettext:function(t,e,n,a){return g.getTranslation(e,a,t,n)},initTranslations:function(t,e){t&&"object"==typeof t&&(c=t),e&&"object"==typeof e&&(l=e)}},f={name:"translate",created:function(){if(this.msgid="",this.$options._renderChildren&&(this.$options._renderChildren[0].hasOwnProperty("text")?this.msgid=this.$options._renderChildren[0].text:this.msgid=this.$options._renderChildren[0]),this.isPlural=void 0!==this.translateN&&void 0!==this.translatePlural,!this.isPlural&&(this.translateN||this.translatePlural))throw new Error("`translate-n` and `translate-plural` attributes must be used together: "+this.msgid+".")},props:{tag:{type:String,default:"span"},translateN:{type:Number,required:!1},translatePlural:{type:String,required:!1},translateContext:{type:String,required:!1},translateParams:{type:Object,required:!1},translateComment:{type:String,required:!1}},computed:{translation:function(){var t=g.getTranslation(this.msgid,this.translateN,this.translateContext,this.isPlural?this.translatePlural:null,this.$language.current),e=this.$parent;return this.translateParams&&(e=Object.assign({},this.$parent,this.translateParams)),this.$gettextInterpolate(t,e)}},render:function(t){return s.config.autoAddKeyAttributes&&!this.$vnode.key&&(this.$vnode.key=e()),t(this.tag,[this.translation])}},d=/[[\].]{1,2}/g,p=/%\{((?:.|\n)+?)\}/g,h=/\{\{((?:.|\n)+?)\}\}/g,y=function(t,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),!s.config.getTextPluginSilent&&h.test(t)&&console.warn('Mustache syntax cannot be used with vue-gettext. Please use "%{}" instead of "{{}}" in: '+t),t.replace(p,function(t,a){function r(t,e){for(var n=e.split(d).filter(function(t){return t});n.length;)t=t[n.shift()];return t}function i(t){try{s=r(this,t)}catch(t){}if(void 0===s){if(this.$parent)return i.call(this.$parent,t);console.warn("Cannot evaluate expression: "+t),s=t}var e=s.toString();return n?e:e.replace(/[&<>"']/g,function(t){return u[t]})}var s,o=a.trim(),u={"&":"&","<":"<",">":">",'"':""","'":"'"};return i.call(e,o)})};y.INTERPOLATION_RE=p,y.INTERPOLATION_PREFIX="%{";var v,b=function(t,e,n){var a=n.data.attrs||{},r=t.dataset.msgid,i=a["translate-context"],o=a["translate-n"],u=a["translate-plural"],l=void 0!==o&&void 0!==u,c=n.context,f="true"===a["render-html"];if(!l&&(o||u))throw new Error("`translate-n` and `translate-plural` attributes must be used together:"+r+".");!s.config.getTextPluginSilent&&a["translate-params"]&&console.warn("`translate-params` is required as an expression for v-translate directive. Please change to `v-translate='params'`: "+r),e.value&&"object"==typeof e.value&&(c=Object.assign({},n.context,e.value));var d=g.getTranslation(r,o,i,l?u:null,t.dataset.currentLanguage),p=y(d,c,f);t.innerHTML=p},m={bind:function(t,n,a){s.config.autoAddKeyAttributes&&!a.key&&(a.key=e());var r=t.innerHTML;if(t.dataset.msgid=r,t.dataset.currentLanguage=s.config.language,!s.config.getTextPluginSilent){-1!==r.indexOf(y.INTERPOLATION_PREFIX)&&!n.expression&&console.info("No expression is provided for change detection. The translation for this key will be static:\n"+r)}b(t,n,a)},update:function(t,e,n){var r=!1;t.dataset.currentLanguage!==s.config.language&&(t.dataset.currentLanguage=s.config.language,r=!0),r||!e.expression||a(e.value,e.oldValue)||(r=!0),r&&b(t,e,n)}},x=function(t,e){void 0===e&&(e={});var a={autoAddKeyAttributes:!1,availableLanguages:{en_US:"English"},defaultLanguage:"en_US",languageVmMixin:{},muteLanguages:[],silent:t.config.silent,translations:null};if(Object.keys(e).forEach(function(t){if(-1===Object.keys(a).indexOf(t))throw new Error(t+" is an invalid option for the translate plugin.")}),!e.translations)throw new Error("No translations available.");e=Object.assign(a,e),v=new t({created:function(){this.available=e.availableLanguages},data:{current:e.defaultLanguage},mixins:[e.languageVmMixin]}),n(t),i(t,v),r(t,v,e.silent,e.autoAddKeyAttributes,e.muteLanguages),g.initTranslations(e.translations,t.config),t.component("translate",f),t.directive("translate",m),t.$translations=e.translations,t.prototype.$gettext=g.gettext.bind(g),t.prototype.$pgettext=g.pgettext.bind(g),t.prototype.$ngettext=g.ngettext.bind(g),t.prototype.$npgettext=g.npgettext.bind(g),t.prototype.$gettextInterpolate=y.bind(y)};t.default=x,t.translate=g,Object.defineProperty(t,"__esModule",{value:!0})}); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):(t=t||self,e(t.VueGettext={}))}(this,function(t){"use strict";function e(t){s=t}function n(){var t,e,n="";for(t=0;t<32;t++)e=16*Math.random()|0,8!==t&&12!==t&&16!==t&&20!==t||(n+="-"),n+=(12===t?4:16===t?3&e|8:e).toString(16);return n}function a(t,e){if(t===e)return!0;var n=null!==t&&"object"==typeof t,r=null!==e&&"object"==typeof e;if(!n||!r)return!n&&!r&&String(t)===String(e);try{var i=Array.isArray(t),s=Array.isArray(e);if(i&&s)return t.length===e.length&&t.every(function(t,n){return a(t,e[n])});if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();if(i||s)return!1;var o=Object.keys(t),u=Object.keys(e);return o.length===u.length&&o.every(function(n){return a(t[n],e[n])})}catch(t){return!1}}function r(t,e,n,a,r){Object.defineProperty(t.config,"language",{enumerable:!0,configurable:!0,get:function(){return e.current},set:function(t){e.current=t}}),Object.defineProperty(t.config,"getTextPluginSilent",{enumerable:!0,writable:!0,value:n}),Object.defineProperty(t.config,"autoAddKeyAttributes",{enumerable:!0,writable:!0,value:a}),Object.defineProperty(t.config,"getTextPluginMuteLanguages",{enumerable:!0,writable:!0,value:r})}function i(t,e){var n=t.prototype._init;t.prototype._init=function(t){void 0===t&&(t={});var a=t._parent||t.parent||this;this.$language=a.$language||e,n.call(this,t)};var a=t.prototype._destroy;t.prototype._destroy=function(){this.$language=null,a.apply(this,arguments)}}"function"!=typeof Object.assign&&function(){Object.assign=function(t){var e,n,a,r,i=arguments;if(void 0===t||null===t)throw new TypeError("Cannot convert undefined or null to object");for(e=Object(t),n=1;n2&&"pt_BR"!==t&&(t=t.split("_")[0]),t){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return e%10!=1||e%100==11?1:0;case"jv":return 0!==e?1:0;case"mk":return 1===e||e%10==1?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"pt_BR":case"tg":case"ti":case"tr":case"uz":case"wa":case"zh":return e>1?1:0;case"lv":return e%10==1&&e%100!=11?0:0!==e?1:2;case"lt":return e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"mnk":return 0===e?0:1===e?1:2;case"ro":return 1===e?0:0===e||e%100>0&&e%100<20?1:2;case"pl":return 1===e?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"cs":case"sk":return 1===e?0:e>=2&&e<=4?1:2;case"csb":return 1===e?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"sl":return e%100==1?0:e%100==2?1:e%100==3||e%100==4?2:3;case"mt":return 1===e?0:0===e||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3;case"gd":return 1===e||11===e?0:2===e||12===e?1:e>2&&e<20?2:3;case"cy":return 1===e?0:2===e?1:8!==e&&11!==e?2:3;case"kw":return 1===e?0:2===e?1:3===e?2:3;case"ga":return 1===e?0:2===e?1:e>2&&e<7?2:e>6&&e<11?3:4;case"ar":return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5;default:return 1!==e?1:0}}},u=/[[\].]{1,2}/g,l=/%\{((?:.|\n)+?)\}/g,c=/\{\{((?:.|\n)+?)\}\}/g,g=function(t,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),s&&!s.config.getTextPluginSilent&&c.test(t)&&console.warn('Mustache syntax cannot be used with vue-gettext. Please use "%{}" instead of "{{}}" in: '+t),t.replace(l,function(t,a){function r(t,e){for(var n=e.split(u).filter(function(t){return t});n.length;)t=t[n.shift()];return t}function i(t){try{s=r(this,t)}catch(t){}if(void 0===s){if(this.$parent)return i.call(this.$parent,t);console.warn("Cannot evaluate expression: "+t),s=t}var e=s.toString();return n?e:e.replace(/[&<>"']/g,function(t){return l[t]})}var s,o=a.trim(),l={"&":"&","<":"<",">":">",'"':""","'":"'"};return i.call(e,o)})};g.INTERPOLATION_RE=l,g.INTERPOLATION_PREFIX="%{";var f,d=/\s{2,}/g,p={language:"",getTextPluginSilent:!1,getTextPluginMuteLanguages:[],silent:!1},h={},y={getTranslation:function(t,e,n,a,r){if(void 0===e&&(e=1),void 0===n&&(n=null),void 0===a&&(a=null),void 0===r&&(r=p.language),!t)return"";var i=p.getTextPluginSilent||-1!==p.getTextPluginMuteLanguages.indexOf(r),s=a&&o.getTranslationIndex(r,e)>0?a:t,u=h[r]||h[r.split("_")[0]];if(!u)return i||console.warn("No translations found for "+r),s;t=t.trim();var l=u[t];if(!l&&d.test(t)&&Object.keys(u).some(function(e){if(e.replace(d," ")===t.replace(d," "))return l=u[e]}),l&&n&&(l=l[n]),!l){if(!i){var c="Untranslated "+r+" key found: "+t;n&&(c+=" (with context: "+n+")"),console.warn(c)}return s}l instanceof Array||!l.hasOwnProperty("")||(l=l[""]),"string"==typeof l&&(l=[l]);var g=o.getTranslationIndex(r,e);return 1===l.length&&1===e&&(g=0),l[g]},gettext:function(t){return y.getTranslation(t)},pgettext:function(t,e){return y.getTranslation(e,1,t)},ngettext:function(t,e,n){return y.getTranslation(t,n,null,e)},npgettext:function(t,e,n,a){return y.getTranslation(e,a,t,n)},initTranslations:function(t,e){t&&"object"==typeof t&&(h=t),e&&"object"==typeof e&&(p=e)},gettextInterpolate:g.bind(g)},v={name:"translate",created:function(){if(this.msgid="",this.$options._renderChildren&&(this.$options._renderChildren[0].hasOwnProperty("text")?this.msgid=this.$options._renderChildren[0].text:this.msgid=this.$options._renderChildren[0]),this.isPlural=void 0!==this.translateN&&void 0!==this.translatePlural,!this.isPlural&&(this.translateN||this.translatePlural))throw new Error("`translate-n` and `translate-plural` attributes must be used together: "+this.msgid+".")},props:{tag:{type:String,default:"span"},translateN:{type:Number,required:!1},translatePlural:{type:String,required:!1},translateContext:{type:String,required:!1},translateParams:{type:Object,required:!1},translateComment:{type:String,required:!1}},computed:{translation:function(){var t=y.getTranslation(this.msgid,this.translateN,this.translateContext,this.isPlural?this.translatePlural:null,this.$language.current),e=this.$parent;return this.translateParams&&(e=Object.assign({},this.$parent,this.translateParams)),this.$gettextInterpolate(t,e)}},render:function(t){return s.config.autoAddKeyAttributes&&!this.$vnode.key&&(this.$vnode.key=n()),t(this.tag,[this.translation])}},b=function(t,e,n){var a=n.data.attrs||{},r=t.dataset.msgid,i=a["translate-context"],o=a["translate-n"],u=a["translate-plural"],l=void 0!==o&&void 0!==u,c=n.context,f="true"===a["render-html"];if(!l&&(o||u))throw new Error("`translate-n` and `translate-plural` attributes must be used together:"+r+".");!s.config.getTextPluginSilent&&a["translate-params"]&&console.warn("`translate-params` is required as an expression for v-translate directive. Please change to `v-translate='params'`: "+r),e.value&&"object"==typeof e.value&&(c=Object.assign({},n.context,e.value));var d=y.getTranslation(r,o,i,l?u:null,t.dataset.currentLanguage),p=g(d,c,f);t.innerHTML=p},m={bind:function(t,e,a){s.config.autoAddKeyAttributes&&!a.key&&(a.key=n());var r=t.innerHTML;if(t.dataset.msgid=r,t.dataset.currentLanguage=s.config.language,!s.config.getTextPluginSilent){-1!==r.indexOf(g.INTERPOLATION_PREFIX)&&!e.expression&&console.info("No expression is provided for change detection. The translation for this key will be static:\n"+r)}b(t,e,a)},update:function(t,e,n){var r=!1;t.dataset.currentLanguage!==s.config.language&&(t.dataset.currentLanguage=s.config.language,r=!0),r||!e.expression||a(e.value,e.oldValue)||(r=!0),r&&b(t,e,n)}},x=function(t,n){void 0===n&&(n={});var a={autoAddKeyAttributes:!1,availableLanguages:{en_US:"English"},defaultLanguage:"en_US",languageVmMixin:{},muteLanguages:[],silent:t.config.silent,translations:null};if(Object.keys(n).forEach(function(t){if(-1===Object.keys(a).indexOf(t))throw new Error(t+" is an invalid option for the translate plugin.")}),!n.translations)throw new Error("No translations available.");n=Object.assign(a,n),f=new t({created:function(){this.available=n.availableLanguages},data:{current:n.defaultLanguage},mixins:[n.languageVmMixin]}),e(t),i(t,f),r(t,f,n.silent,n.autoAddKeyAttributes,n.muteLanguages),y.initTranslations(n.translations,t.config),t.component("translate",v),t.directive("translate",m),t.$translations=n.translations,t.prototype.$gettext=y.gettext.bind(y),t.prototype.$pgettext=y.pgettext.bind(y),t.prototype.$ngettext=y.ngettext.bind(y),t.prototype.$npgettext=y.npgettext.bind(y),t.prototype.$gettextInterpolate=g.bind(g)};t.default=x,t.translate=y,Object.defineProperty(t,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/src/interpolate.js b/src/interpolate.js index 94f2b59..4eeb745 100644 --- a/src/interpolate.js +++ b/src/interpolate.js @@ -35,7 +35,7 @@ const MUSTACHE_SYNTAX_RE = /\{\{((?:.|\n)+?)\}\}/g */ let interpolate = function (msgid, context = {}, disableHtmlEscaping = false) { - if (!_Vue.config.getTextPluginSilent && MUSTACHE_SYNTAX_RE.test(msgid)) { + if (_Vue && !_Vue.config.getTextPluginSilent && MUSTACHE_SYNTAX_RE.test(msgid)) { console.warn(`Mustache syntax cannot be used with vue-gettext. Please use "%{}" instead of "{{}}" in: ${msgid}`) } diff --git a/src/translate.js b/src/translate.js index 4cc69ad..d5cbe99 100644 --- a/src/translate.js +++ b/src/translate.js @@ -1,4 +1,5 @@ import plurals from './plurals' +import interpolate from './interpolate' const SPACING_RE = /\s{2,}/g @@ -182,6 +183,19 @@ const translate = { } }, + /** + * Allows to use interpolation outside the Vue + * + * @example + * import {translate} from 'vue-gettext'; + * + * const {gettext, gettextInterpolate} = translate; + * + * let translated = gettext('%{ n } foos', n) + * let interpolated = gettextInterpolate(translated, {n: 5}) + */ + gettextInterpolate: interpolate.bind(interpolate), + } export default translate From 295b782191d4bdd4497999639fe900223e7c2dfe Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Fri, 27 Nov 2020 16:33:30 +0300 Subject: [PATCH 2/4] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1ffc63b..5770551 100644 --- a/README.md +++ b/README.md @@ -454,9 +454,10 @@ For convenience `translate` can be imported directly in JavaScript files for cas ```js import {translate} from 'vue-gettext'; -const {gettext: $gettext} = translate; +const {gettext: $gettext, gettextInterpolate} = translate; -let str = $gettext('Hello'); +const str = $gettext('Hello, %{name}'); +const interpolated = gettextInterpolate(str, { name: 'Jerom' }) ``` # Elsewhere From bd73df565cb17d9d05abbcb19fb163ecce4ccd13 Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sat, 5 Dec 2020 15:14:26 +0300 Subject: [PATCH 3/4] rm dist changes --- dist/vue-gettext.js | 255 +++++++++++++++++++--------------------- dist/vue-gettext.min.js | 2 +- 2 files changed, 122 insertions(+), 135 deletions(-) diff --git a/dist/vue-gettext.js b/dist/vue-gettext.js index 3c39c2d..f81262a 100644 --- a/dist/vue-gettext.js +++ b/dist/vue-gettext.js @@ -184,126 +184,6 @@ }; - // Ensure to always use the same Vue instance throughout the plugin. - // - // This was previously done in `index.js` using both named and default exports. - // However, this currently must be kept in a separate file because we are using - // Rollup to build the dist files and it has a drawback when using named and - // default exports together, see: - // https://github.com/rollup/rollup/blob/fca14d/src/utils/getExportMode.js#L27 - // https://github.com/rollup/rollup/wiki/JavaScript-API#exports - // - // If we had kept named and default exports in `index.js`, a user would have to - // do something like this to access the default export: GetTextPlugin['default'] - - var _Vue; - - function shareVueInstance (Vue) { - _Vue = Vue; - } - - var EVALUATION_RE = /[[\].]{1,2}/g; - - /* Interpolation RegExp. - * - * Because interpolation inside attributes are deprecated in Vue 2 we have to - * use another set of delimiters to be able to use `translate-plural` etc. - * We use %{ } delimiters. - * - * / - * %\{ => Starting delimiter: `%{` - * ( => Start capture - * (?:.|\n) => Non-capturing group: any character or newline - * +? => One or more times (ungreedy) - * ) => End capture - * \} => Ending delimiter: `}` - * /g => Global: don't return after first match - */ - var INTERPOLATION_RE = /%\{((?:.|\n)+?)\}/g; - - var MUSTACHE_SYNTAX_RE = /\{\{((?:.|\n)+?)\}\}/g; - - /** - * Evaluate a piece of template string containing %{ } placeholders. - * E.g.: 'Hi %{ user.name }' => 'Hi Bob' - * - * This is a vm.$interpolate alternative for Vue 2. - * https://vuejs.org/v2/guide/migration.html#vm-interpolate-removed - * - * @param {String} msgid - The translation key containing %{ } placeholders - * @param {Object} context - An object whose elements are put in their corresponding placeholders - * - * @return {String} The interpolated string - */ - var interpolate = function (msgid, context, disableHtmlEscaping) { - if ( context === void 0 ) context = {}; - if ( disableHtmlEscaping === void 0 ) disableHtmlEscaping = false; - - - if (_Vue && !_Vue.config.getTextPluginSilent && MUSTACHE_SYNTAX_RE.test(msgid)) { - console.warn(("Mustache syntax cannot be used with vue-gettext. Please use \"%{}\" instead of \"{{}}\" in: " + msgid)); - } - - var result = msgid.replace(INTERPOLATION_RE, function (match, token) { - - var expression = token.trim(); - var evaluated; - - var escapeHtmlMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - }; - - // Avoid eval() by splitting `expression` and looping through its different properties if any, see #55. - function getProps (obj, expression) { - var arr = expression.split(EVALUATION_RE).filter(function (x) { return x; }); - while (arr.length) { - obj = obj[arr.shift()]; - } - return obj - } - - function evalInContext (expression) { - try { - evaluated = getProps(this, expression); - } catch (e) { - // Ignore errors, because this function may be called recursively later. - } - if (evaluated === undefined) { - if (this.$parent) { - // Recursively climb the $parent chain to allow evaluation inside nested components, see #23 and #24. - return evalInContext.call(this.$parent, expression) - } else { - console.warn(("Cannot evaluate expression: " + expression)); - evaluated = expression; - } - } - var result = evaluated.toString(); - if (disableHtmlEscaping) { - // Do not escape HTML, see #78. - return result - } - // Escape HTML, see #78. - return result.replace(/[&<>"']/g, function (m) { return escapeHtmlMap[m] }) - } - - return evalInContext.call(context, expression) - - }); - - return result - - }; - - // Store this values as function attributes for easy access elsewhere to bypass a Rollup - // weak point with `export`: - // https://github.com/rollup/rollup/blob/fca14d/src/utils/getExportMode.js#L27 - interpolate.INTERPOLATION_RE = INTERPOLATION_RE; - interpolate.INTERPOLATION_PREFIX = '%{'; - var SPACING_RE = /\s{2,}/g; // Default configuration if only the translation is passed. @@ -491,19 +371,6 @@ } }, - /** - * Allows to use interpolation outside the Vue - * - * @example - * import {translate} from 'vue-gettext'; - * - * const {gettext, gettextInterpolate} = translate; - * - * let translated = gettext('%{ n } foos', n) - * let interpolated = gettextInterpolate(translated, {n: 5}) - */ - gettextInterpolate: interpolate.bind(interpolate), - }; // UUID v4 generator (RFC4122 compliant). @@ -528,6 +395,24 @@ } + // Ensure to always use the same Vue instance throughout the plugin. + // + // This was previously done in `index.js` using both named and default exports. + // However, this currently must be kept in a separate file because we are using + // Rollup to build the dist files and it has a drawback when using named and + // default exports together, see: + // https://github.com/rollup/rollup/blob/fca14d/src/utils/getExportMode.js#L27 + // https://github.com/rollup/rollup/wiki/JavaScript-API#exports + // + // If we had kept named and default exports in `index.js`, a user would have to + // do something like this to access the default export: GetTextPlugin['default'] + + var _Vue; + + function shareVueInstance (Vue) { + _Vue = Vue; + } + /** * Translate content according to the current language. */ @@ -625,6 +510,108 @@ }; + var EVALUATION_RE = /[[\].]{1,2}/g; + + /* Interpolation RegExp. + * + * Because interpolation inside attributes are deprecated in Vue 2 we have to + * use another set of delimiters to be able to use `translate-plural` etc. + * We use %{ } delimiters. + * + * / + * %\{ => Starting delimiter: `%{` + * ( => Start capture + * (?:.|\n) => Non-capturing group: any character or newline + * +? => One or more times (ungreedy) + * ) => End capture + * \} => Ending delimiter: `}` + * /g => Global: don't return after first match + */ + var INTERPOLATION_RE = /%\{((?:.|\n)+?)\}/g; + + var MUSTACHE_SYNTAX_RE = /\{\{((?:.|\n)+?)\}\}/g; + + /** + * Evaluate a piece of template string containing %{ } placeholders. + * E.g.: 'Hi %{ user.name }' => 'Hi Bob' + * + * This is a vm.$interpolate alternative for Vue 2. + * https://vuejs.org/v2/guide/migration.html#vm-interpolate-removed + * + * @param {String} msgid - The translation key containing %{ } placeholders + * @param {Object} context - An object whose elements are put in their corresponding placeholders + * + * @return {String} The interpolated string + */ + var interpolate = function (msgid, context, disableHtmlEscaping) { + if ( context === void 0 ) context = {}; + if ( disableHtmlEscaping === void 0 ) disableHtmlEscaping = false; + + + if (!_Vue.config.getTextPluginSilent && MUSTACHE_SYNTAX_RE.test(msgid)) { + console.warn(("Mustache syntax cannot be used with vue-gettext. Please use \"%{}\" instead of \"{{}}\" in: " + msgid)); + } + + var result = msgid.replace(INTERPOLATION_RE, function (match, token) { + + var expression = token.trim(); + var evaluated; + + var escapeHtmlMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + }; + + // Avoid eval() by splitting `expression` and looping through its different properties if any, see #55. + function getProps (obj, expression) { + var arr = expression.split(EVALUATION_RE).filter(function (x) { return x; }); + while (arr.length) { + obj = obj[arr.shift()]; + } + return obj + } + + function evalInContext (expression) { + try { + evaluated = getProps(this, expression); + } catch (e) { + // Ignore errors, because this function may be called recursively later. + } + if (evaluated === undefined) { + if (this.$parent) { + // Recursively climb the $parent chain to allow evaluation inside nested components, see #23 and #24. + return evalInContext.call(this.$parent, expression) + } else { + console.warn(("Cannot evaluate expression: " + expression)); + evaluated = expression; + } + } + var result = evaluated.toString(); + if (disableHtmlEscaping) { + // Do not escape HTML, see #78. + return result + } + // Escape HTML, see #78. + return result.replace(/[&<>"']/g, function (m) { return escapeHtmlMap[m] }) + } + + return evalInContext.call(context, expression) + + }); + + return result + + }; + + // Store this values as function attributes for easy access elsewhere to bypass a Rollup + // weak point with `export`: + // https://github.com/rollup/rollup/blob/fca14d/src/utils/getExportMode.js#L27 + interpolate.INTERPOLATION_RE = INTERPOLATION_RE; + interpolate.INTERPOLATION_PREFIX = '%{'; + // Check if two values are loosely equal - that is, // if they are plain objects, do they have the same shape? // https://github.com/vuejs/vue/blob/v2.6.11/src/shared/util.js#L285 @@ -904,4 +891,4 @@ Object.defineProperty(exports, '__esModule', { value: true }); -})); +})); \ No newline at end of file diff --git a/dist/vue-gettext.min.js b/dist/vue-gettext.min.js index b7d49b7..ba7b143 100644 --- a/dist/vue-gettext.min.js +++ b/dist/vue-gettext.min.js @@ -3,4 +3,4 @@ * (c) 2020 Polyconseil * @license MIT */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):(t=t||self,e(t.VueGettext={}))}(this,function(t){"use strict";function e(t){s=t}function n(){var t,e,n="";for(t=0;t<32;t++)e=16*Math.random()|0,8!==t&&12!==t&&16!==t&&20!==t||(n+="-"),n+=(12===t?4:16===t?3&e|8:e).toString(16);return n}function a(t,e){if(t===e)return!0;var n=null!==t&&"object"==typeof t,r=null!==e&&"object"==typeof e;if(!n||!r)return!n&&!r&&String(t)===String(e);try{var i=Array.isArray(t),s=Array.isArray(e);if(i&&s)return t.length===e.length&&t.every(function(t,n){return a(t,e[n])});if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();if(i||s)return!1;var o=Object.keys(t),u=Object.keys(e);return o.length===u.length&&o.every(function(n){return a(t[n],e[n])})}catch(t){return!1}}function r(t,e,n,a,r){Object.defineProperty(t.config,"language",{enumerable:!0,configurable:!0,get:function(){return e.current},set:function(t){e.current=t}}),Object.defineProperty(t.config,"getTextPluginSilent",{enumerable:!0,writable:!0,value:n}),Object.defineProperty(t.config,"autoAddKeyAttributes",{enumerable:!0,writable:!0,value:a}),Object.defineProperty(t.config,"getTextPluginMuteLanguages",{enumerable:!0,writable:!0,value:r})}function i(t,e){var n=t.prototype._init;t.prototype._init=function(t){void 0===t&&(t={});var a=t._parent||t.parent||this;this.$language=a.$language||e,n.call(this,t)};var a=t.prototype._destroy;t.prototype._destroy=function(){this.$language=null,a.apply(this,arguments)}}"function"!=typeof Object.assign&&function(){Object.assign=function(t){var e,n,a,r,i=arguments;if(void 0===t||null===t)throw new TypeError("Cannot convert undefined or null to object");for(e=Object(t),n=1;n2&&"pt_BR"!==t&&(t=t.split("_")[0]),t){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return e%10!=1||e%100==11?1:0;case"jv":return 0!==e?1:0;case"mk":return 1===e||e%10==1?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"pt_BR":case"tg":case"ti":case"tr":case"uz":case"wa":case"zh":return e>1?1:0;case"lv":return e%10==1&&e%100!=11?0:0!==e?1:2;case"lt":return e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"mnk":return 0===e?0:1===e?1:2;case"ro":return 1===e?0:0===e||e%100>0&&e%100<20?1:2;case"pl":return 1===e?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"cs":case"sk":return 1===e?0:e>=2&&e<=4?1:2;case"csb":return 1===e?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"sl":return e%100==1?0:e%100==2?1:e%100==3||e%100==4?2:3;case"mt":return 1===e?0:0===e||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3;case"gd":return 1===e||11===e?0:2===e||12===e?1:e>2&&e<20?2:3;case"cy":return 1===e?0:2===e?1:8!==e&&11!==e?2:3;case"kw":return 1===e?0:2===e?1:3===e?2:3;case"ga":return 1===e?0:2===e?1:e>2&&e<7?2:e>6&&e<11?3:4;case"ar":return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5;default:return 1!==e?1:0}}},u=/[[\].]{1,2}/g,l=/%\{((?:.|\n)+?)\}/g,c=/\{\{((?:.|\n)+?)\}\}/g,g=function(t,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),s&&!s.config.getTextPluginSilent&&c.test(t)&&console.warn('Mustache syntax cannot be used with vue-gettext. Please use "%{}" instead of "{{}}" in: '+t),t.replace(l,function(t,a){function r(t,e){for(var n=e.split(u).filter(function(t){return t});n.length;)t=t[n.shift()];return t}function i(t){try{s=r(this,t)}catch(t){}if(void 0===s){if(this.$parent)return i.call(this.$parent,t);console.warn("Cannot evaluate expression: "+t),s=t}var e=s.toString();return n?e:e.replace(/[&<>"']/g,function(t){return l[t]})}var s,o=a.trim(),l={"&":"&","<":"<",">":">",'"':""","'":"'"};return i.call(e,o)})};g.INTERPOLATION_RE=l,g.INTERPOLATION_PREFIX="%{";var f,d=/\s{2,}/g,p={language:"",getTextPluginSilent:!1,getTextPluginMuteLanguages:[],silent:!1},h={},y={getTranslation:function(t,e,n,a,r){if(void 0===e&&(e=1),void 0===n&&(n=null),void 0===a&&(a=null),void 0===r&&(r=p.language),!t)return"";var i=p.getTextPluginSilent||-1!==p.getTextPluginMuteLanguages.indexOf(r),s=a&&o.getTranslationIndex(r,e)>0?a:t,u=h[r]||h[r.split("_")[0]];if(!u)return i||console.warn("No translations found for "+r),s;t=t.trim();var l=u[t];if(!l&&d.test(t)&&Object.keys(u).some(function(e){if(e.replace(d," ")===t.replace(d," "))return l=u[e]}),l&&n&&(l=l[n]),!l){if(!i){var c="Untranslated "+r+" key found: "+t;n&&(c+=" (with context: "+n+")"),console.warn(c)}return s}l instanceof Array||!l.hasOwnProperty("")||(l=l[""]),"string"==typeof l&&(l=[l]);var g=o.getTranslationIndex(r,e);return 1===l.length&&1===e&&(g=0),l[g]},gettext:function(t){return y.getTranslation(t)},pgettext:function(t,e){return y.getTranslation(e,1,t)},ngettext:function(t,e,n){return y.getTranslation(t,n,null,e)},npgettext:function(t,e,n,a){return y.getTranslation(e,a,t,n)},initTranslations:function(t,e){t&&"object"==typeof t&&(h=t),e&&"object"==typeof e&&(p=e)},gettextInterpolate:g.bind(g)},v={name:"translate",created:function(){if(this.msgid="",this.$options._renderChildren&&(this.$options._renderChildren[0].hasOwnProperty("text")?this.msgid=this.$options._renderChildren[0].text:this.msgid=this.$options._renderChildren[0]),this.isPlural=void 0!==this.translateN&&void 0!==this.translatePlural,!this.isPlural&&(this.translateN||this.translatePlural))throw new Error("`translate-n` and `translate-plural` attributes must be used together: "+this.msgid+".")},props:{tag:{type:String,default:"span"},translateN:{type:Number,required:!1},translatePlural:{type:String,required:!1},translateContext:{type:String,required:!1},translateParams:{type:Object,required:!1},translateComment:{type:String,required:!1}},computed:{translation:function(){var t=y.getTranslation(this.msgid,this.translateN,this.translateContext,this.isPlural?this.translatePlural:null,this.$language.current),e=this.$parent;return this.translateParams&&(e=Object.assign({},this.$parent,this.translateParams)),this.$gettextInterpolate(t,e)}},render:function(t){return s.config.autoAddKeyAttributes&&!this.$vnode.key&&(this.$vnode.key=n()),t(this.tag,[this.translation])}},b=function(t,e,n){var a=n.data.attrs||{},r=t.dataset.msgid,i=a["translate-context"],o=a["translate-n"],u=a["translate-plural"],l=void 0!==o&&void 0!==u,c=n.context,f="true"===a["render-html"];if(!l&&(o||u))throw new Error("`translate-n` and `translate-plural` attributes must be used together:"+r+".");!s.config.getTextPluginSilent&&a["translate-params"]&&console.warn("`translate-params` is required as an expression for v-translate directive. Please change to `v-translate='params'`: "+r),e.value&&"object"==typeof e.value&&(c=Object.assign({},n.context,e.value));var d=y.getTranslation(r,o,i,l?u:null,t.dataset.currentLanguage),p=g(d,c,f);t.innerHTML=p},m={bind:function(t,e,a){s.config.autoAddKeyAttributes&&!a.key&&(a.key=n());var r=t.innerHTML;if(t.dataset.msgid=r,t.dataset.currentLanguage=s.config.language,!s.config.getTextPluginSilent){-1!==r.indexOf(g.INTERPOLATION_PREFIX)&&!e.expression&&console.info("No expression is provided for change detection. The translation for this key will be static:\n"+r)}b(t,e,a)},update:function(t,e,n){var r=!1;t.dataset.currentLanguage!==s.config.language&&(t.dataset.currentLanguage=s.config.language,r=!0),r||!e.expression||a(e.value,e.oldValue)||(r=!0),r&&b(t,e,n)}},x=function(t,n){void 0===n&&(n={});var a={autoAddKeyAttributes:!1,availableLanguages:{en_US:"English"},defaultLanguage:"en_US",languageVmMixin:{},muteLanguages:[],silent:t.config.silent,translations:null};if(Object.keys(n).forEach(function(t){if(-1===Object.keys(a).indexOf(t))throw new Error(t+" is an invalid option for the translate plugin.")}),!n.translations)throw new Error("No translations available.");n=Object.assign(a,n),f=new t({created:function(){this.available=n.availableLanguages},data:{current:n.defaultLanguage},mixins:[n.languageVmMixin]}),e(t),i(t,f),r(t,f,n.silent,n.autoAddKeyAttributes,n.muteLanguages),y.initTranslations(n.translations,t.config),t.component("translate",v),t.directive("translate",m),t.$translations=n.translations,t.prototype.$gettext=y.gettext.bind(y),t.prototype.$pgettext=y.pgettext.bind(y),t.prototype.$ngettext=y.ngettext.bind(y),t.prototype.$npgettext=y.npgettext.bind(y),t.prototype.$gettextInterpolate=g.bind(g)};t.default=x,t.translate=y,Object.defineProperty(t,"__esModule",{value:!0})}); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):(t=t||self,e(t.VueGettext={}))}(this,function(t){"use strict";function e(){var t,e,n="";for(t=0;t<32;t++)e=16*Math.random()|0,8!==t&&12!==t&&16!==t&&20!==t||(n+="-"),n+=(12===t?4:16===t?3&e|8:e).toString(16);return n}function n(t){s=t}function a(t,e){if(t===e)return!0;var n=null!==t&&"object"==typeof t,r=null!==e&&"object"==typeof e;if(!n||!r)return!n&&!r&&String(t)===String(e);try{var i=Array.isArray(t),s=Array.isArray(e);if(i&&s)return t.length===e.length&&t.every(function(t,n){return a(t,e[n])});if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();if(i||s)return!1;var o=Object.keys(t),u=Object.keys(e);return o.length===u.length&&o.every(function(n){return a(t[n],e[n])})}catch(t){return!1}}function r(t,e,n,a,r){Object.defineProperty(t.config,"language",{enumerable:!0,configurable:!0,get:function(){return e.current},set:function(t){e.current=t}}),Object.defineProperty(t.config,"getTextPluginSilent",{enumerable:!0,writable:!0,value:n}),Object.defineProperty(t.config,"autoAddKeyAttributes",{enumerable:!0,writable:!0,value:a}),Object.defineProperty(t.config,"getTextPluginMuteLanguages",{enumerable:!0,writable:!0,value:r})}function i(t,e){var n=t.prototype._init;t.prototype._init=function(t){void 0===t&&(t={});var a=t._parent||t.parent||this;this.$language=a.$language||e,n.call(this,t)};var a=t.prototype._destroy;t.prototype._destroy=function(){this.$language=null,a.apply(this,arguments)}}"function"!=typeof Object.assign&&function(){Object.assign=function(t){var e,n,a,r,i=arguments;if(void 0===t||null===t)throw new TypeError("Cannot convert undefined or null to object");for(e=Object(t),n=1;n2&&"pt_BR"!==t&&(t=t.split("_")[0]),t){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return e%10!=1||e%100==11?1:0;case"jv":return 0!==e?1:0;case"mk":return 1===e||e%10==1?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"pt_BR":case"tg":case"ti":case"tr":case"uz":case"wa":case"zh":return e>1?1:0;case"lv":return e%10==1&&e%100!=11?0:0!==e?1:2;case"lt":return e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"mnk":return 0===e?0:1===e?1:2;case"ro":return 1===e?0:0===e||e%100>0&&e%100<20?1:2;case"pl":return 1===e?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"cs":case"sk":return 1===e?0:e>=2&&e<=4?1:2;case"csb":return 1===e?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"sl":return e%100==1?0:e%100==2?1:e%100==3||e%100==4?2:3;case"mt":return 1===e?0:0===e||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3;case"gd":return 1===e||11===e?0:2===e||12===e?1:e>2&&e<20?2:3;case"cy":return 1===e?0:2===e?1:8!==e&&11!==e?2:3;case"kw":return 1===e?0:2===e?1:3===e?2:3;case"ga":return 1===e?0:2===e?1:e>2&&e<7?2:e>6&&e<11?3:4;case"ar":return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5;default:return 1!==e?1:0}}},u=/\s{2,}/g,l={language:"",getTextPluginSilent:!1,getTextPluginMuteLanguages:[],silent:!1},c={},g={getTranslation:function(t,e,n,a,r){if(void 0===e&&(e=1),void 0===n&&(n=null),void 0===a&&(a=null),void 0===r&&(r=l.language),!t)return"";var i=l.getTextPluginSilent||-1!==l.getTextPluginMuteLanguages.indexOf(r),s=a&&o.getTranslationIndex(r,e)>0?a:t,g=c[r]||c[r.split("_")[0]];if(!g)return i||console.warn("No translations found for "+r),s;t=t.trim();var f=g[t];if(!f&&u.test(t)&&Object.keys(g).some(function(e){if(e.replace(u," ")===t.replace(u," "))return f=g[e]}),f&&n&&(f=f[n]),!f){if(!i){var d="Untranslated "+r+" key found: "+t;n&&(d+=" (with context: "+n+")"),console.warn(d)}return s}f instanceof Array||!f.hasOwnProperty("")||(f=f[""]),"string"==typeof f&&(f=[f]);var p=o.getTranslationIndex(r,e);return 1===f.length&&1===e&&(p=0),f[p]},gettext:function(t){return g.getTranslation(t)},pgettext:function(t,e){return g.getTranslation(e,1,t)},ngettext:function(t,e,n){return g.getTranslation(t,n,null,e)},npgettext:function(t,e,n,a){return g.getTranslation(e,a,t,n)},initTranslations:function(t,e){t&&"object"==typeof t&&(c=t),e&&"object"==typeof e&&(l=e)}},f={name:"translate",created:function(){if(this.msgid="",this.$options._renderChildren&&(this.$options._renderChildren[0].hasOwnProperty("text")?this.msgid=this.$options._renderChildren[0].text:this.msgid=this.$options._renderChildren[0]),this.isPlural=void 0!==this.translateN&&void 0!==this.translatePlural,!this.isPlural&&(this.translateN||this.translatePlural))throw new Error("`translate-n` and `translate-plural` attributes must be used together: "+this.msgid+".")},props:{tag:{type:String,default:"span"},translateN:{type:Number,required:!1},translatePlural:{type:String,required:!1},translateContext:{type:String,required:!1},translateParams:{type:Object,required:!1},translateComment:{type:String,required:!1}},computed:{translation:function(){var t=g.getTranslation(this.msgid,this.translateN,this.translateContext,this.isPlural?this.translatePlural:null,this.$language.current),e=this.$parent;return this.translateParams&&(e=Object.assign({},this.$parent,this.translateParams)),this.$gettextInterpolate(t,e)}},render:function(t){return s.config.autoAddKeyAttributes&&!this.$vnode.key&&(this.$vnode.key=e()),t(this.tag,[this.translation])}},d=/[[\].]{1,2}/g,p=/%\{((?:.|\n)+?)\}/g,h=/\{\{((?:.|\n)+?)\}\}/g,y=function(t,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),!s.config.getTextPluginSilent&&h.test(t)&&console.warn('Mustache syntax cannot be used with vue-gettext. Please use "%{}" instead of "{{}}" in: '+t),t.replace(p,function(t,a){function r(t,e){for(var n=e.split(d).filter(function(t){return t});n.length;)t=t[n.shift()];return t}function i(t){try{s=r(this,t)}catch(t){}if(void 0===s){if(this.$parent)return i.call(this.$parent,t);console.warn("Cannot evaluate expression: "+t),s=t}var e=s.toString();return n?e:e.replace(/[&<>"']/g,function(t){return u[t]})}var s,o=a.trim(),u={"&":"&","<":"<",">":">",'"':""","'":"'"};return i.call(e,o)})};y.INTERPOLATION_RE=p,y.INTERPOLATION_PREFIX="%{";var v,b=function(t,e,n){var a=n.data.attrs||{},r=t.dataset.msgid,i=a["translate-context"],o=a["translate-n"],u=a["translate-plural"],l=void 0!==o&&void 0!==u,c=n.context,f="true"===a["render-html"];if(!l&&(o||u))throw new Error("`translate-n` and `translate-plural` attributes must be used together:"+r+".");!s.config.getTextPluginSilent&&a["translate-params"]&&console.warn("`translate-params` is required as an expression for v-translate directive. Please change to `v-translate='params'`: "+r),e.value&&"object"==typeof e.value&&(c=Object.assign({},n.context,e.value));var d=g.getTranslation(r,o,i,l?u:null,t.dataset.currentLanguage),p=y(d,c,f);t.innerHTML=p},m={bind:function(t,n,a){s.config.autoAddKeyAttributes&&!a.key&&(a.key=e());var r=t.innerHTML;if(t.dataset.msgid=r,t.dataset.currentLanguage=s.config.language,!s.config.getTextPluginSilent){-1!==r.indexOf(y.INTERPOLATION_PREFIX)&&!n.expression&&console.info("No expression is provided for change detection. The translation for this key will be static:\n"+r)}b(t,n,a)},update:function(t,e,n){var r=!1;t.dataset.currentLanguage!==s.config.language&&(t.dataset.currentLanguage=s.config.language,r=!0),r||!e.expression||a(e.value,e.oldValue)||(r=!0),r&&b(t,e,n)}},x=function(t,e){void 0===e&&(e={});var a={autoAddKeyAttributes:!1,availableLanguages:{en_US:"English"},defaultLanguage:"en_US",languageVmMixin:{},muteLanguages:[],silent:t.config.silent,translations:null};if(Object.keys(e).forEach(function(t){if(-1===Object.keys(a).indexOf(t))throw new Error(t+" is an invalid option for the translate plugin.")}),!e.translations)throw new Error("No translations available.");e=Object.assign(a,e),v=new t({created:function(){this.available=e.availableLanguages},data:{current:e.defaultLanguage},mixins:[e.languageVmMixin]}),n(t),i(t,v),r(t,v,e.silent,e.autoAddKeyAttributes,e.muteLanguages),g.initTranslations(e.translations,t.config),t.component("translate",f),t.directive("translate",m),t.$translations=e.translations,t.prototype.$gettext=g.gettext.bind(g),t.prototype.$pgettext=g.pgettext.bind(g),t.prototype.$ngettext=g.ngettext.bind(g),t.prototype.$npgettext=g.npgettext.bind(g),t.prototype.$gettextInterpolate=y.bind(y)};t.default=x,t.translate=g,Object.defineProperty(t,"__esModule",{value:!0})}); \ No newline at end of file From 170ce6890865befd519c7ca7adf80670ae3b884a Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sat, 5 Dec 2020 15:17:41 +0300 Subject: [PATCH 4/4] add ln --- dist/vue-gettext.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/vue-gettext.js b/dist/vue-gettext.js index f81262a..fa18da6 100644 --- a/dist/vue-gettext.js +++ b/dist/vue-gettext.js @@ -891,4 +891,4 @@ Object.defineProperty(exports, '__esModule', { value: true }); -})); \ No newline at end of file +}));