Revert "Upgraded gettext/gettext (+ JS-Translator)"

This reverts commit 9abb92763d2122ce6cc00c2f0531f0969a3cccd4.
This commit is contained in:
Bernd Bestel 2021-07-04 21:47:55 +02:00
parent 9abb92763d
commit cb24a7149f
No known key found for this signature in database
GPG Key ID: 71BD34C0D4891300
7 changed files with 81 additions and 179 deletions

View File

@ -7,16 +7,14 @@
"php-di/php-di": "^6.0", "php-di/php-di": "^6.0",
"rubellum/slim-blade-view": "^0.1.1", "rubellum/slim-blade-view": "^0.1.1",
"morris/lessql": "^1.0", "morris/lessql": "^1.0",
"gettext/gettext": "^5.5.4", "gettext/gettext": "^4.8",
"eluceo/ical": "^2.2.0", "eluceo/ical": "^2.2.0",
"erusev/parsedown": "^1.7", "erusev/parsedown": "^1.7",
"gumlet/php-image-resize": "^2.0", "gumlet/php-image-resize": "^2.0",
"ezyang/htmlpurifier": "^4.13", "ezyang/htmlpurifier": "^4.13",
"jucksearm/php-barcode": "^1.0", "jucksearm/php-barcode": "^1.0",
"guzzlehttp/guzzle": "^7.0", "guzzlehttp/guzzle": "^7.0",
"mike42/escpos-php": "^3.0", "mike42/escpos-php": "^3.0"
"gettext/translator": "^1.0",
"gettext/json": "^1.0"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

163
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "d057a6ab1ad847ba7cb44de95f05a97f", "content-hash": "35840e48e78e30b63f589addfdb50f92",
"packages": [ "packages": [
{ {
"name": "doctrine/inflector", "name": "doctrine/inflector",
@ -328,28 +328,35 @@
}, },
{ {
"name": "gettext/gettext", "name": "gettext/gettext",
"version": "v5.5.4", "version": "v4.8.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-gettext/Gettext.git", "url": "https://github.com/php-gettext/Gettext.git",
"reference": "77baf40326b4eac0230cd11ee75680969dcbe72a" "reference": "58bc0f7f37e78efb0f9758f93d4a0f669f0f84a1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-gettext/Gettext/zipball/77baf40326b4eac0230cd11ee75680969dcbe72a", "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/58bc0f7f37e78efb0f9758f93d4a0f669f0f84a1",
"reference": "77baf40326b4eac0230cd11ee75680969dcbe72a", "reference": "58bc0f7f37e78efb0f9758f93d4a0f669f0f84a1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"gettext/languages": "^2.3", "gettext/languages": "^2.3",
"php": "^7.2|^8.0" "php": ">=5.4.0"
}, },
"require-dev": { "require-dev": {
"brick/varexporter": "^0.2.1", "illuminate/view": "*",
"friendsofphp/php-cs-fixer": "^2.15", "phpunit/phpunit": "^4.8|^5.7|^6.5",
"oscarotero/php-cs-fixer-config": "^1.0", "squizlabs/php_codesniffer": "^3.0",
"phpunit/phpunit": "^8.0", "symfony/yaml": "~2",
"squizlabs/php_codesniffer": "^3.0" "twig/extensions": "*",
"twig/twig": "^1.31|^2.0"
},
"suggest": {
"illuminate/view": "Is necessary if you want to use the Blade extractor",
"symfony/yaml": "Is necessary if you want to use the Yaml extractor/generator",
"twig/extensions": "Is necessary if you want to use the Twig extractor",
"twig/twig": "Is necessary if you want to use the Twig extractor"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -370,7 +377,7 @@
} }
], ],
"description": "PHP gettext manager", "description": "PHP gettext manager",
"homepage": "https://github.com/php-gettext/Gettext", "homepage": "https://github.com/oscarotero/Gettext",
"keywords": [ "keywords": [
"JS", "JS",
"gettext", "gettext",
@ -381,68 +388,24 @@
], ],
"support": { "support": {
"email": "oom@oscarotero.com", "email": "oom@oscarotero.com",
"issues": "https://github.com/php-gettext/Gettext/issues", "issues": "https://github.com/oscarotero/Gettext/issues",
"source": "https://github.com/php-gettext/Gettext/tree/v5.5.4" "source": "https://github.com/php-gettext/Gettext/tree/v4.8.4"
}, },
"time": "2020-12-20T13:37:30+00:00" "funding": [
},
{
"name": "gettext/json",
"version": "v1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-gettext/Json.git",
"reference": "13f0d7c8cdd1fe80515d5c40722e18f568225891"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-gettext/Json/zipball/13f0d7c8cdd1fe80515d5c40722e18f568225891",
"reference": "13f0d7c8cdd1fe80515d5c40722e18f568225891",
"shasum": ""
},
"require": {
"gettext/gettext": "^5.0.0",
"php": "^7.2|^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.15",
"oscarotero/php-cs-fixer-config": "^1.0",
"phpunit/phpunit": "^8.0",
"squizlabs/php_codesniffer": "^3.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Gettext\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{ {
"name": "Oscar Otero", "url": "https://paypal.me/oscarotero",
"email": "oom@oscarotero.com", "type": "custom"
"homepage": "http://oscarotero.com", },
"role": "Developer" {
"url": "https://github.com/oscarotero",
"type": "github"
},
{
"url": "https://www.patreon.com/misteroom",
"type": "patreon"
} }
], ],
"description": "Json format for gettext", "time": "2021-03-10T19:35:49+00:00"
"homepage": "https://github.com/php-gettext/Json",
"keywords": [
"gettext",
"i18n",
"json",
"loader",
"translation"
],
"support": {
"email": "oom@oscarotero.com",
"issues": "https://github.com/php-gettext/Json/issues",
"source": "https://github.com/php-gettext/Json/tree/v1.0.1"
},
"time": "2021-01-22T17:59:51+00:00"
}, },
{ {
"name": "gettext/languages", "name": "gettext/languages",
@ -509,66 +472,6 @@
}, },
"time": "2019-11-13T10:30:21+00:00" "time": "2019-11-13T10:30:21+00:00"
}, },
{
"name": "gettext/translator",
"version": "v1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-gettext/Translator.git",
"reference": "0a80844789e6a4ffad417d2053bbb56c83b02803"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-gettext/Translator/zipball/0a80844789e6a4ffad417d2053bbb56c83b02803",
"reference": "0a80844789e6a4ffad417d2053bbb56c83b02803",
"shasum": ""
},
"require": {
"php": "^7.2|^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.15",
"gettext/gettext": "^5.0.0",
"oscarotero/php-cs-fixer-config": "^1.0",
"phpunit/phpunit": "^8.0",
"squizlabs/php_codesniffer": "^3.0"
},
"suggest": {
"gettext/gettext": "Is necessary to load and generate array files used by the translator"
},
"type": "library",
"autoload": {
"psr-4": {
"Gettext\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Oscar Otero",
"email": "oom@oscarotero.com",
"homepage": "http://oscarotero.com",
"role": "Developer"
}
],
"description": "Gettext translator functions",
"homepage": "https://github.com/php-gettext/Translator",
"keywords": [
"gettext",
"i18n",
"php",
"translator"
],
"support": {
"email": "oom@oscarotero.com",
"issues": "https://github.com/php-gettext/Translator/issues",
"source": "https://github.com/php-gettext/Translator/tree/v1.0.1"
},
"time": "2020-12-01T18:51:46+00:00"
},
{ {
"name": "gumlet/php-image-resize", "name": "gumlet/php-image-resize",
"version": "2.0.0", "version": "2.0.0",

View File

@ -22,7 +22,7 @@
"datatables.net-select": "^1.3.1", "datatables.net-select": "^1.3.1",
"datatables.net-select-bs4": "^1.3.1", "datatables.net-select-bs4": "^1.3.1",
"fullcalendar": "^3.10.1", "fullcalendar": "^3.10.1",
"gettext-translator": "^3.0.1", "gettext-translator": "2.1.0",
"jquery": "3.5.1", "jquery": "3.5.1",
"jquery-lazy": "^1.7.11", "jquery-lazy": "^1.7.11",
"jquery-serializejson": "^2.9.0", "jquery-serializejson": "^2.9.0",

View File

@ -231,11 +231,11 @@ U = function(relativePath)
return Grocy.BaseUrl.replace(/\/$/, '') + relativePath; return Grocy.BaseUrl.replace(/\/$/, '') + relativePath;
} }
Grocy.Translator = new window.translator.default(); // Dummy, real instance is loaded async below Grocy.Translator = new Translator(); // Dummy, real instance is loaded async below
Grocy.Api.Get("system/localization-strings?v=" + Grocy.Version, Grocy.Api.Get("system/localization-strings?v=" + Grocy.Version,
function(response) function(response)
{ {
Grocy.Translator = new window.translator.default(response); Grocy.Translator = new Translator(response);
}, },
function(xhr) function(xhr)
{ {
@ -250,7 +250,7 @@ __t = function(text, ...placeholderValues)
Grocy.Api.Post('system/log-missing-localization', { "text": text2 }); Grocy.Api.Post('system/log-missing-localization', { "text": text2 });
} }
return Grocy.Translator.gettext(text, ...placeholderValues); return Grocy.Translator.__(text, ...placeholderValues)
} }
__n = function(number, singularForm, pluralForm) __n = function(number, singularForm, pluralForm)
{ {
@ -260,7 +260,7 @@ __n = function(number, singularForm, pluralForm)
Grocy.Api.Post('system/log-missing-localization', { "text": singularForm2 }); Grocy.Api.Post('system/log-missing-localization', { "text": singularForm2 });
} }
return Grocy.Translator.ngettext(singularForm, pluralForm, number, number); return Grocy.Translator.n__(singularForm, pluralForm, number, number)
} }
if (!Grocy.ActiveNav.isEmpty()) if (!Grocy.ActiveNav.isEmpty())

View File

@ -2,12 +2,9 @@
namespace Grocy\Services; namespace Grocy\Services;
use Gettext\Headers;
use Gettext\Translation; use Gettext\Translation;
use Gettext\Translations; use Gettext\Translations;
use Gettext\Translator; use Gettext\Translator;
use Gettext\Loader\PoLoader;
use Gettext\Generator\JsonGenerator;
class LocalizationService class LocalizationService
{ {
@ -38,9 +35,9 @@ class LocalizationService
public function GetPluralCount() public function GetPluralCount()
{ {
if ($this->Po->getHeaders()->getPluralForm() !== null) if ($this->Po->getHeader(Translations::HEADER_PLURAL) !== null)
{ {
return $this->Po->getHeaders()->getPluralForm()[0]; return $this->Po->getPluralForms()[0];
} }
else else
{ {
@ -50,9 +47,9 @@ class LocalizationService
public function GetPluralDefinition() public function GetPluralDefinition()
{ {
if ($this->Po->getHeaders()->getPluralForm() !== null) if ($this->Po->getHeader(Translations::HEADER_PLURAL) !== null)
{ {
return $this->Po->getHeaders()->getPluralForm()[1]; return $this->Po->getPluralForms()[1];
} }
else else
{ {
@ -62,7 +59,7 @@ class LocalizationService
public function GetPoAsJsonString() public function GetPoAsJsonString()
{ {
return (new JsonGenerator())->generateString($this->Po); return $this->Po->toJsonString();
} }
public function __construct(string $culture) public function __construct(string $culture)
@ -116,69 +113,69 @@ class LocalizationService
private function LoadLocalizations() private function LoadLocalizations()
{ {
$culture = $this->Culture; $culture = $this->Culture;
$loader = new PoLoader();
if (GROCY_MODE === 'dev') if (GROCY_MODE === 'dev')
{ {
$this->PotMain = $loader->loadFile(__DIR__ . '/../localization/strings.pot'); $this->PotMain = Translations::fromPoFile(__DIR__ . '/../localization/strings.pot');
$this->Pot = $loader->loadFile(__DIR__ . '/../localization/chore_period_types.pot'); $this->Pot = Translations::fromPoFile(__DIR__ . '/../localization/chore_period_types.pot');
$this->Pot = $this->Pot->mergeWith($loader->loadFile(__DIR__ . '/../localization/chore_assignment_types.pot')); $this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/chore_assignment_types.pot'));
$this->Pot = $this->Pot->mergeWith($loader->loadFile(__DIR__ . '/../localization/component_translations.pot')); $this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/component_translations.pot'));
$this->Pot = $this->Pot->mergeWith($loader->loadFile(__DIR__ . '/../localization/stock_transaction_types.pot')); $this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/stock_transaction_types.pot'));
$this->Pot = $this->Pot->mergeWith($loader->loadFile(__DIR__ . '/../localization/strings.pot')); $this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/strings.pot'));
$this->Pot = $this->Pot->mergeWith($loader->loadFile(__DIR__ . '/../localization/userfield_types.pot')); $this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/userfield_types.pot'));
$this->Pot = $this->Pot->mergeWith($loader->loadFile(__DIR__ . '/../localization/permissions.pot')); $this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/permissions.pot'));
$this->Pot = $this->Pot->mergeWith($loader->loadFile(__DIR__ . '/../localization/locales.pot')); $this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/locales.pot'));
if (GROCY_MODE !== 'production') if (GROCY_MODE !== 'production')
{ {
$this->Pot = $this->Pot->mergeWith($loader->loadFile(__DIR__ . '/../localization/demo_data.pot')); $this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/demo_data.pot'));
} }
} }
$this->PoUserStrings = Translations::create('grocy'); $this->PoUserStrings = new Translations();
$this->PoUserStrings->setDomain('grocy/userstrings');
$this->Po = $loader->loadFile(__DIR__ . "/../localization/$culture/strings.po"); $this->Po = Translations::fromPoFile(__DIR__ . "/../localization/$culture/strings.po");
if (file_exists(__DIR__ . "/../localization/$culture/chore_assignment_types.po")) if (file_exists(__DIR__ . "/../localization/$culture/chore_assignment_types.po"))
{ {
$this->Po = $this->Po->mergeWith($loader->loadFile(__DIR__ . "/../localization/$culture/chore_assignment_types.po")); $this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/chore_assignment_types.po"));
} }
if (file_exists(__DIR__ . "/../localization/$culture/component_translations.po")) if (file_exists(__DIR__ . "/../localization/$culture/component_translations.po"))
{ {
$this->Po = $this->Po->mergeWith($loader->loadFile(__DIR__ . "/../localization/$culture/component_translations.po")); $this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/component_translations.po"));
} }
if (file_exists(__DIR__ . "/../localization/$culture/stock_transaction_types.po")) if (file_exists(__DIR__ . "/../localization/$culture/stock_transaction_types.po"))
{ {
$this->Po = $this->Po->mergeWith($loader->loadFile(__DIR__ . "/../localization/$culture/stock_transaction_types.po")); $this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/stock_transaction_types.po"));
} }
if (file_exists(__DIR__ . "/../localization/$culture/chore_period_types.po")) if (file_exists(__DIR__ . "/../localization/$culture/chore_period_types.po"))
{ {
$this->Po = $this->Po->mergeWith($loader->loadFile(__DIR__ . "/../localization/$culture/chore_period_types.po")); $this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/chore_period_types.po"));
} }
if (file_exists(__DIR__ . "/../localization/$culture/userfield_types.po")) if (file_exists(__DIR__ . "/../localization/$culture/userfield_types.po"))
{ {
$this->Po = $this->Po->mergeWith($loader->loadFile(__DIR__ . "/../localization/$culture/userfield_types.po")); $this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/userfield_types.po"));
} }
if (file_exists(__DIR__ . "/../localization/$culture/permissions.po")) if (file_exists(__DIR__ . "/../localization/$culture/permissions.po"))
{ {
$this->Po = $this->Po->mergeWith($loader->loadFile(__DIR__ . "/../localization/$culture/permissions.po")); $this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/permissions.po"));
} }
if (file_exists(__DIR__ . "/../localization/$culture/locales.po")) if (file_exists(__DIR__ . "/../localization/$culture/locales.po"))
{ {
$this->Po = $this->Po->mergeWith($loader->loadFile(__DIR__ . "/../localization/$culture/locales.po")); $this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/locales.po"));
} }
if (GROCY_MODE !== 'production' && file_exists(__DIR__ . "/../localization/$culture/demo_data.po")) if (GROCY_MODE !== 'production' && file_exists(__DIR__ . "/../localization/$culture/demo_data.po"))
{ {
$this->Po = $this->Po->mergeWith($loader->loadFile(__DIR__ . "/../localization/$culture/demo_data.po")); $this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/demo_data.po"));
} }
$quantityUnits = null; $quantityUnits = null;
@ -195,16 +192,18 @@ class LocalizationService
{ {
foreach ($quantityUnits as $quantityUnit) foreach ($quantityUnits as $quantityUnit)
{ {
$translation = Translation::create($quantityUnit['name'], $quantityUnit['name'], $quantityUnit['name_plural']); $translation = new Translation('', $quantityUnit['name']);
$translation->translate($quantityUnit['name']); $translation->setTranslation($quantityUnit['name']);
$translation->translatePlural($quantityUnit['name_plural'], ...preg_split('/\r\n|\r|\n/', $quantityUnit['plural_forms'])); $translation->setPlural($quantityUnit['name_plural']);
$translation->setPluralTranslations(preg_split('/\r\n|\r|\n/', $quantityUnit['plural_forms']));
$this->PoUserStrings->add($translation); $this->PoUserStrings[] = $translation;
} }
$this->Po = $this->Po->mergeWith($this->PoUserStrings); $this->Po = $this->Po->mergeWith($this->PoUserStrings);
} }
$this->Translator = Translator::createFromTranslations($this->Po); $this->Translator = new Translator();
$this->Translator->loadTranslations($this->Po);
} }
} }

View File

@ -700,7 +700,7 @@
<script src="{{ $U('/node_modules/toastr/build/toastr.min.js?v=', true) }}{{ $version }}"></script> <script src="{{ $U('/node_modules/toastr/build/toastr.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.js?v=', true) }}{{ $version }}"></script> <script src="{{ $U('/node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/sprintf-js/dist/sprintf.min.js?v=', true) }}{{ $version }}"></script> <script src="{{ $U('/node_modules/sprintf-js/dist/sprintf.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/gettext-translator/dist/translator.js?v=', true) }}{{ $version }}"></script> <script src="{{ $U('/node_modules/gettext-translator/src/translator.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/summernote/dist/summernote-bs4.js?v=', true) }}{{ $version }}"></script> <script src="{{ $U('/node_modules/summernote/dist/summernote-bs4.js?v=', true) }}{{ $version }}"></script>
@if(!empty($__t('summernote_locale') && $__t('summernote_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/summernote/dist/lang/summernote-{{ $__t('summernote_locale') }}.js?v={{ $version }}"></script>@endif @if(!empty($__t('summernote_locale') && $__t('summernote_locale') != 'x'))<script src="{{ $U('/node_modules', true) }}/summernote/dist/lang/summernote-{{ $__t('summernote_locale') }}.js?v={{ $version }}"></script>@endif
<script src="{{ $U('/node_modules/bootstrap-select/dist/js/bootstrap-select.min.js?v=', true) }}{{ $version }}"></script> <script src="{{ $U('/node_modules/bootstrap-select/dist/js/bootstrap-select.min.js?v=', true) }}{{ $version }}"></script>

View File

@ -1716,10 +1716,12 @@ getpass@^0.1.1:
dependencies: dependencies:
assert-plus "^1.0.0" assert-plus "^1.0.0"
gettext-translator@^3.0.1: gettext-translator@2.1.0:
version "3.0.1" version "2.1.0"
resolved "https://registry.yarnpkg.com/gettext-translator/-/gettext-translator-3.0.1.tgz#6e315a24f2baea56f86a215abb5be0ff2e641baa" resolved "https://registry.yarnpkg.com/gettext-translator/-/gettext-translator-2.1.0.tgz#946047649b7df4ef00522787bb78792667e4de2f"
integrity sha512-rqCbHfglrIL/Siinsylwc2eAbgrSPvGL5Dofo3WPoCQkxljoafDzw0n91TuTGmaYPkrp8S1fIDxOmX5fkpsNeQ== integrity sha512-RD9HifZKtlRtFScA0VWESzLKQxxRmaRU0IFg6cFZgMP0MMgzfHpWO7MipUyRbMxDFm8adbQqCcFLBV47tjT6Ug==
dependencies:
sprintf-js "^1.0.3"
gl-mat2@^1.0.1: gl-mat2@^1.0.1:
version "1.0.1" version "1.0.1"
@ -3753,7 +3755,7 @@ split-ca@^1.0.1:
resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6"
integrity sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY= integrity sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY=
sprintf-js@^1.1.2: sprintf-js@^1.0.3, sprintf-js@^1.1.2:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==