From 218fef9951cd551cdf6d63d4deafb6397f1e437b Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Tue, 30 Oct 2018 10:15:30 -0400 Subject: [PATCH] HOR-4915 --- .../Commands/PMTranslationsPlugins.php | 210 ++++++++++++++++++ app/Console/Kernel.php | 39 ++++ bootstrap/app.php | 3 +- composer.json | 13 +- gulliver/js/i18next/i18next.min.js | 2 + gulliver/system/class.i18n_po.php | 172 +++++++++----- .../engine/src/ProcessMaker/Application.php | 18 ++ .../ProcessMaker/Util/Translation/I18Next.php | 123 ++++++++++ 8 files changed, 513 insertions(+), 67 deletions(-) create mode 100644 app/Console/Commands/PMTranslationsPlugins.php create mode 100644 app/Console/Kernel.php create mode 100644 gulliver/js/i18next/i18next.min.js create mode 100644 workflow/engine/src/ProcessMaker/Application.php create mode 100644 workflow/engine/src/ProcessMaker/Util/Translation/I18Next.php diff --git a/app/Console/Commands/PMTranslationsPlugins.php b/app/Console/Commands/PMTranslationsPlugins.php new file mode 100644 index 000000000..1a6f5b41c --- /dev/null +++ b/app/Console/Commands/PMTranslationsPlugins.php @@ -0,0 +1,210 @@ +pluginsPath = realpath(base_path() . DIRECTORY_SEPARATOR . "workflow" . DIRECTORY_SEPARATOR . "engine" . DIRECTORY_SEPARATOR . "plugins"); + } + + /** + * Execute the console command. + */ + public function handle() + { + $pluginNames = $this->option('name'); + $processAll = $this->option('all'); + $processType = $this->option('type'); + $directoryPlugins = []; + if ($processAll) { + $directoryPlugins = $this->filterFiles(array_diff(scandir($this->pluginsPath), ['..', '.'])) ?: []; + } elseif ($pluginNames) { + $directoryPlugins = $pluginNames; + } else { + $this->comment("Please use the --all option or introduce the plugin name (--name=namePlugin)"); + return; + } + $this->info('Start converting'); + $bar = $this->output->createProgressBar(count($directoryPlugins)); + foreach ($directoryPlugins as $name) { + if ($processType == 'po') { + $this->generateI18nFromPoFiles($name); + } elseif ($processType == 'laravel') { + $this->generateI18nFromLaravelLang($name); + } + $bar->advance(); + } + $bar->finish(); + $this->info("\nFinish"); + } + + /** + * Generate files i18n from .po. + * + * @param object $pluginName + * @return void + */ + private function generateI18nFromPoFiles($pluginName) + { + $pluginPath = $this->pluginsPath . DIRECTORY_SEPARATOR . $pluginName; + if (is_dir($pluginPath)) { + // Translate for files .po in plugin + $translationsDirectory = $pluginPath . DIRECTORY_SEPARATOR . 'translations'; + $scannedDirectory = is_dir($translationsDirectory) ? array_diff(scandir($translationsDirectory), ['..', '.']) : null; + if ($scannedDirectory) { + $this->i18next = new I18Next(); + foreach ($scannedDirectory as $index => $item) { + $filePath = $translationsDirectory . DIRECTORY_SEPARATOR . $item; + $pathParts = pathinfo($filePath); + $isPofile = !empty($pathParts['extension']) && $pathParts['extension'] === 'po'; + + if ($isPofile) { + $basename = explode('.', $pathParts['basename']); + $language = $basename[1]; + + $this->i18next->setLanguage($language); + + //read file .po + $str = new stdClass(); + $poFile = new i18n_PO($filePath); + $poFile->readInit(); + while ($translation = $poFile->getTranslation()) { + $translatorComments = $poFile->translatorComments; + $references = $poFile->references; + + $ifContinue = empty($translatorComments[0]) && empty($translatorComments[1]) && empty($references[0]); + if ($ifContinue) { + continue; + } + $ifNotTranslation = !($translatorComments[0] === 'TRANSLATION'); + if ($ifNotTranslation) { + continue; + } + $key = explode("/", $translatorComments[1]); + $str->{$key[1]} = $translation['msgstr']; + } + $this->i18next->setPlugin($language, $pluginName, $str); + } + } + $this->saveFileJs($pluginName); + } + } + } + + /** + * Generate files i18n from resource/lang/*. + * + * @param $pluginName + * @return void + */ + private function generateI18nFromLaravelLang($pluginName) + { + $pluginPath = $this->pluginsPath . DIRECTORY_SEPARATOR . $pluginName; + if (is_dir($pluginPath)) { + // Translate for files resources/lang in plugin + $translationsDirectory = $pluginPath . DIRECTORY_SEPARATOR . 'resources' . DIRECTORY_SEPARATOR . 'lang'; + $scannedDirectory = is_dir($translationsDirectory) ? array_diff(scandir($translationsDirectory), ['..', '.']) : null; + if ($scannedDirectory) { + $this->i18next = new I18Next(); + foreach ($scannedDirectory as $lang) { + $dirLanguage = $pluginPath . DIRECTORY_SEPARATOR . 'resources' . DIRECTORY_SEPARATOR . 'lang' . DIRECTORY_SEPARATOR . $lang; + $scannedLanguage = is_dir($dirLanguage) ? array_diff(scandir($dirLanguage), ['..', '.']) : []; + foreach ($scannedLanguage as $index => $item) { + $filePath = $dirLanguage . DIRECTORY_SEPARATOR . $item; + $pathParts = pathinfo($filePath); + $isPhpFile = !empty($pathParts['extension']) && $pathParts['extension'] === 'php'; + if ($isPhpFile) { + $file = explode(".", $item); + array_pop($file); + $filename = implode("_", $file); + $arrayLanguage = [$filename => require_once($dirLanguage . DIRECTORY_SEPARATOR . $item)]; + $this->i18next->setLanguage($lang); + $this->i18next->setPlugin($lang, $pluginName, json_decode(json_encode($arrayLanguage))); + } + } + } + $this->saveFileJs($pluginName); + } + } + } + + /** + * Save js file generate of translate files. + * + * @param string $pluginName + */ + private function saveFileJs($pluginName) + { + $folderToSave = $this->pluginsPath . DIRECTORY_SEPARATOR . $pluginName . DIRECTORY_SEPARATOR . "public_html" . DIRECTORY_SEPARATOR . "js"; + if (!is_dir($folderToSave)) { + $create = $this->choice('The "js" folder does not exist, Do you want to create the folder?', ['Yes', 'No'], 0); + if (strtolower($create) == 'yes') { + G::mk_dir($folderToSave, 0775); + } + } + $this->i18next->saveJs($pluginName, $folderToSave . DIRECTORY_SEPARATOR . $pluginName . ".i18n"); + } + + /** + * Remove files, return only folders. + * + * @param $scannedDirectory + * @return array + */ + private function filterFiles($scannedDirectory) + { + $onlyFolders = []; + foreach ($scannedDirectory as $index => $item) { + $pluginPath = $this->pluginsPath . DIRECTORY_SEPARATOR . $item; + if (is_dir($pluginPath)) { + array_push($onlyFolders, $item); + } + } + return $onlyFolders; + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 000000000..5012ffaf8 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,39 @@ +singleton( $app->singleton( Kernel2::class, - Kernel::class + App\Console\Kernel::class ); $app->singleton( diff --git a/composer.json b/composer.json index 6c2931319..c3a78cb5f 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "colosa/pmdynaform": "release/3.2.4-dev", "google/apiclient": "1.1.6", "dapphp/securimage": "^3.6", - "psr/log":"1.0.0", + "psr/log": "1.0.0", "monolog/monolog": "1.19.0", "geshi/geshi": "dev-master", "libchart/libchart": "1.4.0", @@ -46,8 +46,8 @@ "TYPO3/class-alias-loader": "^1.0", "ralouphie/getallheaders": "^2.0", "smarty/smarty": "2.6.30", - "pdepend/pdepend" : "@stable", - "chumper/zipper" : "^1.0" + "pdepend/pdepend": "@stable", + "chumper/zipper": "^1.0" }, "require-dev": { "fzaninotto/faker": "^1.7", @@ -64,8 +64,9 @@ "ProcessMaker\\": "workflow/engine/src" }, "psr-4": { - "Maveriks\\": "framework/src/Maveriks/", - "Tests\\": "tests/" + "App\\": "app/", + "Maveriks\\": "framework/src/Maveriks/", + "Tests\\": "tests/" }, "classmap": [ "gulliver/system/", @@ -97,7 +98,7 @@ }, "scripts": { "post-install-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wimg/php-compatibility", - "post-update-cmd" : "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wimg/php-compatibility" + "post-update-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wimg/php-compatibility" }, "extra": { "typo3/class-alias-loader": { diff --git a/gulliver/js/i18next/i18next.min.js b/gulliver/js/i18next/i18next.min.js new file mode 100644 index 000000000..e3c3fc389 --- /dev/null +++ b/gulliver/js/i18next/i18next.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.i18next=e()}(this,function(){"use strict";function t(t){return null==t?"":""+t}function e(t,e,n){t.forEach(function(t){e[t]&&(n[t]=e[t])})}function n(t,e,n){function o(t){return t&&t.indexOf("###")>-1?t.replace(/###/g,"."):t}function r(){return!t||"string"==typeof t}for(var i="string"!=typeof e?[].concat(e):e.split(".");i.length>1;){if(r())return{};var s=o(i.shift());!t[s]&&n&&(t[s]=new n),t=t[s]}return r()?{}:{obj:t,k:o(i.shift())}}function o(t,e,o){var r=n(t,e,Object);r.obj[r.k]=o}function r(t,e,o,r){var i=n(t,e,Object),s=i.obj,a=i.k;s[a]=s[a]||[],r&&(s[a]=s[a].concat(o)),r||s[a].push(o)}function i(t,e){var o=n(t,e),r=o.obj,i=o.k;if(r)return r[i]}function s(t,e,n){for(var o in e)o in t?"string"==typeof t[o]||t[o]instanceof String||"string"==typeof e[o]||e[o]instanceof String?n&&(t[o]=e[o]):s(t[o],e[o],n):t[o]=e[o];return t}function a(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}function u(t){return"string"==typeof t?t.replace(/[&<>"'\/]/g,function(t){return L[t]}):t}function l(t){return t.charAt(0).toUpperCase()+t.slice(1)}function p(){var t={};return P.forEach(function(e){e.lngs.forEach(function(n){t[n]={numbers:e.nr,plurals:F[e.fc]}})}),t}function c(t,e){for(var n=t.indexOf(e);-1!==n;)t.splice(n,1),n=t.indexOf(e)}function f(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,whitelist:!1,nonExplicitWhitelist:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:function(){},parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function(t){var e={};return t[1]&&(e.defaultValue=t[1]),t[2]&&(e.tDescription=t[2]),e},interpolation:{escapeValue:!0,format:function(t,e,n){return t},prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",maxReplaces:1e3}}}function h(t){return"string"==typeof t.ns&&(t.ns=[t.ns]),"string"==typeof t.fallbackLng&&(t.fallbackLng=[t.fallbackLng]),"string"==typeof t.fallbackNS&&(t.fallbackNS=[t.fallbackNS]),t.whitelist&&t.whitelist.indexOf("cimode")<0&&(t.whitelist=t.whitelist.concat(["cimode"])),t}function g(){}var d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},y=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},v=Object.assign||function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{};y(this,t),this.init(e,n)}return t.prototype.init=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.prefix=e.prefix||"i18next:",this.logger=t||k,this.options=e,this.debug=e.debug},t.prototype.setDebug=function(t){this.debug=t},t.prototype.log=function(){for(var t=arguments.length,e=Array(t),n=0;n-1&&n.observers[t].splice(o,1)}else delete n.observers[t]})},t.prototype.emit=function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),o=1;o":">",'"':""","'":"'","/":"/"},N=function(t){function e(n){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ns:["translation"],defaultNS:"translation"};y(this,e);var r=b(this,t.call(this));return r.data=n||{},r.options=o,void 0===r.options.keySeparator&&(r.options.keySeparator="."),r}return m(e,t),e.prototype.addNamespaces=function(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)},e.prototype.removeNamespaces=function(t){var e=this.options.ns.indexOf(t);e>-1&&this.options.ns.splice(e,1)},e.prototype.getResource=function(t,e,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},r=void 0!==o.keySeparator?o.keySeparator:this.options.keySeparator,s=[t,e];return n&&"string"!=typeof n&&(s=s.concat(n)),n&&"string"==typeof n&&(s=s.concat(r?n.split(r):n)),t.indexOf(".")>-1&&(s=t.split(".")),i(this.data,s)},e.prototype.addResource=function(t,e,n,r){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{silent:!1},s=this.options.keySeparator;void 0===s&&(s=".");var a=[t,e];n&&(a=a.concat(s?n.split(s):n)),t.indexOf(".")>-1&&(a=t.split("."),r=e,e=a[1]),this.addNamespaces(e),o(this.data,a,r),i.silent||this.emit("added",t,e,n,r)},e.prototype.addResources=function(t,e,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{silent:!1};for(var r in n)"string"==typeof n[r]&&this.addResource(t,e,r,n[r],{silent:!0});o.silent||this.emit("added",t,e,n)},e.prototype.addResourceBundle=function(t,e,n,r,a){var u=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{silent:!1},l=[t,e];t.indexOf(".")>-1&&(l=t.split("."),r=n,n=e,e=l[1]),this.addNamespaces(e);var p=i(this.data,l)||{};r?s(p,n,a):p=v({},p,n),o(this.data,l,p),u.silent||this.emit("added",t,e,n)},e.prototype.removeResourceBundle=function(t,e){this.hasResourceBundle(t,e)&&delete this.data[t][e],this.removeNamespaces(e),this.emit("removed",t,e)},e.prototype.hasResourceBundle=function(t,e){return void 0!==this.getResource(t,e)},e.prototype.getResourceBundle=function(t,e){return e||(e=this.options.defaultNS),"v1"===this.options.compatibilityAPI?v({},this.getResource(t,e)):this.getResource(t,e)},e.prototype.getDataByLanguage=function(t){return this.data[t]},e.prototype.toJSON=function(){return this.data},e}(R),C={processors:{},addPostProcessor:function(t){this.processors[t.name]=t},handle:function(t,e,n,o,r){var i=this;return t.forEach(function(t){i.processors[t]&&(e=i.processors[t].process(e,n,o,r))}),e}},j=function(t){function n(o){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};y(this,n);var i=b(this,t.call(this));return e(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat"],o,i),i.options=r,void 0===i.options.keySeparator&&(i.options.keySeparator="."),i.logger=O.create("translator"),i}return m(n,t),n.prototype.changeLanguage=function(t){t&&(this.language=t)},n.prototype.exists=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}},n=this.resolve(t,e);return n&&void 0!==n.res},n.prototype.extractFromKey=function(t,e){var n=e.nsSeparator||this.options.nsSeparator;void 0===n&&(n=":");var o=void 0!==e.keySeparator?e.keySeparator:this.options.keySeparator,r=e.ns||this.options.defaultNS;if(n&&t.indexOf(n)>-1){var i=t.split(n);(n!==o||n===o&&this.options.ns.indexOf(i[0])>-1)&&(r=i.shift()),t=i.join(o)}return"string"==typeof r&&(r=[r]),{key:t,namespaces:r}},n.prototype.translate=function(t,e){var n=this;if("object"!==(void 0===e?"undefined":d(e))&&this.options.overloadTranslationOptionHandler&&(e=this.options.overloadTranslationOptionHandler(arguments)),e||(e={}),void 0===t||null===t||""===t)return"";"number"==typeof t&&(t=String(t)),"string"==typeof t&&(t=[t]);var o=void 0!==e.keySeparator?e.keySeparator:this.options.keySeparator,r=this.extractFromKey(t[t.length-1],e),i=r.key,s=r.namespaces,a=s[s.length-1],u=e.lng||this.language,l=e.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(u&&"cimode"===u.toLowerCase()){if(l){var p=e.nsSeparator||this.options.nsSeparator;return a+p+i}return i}var c=this.resolve(t,e),f=c&&c.res,h=c&&c.usedKey||i,g=Object.prototype.toString.apply(f),y=["[object Number]","[object Function]","[object RegExp]"],m=void 0!==e.joinArrays?e.joinArrays:this.options.joinArrays,b=!this.i18nFormat||this.i18nFormat.handleAsObject,x="string"!=typeof f&&"boolean"!=typeof f&&"number"!=typeof f;if(b&&f&&x&&y.indexOf(g)<0&&(!m||"[object Array]"!==g)){if(!e.returnObjects&&!this.options.returnObjects)return this.logger.warn("accessing an object - but returnObjects options is not enabled!"),this.options.returnedObjectHandler?this.options.returnedObjectHandler(h,f,e):"key '"+i+" ("+this.language+")' returned an object instead of string.";if(o){var S="[object Array]"===g?[]:{};for(var k in f)if(Object.prototype.hasOwnProperty.call(f,k)){var w=""+h+o+k;S[k]=this.translate(w,v({},e,{joinArrays:!1,ns:s})),S[k]===w&&(S[k]=f[k])}f=S}}else if(b&&m&&"[object Array]"===g)(f=f.join(m))&&(f=this.extendTranslation(f,t,e));else{var O=!1,R=!1;if(!this.isValidLookup(f)&&void 0!==e.defaultValue){if(O=!0,void 0!==e.count){var L=this.pluralResolver.getSuffix(u,e.count);f=e["defaultValue"+L]}f||(f=e.defaultValue)}this.isValidLookup(f)||(R=!0,f=i);var N=e.defaultValue&&e.defaultValue!==f&&this.options.updateMissing;if(R||O||N){this.logger.log(N?"updateKey":"missingKey",u,a,i,N?e.defaultValue:f);var C=[],j=this.languageUtils.getFallbackCodes(this.options.fallbackLng,e.lng||this.language);if("fallback"===this.options.saveMissingTo&&j&&j[0])for(var E=0;E1&&void 0!==arguments[1]?arguments[1]:{},o=void 0,r=void 0,i=void 0,s=void 0;return"string"==typeof t&&(t=[t]),t.forEach(function(t){if(!e.isValidLookup(o)){var a=e.extractFromKey(t,n),u=a.key;r=u;var l=a.namespaces;e.options.fallbackNS&&(l=l.concat(e.options.fallbackNS));var p=void 0!==n.count&&"string"!=typeof n.count,c=void 0!==n.context&&"string"==typeof n.context&&""!==n.context,f=n.lngs?n.lngs:e.languageUtils.toResolveHierarchy(n.lng||e.language);l.forEach(function(t){e.isValidLookup(o)||(s=t,f.forEach(function(r){if(!e.isValidLookup(o)){i=r;var s=u,a=[s];if(e.i18nFormat&&e.i18nFormat.addLookupKeys)e.i18nFormat.addLookupKeys(a,u,r,t,n);else{var l=void 0;p&&(l=e.pluralResolver.getSuffix(r,n.count)),p&&c&&a.push(s+l),c&&a.push(s+=""+e.options.contextSeparator+n.context),p&&a.push(s+=l)}for(var f=void 0;f=a.pop();)e.isValidLookup(o)||(o=e.getResource(r,t,f,n))}}))})}}),{res:o,usedKey:r,usedLng:i,usedNS:s}},n.prototype.isValidLookup=function(t){return!(void 0===t||!this.options.returnNull&&null===t||!this.options.returnEmptyString&&""===t)},n.prototype.getResource=function(t,e,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,e,n,o):this.resourceStore.getResource(t,e,n,o)},n}(R),E=function(){function t(e){y(this,t),this.options=e,this.whitelist=this.options.whitelist||!1,this.logger=O.create("languageUtils")}return t.prototype.getScriptPartFromCode=function(t){if(!t||t.indexOf("-")<0)return null;var e=t.split("-");return 2===e.length?null:(e.pop(),this.formatLanguageCode(e.join("-")))},t.prototype.getLanguagePartFromCode=function(t){if(!t||t.indexOf("-")<0)return t;var e=t.split("-");return this.formatLanguageCode(e[0])},t.prototype.formatLanguageCode=function(t){if("string"==typeof t&&t.indexOf("-")>-1){var e=["hans","hant","latn","cyrl","cans","mong","arab"],n=t.split("-");return this.options.lowerCaseLng?n=n.map(function(t){return t.toLowerCase()}):2===n.length?(n[0]=n[0].toLowerCase(),n[1]=n[1].toUpperCase(),e.indexOf(n[1].toLowerCase())>-1&&(n[1]=l(n[1].toLowerCase()))):3===n.length&&(n[0]=n[0].toLowerCase(),2===n[1].length&&(n[1]=n[1].toUpperCase()),"sgn"!==n[0]&&2===n[2].length&&(n[2]=n[2].toUpperCase()),e.indexOf(n[1].toLowerCase())>-1&&(n[1]=l(n[1].toLowerCase())),e.indexOf(n[2].toLowerCase())>-1&&(n[2]=l(n[2].toLowerCase()))),n.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t},t.prototype.isWhitelisted=function(t){return("languageOnly"===this.options.load||this.options.nonExplicitWhitelist)&&(t=this.getLanguagePartFromCode(t)),!this.whitelist||!this.whitelist.length||this.whitelist.indexOf(t)>-1},t.prototype.getFallbackCodes=function(t,e){if(!t)return[];if("string"==typeof t&&(t=[t]),"[object Array]"===Object.prototype.toString.apply(t))return t;if(!e)return t.default||[];var n=t[e];return n||(n=t[this.getScriptPartFromCode(e)]),n||(n=t[this.formatLanguageCode(e)]),n||(n=t.default),n||[]},t.prototype.toResolveHierarchy=function(t,e){var n=this,o=this.getFallbackCodes(e||this.options.fallbackLng||[],t),r=[],i=function(t){t&&(n.isWhitelisted(t)?r.push(t):n.logger.warn("rejecting non-whitelisted language code: "+t))};return"string"==typeof t&&t.indexOf("-")>-1?("languageOnly"!==this.options.load&&i(this.formatLanguageCode(t)),"languageOnly"!==this.options.load&&"currentOnly"!==this.options.load&&i(this.getScriptPartFromCode(t)),"currentOnly"!==this.options.load&&i(this.getLanguagePartFromCode(t))):"string"==typeof t&&i(this.formatLanguageCode(t)),o.forEach(function(t){r.indexOf(t)<0&&i(n.formatLanguageCode(t))}),r},t}(),P=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","he","hi","hu","hy","ia","it","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","id","ja","jbo","ka","kk","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21}],F={1:function(t){return Number(t>1)},2:function(t){return Number(1!=t)},3:function(t){return 0},4:function(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},5:function(t){return Number(0===t?0:1==t?1:2==t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5)},6:function(t){return Number(1==t?0:t>=2&&t<=4?1:2)},7:function(t){return Number(1==t?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},8:function(t){return Number(1==t?0:2==t?1:8!=t&&11!=t?2:3)},9:function(t){return Number(t>=2)},10:function(t){return Number(1==t?0:2==t?1:t<7?2:t<11?3:4)},11:function(t){return Number(1==t||11==t?0:2==t||12==t?1:t>2&&t<20?2:3)},12:function(t){return Number(t%10!=1||t%100==11)},13:function(t){return Number(0!==t)},14:function(t){return Number(1==t?0:2==t?1:3==t?2:3)},15:function(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2)},16:function(t){return Number(t%10==1&&t%100!=11?0:0!==t?1:2)},17:function(t){return Number(1==t||t%10==1?0:1)},18:function(t){return Number(0==t?0:1==t?1:2)},19:function(t){return Number(1==t?0:0===t||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3)},20:function(t){return Number(1==t?0:0===t||t%100>0&&t%100<20?1:2)},21:function(t){return Number(t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0)}},A=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};y(this,t),this.languageUtils=e,this.options=n,this.logger=O.create("pluralResolver"),this.rules=p()}return t.prototype.addRule=function(t,e){this.rules[t]=e},t.prototype.getRule=function(t){return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]},t.prototype.needsPlural=function(t){var e=this.getRule(t);return e&&e.numbers.length>1},t.prototype.getPluralFormsOfKey=function(t,e){var n=this,o=[],r=this.getRule(t);return r?(r.numbers.forEach(function(r){var i=n.getSuffix(t,r);o.push(""+e+i)}),o):o},t.prototype.getSuffix=function(t,e){var n=this,o=this.getRule(t);if(o){var r=o.noAbs?o.plurals(e):o.plurals(Math.abs(e)),i=o.numbers[r];this.options.simplifyPluralSuffix&&2===o.numbers.length&&1===o.numbers[0]&&(2===i?i="plural":1===i&&(i=""));var s=function(){return n.options.prepend&&i.toString()?n.options.prepend+i.toString():i.toString()};return"v1"===this.options.compatibilityJSON?1===i?"":"number"==typeof i?"_plural_"+i.toString():s():"v2"===this.options.compatibilityJSON&&2===o.numbers.length&&1===o.numbers[0]?s():this.options.simplifyPluralSuffix&&2===o.numbers.length&&1===o.numbers[0]?s():this.options.prepend&&r.toString()?this.options.prepend+r.toString():r.toString()}return this.logger.warn("no plural rule found for: "+t),""},t}(),T=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};y(this,e),this.logger=O.create("interpolator"),this.init(t,!0)}return e.prototype.init=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};arguments[1]&&(this.options=t,this.format=t.interpolation&&t.interpolation.format||function(t){return t}),t.interpolation||(t.interpolation={escapeValue:!0});var e=t.interpolation;this.escape=void 0!==e.escape?e.escape:u,this.escapeValue=void 0===e.escapeValue||e.escapeValue,this.useRawValueToEscape=void 0!==e.useRawValueToEscape&&e.useRawValueToEscape,this.prefix=e.prefix?a(e.prefix):e.prefixEscaped||"{{",this.suffix=e.suffix?a(e.suffix):e.suffixEscaped||"}}",this.formatSeparator=e.formatSeparator?e.formatSeparator:e.formatSeparator||",",this.unescapePrefix=e.unescapeSuffix?"":e.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":e.unescapeSuffix||"",this.nestingPrefix=e.nestingPrefix?a(e.nestingPrefix):e.nestingPrefixEscaped||a("$t("),this.nestingSuffix=e.nestingSuffix?a(e.nestingSuffix):e.nestingSuffixEscaped||a(")"),this.maxReplaces=e.maxReplaces?e.maxReplaces:1e3,this.resetRegExp()},e.prototype.reset=function(){this.options&&this.init(this.options)},e.prototype.resetRegExp=function(){var t=this.prefix+"(.+?)"+this.suffix;this.regexp=new RegExp(t,"g");var e=""+this.prefix+this.unescapePrefix+"(.+?)"+this.unescapeSuffix+this.suffix;this.regexpUnescape=new RegExp(e,"g");var n=this.nestingPrefix+"(.+?)"+this.nestingSuffix;this.nestingRegexp=new RegExp(n,"g")},e.prototype.interpolate=function(e,n,o){function r(t){return t.replace(/\$/g,"$$$$")}var s=this,a=void 0,u=void 0,l=void 0,p=function(t){if(t.indexOf(s.formatSeparator)<0)return i(n,t);var e=t.split(s.formatSeparator),r=e.shift().trim(),a=e.join(s.formatSeparator).trim();return s.format(i(n,r),a,o)};for(this.resetRegExp(),l=0;(a=this.regexpUnescape.exec(e))&&(u=p(a[1].trim()),e=e.replace(a[0],u),this.regexpUnescape.lastIndex=0,!(++l>=this.maxReplaces)););for(l=0;a=this.regexp.exec(e);){if(void 0===(u=p(a[1].trim())))if("function"==typeof this.options.missingInterpolationHandler){var c=this.options.missingInterpolationHandler(e,a);u="string"==typeof c?c:""}else this.logger.warn("missed to pass in variable "+a[1]+" for interpolating "+e),u="";else"string"==typeof u||this.useRawValueToEscape||(u=t(u));if(u=r(this.escapeValue?this.escape(u):u),e=e.replace(a[0],u),this.regexp.lastIndex=0,++l>=this.maxReplaces)break}return e},e.prototype.nest=function(e,n){function o(t,e){if(t.indexOf(",")<0)return t;var n=t.split(",");t=n.shift();var o=n.join(",");o=this.interpolate(o,a),o=o.replace(/'/g,'"');try{a=JSON.parse(o),e&&(a=v({},e,a))}catch(e){this.logger.error("failed parsing options string in nesting for key "+t,e)}return t}var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=void 0,s=void 0,a=v({},r);for(a.applyPostProcessor=!1;i=this.nestingRegexp.exec(e);){if((s=n(o.call(this,i[1].trim(),a),a))&&i[0]===e&&"string"!=typeof s)return s;"string"!=typeof s&&(s=t(s)),s||(this.logger.warn("missed to resolve "+i[1]+" for nesting "+e),s=""),e=e.replace(i[0],s),this.regexp.lastIndex=0}return e},e}(),V=function(t){function e(n,o,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};y(this,e);var s=b(this,t.call(this));return s.backend=n,s.store=o,s.languageUtils=r.languageUtils,s.options=i,s.logger=O.create("backendConnector"),s.state={},s.queue=[],s.backend&&s.backend.init&&s.backend.init(r,i.backend,i),s}return m(e,t),e.prototype.queueLoad=function(t,e,n,o){var r=this,i=[],s=[],a=[],u=[];return t.forEach(function(t){var o=!0;e.forEach(function(e){var a=t+"|"+e;!n.reload&&r.store.hasResourceBundle(t,e)?r.state[a]=2:r.state[a]<0||(1===r.state[a]?s.indexOf(a)<0&&s.push(a):(r.state[a]=1,o=!1,s.indexOf(a)<0&&s.push(a),i.indexOf(a)<0&&i.push(a),u.indexOf(e)<0&&u.push(e)))}),o||a.push(t)}),(i.length||s.length)&&this.queue.push({pending:s,loaded:{},errors:[],callback:o}),{toLoad:i,pending:s,toLoadLanguages:a,toLoadNamespaces:u}},e.prototype.loaded=function(t,e,n){var o=t.split("|"),i=x(o,2),s=i[0],a=i[1];e&&this.emit("failedLoading",s,a,e),n&&this.store.addResourceBundle(s,a,n),this.state[t]=e?-1:2;var u={};this.queue.forEach(function(n){r(n.loaded,[s],a),c(n.pending,t),e&&n.errors.push(e),0!==n.pending.length||n.done||(Object.keys(n.loaded).forEach(function(t){u[t]||(u[t]=[]),n.loaded[t].length&&n.loaded[t].forEach(function(e){u[t].indexOf(e)<0&&u[t].push(e)})}),n.done=!0,n.errors.length?n.callback(n.errors):n.callback())}),this.emit("loaded",u),this.queue=this.queue.filter(function(t){return!t.done})},e.prototype.read=function(t,e,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,r=this,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:250,s=arguments[5];return t.length?this.backend[n](t,e,function(a,u){if(a&&u&&o<5)return void setTimeout(function(){r.read.call(r,t,e,n,o+1,2*i,s)},i);s(a,u)}):s(null,{})},e.prototype.prepareLoading=function(t,e){var n=this,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments[3];if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),r&&r();"string"==typeof t&&(t=this.languageUtils.toResolveHierarchy(t)),"string"==typeof e&&(e=[e]);var i=this.queueLoad(t,e,o,r);if(!i.toLoad.length)return i.pending.length||r(),null;i.toLoad.forEach(function(t){n.loadOne(t)})},e.prototype.load=function(t,e,n){this.prepareLoading(t,e,{},n)},e.prototype.reload=function(t,e,n){this.prepareLoading(t,e,{reload:!0},n)},e.prototype.loadOne=function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",o=t.split("|"),r=x(o,2),i=r[0],s=r[1];this.read(i,s,"read",null,null,function(o,r){o&&e.logger.warn(n+"loading namespace "+s+" for language "+i+" failed",o),!o&&r&&e.logger.log(n+"loaded namespace "+s+" for language "+i,r),e.loaded(t,o,r)})},e.prototype.saveMissing=function(t,e,n,o,r){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};this.backend&&this.backend.create&&this.backend.create(t,e,n,o,null,v({},i,{isUpdate:r})),t&&t[0]&&this.store.addResource(t[0],e,n,o)},e}(R);return new(function(t){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments[1];y(this,e);var r=b(this,t.call(this));if(r.options=h(n),r.services={},r.logger=O,r.modules={external:[]},o&&!r.isInitialized&&!n.isClone){var i;if(!r.options.initImmediate)return i=r.init(n,o),b(r,i);setTimeout(function(){r.init(n,o)},0)}return r}return m(e,t),e.prototype.init=function(){function t(t){return t?"function"==typeof t?new t:t:null}var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments[1];if("function"==typeof n&&(o=n,n={}),this.options=v({},f(),this.options,h(n)),this.format=this.options.interpolation.format,o||(o=g),!this.options.isClone){this.modules.logger?O.init(t(this.modules.logger),this.options):O.init(null,this.options);var r=new E(this.options);this.store=new N(this.options.resources,this.options);var i=this.services;i.logger=O,i.resourceStore=this.store,i.languageUtils=r,i.pluralResolver=new A(r,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),i.interpolator=new T(this.options),i.backendConnector=new V(t(this.modules.backend),i.resourceStore,i,this.options),i.backendConnector.on("*",function(t){for(var n=arguments.length,o=Array(n>1?n-1:0),r=1;r1?n-1:0),r=1;r0&&void 0!==arguments[0]?arguments[0]:g;if(this.options.resources)e(null);else{if(this.language&&"cimode"===this.language.toLowerCase())return e();var n=[],o=function(e){if(e){t.services.languageUtils.toResolveHierarchy(e).forEach(function(t){n.indexOf(t)<0&&n.push(t)})}};if(this.language)o(this.language);else{this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(function(t){return o(t)})}this.options.preload&&this.options.preload.forEach(function(t){return o(t)}),this.services.backendConnector.load(n,this.options.ns,e)}},e.prototype.reloadResources=function(t,e,n){t||(t=this.languages),e||(e=this.options.ns),n||(n=function(){}),this.services.backendConnector.reload(t,e,n)},e.prototype.use=function(t){return"backend"===t.type&&(this.modules.backend=t),("logger"===t.type||t.log&&t.warn&&t.error)&&(this.modules.logger=t),"languageDetector"===t.type&&(this.modules.languageDetector=t),"i18nFormat"===t.type&&(this.modules.i18nFormat=t),"postProcessor"===t.type&&C.addPostProcessor(t),"3rdParty"===t.type&&this.modules.external.push(t),this},e.prototype.changeLanguage=function(t,e){var n=this,o=function(t,o){n.translator.changeLanguage(o),o&&(n.emit("languageChanged",o),n.logger.log("languageChanged",o)),e&&e(t,function(){return n.t.apply(n,arguments)})},r=function(t){t&&(n.language=t,n.languages=n.services.languageUtils.toResolveHierarchy(t),n.translator.language||n.translator.changeLanguage(t),n.services.languageDetector&&n.services.languageDetector.cacheUserLanguage(t)),n.loadResources(function(e){o(e,t)})};t||!this.services.languageDetector||this.services.languageDetector.async?!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(r):r(t):r(this.services.languageDetector.detect())},e.prototype.getFixedT=function(t,e){var n=this,o=function t(e,o){for(var r=arguments.length,i=Array(r>2?r-2:0),s=2;s0?this.languages[0]:this.language),t?["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam"].indexOf(this.services.languageUtils.getLanguagePartFromCode(t))>=0?"rtl":"ltr":"rtl"},e.prototype.createInstance=function(){return new e(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},arguments[1])},e.prototype.cloneInstance=function(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g,r=v({},this.options,n,{isClone:!0}),i=new e(r);return["store","services","language"].forEach(function(e){i[e]=t[e]}),i.translator=new j(i.services,i.options),i.translator.on("*",function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),o=1;o. - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., - * Coral Gables, FL, 33134, USA, or email info@colosa.com. - * - */ - /** * i18n_PO - * This class build biggers PO files without size limit and this not use much memory that the allowed - * - * @package gulliver.system - * @author Erik Amaru Ortiz - * date Aug 31th, 2010 - * @copyright (C) 2002 by Colosa Development Team. + * This class build biggers PO files without size limit and this not use much + * memory that the allowed. */ class i18n_PO { - private $_file = null; private $_string = ''; private $_meta; @@ -55,11 +24,22 @@ class i18n_PO public $flags; public $previousUntranslatedStrings; + /** + * Constructor. + * + * @param string $file + */ public function __construct($file) { $this->file = $file; } + /** + * Prepares the construction of the .po file. + * + * @return boolean|undefined + * @throws Exception + */ public function buildInit() { $this->_fp = fopen($this->file, 'w'); @@ -82,6 +62,11 @@ class i18n_PO $this->_editingHeader = true; } + /** + * Start reading the .po file. + * + * @throws Exception + */ public function readInit() { $this->_fp = fopen($this->file, 'r'); @@ -90,17 +75,23 @@ class i18n_PO throw new Exception('Could\'t open ' . $this->file . ' file'); } //skipping comments - $this->skipCommets(); + $this->skipComments(); //deaing headers $this->readHeaders(); - $this->translatorComments = Array(); - $this->extractedComments = Array(); - $this->references = Array(); - $this->flags = Array(); - $this->previousUntranslatedStrings = Array(); + $this->translatorComments = []; + $this->extractedComments = []; + $this->references = []; + $this->flags = []; + $this->previousUntranslatedStrings = []; } + /** + * Add header information. + * + * @param string $id + * @param string $value + */ public function addHeader($id, $value) { if ($this->_editingHeader) { @@ -109,6 +100,11 @@ class i18n_PO } } + /** + * Add a translator comment. + * + * @param string $str + */ public function addTranslatorComment($str) { $this->headerStroke(); @@ -116,6 +112,11 @@ class i18n_PO $this->_writeLine($comment); } + /** + * Add a extracted comment. + * + * @param string $str + */ public function addExtractedComment($str) { $this->headerStroke(); @@ -123,6 +124,11 @@ class i18n_PO $this->_writeLine($comment); } + /** + * Add a reference comment. + * + * @param string $str + */ public function addReference($str) { $this->headerStroke(); @@ -130,6 +136,11 @@ class i18n_PO $this->_writeLine($reference); } + /** + * Add a flag comment. + * + * @param string $str + */ public function addFlag($str) { $this->headerStroke(); @@ -137,6 +148,11 @@ class i18n_PO $this->_writeLine($flag); } + /** + * Add previous untranslated string. + * + * @param string $str + */ public function addPreviousUntranslatedString($str) { $this->headerStroke(); @@ -144,6 +160,12 @@ class i18n_PO $this->_writeLine($str); } + /** + * Add a translation. + * + * @param string $msgid + * @param string $msgstr + */ public function addTranslation($msgid, $msgstr) { $this->headerStroke(); @@ -152,22 +174,35 @@ class i18n_PO $this->_writeLine(''); } + /** + * Write line into file. + * + * @param string $str + */ public function _writeLine($str) { $this->_write($str . "\n"); } + /** + * Write into file. + * + * @param string $str + */ public function _write($str) { fwrite($this->_fp, $str); } + /** + * Prepare string for add to file. + * + * @param string $string + * @param boolean $reverse + * @return string + */ public function prepare($string, $reverse = false) { - //$string = str_replace('\"', '"', $string); - //$string = stripslashes($string); - - if ($reverse) { $smap = array('"', "\n", "\t", "\r"); $rmap = array('\"', '\\n"' . "\n" . '"', '\\t', '\\r'); @@ -180,19 +215,24 @@ class i18n_PO } } + /** + * Add a header stroke. + */ public function headerStroke() { if ($this->_editingHeader) { $this->_editingHeader = false; $this->_writeLine(''); - } } - /** * read funtions * */ - private function skipCommets() + + /** + * Skip comments + */ + private function skipComments() { $this->_fileComments = ''; do { @@ -200,10 +240,14 @@ class i18n_PO $line = fgets($this->_fp); $this->_fileComments .= $line; } while ((substr($line, 0, 1) == '#' || trim($line) == '') && !feof($this->_fp)); - fseek($this->_fp, $lastPos); } + /** + * Read headers information from .po file. + * + * @throws Exception + */ private function readHeaders() { $this->flagEndHeaders = false; @@ -283,19 +327,30 @@ class i18n_PO } } + /** + * Get headers information. + * + * @return array + */ public function getHeaders() { return $this->_meta; } + /** + * Get translations. + * + * @return array|boolean + * @throws Exception + */ public function getTranslation() { $flagReadingComments = true; - $this->translatorComments = Array(); - $this->extractedComments = Array(); - $this->references = Array(); - $this->flags = Array(); + $this->translatorComments = []; + $this->extractedComments = []; + $this->references = []; + $this->flags = []; //getting the new line while ($flagReadingComments && !$this->flagError) { @@ -388,15 +443,15 @@ class i18n_PO preg_match('/^"(.*)"\s*/s', $this->_fileLine, $match); } while (sizeof($match) == 2); - /* g::pr($this->translatorComments); - g::pr($this->references); - g::pr($match); - die; */ - - return Array('msgid' => trim($msgid), 'msgstr' => trim($msgstr)); + return [ + 'msgid' => trim($msgid), + 'msgstr' => trim($msgstr) + ]; } - //garbage + /** + * Destructor. + */ public function __destruct() { if ($this->_fp) { @@ -404,4 +459,3 @@ class i18n_PO } } } - diff --git a/workflow/engine/src/ProcessMaker/Application.php b/workflow/engine/src/ProcessMaker/Application.php new file mode 100644 index 000000000..de4c47e3d --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Application.php @@ -0,0 +1,18 @@ +basePath . DIRECTORY_SEPARATOR . 'workflow' . DIRECTORY_SEPARATOR . + 'engine' . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'ProcessMaker'; + } +} diff --git a/workflow/engine/src/ProcessMaker/Util/Translation/I18Next.php b/workflow/engine/src/ProcessMaker/Util/Translation/I18Next.php new file mode 100644 index 000000000..bf13d60f6 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Util/Translation/I18Next.php @@ -0,0 +1,123 @@ +languages = new stdClass(); + } + + /** + * Add translate globals. + * + * @param string $lan + * @param array $translation + */ + public function setTranslation($lan, array $translation) + { + foreach ($translation as $index => $item) { + $this->languages->{$lan}->translation->{$index} = $item; + } + } + + /** + * Get a language. + * + * @param string $lan + * @return stdClass|null + */ + public function getLanguage($lan) + { + if (property_exists($this->languages, $lan)) { + return $this->languages->{$lan}; + } + return null; + } + + /** + * Add language in object. + * + * @param string $lan + */ + public function setLanguage($lan) + { + if (!property_exists($this->languages, $lan)) { + $this->languages->{$lan} = new stdClass(); + $this->languages->{$lan}->translation = new stdClass(); + } + } + + /** + * Get plugin. + * + * @param string $lan + * @param string $pluginName + * @return stdClass + */ + public function getPlugin($lan, $pluginName) + { + return $this->languages->{$lan}->translation->{$pluginName}; + } + + /** + * Set plugin. + * + * @param string $lan + * @param string $pluginName + * @param object $plugin + */ + public function setPlugin($lan, $pluginName, $plugin) + { + if (!property_exists($this->languages->{$lan}->translation, $pluginName)) { + $this->languages->{$lan}->translation->{$pluginName} = new stdClass(); + } + $objMerged = (object) array_merge( + (array) $this->languages->{$lan}->translation->{$pluginName}, (array) $plugin + ); + $this->languages->{$lan}->translation->{$pluginName} = $objMerged; + } + + /** + * Generate file i18n in json. + * + * @param string $filename + * @return bool + */ + public function saveJson($filename) + { + if ($filename) { + return file_put_contents($filename, json_encode($this->languages)) !== false; + } + return false; + } + + /** + * Generate file i18n in js. + * + * @param string $pluginName + * @param string $filename + * @return bool + */ + public function saveJs($pluginName, $filename) + { + if ($filename) { + $fileContent = "$pluginName = {};"; + $fileContent .= "$pluginName.i18n = function() { return " . json_encode($this->languages) . "; }"; + return file_put_contents($filename . ".js", $fileContent) !== false; + } + return false; + } +}