Merge branch '3.0'

* 3.0: (28 commits)
  [Console] Fix an autocompletion question helper issue with non-sequentially indexed choices
  [Process] Fix pipes handling
  [Finder] Partially revert #17134 to fix a regression
  Mentioned the deprecation of deep parameters in UPGRADE files
  [HttpKernel] Fix mem usage when stripping the prod container
  [Filesystem] Fix false positive in ->remove()
  [Filesystem] Cleanup/sync with 2.3
  [Validator] Fix the locale validator so it treats a locale alias as a valid locale
  [HttpFoundation] Fix transient test
  [HttpFoundation] Add a dependency on the mbstring polyfill
  [2.7] update readme files for new components
  add readme files where missing
  [2.8] update readme files for new components
  fix lowest TwigBridge deps versions
  reference form type by name on Symfony 2.7
  [EventDispatcher] fix syntax error
  Don't use reflections when possible
  Don't use reflections when possible
  [Form] Update form tests after the ICU data update
  [Intl] Update tests and the number formatter to match behaviour of the intl extension
  ...

Conflicts:
	src/Symfony/Component/Ldap/README.md
	src/Symfony/Component/Security/Core/README.md
	src/Symfony/Component/Security/Csrf/README.md
	src/Symfony/Component/Security/Http/README.md
This commit is contained in:
Nicolas Grekas 2016-03-10 12:16:56 +01:00
commit fe012e8abb
689 changed files with 2457 additions and 4627 deletions

View File

@ -781,7 +781,7 @@ UPGRADE FROM 2.x to 3.0
The `security.csrf.token_manager` should be used instead.
* The `validator.mapping.cache.apc` service has been removed in favor of the `validator.mapping.cache.doctrine.apc` one.
* The ability to pass `apc` as the `framework.validation.cache` configuration key value has been removed.
Use `validator.mapping.cache.doctrine.apc` instead:
@ -1061,7 +1061,7 @@ UPGRADE FROM 2.x to 3.0
```php
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class MyVoter extends Voter
{
protected function supports($attribute, $object)
@ -1772,4 +1772,19 @@ UPGRADE FROM 2.x to 3.0
### HttpFoundation
* `Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface` no longer implements the `IteratorAggregate` interface. Use the `all()` method instead of iterating over the flash bag.
* `Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface` no longer implements the `IteratorAggregate` interface. Use the `all()` method instead of iterating over the flash bag.
* Removed the feature that allowed finding deep items in `ParameterBag::get()`.
This may affect you when getting parameters from the `Request` class:
Before:
```php
$request->query->get('foo[bar]', null, true);
```
After:
```php
$request->query->get('foo')[bar];
```

View File

@ -3,58 +3,11 @@ PHPUnit Bridge
Provides utilities for PHPUnit, especially user deprecation notices management.
It comes with the following features:
Resources
---------
* enforce a consistent `C` locale;
* auto-register `class_exists` to load Doctrine annotations;
* print a user deprecation notices summary at the end of the test suite;
* display the stack trace of a deprecation on-demand.
By default any non-legacy-tagged or any non-@-silenced deprecation notices will
make tests fail. This can be changed by setting the `SYMFONY_DEPRECATIONS_HELPER`
environment variable to the maximum number of deprecations that are allowed to be
triggered before making the test suite fail. Alternatively, setting it to `weak`
will make the bridge ignore any deprecation notices and is useful to projects
that must use deprecated interfaces for backward compatibility reasons.
A summary of deprecation notices is displayed at the end of the test suite:
* **Unsilenced** reports deprecation notices that were triggered without the
recommended @-silencing operator;
* **Legacy** deprecation notices denote tests that explicitly test some legacy
interfaces. There are four ways to mark a test as legacy:
- make its class start with the `Legacy` prefix;
- make its method start with `testLegacy`;
- make its data provider start with `provideLegacy` or `getLegacy`;
- add the `@group legacy` annotation to its class or method.
* **Remaining/Other** deprecation notices are all other (non-legacy)
notices, grouped by message, test class and method.
Usage
-----
Add this bridge to the `require-dev` section of your `composer.json` file
(not in `require`) with e.g. `composer require --dev "symfony/phpunit-bridge"`.
When running `phpunit`, you will see a summary of deprecation notices at the end
of the test suite.
Deprecation notices in the **Unsilenced** section should just be @-silenced:
`@trigger_error('...', E_USER_DEPRECATED);`. Without the @-silencing operator,
users would need to opt-out from deprecation notices. Silencing by default swaps
this behavior and allows users to opt-in when they are ready to cope with them
(by adding a custom error handler like the one provided by this bridge.)
Deprecation notices in the **Remaining/Other** section need some thought.
You have to decide either to:
* update your code to not use deprecated interfaces anymore, thus gaining better
forward compatibility;
* or move them to the **Legacy** section (by using one of the above way).
In case you need to inspect the stack trace of a particular deprecation triggered
by your unit tests, you can set the `SYMFONY_DEPRECATIONS_HELPER` env var to a
regular expression that matches this deprecation's message, encapsed between `/`.
For example, `SYMFONY_DEPRECATIONS_HELPER=/foobar/ phpunit` will stop your test
suite once a deprecation notice is triggered whose message contains the "foobar"
string.
* [Documentation](https://symfony.com/doc/current/components/phpunit_bridge.html)
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
* [Report issues](https://github.com/symfony/symfony/issues) and
[send Pull Requests](https://github.com/symfony/symfony/pulls)
in the [main Symfony repository](https://github.com/symfony/symfony)

View File

@ -0,0 +1,13 @@
Swiftmailer Bridge
==================
Provides integration for [Swiftmailer](http://swiftmailer.org/) into the
Symfony web development toolbar.
Resources
---------
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
* [Report issues](https://github.com/symfony/symfony/issues) and
[send Pull Requests](https://github.com/symfony/symfony/pulls)
in the [main Symfony repository](https://github.com/symfony/symfony)

View File

@ -22,7 +22,7 @@
"require-dev": {
"symfony/asset": "~2.8|~3.0",
"symfony/finder": "~2.8|~3.0",
"symfony/form": "~2.8.3|~3.0",
"symfony/form": "~2.8.4|~3.0.4",
"symfony/http-kernel": "~2.8|~3.0",
"symfony/polyfill-intl-icu": "~1.0",
"symfony/routing": "~2.8|~3.0",

View File

@ -36,8 +36,7 @@ class LoggingTranslatorPass implements CompilerPassInterface
$definition = $container->getDefinition((string) $translatorAlias);
$class = $container->getParameterBag()->resolveValue($definition->getClass());
$refClass = new \ReflectionClass($class);
if ($refClass->implementsInterface('Symfony\Component\Translation\TranslatorInterface') && $refClass->implementsInterface('Symfony\Component\Translation\TranslatorBagInterface')) {
if (is_subclass_of($class, 'Symfony\Component\Translation\TranslatorInterface') && is_subclass_of($class, 'Symfony\Component\Translation\TranslatorBagInterface')) {
$container->getDefinition('translator.logging')->setDecoratedService('translator');
$container->getDefinition('translation.warmer')->replaceArgument(0, new Reference('translator.logging.inner'));
}

View File

@ -0,0 +1,10 @@
FrameworkBundle
===============
Resources
---------
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
* [Report issues](https://github.com/symfony/symfony/issues) and
[send Pull Requests](https://github.com/symfony/symfony/pulls)
in the [main Symfony repository](https://github.com/symfony/symfony)

View File

@ -0,0 +1,10 @@
SecurityBundle
==============
Resources
---------
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
* [Report issues](https://github.com/symfony/symfony/issues) and
[send Pull Requests](https://github.com/symfony/symfony/pulls)
in the [main Symfony repository](https://github.com/symfony/symfony)

View File

@ -0,0 +1,10 @@
TwigBundle
==========
Resources
---------
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
* [Report issues](https://github.com/symfony/symfony/issues) and
[send Pull Requests](https://github.com/symfony/symfony/pulls)
in the [main Symfony repository](https://github.com/symfony/symfony)

View File

@ -0,0 +1,10 @@
WebProfilerBundle
=================
Resources
---------
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
* [Report issues](https://github.com/symfony/symfony/issues) and
[send Pull Requests](https://github.com/symfony/symfony/pulls)
in the [main Symfony repository](https://github.com/symfony/symfony)

View File

@ -1,166 +1,14 @@
Asset Component
===============
The Asset component manages asset URLs.
Versioned Asset URLs
--------------------
The basic `Package` adds a version to generated asset URLs:
```php
use Symfony\Component\Asset\Package;
use Symfony\Component\Asset\VersionStrategy\StaticVersionStrategy;
$package = new Package(new StaticVersionStrategy('v1'));
echo $package->getUrl('/me.png');
// /me.png?v1
```
The default format can be configured:
```php
$package = new Package(new StaticVersionStrategy('v1', '%s?version=%s'));
echo $package->getUrl('/me.png');
// /me.png?version=v1
// put the version before the path
$package = new Package(new StaticVersionStrategy('v1', 'version-%2$s/%1$s'));
echo $package->getUrl('/me.png');
// /version-v1/me.png
```
Asset URLs Base Path
--------------------
When all assets are stored in a common path, use the `PathPackage` to avoid
repeating yourself:
```php
use Symfony\Component\Asset\PathPackage;
$package = new PathPackage('/images', new StaticVersionStrategy('v1'));
echo $package->getUrl('/me.png');
// /images/me.png?v1
```
Asset URLs Base URLs
--------------------
If your assets are hosted on different domain name than the main website, use
the `UrlPackage` class:
```php
use Symfony\Component\Asset\UrlPackage;
$package = new UrlPackage('http://assets.example.com/images/', new StaticVersionStrategy('v1'));
echo $package->getUrl('/me.png');
// http://assets.example.com/images/me.png?v1
```
One technique used to speed up page rendering in browsers is to use several
domains for assets; this is possible by passing more than one base URLs:
```php
use Symfony\Component\Asset\UrlPackage;
$urls = array(
'http://a1.example.com/images/',
'http://a2.example.com/images/',
);
$package = new UrlPackage($urls, new StaticVersionStrategy('v1'));
echo $package->getUrl('/me.png');
// http://a1.example.com/images/me.png?v1
```
Note that it's also guaranteed that any given path will always use the same
base URL to be nice with HTTP caching mechanisms.
HttpFoundation Integration
--------------------------
If you are using HttpFoundation for your project, set the Context to get
additional features for free:
```php
use Symfony\Component\Asset\PathPackage;
use Symfony\Component\Asset\Context\RequestStackContext;
$package = new PathPackage('images', new StaticVersionStrategy('v1'));
$package->setContext(new RequestStackContext($requestStack));
echo $package->getUrl('/me.png');
// /somewhere/images/me.png?v1
```
In addition to the configured base path, `PathPackage` now also automatically
prepends the current request base URL to assets to allow your website to be
hosted anywhere under the web server root directory.
```php
use Symfony\Component\Asset\UrlPackage;
use Symfony\Component\Asset\Context\RequestStackContext;
$package = new UrlPackage(array('http://example.com/', 'https://example.com/'), new StaticVersionStrategy('v1'));
$package->setContext(new RequestStackContext($requestStack));
echo $package->getUrl('/me.png');
// https://example.com/images/me.png?v1
```
`UrlPackage` now uses the current request scheme (HTTP or HTTPs) to select an
appropriate base URL (HTTPs or protocol-relative URLs for HTTPs requests, any
base URL for HTTP requests).
Named Packages
--------------
The `Packages` class allows to easily manages several packages in a single
project by naming packages:
```php
use Symfony\Component\Asset\Package;
use Symfony\Component\Asset\PathPackage;
use Symfony\Component\Asset\UrlPackage;
use Symfony\Component\Asset\Packages;
// by default, just add a version to all assets
$versionStrategy = new StaticVersionStrategy('v1');
$defaultPackage = new Asset\Package($versionStrategy);
$namedPackages = array(
// images are hosted on another web server
'img' => new Asset\UrlPackage('http://img.example.com/', $versionStrategy),
// documents are stored deeply under the web root directory
// let's create a shortcut
'doc' => new Asset\PathPackage('/somewhere/deep/for/documents', $versionStrategy),
);
// bundle all packages to make it easy to use them
$packages = new Asset\Packages($defaultPackage, $namedPackages);
echo $packages->getUrl('/some.css');
// /some.css?v1
echo $packages->getUrl('/me.png', 'img');
// http://img.example.com/me.png?v1
echo $packages->getUrl('/me.pdf', 'doc');
// /somewhere/deep/for/documents/me.pdf?v1
```
The Asset component manages URL generation and versioning of web assets such as
CSS stylesheets, JavaScript files and image files.
Resources
---------
You can run the unit tests with the following command:
$ cd path/to/Symfony/Component/Asset/
$ composer update
$ phpunit
* [Documentation](https://symfony.com/doc/current/components/asset/introduction.html)
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
* [Report issues](https://github.com/symfony/symfony/issues) and
[send Pull Requests](https://github.com/symfony/symfony/pulls)
in the [main Symfony repository](https://github.com/symfony/symfony)

View File

@ -138,8 +138,8 @@ class Question
*/
public function setAutocompleterValues($values)
{
if (is_array($values) && $this->isAssoc($values)) {
$values = array_merge(array_keys($values), array_values($values));
if (is_array($values)) {
$values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values);
}
if (null !== $values && !is_array($values)) {

View File

@ -135,6 +135,26 @@ class QuestionHelperTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('FooBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
}
public function testAskWithAutocompleteWithNonSequentialKeys()
{
if (!$this->hasSttyAvailable()) {
$this->markTestSkipped('`stty` is required to test autocomplete functionality');
}
// <UP ARROW><UP ARROW><NEWLINE><DOWN ARROW><DOWN ARROW><NEWLINE>
$inputStream = $this->getInputStream("\033[A\033[A\n\033[B\033[B\n");
$dialog = new QuestionHelper();
$dialog->setInputStream($inputStream);
$dialog->setHelperSet(new HelperSet(array(new FormatterHelper())));
$question = new ChoiceQuestion('Please select a bundle', array(1 => 'AcmeDemoBundle', 4 => 'AsseticBundle'));
$question->setMaxAttempts(1);
$this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
$this->assertEquals('AsseticBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
}
public function testAskHiddenResponse()
{
if ('\\' === DIRECTORY_SEPARATOR) {

View File

@ -45,7 +45,7 @@ class Debug
error_reporting(E_ALL);
}
if ('cli' !== php_sapi_name()) {
if ('cli' !== PHP_SAPI) {
ini_set('display_errors', 0);
ExceptionHandler::register();
} elseif ($displayErrors && (!ini_get('log_errors') || ini_get('error_log'))) {

View File

@ -162,17 +162,17 @@ class DebugClassLoader
break;
}
}
$parent = $refl->getParentClass();
$parent = get_parent_class($class);
if (!$parent || strncmp($ns, $parent->name, $len)) {
if ($parent && isset(self::$deprecated[$parent->name]) && strncmp($ns, $parent->name, $len)) {
@trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED);
if (!$parent || strncmp($ns, $parent, $len)) {
if ($parent && isset(self::$deprecated[$parent]) && strncmp($ns, $parent, $len)) {
@trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent, self::$deprecated[$parent]), E_USER_DEPRECATED);
}
$parentInterfaces = array();
$deprecatedInterfaces = array();
if ($parent) {
foreach ($parent->getInterfaceNames() as $interface) {
foreach (class_implements($parent) as $interface) {
$parentInterfaces[$interface] = 1;
}
}

View File

@ -325,9 +325,8 @@ class Container implements ResettableContainerInterface
public function getServiceIds()
{
$ids = array();
$r = new \ReflectionClass($this);
foreach ($r->getMethods() as $method) {
if (preg_match('/^get(.+)Service$/', $method->name, $match)) {
foreach (get_class_methods($this) as $method) {
if (preg_match('/^get(.+)Service$/', $method, $match)) {
$ids[] = self::underscore($match[1]);
}
}

View File

@ -25,6 +25,7 @@ use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface as
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\NullDumper;
use Symfony\Component\DependencyInjection\ExpressionLanguage;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\HttpKernel\Kernel;
/**
* PhpDumper dumps a service container as a PHP class.
@ -56,6 +57,7 @@ class PhpDumper extends Dumper
private $expressionLanguage;
private $targetDirRegex;
private $targetDirMaxMatches;
private $docStar;
/**
* @var \Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface
@ -102,7 +104,9 @@ class PhpDumper extends Dumper
'class' => 'ProjectServiceContainer',
'base_class' => 'Container',
'namespace' => '',
'debug' => true,
), $options);
$this->docStar = $options['debug'] ? '*' : '';
if (!empty($options['file']) && is_dir($dir = dirname($options['file']))) {
// Build a regexp where the first root dirs are mandatory,
@ -227,9 +231,15 @@ class PhpDumper extends Dumper
array($this->getProxyDumper(), 'isProxyCandidate')
);
$code = '';
$strip = '' === $this->docStar && method_exists('Symfony\Component\HttpKernel\Kernel', 'stripComments');
foreach ($definitions as $definition) {
$code .= "\n".$this->getProxyDumper()->getProxyCode($definition);
$proxyCode = "\n".$this->getProxyDumper()->getProxyCode($definition);
if ($strip) {
$proxyCode = "<?php\n".$proxyCode;
$proxyCode = substr(Kernel::stripComments($proxyCode), 5);
}
$code .= $proxyCode;
}
return $code;
@ -617,7 +627,7 @@ EOF;
$visibility = $isProxyCandidate ? 'public' : 'protected';
$code = <<<EOF
/**
/*{$this->docStar}
* Gets the '$id' service.$doc
*$lazyInitializationDoc
* $return
@ -740,7 +750,7 @@ use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
$bagClass
/**
/*{$this->docStar}
* $class.
*
* This class has been auto-generated
@ -766,7 +776,7 @@ EOF;
$code = <<<EOF
/**
/*{$this->docStar}
* Constructor.
*/
public function __construct()
@ -797,7 +807,7 @@ EOF;
$code = <<<EOF
/**
/*{$this->docStar}
* Constructor.
*/
public function __construct()
@ -829,7 +839,7 @@ EOF;
{
return <<<EOF
/**
/*{$this->docStar}
* {@inheritdoc}
*/
public function compile()
@ -950,11 +960,14 @@ EOF;
}
EOF;
if ('' === $this->docStar) {
$code = str_replace('/**', '/*', $code);
}
}
$code .= <<<EOF
/**
/*{$this->docStar}
* Gets the default parameters.
*
* @return array An array of the default parameters

View File

@ -98,9 +98,8 @@ class RegisterListenersPass implements CompilerPassInterface
// We must assume that the class value has been correctly filled, even if the service is created by a factory
$class = $container->getParameterBag()->resolveValue($def->getClass());
$refClass = new \ReflectionClass($class);
$interface = 'Symfony\Component\EventDispatcher\EventSubscriberInterface';
if (!$refClass->implementsInterface($interface)) {
if (!is_subclass_of($class, $interface)) {
throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface));
}

View File

@ -2,42 +2,14 @@ ExpressionLanguage Component
============================
The ExpressionLanguage component provides an engine that can compile and
evaluate expressions:
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
$language = new ExpressionLanguage();
echo $language->evaluate('1 + foo', array('foo' => 2));
// would output 3
echo $language->compile('1 + foo', array('foo'));
// would output (1 + $foo)
By default, the engine implements simple math and logic functions, method
calls, property accesses, and array accesses.
You can extend your DSL with functions:
$compiler = function ($arg) {
return sprintf('strtoupper(%s)', $arg);
};
$evaluator = function (array $variables, $value) {
return strtoupper($value);
};
$language->register('upper', $compiler, $evaluator);
echo $language->evaluate('"foo" ~ upper(foo)', array('foo' => 'bar'));
// would output fooBAR
echo $language->compile('"foo" ~ upper(foo)');
// would output ("foo" . strtoupper($foo))
evaluate expressions. An expression is a one-liner that returns a value
(mostly, but not limited to, Booleans).
Resources
---------
You can run the unit tests with the following command:
$ cd path/to/Symfony/Component/ExpressionLanguage/
$ composer.phar install --dev
$ phpunit
* [Documentation](https://symfony.com/doc/current/components/expression_language/introduction.html)
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
* [Report issues](https://github.com/symfony/symfony/issues) and
[send Pull Requests](https://github.com/symfony/symfony/pulls)
in the [main Symfony repository](https://github.com/symfony/symfony)

View File

@ -158,12 +158,13 @@ class Filesystem
$files = iterator_to_array($this->toIterator($files));
$files = array_reverse($files);
foreach ($files as $file) {
if (@(unlink($file) || rmdir($file))) {
continue;
}
if (is_link($file)) {
// Workaround https://bugs.php.net/52176
if (!@unlink($file) && !@rmdir($file)) {
$error = error_get_last();
throw new IOException(sprintf('Failed to remove symlink "%s": %s.', $file, $error['message']));
}
// See https://bugs.php.net/52176
$error = error_get_last();
throw new IOException(sprintf('Failed to remove symlink "%s": %s.', $file, $error['message']));
} elseif (is_dir($file)) {
$this->remove(new \FilesystemIterator($file));
@ -171,11 +172,9 @@ class Filesystem
$error = error_get_last();
throw new IOException(sprintf('Failed to remove directory "%s": %s.', $file, $error['message']));
}
} elseif ($this->exists($file)) {
if (!@unlink($file)) {
$error = error_get_last();
throw new IOException(sprintf('Failed to remove file "%s": %s.', $file, $error['message']));
}
} elseif (file_exists($file)) {
$error = error_get_last();
throw new IOException(sprintf('Failed to remove file "%s": %s.', $file, $error['message']));
}
}
}
@ -435,7 +434,7 @@ class Filesystem
$target = str_replace($originDir, $targetDir, $file->getPathname());
if ($copyOnWindows) {
if (is_link($file) || is_file($file)) {
if (is_file($file)) {
$this->copy($file, $target, isset($options['override']) ? $options['override'] : false);
} elseif (is_dir($file)) {
$this->mkdir($target);

View File

@ -156,7 +156,7 @@ class FilesystemTest extends FilesystemTestCase
$this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath));
}
public function testCopyForOriginUrlsAndExistingLocalFileDefaultsToNotCopy()
public function testCopyForOriginUrlsAndExistingLocalFileDefaultsToCopy()
{
$sourceFilePath = 'http://symfony.com/images/common/logo/logo_symfony_header.png';
$targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file';
@ -347,7 +347,7 @@ class FilesystemTest extends FilesystemTestCase
// create symlink to nonexistent dir
rmdir($basePath.'dir');
$this->assertFalse(is_dir($basePath.'dir-link'));
$this->assertFalse('\\' === DIRECTORY_SEPARATOR ? @readlink($basePath.'dir-link') : is_dir($basePath.'dir-link'));
$this->filesystem->remove($basePath);
@ -383,7 +383,7 @@ class FilesystemTest extends FilesystemTestCase
$file = str_repeat('T', 259 - strlen($basePath));
$path = $basePath.$file;
exec('TYPE NUL >>'.$file); // equivalent of touch, we can not use the php touch() here because it suffers from the same limitation
self::$longPathNamesWindows[] = $path; // save this so we can clean up later
$this->longPathNamesWindows[] = $path; // save this so we can clean up later
chdir($oldPath);
$this->filesystem->exists($path);
}
@ -744,6 +744,8 @@ class FilesystemTest extends FilesystemTestCase
$this->filesystem->remove($link);
$this->assertTrue(!is_link($link));
$this->assertTrue(!is_file($link));
$this->assertTrue(!is_dir($link));
}
public function testSymlinkIsOverwrittenIfPointsToDifferentTarget()
@ -917,7 +919,7 @@ class FilesystemTest extends FilesystemTestCase
$this->filesystem->mirror($sourcePath, $targetPath);
$this->assertTrue(is_dir($targetPath));
$this->assertFileEquals($sourcePath.'file1', $targetPath.DIRECTORY_SEPARATOR.'link1');
$this->assertFileEquals($sourcePath.'file1', $targetPath.'link1');
$this->assertTrue(is_link($targetPath.DIRECTORY_SEPARATOR.'link1'));
}
@ -937,7 +939,7 @@ class FilesystemTest extends FilesystemTestCase
$this->filesystem->mirror($sourcePath, $targetPath);
$this->assertTrue(is_dir($targetPath));
$this->assertFileEquals($sourcePath.'/nested/file1.txt', $targetPath.DIRECTORY_SEPARATOR.'link1/file1.txt');
$this->assertFileEquals($sourcePath.'/nested/file1.txt', $targetPath.'link1/file1.txt');
$this->assertTrue(is_link($targetPath.DIRECTORY_SEPARATOR.'link1'));
}
@ -961,7 +963,7 @@ class FilesystemTest extends FilesystemTestCase
$this->filesystem->mirror($sourcePath, $targetPath);
$this->assertTrue(is_dir($targetPath));
$this->assertFileEquals($sourcePath.'/nested/file1.txt', $targetPath.DIRECTORY_SEPARATOR.'link1/file1.txt');
$this->assertFileEquals($sourcePath.'/nested/file1.txt', $targetPath.'link1/file1.txt');
$this->assertTrue(is_link($targetPath.DIRECTORY_SEPARATOR.'link1'));
$this->assertEquals('\\' === DIRECTORY_SEPARATOR ? realpath($sourcePath.'\nested') : 'nested', readlink($targetPath.DIRECTORY_SEPARATOR.'link1'));
}

View File

@ -17,7 +17,7 @@ class FilesystemTestCase extends \PHPUnit_Framework_TestCase
{
private $umask;
static protected $longPathNamesWindows = array();
protected $longPathNamesWindows = array();
/**
* @var \Symfony\Component\Filesystem\Filesystem
@ -33,18 +33,11 @@ class FilesystemTestCase extends \PHPUnit_Framework_TestCase
public static function setUpBeforeClass()
{
if (!empty(self::$longPathNamesWindows)) {
foreach (self::$longPathNamesWindows as $path) {
exec('DEL '.$path);
}
}
if ('\\' === DIRECTORY_SEPARATOR && null === self::$symlinkOnWindows) {
$target = tempnam(sys_get_temp_dir(), 'sl');
$link = sys_get_temp_dir().'/sl'.microtime(true).mt_rand();
if (self::$symlinkOnWindows = @symlink($target, $link)) {
unlink($link);
}
self::$symlinkOnWindows = @symlink($target, $link) && is_link($link);
@unlink($link);
unlink($target);
}
}
@ -52,14 +45,21 @@ class FilesystemTestCase extends \PHPUnit_Framework_TestCase
protected function setUp()
{
$this->umask = umask(0);
$this->filesystem = new Filesystem();
$this->workspace = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.time().mt_rand(0, 1000);
mkdir($this->workspace, 0777, true);
$this->workspace = realpath($this->workspace);
$this->filesystem = new Filesystem();
}
protected function tearDown()
{
if (!empty($this->longPathNamesWindows)) {
foreach ($this->longPathNamesWindows as $path) {
exec('DEL '.$path);
}
$this->longPathNamesWindows = array();
}
$this->filesystem->remove($this->workspace);
umask($this->umask);
}
@ -102,10 +102,6 @@ class FilesystemTestCase extends \PHPUnit_Framework_TestCase
protected function markAsSkippedIfSymlinkIsMissing($relative = false)
{
if (!function_exists('symlink')) {
$this->markTestSkipped('Function symlink is required.');
}
if ('\\' === DIRECTORY_SEPARATOR && false === self::$symlinkOnWindows) {
$this->markTestSkipped('symlink requires "Create symbolic links" privilege on Windows');
}

View File

@ -39,11 +39,18 @@ abstract class FilterIterator extends \FilterIterator
while ($iterator instanceof \OuterIterator) {
$innerIterator = $iterator->getInnerIterator();
if ($innerIterator instanceof \FilesystemIterator) {
if ($innerIterator instanceof RecursiveDirectoryIterator) {
// this condition is necessary for iterators to work properly with non-local filesystems like ftp
if ($innerIterator->isRewindable()) {
$innerIterator->next();
$innerIterator->rewind();
}
} elseif ($innerIterator instanceof \FilesystemIterator) {
$innerIterator->next();
$innerIterator->rewind();
}
$iterator = $iterator->getInnerIterator();
$iterator = $innerIterator;
}
parent::rewind();

View File

@ -51,17 +51,17 @@ class DateTimeToLocalizedStringTransformerTest extends DateTimeTestCase
public function dataProvider()
{
return array(
array(\IntlDateFormatter::SHORT, null, null, '03.02.10 04:05', '2010-02-03 04:05:00 UTC'),
array(\IntlDateFormatter::MEDIUM, null, null, '03.02.2010 04:05', '2010-02-03 04:05:00 UTC'),
array(\IntlDateFormatter::LONG, null, null, '03. Februar 2010 04:05', '2010-02-03 04:05:00 UTC'),
array(\IntlDateFormatter::FULL, null, null, 'Mittwoch, 03. Februar 2010 04:05', '2010-02-03 04:05:00 UTC'),
array(\IntlDateFormatter::SHORT, null, null, '03.02.10, 04:05', '2010-02-03 04:05:00 UTC'),
array(\IntlDateFormatter::MEDIUM, null, null, '03.02.2010, 04:05', '2010-02-03 04:05:00 UTC'),
array(\IntlDateFormatter::LONG, null, null, '3. Februar 2010 um 04:05', '2010-02-03 04:05:00 UTC'),
array(\IntlDateFormatter::FULL, null, null, 'Mittwoch, 3. Februar 2010 um 04:05', '2010-02-03 04:05:00 UTC'),
array(\IntlDateFormatter::SHORT, \IntlDateFormatter::NONE, null, '03.02.10', '2010-02-03 00:00:00 UTC'),
array(\IntlDateFormatter::MEDIUM, \IntlDateFormatter::NONE, null, '03.02.2010', '2010-02-03 00:00:00 UTC'),
array(\IntlDateFormatter::LONG, \IntlDateFormatter::NONE, null, '03. Februar 2010', '2010-02-03 00:00:00 UTC'),
array(\IntlDateFormatter::FULL, \IntlDateFormatter::NONE, null, 'Mittwoch, 03. Februar 2010', '2010-02-03 00:00:00 UTC'),
array(null, \IntlDateFormatter::SHORT, null, '03.02.2010 04:05', '2010-02-03 04:05:00 UTC'),
array(null, \IntlDateFormatter::MEDIUM, null, '03.02.2010 04:05:06', '2010-02-03 04:05:06 UTC'),
array(null, \IntlDateFormatter::LONG, null, '03.02.2010 04:05:06 GMT', '2010-02-03 04:05:06 UTC'),
array(\IntlDateFormatter::LONG, \IntlDateFormatter::NONE, null, '3. Februar 2010', '2010-02-03 00:00:00 UTC'),
array(\IntlDateFormatter::FULL, \IntlDateFormatter::NONE, null, 'Mittwoch, 3. Februar 2010', '2010-02-03 00:00:00 UTC'),
array(null, \IntlDateFormatter::SHORT, null, '03.02.2010, 04:05', '2010-02-03 04:05:00 UTC'),
array(null, \IntlDateFormatter::MEDIUM, null, '03.02.2010, 04:05:06', '2010-02-03 04:05:06 UTC'),
array(null, \IntlDateFormatter::LONG, null, '03.02.2010, 04:05:06 GMT', '2010-02-03 04:05:06 UTC'),
// see below for extra test case for time format FULL
array(\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT, null, '04:05', '1970-01-01 04:05:00 UTC'),
array(\IntlDateFormatter::NONE, \IntlDateFormatter::MEDIUM, null, '04:05:06', '1970-01-01 04:05:06 UTC'),
@ -103,7 +103,7 @@ class DateTimeToLocalizedStringTransformerTest extends DateTimeTestCase
{
$transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::FULL);
$this->assertEquals('03.02.2010 04:05:06 GMT', $transformer->transform($this->dateTime));
$this->assertEquals('03.02.2010, 04:05:06 GMT', $transformer->transform($this->dateTime));
}
public function testTransformToDifferentLocale()
@ -131,7 +131,7 @@ class DateTimeToLocalizedStringTransformerTest extends DateTimeTestCase
$dateTime = clone $input;
$dateTime->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));
$this->assertEquals($dateTime->format('d.m.Y H:i'), $transformer->transform($input));
$this->assertEquals($dateTime->format('d.m.Y, H:i'), $transformer->transform($input));
}
public function testTransformWithDifferentPatterns()
@ -150,7 +150,7 @@ class DateTimeToLocalizedStringTransformerTest extends DateTimeTestCase
$dateTime = clone $input;
$dateTime = $dateTime->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));
$this->assertEquals($dateTime->format('d.m.Y H:i'), $transformer->transform($input));
$this->assertEquals($dateTime->format('d.m.Y, H:i'), $transformer->transform($input));
}
/**
@ -198,7 +198,7 @@ class DateTimeToLocalizedStringTransformerTest extends DateTimeTestCase
{
$transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::FULL);
$this->assertDateTimeEquals($this->dateTime, $transformer->reverseTransform('03.02.2010 04:05:06 GMT+00:00'));
$this->assertDateTimeEquals($this->dateTime, $transformer->reverseTransform('03.02.2010, 04:05:06 GMT+00:00'));
}
public function testReverseTransformFromDifferentLocale()
@ -217,7 +217,7 @@ class DateTimeToLocalizedStringTransformerTest extends DateTimeTestCase
$dateTime = new \DateTime('2010-02-03 04:05:00 Asia/Hong_Kong');
$dateTime->setTimezone(new \DateTimeZone('America/New_York'));
$this->assertDateTimeEquals($dateTime, $transformer->reverseTransform('03.02.2010 04:05'));
$this->assertDateTimeEquals($dateTime, $transformer->reverseTransform('03.02.2010, 04:05'));
}
public function testReverseTransformWithDifferentPatterns()

View File

@ -487,7 +487,7 @@ class DateTypeTest extends TestCase
$view = $form->createView();
$this->assertEquals(array(
new ChoiceView(1, '1', 'Jän'),
new ChoiceView(1, '1', 'Jän.'),
new ChoiceView(4, '4', 'Apr.'),
), $view['month']->vars['choices']);
}

View File

@ -161,6 +161,20 @@ class BinaryFileResponse extends Response
$filename = $this->file->getFilename();
}
if ('' === $filenameFallback && (!preg_match('/^[\x20-\x7e]*$/', $filename) || false !== strpos($filename, '%'))) {
$encoding = mb_detect_encoding($filename, null, true);
for ($i = 0; $i < mb_strlen($filename, $encoding); ++$i) {
$char = mb_substr($filename, $i, 1, $encoding);
if ('%' === $char || ord($char) < 32 || ord($char) > 126) {
$filenameFallback .= '_';
} else {
$filenameFallback .= $char;
}
}
}
$dispositionHeader = $this->headers->makeDisposition($disposition, $filename, $filenameFallback);
$this->headers->set('Content-Disposition', $dispositionHeader);

View File

@ -268,7 +268,7 @@ class Request
// stores the Content-Type and Content-Length header values in
// HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH fields.
$server = $_SERVER;
if ('cli-server' === php_sapi_name()) {
if ('cli-server' === PHP_SAPI) {
if (array_key_exists('HTTP_CONTENT_LENGTH', $_SERVER)) {
$server['CONTENT_LENGTH'] = $_SERVER['HTTP_CONTENT_LENGTH'];
}

View File

@ -236,6 +236,10 @@ class NativeSessionStorage implements SessionStorageInterface
*/
public function registerBag(SessionBagInterface $bag)
{
if ($this->started) {
throw new \LogicException('Cannot register a bag when the session is already started.');
}
$this->bags[$bag->getName()] = $bag;
}

View File

@ -34,6 +34,17 @@ class BinaryFileResponseTest extends ResponseTestCase
$this->assertEquals('inline; filename="README.md"', $response->headers->get('Content-Disposition'));
}
public function testConstructWithNonAsciiFilename()
{
touch(sys_get_temp_dir().'/fööö.html');
$response = new BinaryFileResponse(sys_get_temp_dir().'/fööö.html', 200, array(), true, 'attachment');
@unlink(sys_get_temp_dir().'/fööö.html');
$this->assertSame('fööö.html', $response->getFile()->getFilename());
}
/**
* @expectedException \LogicException
*/
@ -49,6 +60,14 @@ class BinaryFileResponseTest extends ResponseTestCase
$this->assertFalse($response->getContent());
}
public function testSetContentDispositionGeneratesSafeFallbackFilename()
{
$response = new BinaryFileResponse(__FILE__);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'föö.html');
$this->assertSame('attachment; filename="f__.html"; filename*=utf-8\'\'f%C3%B6%C3%B6.html', $response->headers->get('Content-Disposition'));
}
/**
* @dataProvider provideRanges
*/

View File

@ -1833,7 +1833,7 @@ class RequestTest extends \PHPUnit_Framework_TestCase
$request = Request::create('/');
$request->headers->set('host', $host);
$this->assertEquals($host, $request->getHost());
$this->assertLessThan(3, microtime(true) - $start);
$this->assertLessThan(5, microtime(true) - $start);
}
/**

View File

@ -82,6 +82,16 @@ class NativeSessionStorageTest extends \PHPUnit_Framework_TestCase
$storage->getBag('non_existing');
}
/**
* @expectedException \LogicException
*/
public function testRegisterBagForAStartedSessionThrowsException()
{
$storage = $this->getStorage();
$storage->start();
$storage->registerBag(new AttributeBag());
}
public function testGetId()
{
$storage = $this->getStorage();

View File

@ -16,7 +16,8 @@
}
],
"require": {
"php": ">=5.5.9"
"php": ">=5.5.9",
"symfony/polyfill-mbstring": "~1.1"
},
"require-dev": {
"symfony/expression-language": "~2.8|~3.0"

View File

@ -75,7 +75,7 @@ class ConfigDataCollector extends DataCollector
'wincache_enabled' => extension_loaded('wincache') && ini_get('wincache.ocenabled'),
'zend_opcache_enabled' => extension_loaded('Zend OPcache') && ini_get('opcache.enable'),
'bundles' => array(),
'sapi_name' => php_sapi_name(),
'sapi_name' => PHP_SAPI,
);
if (isset($this->kernel)) {

View File

@ -51,9 +51,9 @@ class FragmentRendererPass implements CompilerPassInterface
throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as fragment renderer are lazy-loaded.', $id));
}
$refClass = new \ReflectionClass($container->getParameterBag()->resolveValue($def->getClass()));
$class = $container->getParameterBag()->resolveValue($def->getClass());
$interface = 'Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface';
if (!$refClass->implementsInterface($interface)) {
if (!is_subclass_of($class, $interface)) {
throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface));
}

View File

@ -629,10 +629,7 @@ abstract class Kernel implements KernelInterface, TerminableInterface
$dumper->setProxyDumper(new ProxyDumper(md5($cache->getPath())));
}
$content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass, 'file' => $cache->getPath()));
if (!$this->debug) {
$content = static::stripComments($content);
}
$content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass, 'file' => $cache->getPath(), 'debug' => $this->debug));
$cache->write($content, $container->getResources());
}

View File

@ -49,6 +49,7 @@ class LanguageDataGenerator extends AbstractDataGenerator
'fr' => 'fra',
'gn' => 'grn',
'hy' => 'hye',
'hr' => 'hrv',
'ik' => 'ipk',
'is' => 'isl',
'iu' => 'iku',
@ -76,6 +77,7 @@ class LanguageDataGenerator extends AbstractDataGenerator
'sc' => 'srd',
'sk' => 'slk',
'sq' => 'sqi',
'sr' => 'srp',
'sw' => 'swa',
'uz' => 'uzb',
'yi' => 'yid',
@ -164,10 +166,13 @@ class LanguageDataGenerator extends AbstractDataGenerator
private function generateAlpha2ToAlpha3Mapping(ArrayAccessibleResourceBundle $metadataBundle)
{
$aliases = $metadataBundle['languageAlias'];
// Data structure has changed in ICU 5.5 from "languageAlias" to "alias->language"
$aliases = $metadataBundle['languageAlias'] ?: $metadataBundle['alias']['language'];
$alpha2ToAlpha3 = array();
foreach ($aliases as $alias => $language) {
// $language is a string before ICU 5.5
$language = is_string($language) ? $language : $language['replacement'];
if (2 === strlen($language) && 3 === strlen($alias)) {
if (isset(self::$preferredAlpha2ToAlpha3Mapping[$language])) {
// Validate to prevent typos
@ -181,12 +186,13 @@ class LanguageDataGenerator extends AbstractDataGenerator
}
$alpha3 = self::$preferredAlpha2ToAlpha3Mapping[$language];
$alpha2 = is_string($aliases[$alpha3]) ? $aliases[$alpha3] : $aliases[$alpha3]['replacement'];
if ($language !== $aliases[$alpha3]) {
if ($language !== $alpha2) {
throw new RuntimeException(
'The statically set three-letter mapping '.$alpha3.' '.
'for the language code '.$language.' seems to be '.
'an alias for '.$aliases[$alpha3].'. Wrong mapping?'
'an alias for '.$alpha2.'. Wrong mapping?'
);
}

View File

@ -234,7 +234,7 @@ final class Intl
*/
public static function getIcuStubVersion()
{
return '51.2';
return '55.1';
}
/**

View File

@ -259,7 +259,7 @@ class NumberFormatter
private static $enTextAttributes = array(
self::DECIMAL => array('', '', '-', '', '*', '', ''),
self::CURRENCY => array('¤', '', '(¤', ')', '*', ''),
self::CURRENCY => array('¤', '', '-¤', '', '*', ''),
);
/**
@ -357,7 +357,7 @@ class NumberFormatter
$ret = $symbol.$value;
return $negative ? '('.$ret.')' : $ret;
return $negative ? '-'.$ret : $ret;
}
/**

View File

@ -10,4 +10,5 @@
51 = http://source.icu-project.org/repos/icu/icu/tags/release-51-2/source
52 = http://source.icu-project.org/repos/icu/icu/tags/release-52-1/source
53 = http://source.icu-project.org/repos/icu/icu/tags/release-53-1/source
54 = http://source.icu-project.org/repos/icu/icu/tags/release-54-rc/source
54 = http://source.icu-project.org/repos/icu/icu/tags/release-54-1/source
55 = http://source.icu-project.org/repos/icu/icu/tags/release-55-1/source

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"AED": [
"AED",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.11.68",
"Names": {
"NAD": [
"$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"AED": [
"AED",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.12.18",
"Names": {
"SDG": [
"SDG",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",
@ -339,7 +339,7 @@
],
"GBP": [
"£",
"Britaniya Funt Sterlinqi"
"Britaniya Funt"
],
"GEK": [
"GEK",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.10.34",
"Names": {
"AZN": [
"ман.",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.7.39",
"Version": "2.1.10.93",
"Names": {
"AUD": [
"A$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.10.42",
"Names": {
"AED": [
"AED",
@ -71,7 +71,7 @@
],
"GBP": [
"£",
"angilɛ Livri Siterlingi"
"angilɛ Livri"
],
"GHC": [
"GHC",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.7.39",
"Version": "2.1.10.93",
"Names": {
"ADP": [
"ADP",
@ -315,7 +315,7 @@
],
"GBP": [
"£ RU",
"lur sterling Breizh-Veur"
"lur Breizh-Veur"
],
"GEL": [
"GEL",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.13.46",
"Names": {
"ADP": [
"ADP",
@ -359,7 +359,7 @@
],
"GBP": [
"GBP",
"Britanska funta sterlinga"
"Britanska funta"
],
"GEK": [
"GEK",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",
@ -347,7 +347,7 @@
],
"GBP": [
"£",
"Британска фунта стерлинга"
"Британска фунта"
],
"GEK": [
"GEK",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",
@ -384,7 +384,7 @@
],
"GBP": [
"£",
"lliura esterlina britànica"
"lliura britànica"
],
"GEK": [
"GEK",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.7.80",
"Version": "2.1.10.93",
"Names": {
"AED": [
"AED",
@ -187,7 +187,7 @@
],
"GBP": [
"£",
"Punt Sterling Prydain"
"Punt Prydain"
],
"GEL": [
"GEL",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.9.62",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.13.4",
"Names": {
"ADP": [
"ADP",
@ -387,7 +387,7 @@
],
"GBP": [
"£",
"Britisches Pfund Sterling"
"Britisches Pfund"
],
"GEK": [
"GEK",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.21",
"Version": "2.1.11.70",
"Names": {
"BYR": [
"BYR",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",
@ -387,7 +387,7 @@
],
"GBP": [
"£",
"britainga pound sterling"
"britainga pound"
],
"GEK": [
"GEK",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",
@ -335,7 +335,7 @@
],
"GBP": [
"£",
"Λίρα Στερλίνα Βρετανίας"
"Λίρα Βρετανίας"
],
"GEK": [
"GEK",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.87",
"Version": "2.1.13.48",
"Names": {
"ADP": [
"ADP",
@ -387,7 +387,7 @@
],
"GBP": [
"£",
"British Pound Sterling"
"British Pound"
],
"GEK": [
"GEK",
@ -1019,7 +1019,7 @@
],
"UZS": [
"UZS",
"Uzbekistan Som"
"Uzbekistani Som"
],
"VEB": [
"VEB",
@ -1047,7 +1047,7 @@
],
"XAF": [
"FCFA",
"CFA Franc BEAC"
"Central African CFA Franc"
],
"XCD": [
"EC$",
@ -1067,7 +1067,7 @@
],
"XOF": [
"CFA",
"CFA Franc BCEAO"
"West African CFA Franc"
],
"XPF": [
"CFPF",

View File

@ -1,6 +1,34 @@
{
"Version": "2.1.6.69",
"Version": "2.1.12.90",
"Names": {
"BYB": [
"BYB",
"Belarusian New Rouble (19941999)"
],
"BYR": [
"BYR",
"Belarusian Rouble"
],
"JPY": [
"JP¥",
"Japanese Yen"
],
"LVR": [
"LVR",
"Latvian Rouble"
],
"RUB": [
"RUB",
"Russian Rouble"
],
"RUR": [
"RUR",
"Russian Rouble (19911998)"
],
"TJR": [
"TJR",
"Tajikistani Rouble"
],
"USD": [
"US$",
"US Dollar"

View File

@ -1,33 +1,13 @@
{
"Version": "2.1.8.19",
"Version": "2.1.11.59",
"Names": {
"BYR": [
"BYR",
"Belarusian Rouble"
],
"GBP": [
"£",
"British Pound"
],
"RUB": [
"RUB",
"Russian Rouble"
"AUD": [
"$",
"Australian Dollar"
],
"SCR": [
"SCR",
"Seychelles Rupee"
],
"UZS": [
"UZS",
"Uzbekistani Som"
],
"XAF": [
"FCFA",
"Central African CFA Franc"
],
"XOF": [
"CFA",
"West African CFA Franc"
]
}
}

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.11.50",
"Names": {
"BWP": [
"P",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.11.50",
"Names": {
"BZD": [
"$",

View File

@ -1,13 +1,9 @@
{
"Version": "2.1.8.19",
"Version": "2.1.14.16",
"Names": {
"CAD": [
"$",
"Canadian Dollar"
],
"USD": [
"US$",
"US Dollar"
]
}
}

View File

@ -7,7 +7,7 @@
],
"GBP": [
"GB£",
"British Pound Sterling"
"British Pound"
]
}
}

View File

@ -1,374 +1,6 @@
{
"Version": "2.1.8.19",
"Version": "2.1.11.59",
"Names": {
"ADP": [
"ADP",
"Andorran Peseta"
],
"AED": [
"AED",
"United Arab Emirates Dirham"
],
"AFA": [
"AFA",
"Afghan Afghani (19272002)"
],
"AFN": [
"AFN",
"Afghan Afghani"
],
"ALL": [
"ALL",
"Albanian Lek"
],
"AMD": [
"AMD",
"Armenian Dram"
],
"ANG": [
"ANG",
"Netherlands Antillean Guilder"
],
"AOA": [
"AOA",
"Angolan Kwanza"
],
"ARS": [
"ARS",
"Argentine Peso"
],
"ATS": [
"ATS",
"Austrian Schilling"
],
"AUD": [
"A$",
"Australian Dollar"
],
"AWG": [
"AWG",
"Aruban Florin"
],
"AZM": [
"AZM",
"Azerbaijani Manat (19932006)"
],
"AZN": [
"AZN",
"Azerbaijani Manat"
],
"BAD": [
"BAD",
"Bosnia-Herzegovina Dinar (19921994)"
],
"BAM": [
"BAM",
"Bosnia-Herzegovina Convertible Mark"
],
"BAN": [
"BAN",
"Bosnia-Herzegovina New Dinar (19941997)"
],
"BBD": [
"BBD",
"Barbadian Dollar"
],
"BDT": [
"BDT",
"Bangladeshi Taka"
],
"BEC": [
"BEC",
"Belgian Franc (convertible)"
],
"BEF": [
"BEF",
"Belgian Franc"
],
"BEL": [
"BEL",
"Belgian Franc (financial)"
],
"BGL": [
"BGL",
"Bulgarian Hard Lev"
],
"BGM": [
"BGM",
"Bulgarian Socialist Lev"
],
"BGN": [
"BGN",
"Bulgarian Lev"
],
"BGO": [
"BGO",
"Bulgarian Lev (18791952)"
],
"BHD": [
"BHD",
"Bahraini Dinar"
],
"BIF": [
"BIF",
"Burundian Franc"
],
"BMD": [
"BMD",
"Bermudan Dollar"
],
"BND": [
"BND",
"Brunei Dollar"
],
"BOB": [
"BOB",
"Bolivian Boliviano"
],
"BRL": [
"R$",
"Brazilian Real"
],
"BSD": [
"BSD",
"Bahamian Dollar"
],
"BTN": [
"BTN",
"Bhutanese Ngultrum"
],
"BUK": [
"BUK",
"Burmese Kyat"
],
"BWP": [
"BWP",
"Botswanan Pula"
],
"BYB": [
"BYB",
"Belarusian New Rouble (19941999)"
],
"BYR": [
"BYR",
"Belarusian Ruble"
],
"BZD": [
"BZD",
"Belize Dollar"
],
"CAD": [
"CA$",
"Canadian Dollar"
],
"CDF": [
"CDF",
"Congolese Franc"
],
"CHE": [
"CHE",
"WIR Euro"
],
"CHF": [
"CHF",
"Swiss Franc"
],
"CHW": [
"CHW",
"WIR Franc"
],
"CLP": [
"CLP",
"Chilean Peso"
],
"CNY": [
"CN¥",
"Chinese Yuan"
],
"COP": [
"COP",
"Colombian Peso"
],
"CRC": [
"CRC",
"Costa Rican Colón"
],
"CSD": [
"CSD",
"Serbian Dinar (20022006)"
],
"CSK": [
"CSK",
"Czechoslovak Hard Koruna"
],
"CUC": [
"CUC",
"Cuban Convertible Peso"
],
"CUP": [
"CUP",
"Cuban Peso"
],
"CVE": [
"CVE",
"Cape Verdean Escudo"
],
"CYP": [
"CYP",
"Cypriot Pound"
],
"CZK": [
"CZK",
"Czech Republic Koruna"
],
"DDM": [
"DDM",
"East German Mark"
],
"DEM": [
"DEM",
"German Mark"
],
"DJF": [
"DJF",
"Djiboutian Franc"
],
"DKK": [
"DKK",
"Danish Krone"
],
"DOP": [
"DOP",
"Dominican Peso"
],
"DZD": [
"DZD",
"Algerian Dinar"
],
"EEK": [
"EEK",
"Estonian Kroon"
],
"EGP": [
"EGP",
"Egyptian Pound"
],
"ERN": [
"ERN",
"Eritrean Nakfa"
],
"ESA": [
"ESA",
"Spanish Peseta (A account)"
],
"ESB": [
"ESB",
"Spanish Peseta (convertible account)"
],
"ESP": [
"ESP",
"Spanish Peseta"
],
"ETB": [
"ETB",
"Ethiopian Birr"
],
"EUR": [
"€",
"Euro"
],
"FIM": [
"FIM",
"Finnish Markka"
],
"FJD": [
"FJD",
"Fijian Dollar"
],
"FKP": [
"FKP",
"Falkland Islands Pound"
],
"FRF": [
"FRF",
"French Franc"
],
"GBP": [
"£",
"British Pound Sterling"
],
"GEK": [
"GEK",
"Georgian Kupon Larit"
],
"GEL": [
"GEL",
"Georgian Lari"
],
"GHS": [
"GHS",
"Ghanaian Cedi"
],
"GIP": [
"GIP",
"Gibraltar Pound"
],
"GMD": [
"GMD",
"Gambian Dalasi"
],
"GNF": [
"GNF",
"Guinean Franc"
],
"GRD": [
"GRD",
"Greek Drachma"
],
"GTQ": [
"GTQ",
"Guatemalan Quetzal"
],
"GYD": [
"GYD",
"Guyanaese Dollar"
],
"HKD": [
"HK$",
"Hong Kong Dollar"
],
"HNL": [
"HNL",
"Honduran Lempira"
],
"HRD": [
"HRD",
"Croatian Dinar"
],
"HRK": [
"HRK",
"Croatian Kuna"
],
"HTG": [
"HTG",
"Haitian Gourde"
],
"HUF": [
"HUF",
"Hungarian Forint"
],
"IDR": [
"IDR",
"Indonesian Rupiah"
],
"IEP": [
"IEP",
"Irish Pound"
],
"ILP": [
"ILP",
"Israeli Pound"
],
"ILR": [
"ILR",
"Israeli Shekel (19801985)"
@ -376,562 +8,6 @@
"ILS": [
"₪",
"Israeli New Shekel"
],
"INR": [
"₹",
"Indian Rupee"
],
"IQD": [
"IQD",
"Iraqi Dinar"
],
"IRR": [
"IRR",
"Iranian Rial"
],
"ISK": [
"ISK",
"Icelandic Króna"
],
"ITL": [
"ITL",
"Italian Lira"
],
"JMD": [
"JMD",
"Jamaican Dollar"
],
"JOD": [
"JOD",
"Jordanian Dinar"
],
"KES": [
"KES",
"Kenyan Shilling"
],
"KGS": [
"KGS",
"Kyrgystani Som"
],
"KHR": [
"KHR",
"Cambodian Riel"
],
"KMF": [
"KMF",
"Comorian Franc"
],
"KPW": [
"KPW",
"North Korean Won"
],
"KRH": [
"KRH",
"South Korean Hwan (19531962)"
],
"KRO": [
"KRO",
"South Korean Won (19451953)"
],
"KRW": [
"₩",
"South Korean Won"
],
"KWD": [
"KWD",
"Kuwaiti Dinar"
],
"KYD": [
"KYD",
"Cayman Islands Dollar"
],
"KZT": [
"KZT",
"Kazakhstani Tenge"
],
"LAK": [
"LAK",
"Laotian Kip"
],
"LBP": [
"LBP",
"Lebanese Pound"
],
"LKR": [
"LKR",
"Sri Lankan Rupee"
],
"LRD": [
"LRD",
"Liberian Dollar"
],
"LSL": [
"LSL",
"Lesotho Loti"
],
"LTL": [
"LTL",
"Lithuanian Litas"
],
"LTT": [
"LTT",
"Lithuanian Talonas"
],
"LUC": [
"LUC",
"Luxembourgian Convertible Franc"
],
"LUF": [
"LUF",
"Luxembourgian Franc"
],
"LUL": [
"LUL",
"Luxembourg Financial Franc"
],
"LVL": [
"LVL",
"Latvian Lats"
],
"LVR": [
"LVR",
"Latvian Rouble"
],
"LYD": [
"LYD",
"Libyan Dinar"
],
"MAD": [
"MAD",
"Moroccan Dirham"
],
"MCF": [
"MCF",
"Monegasque Franc"
],
"MDC": [
"MDC",
"Moldovan Cupon"
],
"MDL": [
"MDL",
"Moldovan Leu"
],
"MGA": [
"MGA",
"Malagasy Ariary"
],
"MKD": [
"MKD",
"Macedonian Denar"
],
"MKN": [
"MKN",
"Macedonian Denar (19921993)"
],
"MMK": [
"MMK",
"Myanmar Kyat"
],
"MNT": [
"MNT",
"Mongolian Tugrik"
],
"MOP": [
"MOP",
"Macanese Pataca"
],
"MRO": [
"MRO",
"Mauritanian Ouguiya"
],
"MTL": [
"MTL",
"Maltese Lira"
],
"MTP": [
"MTP",
"Maltese Pound"
],
"MUR": [
"MUR",
"Mauritian Rupee"
],
"MVP": [
"MVP",
"Maldivian Rupee"
],
"MVR": [
"MVR",
"Maldivian Rufiyaa"
],
"MWK": [
"MWK",
"Malawian Kwacha"
],
"MXN": [
"MX$",
"Mexican Peso"
],
"MXP": [
"MXP",
"Mexican Silver Peso (18611992)"
],
"MXV": [
"MXV",
"Mexican Investment Unit"
],
"MYR": [
"MYR",
"Malaysian Ringgit"
],
"MZN": [
"MZN",
"Mozambican Metical"
],
"NAD": [
"NAD",
"Namibian Dollar"
],
"NGN": [
"NGN",
"Nigerian Naira"
],
"NIC": [
"NIC",
"Nicaraguan Córdoba (19881991)"
],
"NIO": [
"NIO",
"Nicaraguan Córdoba"
],
"NLG": [
"NLG",
"Dutch Guilder"
],
"NOK": [
"NOK",
"Norwegian Krone"
],
"NPR": [
"NPR",
"Nepalese Rupee"
],
"NZD": [
"NZ$",
"New Zealand Dollar"
],
"OMR": [
"OMR",
"Omani Rial"
],
"PAB": [
"PAB",
"Panamanian Balboa"
],
"PEN": [
"PEN",
"Peruvian Nuevo Sol"
],
"PGK": [
"PGK",
"Papua New Guinean Kina"
],
"PHP": [
"PHP",
"Philippine Peso"
],
"PKR": [
"PKR",
"Pakistani Rupee"
],
"PLN": [
"PLN",
"Polish Zloty"
],
"PLZ": [
"PLZ",
"Polish Zloty (19501995)"
],
"PTE": [
"PTE",
"Portuguese Escudo"
],
"PYG": [
"PYG",
"Paraguayan Guarani"
],
"QAR": [
"QAR",
"Qatari Rial"
],
"ROL": [
"ROL",
"Romanian Leu (19522006)"
],
"RON": [
"RON",
"Romanian Leu"
],
"RSD": [
"RSD",
"Serbian Dinar"
],
"RUB": [
"RUB",
"Russian Ruble"
],
"RUR": [
"RUR",
"Russian Rouble (19911998)"
],
"RWF": [
"RWF",
"Rwandan Franc"
],
"SAR": [
"SAR",
"Saudi Riyal"
],
"SBD": [
"SBD",
"Solomon Islands Dollar"
],
"SCR": [
"SCR",
"Seychellois Rupee"
],
"SDG": [
"SDG",
"Sudanese Pound"
],
"SEK": [
"SEK",
"Swedish Krona"
],
"SGD": [
"SGD",
"Singapore Dollar"
],
"SHP": [
"SHP",
"Saint Helena Pound"
],
"SIT": [
"SIT",
"Slovenian Tolar"
],
"SKK": [
"SKK",
"Slovak Koruna"
],
"SLL": [
"SLL",
"Sierra Leonean Leone"
],
"SOS": [
"SOS",
"Somali Shilling"
],
"SRD": [
"SRD",
"Surinamese Dollar"
],
"SSP": [
"SSP",
"South Sudanese Pound"
],
"STD": [
"STD",
"São Tomé and Príncipe Dobra"
],
"SUR": [
"SUR",
"Soviet Rouble"
],
"SVC": [
"SVC",
"Salvadoran Colón"
],
"SYP": [
"SYP",
"Syrian Pound"
],
"SZL": [
"SZL",
"Swazi Lilangeni"
],
"THB": [
"฿",
"Thai Baht"
],
"TJR": [
"TJR",
"Tajikistani Rouble"
],
"TJS": [
"TJS",
"Tajikistani Somoni"
],
"TMM": [
"TMM",
"Turkmenistani Manat (19932009)"
],
"TMT": [
"TMT",
"Turkmenistani Manat"
],
"TND": [
"TND",
"Tunisian Dinar"
],
"TOP": [
"TOP",
"Tongan Paʻanga"
],
"TPE": [
"TPE",
"Timorese Escudo"
],
"TRL": [
"TRL",
"Turkish Lira (19222005)"
],
"TRY": [
"TRY",
"Turkish Lira"
],
"TTD": [
"TTD",
"Trinidad and Tobago Dollar"
],
"TWD": [
"NT$",
"New Taiwan Dollar"
],
"TZS": [
"TZS",
"Tanzanian Shilling"
],
"UAH": [
"UAH",
"Ukrainian Hryvnia"
],
"UAK": [
"UAK",
"Ukrainian Karbovanets"
],
"UGX": [
"UGX",
"Ugandan Shilling"
],
"USN": [
"USN",
"US Dollar (Next day)"
],
"USS": [
"USS",
"US Dollar (Same day)"
],
"UYU": [
"UYU",
"Uruguayan Peso"
],
"UZS": [
"UZS",
"Uzbekistan Som"
],
"VEF": [
"VEF",
"Venezuelan Bolívar"
],
"VND": [
"₫",
"Vietnamese Dong"
],
"VNN": [
"VNN",
"Vietnamese Dong (19781985)"
],
"VUV": [
"VUV",
"Vanuatu Vatu"
],
"WST": [
"WST",
"Samoan Tala"
],
"XAF": [
"FCFA",
"CFA Franc BEAC"
],
"XCD": [
"EC$",
"East Caribbean Dollar"
],
"XEU": [
"XEU",
"European Currency Unit"
],
"XFO": [
"XFO",
"French Gold Franc"
],
"XFU": [
"XFU",
"French UIC-Franc"
],
"XOF": [
"CFA",
"CFA Franc BCEAO"
],
"XPF": [
"CFPF",
"CFP Franc"
],
"XRE": [
"XRE",
"RINET Funds"
],
"YDD": [
"YDD",
"Yemeni Dinar"
],
"YER": [
"YER",
"Yemeni Rial"
],
"YUD": [
"YUD",
"Yugoslavian Hard Dinar (19661990)"
],
"YUM": [
"YUM",
"Yugoslavian New Dinar (19942002)"
],
"YUN": [
"YUN",
"Yugoslavian Convertible Dinar (19901992)"
],
"YUR": [
"YUR",
"Yugoslavian Reformed Dinar (19921993)"
],
"ZAL": [
"ZAL",
"South African Rand (financial)"
],
"ZAR": [
"ZAR",
"South African Rand"
],
"ZMK": [
"ZMK",
"Zambian Kwacha (19682012)"
],
"ZMW": [
"ZMW",
"Zambian Kwacha"
]
}
}

View File

@ -3,7 +3,7 @@
"Names": {
"GBP": [
"GB£",
"British Pound Sterling"
"British Pound"
],
"GIP": [
"£",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.10.93",
"Names": {
"JMD": [
"$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.11.50",
"Names": {
"MOP": [
"MOP$",

View File

@ -1,9 +1,9 @@
{
"Version": "2.1.8.19",
"Version": "2.1.11.50",
"Names": {
"GBP": [
"GB£",
"British Pound Sterling"
"British Pound"
]
}
}

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.11.51",
"Names": {
"NZD": [
"$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.11.51",
"Names": {
"PKR": [
"Rs",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.11.51",
"Names": {
"SGD": [
"$",

View File

@ -3,11 +3,11 @@
"Names": {
"GBP": [
"GB£",
"British Pound Sterling"
"British Pound"
],
"SHP": [
"£",
"Saint Helena Pound"
"St. Helena Pound"
]
}
}

View File

@ -3,7 +3,7 @@
"Names": {
"GBP": [
"GB£",
"British Pound Sterling"
"British Pound"
],
"SSP": [
"£",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.11.51",
"Names": {
"ZAR": [
"R",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.13.21",
"Names": {
"ADP": [
"ADP",
@ -67,7 +67,7 @@
],
"AWG": [
"AWG",
"florín de Aruba"
"florín arubeño"
],
"AZM": [
"AZM",
@ -87,7 +87,7 @@
],
"BBD": [
"BBD",
"dólar de Barbados"
"dólar barbadense"
],
"BDT": [
"BDT",
@ -111,7 +111,7 @@
],
"BGN": [
"BGN",
"leva"
"lev búlgaro"
],
"BHD": [
"BHD",
@ -167,7 +167,7 @@
],
"BSD": [
"BSD",
"dólar de las Bahamas"
"dólar bahameño"
],
"BTN": [
"BTN",
@ -191,7 +191,7 @@
],
"BZD": [
"BZD",
"dólar de Belice"
"dólar beliceño"
],
"CAD": [
"CA$",
@ -339,7 +339,7 @@
],
"FKP": [
"FKP",
"libra de las Islas Malvinas"
"libra malvinense"
],
"FRF": [
"FRF",
@ -347,7 +347,7 @@
],
"GBP": [
"GBP",
"libra esterlina"
"libra británica"
],
"GEK": [
"GEK",
@ -407,7 +407,7 @@
],
"HKD": [
"HKD",
"dólar de Hong Kong"
"dólar hongkonés"
],
"HNL": [
"HNL",
@ -427,7 +427,7 @@
],
"HUF": [
"HUF",
"forinto"
"forinto húngaro"
],
"IDR": [
"IDR",
@ -467,7 +467,7 @@
],
"JMD": [
"JMD",
"dólar de Jamaica"
"dólar jamaicano"
],
"JOD": [
"JOD",
@ -511,7 +511,7 @@
],
"KZT": [
"KZT",
"tengue"
"tenge kazako"
],
"LAK": [
"LAK",
@ -523,7 +523,7 @@
],
"LKR": [
"LKR",
"rupia de Sri Lanka"
"rupia esrilanquesa"
],
"LRD": [
"LRD",
@ -535,7 +535,7 @@
],
"LTL": [
"LTL",
"litas"
"litas lituano"
],
"LTT": [
"LTT",
@ -555,7 +555,7 @@
],
"LVL": [
"LVL",
"lats"
"lats letón"
],
"LVR": [
"LVR",
@ -627,7 +627,7 @@
],
"MWK": [
"MWK",
"kuacha malauí"
"kwacha malauí"
],
"MXN": [
"MXN",

View File

@ -1,62 +1,14 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"AMD": [
"AMD",
"dram"
],
"AWG": [
"AWG",
"florín arubeño"
],
"BBD": [
"BBD",
"dólar barbadense"
],
"BSD": [
"BSD",
"dólar bahameño"
],
"BZD": [
"BZD",
"dólar beliceño"
],
"CAD": [
"CAD",
"dólar canadiense"
],
"ERN": [
"ERN",
"nakfa"
],
"EUR": [
"EUR",
"euro"
],
"HKD": [
"HKD",
"dólar hongkonés"
],
"ILS": [
"ILS",
"nuevo sheqel israelí"
],
"JMD": [
"JMD",
"dólar jamaicano"
],
"KZT": [
"KZT",
"tenge kazako"
],
"LKR": [
"LKR",
"rupia esrilanquesa"
],
"MOP": [
"MOP",
"pataca"
],
"THB": [
"THB",
"bat"
@ -68,10 +20,6 @@
"VND": [
"VND",
"dong"
],
"ZMW": [
"ZMK",
"kuacha zambiano"
]
}
}

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"ARS": [
"$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"CLP": [
"$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"COP": [
"$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.13.23",
"Names": {
"CRC": [
"₡",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"USD": [
"$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"GTQ": [
"Q",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"HNL": [
"L",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"AFN": [
"Af",
@ -9,10 +9,6 @@
"ALL",
"lek albanés"
],
"AMD": [
"AMD",
"dram armenio"
],
"ANG": [
"Naf",
"florín de las Antillas Neerlandesas"
@ -41,10 +37,6 @@
"BDT",
"taka de Bangladesh"
],
"BGN": [
"BGN",
"lev búlgaro"
],
"BND": [
"BND",
"dólar de Brunéi"
@ -117,22 +109,10 @@
"ECV",
"unidad de valor constante (UVC) ecuatoriana"
],
"ERN": [
"ERN",
"nakfa eritreo"
],
"ETB": [
"ETB",
"birr etíope"
],
"FKP": [
"FKP",
"libra malvinense"
],
"GBP": [
"GBP",
"libra esterlina británica"
],
"GEL": [
"GEL",
"lari georgiano"
@ -153,18 +133,10 @@
"HRK",
"kuna croata"
],
"HUF": [
"HUF",
"florín húngaro"
],
"ILS": [
"ILS",
"nuevo shéquel israelí"
],
"JMD": [
"JMD",
"dólar jamaiquino"
],
"JPY": [
"JPY",
"yen japonés"
@ -189,14 +161,6 @@
"LKR",
"rupia de Sri Lanka"
],
"LTL": [
"LTL",
"litas lituano"
],
"LVL": [
"LVL",
"lats letón"
],
"MGA": [
"MGA",
"ariary malgache"
@ -209,10 +173,6 @@
"MNT",
"tugrik mongol"
],
"MOP": [
"MOP",
"pataca de Macao"
],
"MRO": [
"MRO",
"ouguiya mauritano"
@ -221,10 +181,6 @@
"MVR",
"rufiyaa de Maldivas"
],
"MWK": [
"MWK",
"kwacha malauí"
],
"MXN": [
"$",
"peso mexicano"
@ -354,7 +310,7 @@
"rand sudafricano"
],
"ZMW": [
"ZMK",
"ZMW",
"kwacha zambiano"
]
}

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.13.23",
"Names": {
"NIO": [
"C$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"PAB": [
"B\/.",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"PEN": [
"S\/.",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"USD": [
"$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.13.23",
"Names": {
"USD": [
"$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.19",
"Version": "2.1.13.23",
"Names": {
"JPY": [
"¥",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.11.86",
"Names": {
"USD": [
"US$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"AED": [
"AED",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.12.94",
"Names": {
"ADP": [
"ADP",
@ -783,7 +783,7 @@
],
"XAF": [
"FCFA",
"فرانک CFA مرکز آفریقا"
"فرانک CFA مرکز افریقا"
],
"XCD": [
"$EC",
@ -795,7 +795,7 @@
],
"XOF": [
"CFA",
"فرانک CFA غرب آفریقا"
"فرانک CFA غرب افریقا"
],
"XPF": [
"CFPF",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.6.69",
"Version": "2.1.12.17",
"Names": {
"AUD": [
"A$",

View File

@ -1,5 +1,5 @@
{
"Version": "2.1.8.9",
"Version": "2.1.13.33",
"Names": {
"ADP": [
"ADP",

Some files were not shown because too many files have changed in this diff Show More