Merge branch '2.2'
* 2.2: (22 commits) fixed doc references (closes #7515) fixed doc references (closes #7515) On OS X, sys_get_tmp_dir() returns /var/private/..., which really is below /private/var. Doctrine cannot handle bare random non-utf8 strings small changes [SecurityBundle] Fixed configuration exemple idAsIndex should be true with a smallint or bigint id field. [PropertyAccess] Remove trailing periods from doc blocks Fix param docs for PropertyAccessor read method Fixed long multibyte parameter logging in DbalLogger:startQuery Keep the file extension in the temporary copy and test that it exists (closes #7482) bumped Symfony version to 2.1.10-DEV [Validator][translation][japanese]replaced period to japanese one [Validator][translation][japanese]fixed japanese translation to more practical one [Validator][translation][japanese]fixed message ordering to be consistent with other languages [Validator][translation][japanese]added new validation messages in japanese translation updated VERSION for 2.1.9 update CONTRIBUTORS for 2.1.9 updated CHANGELOG for 2.1.9 [Security] fixed wrong interface Remove already defined arguments Add missing use [FrameworkBundle] Reuse definition variable in FormPass ... Conflicts: src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/config.html.twig
This commit is contained in:
commit
e1c741db9c
|
@ -7,6 +7,41 @@ in 2.1 minor versions.
|
|||
To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash
|
||||
To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v2.1.0...v2.1.1
|
||||
|
||||
* 2.1.9 (2013-03-26)
|
||||
|
||||
* 9875c4b: Added '@@' escaping strategy for YamlFileLoader and YamlDumper
|
||||
* bbcdfe2: [Yaml] fixed bugs with folded scalar parsing
|
||||
* 5afea04: [Form] made DefaultCsrfProvider using session_status() when available
|
||||
* c928ddc: [HttpFoudantion] fixed Request::getPreferredLanguage()
|
||||
* e6b7515: [DomCrawler] added support for query string with slash
|
||||
* 17dc2ff: [HttpRequest] fixes Request::getLanguages() bug
|
||||
* e51432a: sub-requests are now created with the same class as their parent
|
||||
* ef53456: [DoctrineBridge] Avoids blob values to be logged by doctrine
|
||||
* 6575df6: [Security] use current request attributes to generate redirect url?
|
||||
* 7216cb0: [Validator] fix showing wrong max file size for upload errors
|
||||
* c423f16: [2.1][TwigBridge] Fixes Issue #7342 in TwigBridge
|
||||
* 7d87ecd: [FrameworkBundle] fixed cahe:clear command's warmup
|
||||
* fe4cc24: [TwigBridge] fixed fixed scope & trans_default_domain node visitor
|
||||
* fc47589: [BrowserKit] added ability to ignored malformed set-cookie header
|
||||
* 5bc30bb: [Translation] added xliff loader/dumper with resname support
|
||||
* 7241be9: [Finder] fixed a potential issue on Solaris where INF value is wrong (refs #7269)
|
||||
* 1d3da29: [FrameworkBundle] avoids cache:clear to break if new/old folders already exist
|
||||
* b9cdb9a: [HttpKernel] Fixed possible profiler token collision (closes #7272, closes #7171)
|
||||
* d1f5d25: [FrameworkBundle] Fixes invalid serialized objects in cache
|
||||
* c82c754: RedisProfilerStorage wrong db-number/index-number selected
|
||||
* e86fefa: Unset loading[$id] in ContainerBuilder on exception
|
||||
* 73bead7: [ClassLoader] made DebugClassLoader idempotent
|
||||
* a4ec677: [DomCrawler] Fix relative path handling in links
|
||||
* 6681df0: [Console] fixed StringInput binding
|
||||
* 5b19c89: [Console] fixed unparsed StringInput tokens
|
||||
* bae83c7: [TwigBridge] fixed trans twig extractor
|
||||
* 8f8ba38: [DomCrawler] fix handling of schemes by Link::getUri()
|
||||
* 83382bc: [TwigBridge] fixed the translator extractor that were not trimming the text in trans tags (closes #7056)
|
||||
* b1ea8e5: Fixed handling absent href attribute in base tag
|
||||
* 8d9cd42: Routing issue with installation in a sub-directory ref: https://github.com/symfony/symfony/issues/7129
|
||||
* 0690709: added a DebuClassLoader::findFile() method to make the wrapping less invasive
|
||||
* 635b1fc: StringInput resets the given options.
|
||||
|
||||
* 2.1.8 (2013-02-23)
|
||||
|
||||
* b2080c4: [HttpFoundation] Remove Cache-Control when using https download via IE<9 (fixes #6750)
|
||||
|
|
|
@ -20,10 +20,10 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Joseph Bielawski (stloyd)
|
||||
- Igor Wiedler (igorw)
|
||||
- Benjamin Eberlei (beberlei)
|
||||
- Jean-François Simon (jfsimon)
|
||||
- Hugo Hamon (hhamon)
|
||||
- Eriksen Costa (eriksencosta)
|
||||
- Martin Hasoň (hason)
|
||||
- Jean-François Simon (jfsimon)
|
||||
- Jonathan Wage (jwage)
|
||||
- William Durand (couac)
|
||||
- Alexandre Salomé (alexandresalome)
|
||||
|
@ -40,11 +40,11 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Arnaud Le Blanc (arnaud-lb)
|
||||
- Florin Patan (florinpatan)
|
||||
- Eric Clemmons (ericclemmons)
|
||||
- Bilal Amarni (bamarni)
|
||||
- Henrik Westphal (snc)
|
||||
- Romain Neutron (romain)
|
||||
- Deni
|
||||
- Dariusz Górecki (canni)
|
||||
- Bilal Amarni (bamarni)
|
||||
- Marc Weistroff (futurecat)
|
||||
- Jordan Alliot (jalliot)
|
||||
- Arnout Boks (aboks)
|
||||
|
@ -54,25 +54,25 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Andrej Hudec (pulzarraider)
|
||||
- Brikou Carré (brikou)
|
||||
- John Wards (johnwards)
|
||||
- Antoine Hérault (herzult)
|
||||
- Fran Moreno (franmomu)
|
||||
- Antoine Hérault (herzult)
|
||||
- Daniel Holmes (dholmes)
|
||||
- Bart van den Burg (burgov)
|
||||
- Christian Raue
|
||||
- Tim Nagel (merk)
|
||||
- Włodzimierz Gajda (gajdaw)
|
||||
- Bart van den Burg (burgov)
|
||||
- Christian Raue
|
||||
- Michal Piotrowski (eventhorizon)
|
||||
- Toni Uebernickel (havvg)
|
||||
- Colin Frei
|
||||
- lenar
|
||||
- Toni Uebernickel (havvg)
|
||||
- Fabien Pennequin (fabienpennequin)
|
||||
- excelwebzone
|
||||
- woodspire
|
||||
- Michel Weimerskirch (mweimerskirch)
|
||||
- Grégoire Pineau (lyrixx)
|
||||
- Mario A. Alvarez Garcia (nomack84)
|
||||
- Douglas Greenshields (shieldo)
|
||||
- Kevin Bond (kbond)
|
||||
- Michel Weimerskirch (mweimerskirch)
|
||||
- Richard Miller (mr_r_miller)
|
||||
- Jacob Dreesen (jdreesen)
|
||||
- Richard Shank (iampersistent)
|
||||
|
@ -81,6 +81,7 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Robert Schönthal (digitalkaoz)
|
||||
- Felix Labrecque
|
||||
- Michał Pipa (michal.pipa)
|
||||
- Gordon Franke (gimler)
|
||||
- Daniel Gomes (danielcsgomes)
|
||||
- Gábor Egyed (1ed)
|
||||
- Tigran Azatyan (tigranazatyan)
|
||||
|
@ -89,7 +90,6 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Arnaud Kleinpeter (nanocom)
|
||||
- David Buchmann (dbu)
|
||||
- Jonathan Ingram (jonathaningram)
|
||||
- Gordon Franke (gimler)
|
||||
- Sebastiaan Stok (sstok)
|
||||
- Javier Eguiluz (javier.eguiluz)
|
||||
- Matthieu Ouellette-Vachon (maoueh)
|
||||
|
@ -132,6 +132,7 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Alif Rachmawadi
|
||||
- boombatower
|
||||
- Florian Klein (docteurklein)
|
||||
- Adrien Brault (adrienbrault)
|
||||
- jules boussekeyt (gordonslondon)
|
||||
- Jan Sorgalla (jsor)
|
||||
- jdhoek
|
||||
|
@ -148,7 +149,6 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Eric GELOEN (gelo)
|
||||
- Sebastian Bergmann
|
||||
- arjen
|
||||
- Adrien Brault (adrienbrault)
|
||||
- sun (sun)
|
||||
- Manuel Kiessling (manuelkiessling)
|
||||
- Sergey Linnik
|
||||
|
@ -171,8 +171,10 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Jeanmonod David (jeanmonod)
|
||||
- Thomas Lallement (raziel057)
|
||||
- Niklas Fiekas
|
||||
- Francesco Levorato
|
||||
- Tom Van Looy (tvlooy)
|
||||
- Brouznouf
|
||||
- Peter Kruithof (pkruithof)
|
||||
- Greg Thornton (xdissent)
|
||||
- Lars Strojny
|
||||
- Terje Bråten
|
||||
|
@ -194,13 +196,17 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Christophe L. (christophelau)
|
||||
- Michael Ridgway
|
||||
- Pavel Campr (pcampr)
|
||||
- Emanuele Gaspari (inmarelibero)
|
||||
- Brian King
|
||||
- Ricard Clau (ricardclau)
|
||||
- Jan Schumann
|
||||
- Erin Millard
|
||||
- Olivier Dolbeau (odolbeau)
|
||||
- Konstantin Myakshin (koc)
|
||||
- Elnur Abdurrakhimov (elnur)
|
||||
- Michele Orselli (orso)
|
||||
- Asier Illarramendi (doup)
|
||||
- Javier López (loalf)
|
||||
- Chris Heng (gigablah)
|
||||
- Christoph Mewes (xrstf)
|
||||
- Jonas Flodén (flojon)
|
||||
|
@ -226,7 +232,6 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- mcben
|
||||
- Maks Slesarenko
|
||||
- Vicent Soria Durá (vicentgodella)
|
||||
- Peter Kruithof (pkruithof)
|
||||
- Erik Trapman (eriktrapman)
|
||||
- De Cock Xavier (xdecock)
|
||||
- Manuel Reinhard (sprain)
|
||||
|
@ -253,15 +258,14 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Lenar Lõhmus
|
||||
- Zach Badgett (zachbadgett)
|
||||
- Aurélien Fredouelle
|
||||
- Francesco Levorato
|
||||
- Karoly Negyesi (chx)
|
||||
- janschoenherr
|
||||
- Thomas Tourlourat (armetiz)
|
||||
- jamogon
|
||||
- Geoffrey Tran (geoff)
|
||||
- Florian Rey (nervo)
|
||||
- Maks
|
||||
- Christian Schaefer (caefer)
|
||||
- Emanuele Gaspari (inmarelibero)
|
||||
- Elliot Anderson (elliot)
|
||||
- Patrick Kaufmann
|
||||
- Ben Ramsey (ramsey)
|
||||
|
@ -272,7 +276,6 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- aubx
|
||||
- Max Rath (drak3)
|
||||
- Ruben Gonzalez (rubenrua)
|
||||
- Elnur Abdurrakhimov (elnur)
|
||||
- Sinan Eldem
|
||||
- DerManoMann
|
||||
- Nahuel Cuesta (ncuesta)
|
||||
|
@ -280,7 +283,6 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Roumen Damianoff (roumen)
|
||||
- Pierre du Plessis (pierredup)
|
||||
- Åsmund Garfors
|
||||
- Erin Millard
|
||||
- Jeremy David (jeremy.david)
|
||||
- Tobias Sjösten (tobiassjosten)
|
||||
- Dustin Dobervich (dustin10)
|
||||
|
@ -293,12 +295,15 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- yktd26
|
||||
- Jakub Kucharovic
|
||||
- umpirski
|
||||
- Dmitrii Chekaliuk
|
||||
- cedric lombardot (cedriclombardot)
|
||||
- John Kary (johnkary)
|
||||
- Hossein Bukhamsin
|
||||
- Pierre-Yves LEBECQ (pylebecq)
|
||||
- Fabrice Bernhard (fabriceb)
|
||||
- Oleg Zinchenko (cystbear)
|
||||
- Johannes Klauss (cloppy)
|
||||
- fzerorubigd
|
||||
- Mark Sonnabaum
|
||||
- develop
|
||||
- Atsuhiro KUBO (iteman)
|
||||
|
@ -382,7 +387,6 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Miha Vrhovnik
|
||||
- Moritz Borgmann
|
||||
- Daniel Cestari
|
||||
- Javier López (loalf)
|
||||
- Magnus Nordlander (magnusnordlander)
|
||||
- Adam Monsen (meonkeys)
|
||||
- LOUARDI Abdeltif (ouardisoft)
|
||||
|
@ -405,6 +409,7 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Irmantas Šiupšinskas (irmantas)
|
||||
- dantleech
|
||||
- Tero Alén (tero)
|
||||
- Artem (digi)
|
||||
- Vadim Tyukov (vatson)
|
||||
- Sortex
|
||||
- arjenjb
|
||||
|
@ -415,15 +420,16 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Sébastien Lavoie
|
||||
- Per Sandström (per)
|
||||
- Ville Mattila
|
||||
- Marcos Quesada (marcos_quesada)
|
||||
- Robert Kiss (kepten)
|
||||
- Vitaliy Tverdokhlib (vitaliytv)
|
||||
- Martijn Evers
|
||||
- Sergii Smertin (nfx)
|
||||
- Eddie Jaoude
|
||||
- Nerijus Arlauskas
|
||||
- Haritz Iturbe (hizai)
|
||||
- SPolischook
|
||||
- Diego Sapriza
|
||||
- fzerorubigd
|
||||
- Joan Cruz
|
||||
- Antoine Corcy
|
||||
- inspiran
|
||||
|
@ -433,11 +439,11 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Alex Demchenko (pilot)
|
||||
- Tomasz Kowalczyk (thunderer)
|
||||
- Vincent AUBERT (vincent)
|
||||
- Benoit Garret
|
||||
- DerManoMann
|
||||
- Jochen Bayer (jocl)
|
||||
- Jeremy Bush
|
||||
- Evan Villemez
|
||||
- Dmitrii Chekaliuk
|
||||
- Davide Borsatto (davide.borsatto)
|
||||
- kaiwa
|
||||
- Albert Ganiev (helios-ag)
|
||||
|
@ -468,6 +474,7 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Janusz Jablonski
|
||||
- George Giannoulopoulos
|
||||
- Ilya Biryukov
|
||||
- Lance McNearney
|
||||
- Alberto Pirovano (geezmo)
|
||||
- Xavier Briand (xavierbriand)
|
||||
- Evan Kaufman
|
||||
|
@ -490,10 +497,14 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Simon Neidhold
|
||||
- Kevin Dew
|
||||
- James Cowgill
|
||||
- Thomas Ploch (tploch)
|
||||
- Benjamin Bender
|
||||
- Konrad Mohrfeldt
|
||||
- Benoit Lévêque (benoit_leveque)
|
||||
- Mephistofeles
|
||||
- pscheit
|
||||
- Nicolas Badey (nico-b)
|
||||
- Gunnar Lium
|
||||
- povilas
|
||||
- Lars Strojny
|
||||
- Bouke Haarsma
|
||||
|
@ -504,8 +515,10 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Francisco Facioni (fran6co)
|
||||
- Paweł Wacławczyk (pwc)
|
||||
- Eric Caron
|
||||
- 2manypeople
|
||||
- Thomas Bibb
|
||||
- Josef Cech
|
||||
- Ait Boudad Abdellatif (aitboudad)
|
||||
- Andrey Esaulov (andremaha)
|
||||
- hicham ELGUAROUANI (hiiimoo)
|
||||
- Stefan Koopmanschap (skoop)
|
||||
|
@ -514,7 +527,6 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Chris Tickner (tickner)
|
||||
- Luis Muñoz
|
||||
- Thomas Chmielowiec
|
||||
- Oleg Zinchenko
|
||||
- Christoph Nissle (derstoffel)
|
||||
- Xavier HAUSHERR
|
||||
- Benjamin Zikarsky
|
||||
|
@ -538,6 +550,7 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Artyom Protaskin
|
||||
- Nathanael d. Noblet
|
||||
- helmer
|
||||
- Julien Moulin (lizjulien)
|
||||
- devel
|
||||
- gedrox
|
||||
- hirocaster
|
||||
|
@ -569,6 +582,7 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Haritz
|
||||
- Grummfy
|
||||
- Rowan Manning
|
||||
- Kevin Herrera
|
||||
- David Windell
|
||||
- Gabriel Birke
|
||||
- Alan Chen
|
||||
|
@ -595,6 +609,7 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Jorge Martin (jorgemartind)
|
||||
- giulio de donato (liuggio)
|
||||
- Matthew Davis (mdavis1982)
|
||||
- Muriel Lusseau (metalmumu)
|
||||
- Matthias Pigulla (mpdude)
|
||||
- Pablo Monterde Perez (plebs)
|
||||
- Jimmy Leger (redpanda)
|
||||
|
@ -650,6 +665,7 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- kwiateusz
|
||||
- David Soria Parra
|
||||
- Sergiy Sokolenko
|
||||
- dinitrol
|
||||
- Penny Leach
|
||||
- Gábor Fási
|
||||
- oscartv
|
||||
|
@ -663,6 +679,8 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- dorkitude
|
||||
- tirnanog06
|
||||
- Besnik Br
|
||||
- sualko
|
||||
- Nicolas Roudaire
|
||||
- Alex Olmos (alexolmos)
|
||||
- Juan Ases García (ases)
|
||||
- Bernd Matzner (bmatzner)
|
||||
|
@ -693,6 +711,7 @@ Symfony2 is the result of the work of many people who made the code better
|
|||
- Alex Carol (picard89)
|
||||
- Daniel Perez Pinazo (pitiflautico)
|
||||
- Ruud Kamphuis (ruudk)
|
||||
- Sarah Khalil (saro0h)
|
||||
- Sebastian Busch (sebu)
|
||||
- Simon Terrien (sterrien)
|
||||
- Markus Tacker (tacker)
|
||||
|
|
|
@ -113,7 +113,7 @@ class EntityChoiceList extends ObjectChoiceList
|
|||
$this->idField = $identifier[0];
|
||||
$this->idAsValue = true;
|
||||
|
||||
if ('integer' === $this->classMetadata->getTypeOfField($this->idField)) {
|
||||
if (in_array($this->classMetadata->getTypeOfField($this->idField), array('integer', 'smallint', 'bigint'))) {
|
||||
$this->idAsIndex = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,10 +61,17 @@ class DbalLogger implements SQLLogger
|
|||
continue;
|
||||
}
|
||||
|
||||
// too long string must be shorten
|
||||
if (self::MAX_STRING_LENGTH < strlen($params[$index])) {
|
||||
$params[$index] = substr($params[$index], 0, self::MAX_STRING_LENGTH - 6).' [...]';
|
||||
continue;
|
||||
// detect if the too long string must be shorten
|
||||
if (function_exists('mb_detect_encoding') && false !== $encoding = mb_detect_encoding($params[$index])) {
|
||||
if (self::MAX_STRING_LENGTH < mb_strlen($params[$index], $encoding)) {
|
||||
$params[$index] = mb_substr($params[$index], 0, self::MAX_STRING_LENGTH - 6, $encoding).' [...]';
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (self::MAX_STRING_LENGTH < strlen($params[$index])) {
|
||||
$params[$index] = substr($params[$index], 0, self::MAX_STRING_LENGTH - 6).' [...]';
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -81,8 +81,10 @@ class DbalLoggerTest extends \PHPUnit_Framework_TestCase
|
|||
->getMock()
|
||||
;
|
||||
|
||||
$shortString = str_repeat('a', DbalLogger::MAX_STRING_LENGTH);
|
||||
$longString = str_repeat('a', DbalLogger::MAX_STRING_LENGTH + 1);
|
||||
$testString = 'abc';
|
||||
|
||||
$shortString = str_pad('', DbalLogger::MAX_STRING_LENGTH, $testString);
|
||||
$longString = str_pad('', DbalLogger::MAX_STRING_LENGTH+1, $testString);
|
||||
|
||||
$dbalLogger
|
||||
->expects($this->once())
|
||||
|
@ -95,4 +97,43 @@ class DbalLoggerTest extends \PHPUnit_Framework_TestCase
|
|||
'long' => $longString,
|
||||
));
|
||||
}
|
||||
|
||||
public function testLogUTF8LongString()
|
||||
{
|
||||
if (!function_exists('mb_detect_encoding')) {
|
||||
$this->markTestSkipped('Testing log shortening of utf8 charsets requires the mb_detect_encoding() function.');
|
||||
}
|
||||
|
||||
$logger = $this->getMock('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface');
|
||||
|
||||
$dbalLogger = $this
|
||||
->getMockBuilder('Symfony\\Bridge\\Doctrine\\Logger\\DbalLogger')
|
||||
->setConstructorArgs(array($logger, null))
|
||||
->setMethods(array('log'))
|
||||
->getMock()
|
||||
;
|
||||
|
||||
$testStringArray = array('é', 'á', 'ű', 'ő', 'ú', 'ö', 'ü', 'ó', 'í');
|
||||
$testStringCount = count($testStringArray);
|
||||
|
||||
$shortString = '';
|
||||
$longString = '';
|
||||
for($i=1; $i<=DbalLogger::MAX_STRING_LENGTH; $i++) {
|
||||
$shortString .= $testStringArray[$i % $testStringCount];
|
||||
$longString .= $testStringArray[$i % $testStringCount];
|
||||
}
|
||||
$longString .= $testStringArray[$i % $testStringCount];
|
||||
|
||||
$dbalLogger
|
||||
->expects($this->once())
|
||||
->method('log')
|
||||
->with('SQL', array('short' => $shortString, 'long' => mb_substr($longString, 0, DbalLogger::MAX_STRING_LENGTH - 6, mb_detect_encoding($longString)).' [...]'))
|
||||
;
|
||||
|
||||
$dbalLogger->startQuery('SQL', array(
|
||||
'short' => $shortString,
|
||||
'long' => $longString,
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -28,6 +28,8 @@ class FormPass implements CompilerPassInterface
|
|||
return;
|
||||
}
|
||||
|
||||
$definition = $container->getDefinition('form.extension');
|
||||
|
||||
// Builds an array with service IDs as keys and tag aliases as values
|
||||
$types = array();
|
||||
|
||||
|
@ -40,7 +42,7 @@ class FormPass implements CompilerPassInterface
|
|||
$types[$alias] = $serviceId;
|
||||
}
|
||||
|
||||
$container->getDefinition('form.extension')->replaceArgument(1, $types);
|
||||
$definition->replaceArgument(1, $types);
|
||||
|
||||
$typeExtensions = array();
|
||||
|
||||
|
@ -52,11 +54,11 @@ class FormPass implements CompilerPassInterface
|
|||
$typeExtensions[$alias][] = $serviceId;
|
||||
}
|
||||
|
||||
$container->getDefinition('form.extension')->replaceArgument(2, $typeExtensions);
|
||||
$definition->replaceArgument(2, $typeExtensions);
|
||||
|
||||
// Find all services annotated with "form.type_guesser"
|
||||
$guessers = array_keys($container->findTaggedServiceIds('form.type_guesser'));
|
||||
|
||||
$container->getDefinition('form.extension')->replaceArgument(3, $guessers);
|
||||
$definition->replaceArgument(3, $guessers);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -301,8 +301,7 @@ class MainConfiguration implements ConfigurationInterface
|
|||
->children()
|
||||
->arrayNode('providers')
|
||||
->example(array(
|
||||
'memory' => array(
|
||||
'name' => 'memory',
|
||||
'my_memory_provider' => array(
|
||||
'memory' => array(
|
||||
'users' => array(
|
||||
'foo' => array('password' => 'foo', 'roles' => 'ROLE_USER'),
|
||||
|
@ -310,7 +309,7 @@ class MainConfiguration implements ConfigurationInterface
|
|||
),
|
||||
)
|
||||
),
|
||||
'entity' => array('entity' => array('class' => 'SecurityBundle:User', 'property' => 'username'))
|
||||
'my_entity_provider' => array('entity' => array('class' => 'SecurityBundle:User', 'property' => 'username'))
|
||||
))
|
||||
->disallowNewKeysInSubsequentConfigs()
|
||||
->isRequired()
|
||||
|
|
|
@ -45,11 +45,6 @@
|
|||
class="%security.authentication.rememberme.services.persistent.class%"
|
||||
parent="security.authentication.rememberme.services.abstract"
|
||||
abstract="true">
|
||||
<argument type="collection" /> <!-- User Providers -->
|
||||
<argument /> <!-- Shared Token Key -->
|
||||
<argument /> <!-- Shared Provider Key -->
|
||||
<argument type="collection" /> <!-- Options -->
|
||||
<argument type="service" id="logger" on-invalid="null" />
|
||||
<argument type="service" id="security.secure_random" />
|
||||
</service>
|
||||
|
||||
|
|
|
@ -5,15 +5,26 @@
|
|||
{% set icon %}
|
||||
<a href="http://symfony.com/">
|
||||
<img width="26" height="28" alt="Symfony" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAcCAMAAABIzV/hAAACZFBMVEUwLjL///////////////////////////////////////////////////////////////////+Eg4b///+Ni46Xlpj///////////+op6n///////////////////////////////////////////////////////////9ZWFv///////9qaWz///////+mpaf///////////////9ZWFv///////////////9PTVH///91dHb////////////////////g4OD///9NTE+Ih4r///////+Ni47///////92dHeRkJLk5OTLy8xlY2b///////+cm53///////+5ubr////o6Oj////////U1NT///9DQURsa22rq6ysq61hX2L///+LioxTUVVBP0NEQkZpZ2rGxsf///9ram3////s7O2SkZNfXmFxcHKmpae4uLnKysuXlpiop6l3dXiIh4pYVlmrq6ycm52trK7Nzc48Oj5dW158e36dnJ49Oz/Pz9BiYGPAv8BDQUTQz9BVU1aioaNHRUnBwcJXVVk6ODxJR0t3dnmko6U8Oj6lpKY9Oz+0tLXDwsRQTlF7en1QTlHi4eJhX2LFxcZTUVViYGNwb3J+fX83NTlFQ0dUUlW4t7icm524uLk8Oj5YVlmPjpBLSU2enZ9aWVw/PkFBP0NdW153dnk0MjZQTlE1MzdQT1JdXF9ram15eHqGhYdDQkV5eHo2NThEQkZRUFNFQ0dta244NjpGREhTUVU5NztUUlVhX2JubG9HRUlVU1ZiYGM7OTxIRkk7OT1IR0o8Oj4wLjI9Oz8YdG13AAAAynRSTlMAAAEDBAUGCgsMDQ4QEhMUGRobGx0gISIkJiYnKCktLi8wMjM0NTk6Ozw+P0NFSEpLTE5PUFBTWlteXmBiZGVmaWxtcHBxc3R0dnl5fX+BgoOGi46Pj5CRmZqanZ6eoKeoq6ytsLCwsrO0tbe5urq8vL+/wsTFx8jJycvLy8vM0NHR0tLU1NfX2NnZ2trc3N3d3eHh4uLl5ebm5ubn5+fo6urt7e3u7vDx8/Pz9PT19fX19fX29vf39/j4+fn5+vr6+vv7+/z8/f3+yR5EtwAAAbVJREFUeNpl0mVXVFEYhuF3zhkOFqMjYmCi2MUYYKGIYiJ2YCd2t4IBFqgoKjZ2jg3igI2KyO2f8sTMngGvj/te71r7wyMuk4jofZccAihcMzJKXDYnuYcVotyeYKiktV5LA0faaE7S4s7TyMsBupnMcoH/vO6gmanJaiLV1Py+Xwn5zc0fjCbSi2LI2QdkGdLyFBG+rHwMzz4BD7wyGEfFk8pfsD2TkGmyFNvFHfDj55v02VD6DcteOYylatY8oG7boA2QV4vlklzB8tU3/DIwo+dWv58guY5tRcLMtwSGdi1DkTvAn9Jqsgbu4kafRBqlV4sDFCWuIjdhMsp7yQU49rB28/QPLOu2DuWqLMfmfw6M716GskdGVRMSGDKRsEzpvZ+Qs0lFKDd94s2oArh2F7K3oNQt6ChGr5x6+Dx3J7d2E3Ygqam4PCkngRNnngYIO5cWq4lLb5t+vJ6GiifFR1nbMNqP3fSOCN8PZnQynEW5W/nmHy0PXv79eHpRSjsjtEOtWZcRc9YXlNx7VFKwceGYHjG6s0Ob3iK+X3LqlKnjkvt39rjD6w3W6BhvrCdaVw//ADrWicJIvtkmAAAAAElFTkSuQmCC">
|
||||
<span>{{ collector.symfonyversion }}</span>
|
||||
<span>
|
||||
{% if collector.applicationname %}
|
||||
{{ collector.applicationname }} {{ collector.applicationversion }}
|
||||
{% else %}
|
||||
{{ collector.symfonyversion }}
|
||||
{% endif %}
|
||||
</span>
|
||||
</a>
|
||||
{% endset %}
|
||||
{% set text %}
|
||||
{% if collector.applicationname %}
|
||||
<div class="sf-toolbar-info-piece">
|
||||
{{ collector.applicationname }} <b>{{ collector.applicationversion }}</b>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="sf-toolbar-info-piece">
|
||||
Symfony <b>{{ collector.symfonyversion }}</b>
|
||||
</div>
|
||||
<div class="sf-toolbar-info-piece">
|
||||
<a href="http://symfony.com/doc/{{ collector.symfonyversion }}/index.html" rel="help">Documentation</a>
|
||||
<a href="http://symfony.com/doc/{{ collector.symfonyversion }}/index.html" rel="help">Symfony Documentation</a>
|
||||
</div>
|
||||
{% endset %}
|
||||
{% include '@WebProfiler/Profiler/toolbar_item.html.twig' with { 'link': false } %}
|
||||
|
@ -106,8 +117,13 @@
|
|||
<th>Value</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Symfony version</th>
|
||||
<td>{{ collector.symfonyversion }}</td>
|
||||
{% if collector.applicationname %}
|
||||
<th>Application</th>
|
||||
<td>{{ collector.applicationname }} {{ collector.applicationversion }} (on Symfony {{ collector.symfonyversion }})</td>
|
||||
{% else %}
|
||||
<th>Symfony version</th>
|
||||
<td>{{ collector.symfonyversion }}</td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% if 'n/a' != collector.appname %}
|
||||
<tr>
|
||||
|
|
|
@ -59,11 +59,17 @@ class FileFormField extends FormField
|
|||
if (null !== $value && is_readable($value)) {
|
||||
$error = UPLOAD_ERR_OK;
|
||||
$size = filesize($value);
|
||||
$name = basename($value);
|
||||
$info = pathinfo($value);
|
||||
$name = $info['basename'];
|
||||
|
||||
// copy to a tmp location
|
||||
$tmp = tempnam(sys_get_temp_dir(), 'upload');
|
||||
unlink($tmp);
|
||||
$tmp = sys_get_temp_dir().'/'.sha1(uniqid(mt_rand(), true));
|
||||
if (array_key_exists('extension', $info)) {
|
||||
$tmp .= '.'.$info['extension'];
|
||||
}
|
||||
if (is_file($tmp)) {
|
||||
unlink($tmp);
|
||||
}
|
||||
copy($value, $tmp);
|
||||
$value = $tmp;
|
||||
} else {
|
||||
|
|
|
@ -56,8 +56,26 @@ class FileFormFieldTest extends FormFieldTestCase
|
|||
$this->assertEquals(basename(__FILE__), $value['name'], "->$method() sets the name of the file field");
|
||||
$this->assertEquals('', $value['type'], "->$method() sets the type of the file field");
|
||||
$this->assertInternalType('string', $value['tmp_name'], "->$method() sets the tmp_name of the file field");
|
||||
$this->assertFileExists($value['tmp_name'], "->$method() creates a copy of the file at the tmp_name path");
|
||||
$this->assertEquals(0, $value['error'], "->$method() sets the error of the file field");
|
||||
$this->assertEquals(filesize(__FILE__), $value['size'], "->$method() sets the size of the file field");
|
||||
|
||||
$origInfo = pathinfo(__FILE__);
|
||||
$tmpInfo = pathinfo($value['tmp_name']);
|
||||
$this->assertEquals(
|
||||
$origInfo['extension'],
|
||||
$tmpInfo['extension'],
|
||||
"->$method() keeps the same file extension in the tmp_name copy"
|
||||
);
|
||||
|
||||
$field->$method(__DIR__.'/../Fixtures/no-extension');
|
||||
$value = $field->getValue();
|
||||
|
||||
$this->assertArrayNotHasKey(
|
||||
'extension',
|
||||
pathinfo($value['tmp_name']),
|
||||
"->$method() does not add a file extension in the tmp_name copy"
|
||||
);
|
||||
}
|
||||
|
||||
public function getSetValueMethods()
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Test
|
|
@ -19,7 +19,7 @@ abstract class RealIteratorTestCase extends IteratorTestCase
|
|||
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
self::$tmpDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'symfony2_finder';
|
||||
self::$tmpDir = realpath(sys_get_temp_dir()) . DIRECTORY_SEPARATOR . 'symfony2_finder';
|
||||
|
||||
self::$files = array(
|
||||
'.git/',
|
||||
|
@ -75,7 +75,7 @@ abstract class RealIteratorTestCase extends IteratorTestCase
|
|||
* Without the call to setUpBeforeClass() property can be null.
|
||||
*/
|
||||
if (!self::$tmpDir) {
|
||||
self::$tmpDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'symfony2_finder';
|
||||
self::$tmpDir = realpath(sys_get_temp_dir()) . DIRECTORY_SEPARATOR . 'symfony2_finder';
|
||||
}
|
||||
|
||||
if (is_array($files)) {
|
||||
|
|
|
@ -14,7 +14,7 @@ https://github.com/fabpot/Silex/blob/master/src/Silex/Provider/FormServiceProvid
|
|||
|
||||
Documentation:
|
||||
|
||||
http://symfony.com/doc/2.0/book/forms.html
|
||||
http://symfony.com/doc/2.2/book/forms.html
|
||||
|
||||
Resources
|
||||
---------
|
||||
|
|
|
@ -117,6 +117,6 @@ class DateTimeToRfc3339TransformerTest extends DateTimeTestCase
|
|||
{
|
||||
$transformer = new DateTimeToRfc3339Transformer('UTC', 'UTC');
|
||||
|
||||
var_dump($transformer->reverseTransform('2010-04-31T04:05Z'));
|
||||
$transformer->reverseTransform('2010-04-31T04:05Z');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -149,7 +149,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
|
|||
*
|
||||
* @param string $key The key
|
||||
* @param string|array $values The value or an array of values
|
||||
* @param Boolean $replace Whether to replace the actual value of not (true by default)
|
||||
* @param Boolean $replace Whether to replace the actual value or not (true by default)
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
|
|
|
@ -25,10 +25,24 @@ use Symfony\Component\HttpFoundation\Response;
|
|||
class ConfigDataCollector extends DataCollector
|
||||
{
|
||||
private $kernel;
|
||||
private $name;
|
||||
private $version;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $name The name of the application using the web profiler
|
||||
* @param string $version The version of the application using the web profiler
|
||||
*/
|
||||
public function __construct($name = null, $version = null)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->version = $version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the Kernel associated with this Request.
|
||||
*
|
||||
* @param KernelInterface $kernel A KernelInterface instance
|
||||
*/
|
||||
public function setKernel(KernelInterface $kernel = null)
|
||||
|
@ -42,6 +56,8 @@ class ConfigDataCollector extends DataCollector
|
|||
public function collect(Request $request, Response $response, \Exception $exception = null)
|
||||
{
|
||||
$this->data = array(
|
||||
'app_name' => $this->name,
|
||||
'app_version' => $this->version,
|
||||
'token' => $response->headers->get('X-Debug-Token'),
|
||||
'symfony_version' => Kernel::VERSION,
|
||||
'name' => isset($this->kernel) ? $this->kernel->getName() : 'n/a',
|
||||
|
@ -64,6 +80,16 @@ class ConfigDataCollector extends DataCollector
|
|||
}
|
||||
}
|
||||
|
||||
public function getApplicationName()
|
||||
{
|
||||
return $this->data['app_name'];
|
||||
}
|
||||
|
||||
public function getApplicationVersion()
|
||||
{
|
||||
return $this->data['app_version'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the token.
|
||||
*
|
||||
|
|
|
@ -21,7 +21,7 @@ final class PropertyAccess
|
|||
/**
|
||||
* Creates a property accessor with the default configuration.
|
||||
*
|
||||
* @return PropertyAccessor The new property accessor.
|
||||
* @return PropertyAccessor The new property accessor
|
||||
*/
|
||||
public static function getPropertyAccessor()
|
||||
{
|
||||
|
|
|
@ -96,9 +96,9 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||
/**
|
||||
* Reads the path from an object up to a given path index.
|
||||
*
|
||||
* @param object|array $objectOrArray The object or array to read from.
|
||||
* @param PropertyPathInterface $propertyPath The property path to read.
|
||||
* @param integer $lastIndex The integer up to which should be read.
|
||||
* @param object|array $objectOrArray The object or array to read from
|
||||
* @param PropertyPathInterface $propertyPath The property path to read
|
||||
* @param integer $lastIndex The index up to which should be read
|
||||
*
|
||||
* @return array The values read in the path.
|
||||
*
|
||||
|
@ -139,12 +139,12 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||
/**
|
||||
* Reads a key from an array-like structure.
|
||||
*
|
||||
* @param \ArrayAccess|array $array The array or \ArrayAccess object to read from.
|
||||
* @param string|integer $index The key to read.
|
||||
* @param \ArrayAccess|array $array The array or \ArrayAccess object to read from
|
||||
* @param string|integer $index The key to read
|
||||
*
|
||||
* @return mixed The value of the key
|
||||
*
|
||||
* @throws NoSuchPropertyException If the array does not implement \ArrayAccess or it is not an array.
|
||||
* @throws NoSuchPropertyException If the array does not implement \ArrayAccess or it is not an array
|
||||
*/
|
||||
private function &readIndex(&$array, $index)
|
||||
{
|
||||
|
@ -180,9 +180,9 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||
*
|
||||
* @return mixed The value of the read property
|
||||
*
|
||||
* @throws NoSuchPropertyException If the property does not exist.
|
||||
* @throws NoSuchPropertyException If the property does not exist
|
||||
* @throws PropertyAccessDeniedException If the property cannot be accessed due to
|
||||
* access restrictions (private or protected).
|
||||
* access restrictions (private or protected)
|
||||
*/
|
||||
private function &readProperty(&$object, $property)
|
||||
{
|
||||
|
@ -250,11 +250,11 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||
/**
|
||||
* Sets the value of the property at the given index in the path
|
||||
*
|
||||
* @param \ArrayAccess|array $array An array or \ArrayAccess object to write to.
|
||||
* @param string|integer $index The index to write at.
|
||||
* @param mixed $value The value to write.
|
||||
* @param \ArrayAccess|array $array An array or \ArrayAccess object to write to
|
||||
* @param string|integer $index The index to write at
|
||||
* @param mixed $value The value to write
|
||||
*
|
||||
* @throws NoSuchPropertyException If the array does not implement \ArrayAccess or it is not an array.
|
||||
* @throws NoSuchPropertyException If the array does not implement \ArrayAccess or it is not an array
|
||||
*/
|
||||
private function writeIndex(&$array, $index, $value)
|
||||
{
|
||||
|
@ -268,14 +268,14 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||
/**
|
||||
* Sets the value of the property at the given index in the path
|
||||
*
|
||||
* @param object|array $object The object or array to write to.
|
||||
* @param string $property The property to write.
|
||||
* @param string|null $singular The singular form of the property name or null.
|
||||
* @param mixed $value The value to write.
|
||||
* @param object|array $object The object or array to write to
|
||||
* @param string $property The property to write
|
||||
* @param string|null $singular The singular form of the property name or null
|
||||
* @param mixed $value The value to write
|
||||
*
|
||||
* @throws NoSuchPropertyException If the property does not exist.
|
||||
* @throws NoSuchPropertyException If the property does not exist
|
||||
* @throws PropertyAccessDeniedException If the property cannot be accessed due to
|
||||
* access restrictions (private or protected).
|
||||
* access restrictions (private or protected)
|
||||
*/
|
||||
private function writeProperty(&$object, $property, $singular, $value)
|
||||
{
|
||||
|
@ -368,9 +368,9 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||
/**
|
||||
* Camelizes a given string.
|
||||
*
|
||||
* @param string $string Some string.
|
||||
* @param string $string Some string
|
||||
*
|
||||
* @return string The camelized version of the string.
|
||||
* @return string The camelized version of the string
|
||||
*/
|
||||
private function camelize($string)
|
||||
{
|
||||
|
@ -381,11 +381,11 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||
* Searches for add and remove methods.
|
||||
*
|
||||
* @param \ReflectionClass $reflClass The reflection class for the given object
|
||||
* @param array $singulars The singular form of the property name or null.
|
||||
* @param array $singulars The singular form of the property name or null
|
||||
*
|
||||
* @return array|null An array containing the adder and remover when found, null otherwise.
|
||||
* @return array|null An array containing the adder and remover when found, null otherwise
|
||||
*
|
||||
* @throws NoSuchPropertyException If the property does not exist.
|
||||
* @throws NoSuchPropertyException If the property does not exist
|
||||
*/
|
||||
private function findAdderAndRemover(\ReflectionClass $reflClass, array $singulars)
|
||||
{
|
||||
|
@ -416,12 +416,12 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||
/**
|
||||
* Returns whether a method is public and has a specific number of required parameters.
|
||||
*
|
||||
* @param \ReflectionClass $class The class of the method.
|
||||
* @param string $methodName The method name.
|
||||
* @param integer $parameters The number of parameters.
|
||||
* @param \ReflectionClass $class The class of the method
|
||||
* @param string $methodName The method name
|
||||
* @param integer $parameters The number of parameters
|
||||
*
|
||||
* @return Boolean Whether the method is public and has $parameters
|
||||
* required parameters.
|
||||
* required parameters
|
||||
*/
|
||||
private function isAccessible(\ReflectionClass $class, $methodName, $parameters)
|
||||
{
|
||||
|
|
|
@ -39,15 +39,15 @@ interface PropertyAccessorInterface
|
|||
*
|
||||
* If neither is found, an exception is thrown.
|
||||
*
|
||||
* @param object|array $objectOrArray The object or array to modify.
|
||||
* @param string|PropertyPathInterface $propertyPath The property path to modify.
|
||||
* @param mixed $value The value to set at the end of the property path.
|
||||
* @param object|array $objectOrArray The object or array to modify
|
||||
* @param string|PropertyPathInterface $propertyPath The property path to modify
|
||||
* @param mixed $value The value to set at the end of the property path
|
||||
*
|
||||
* @throws Exception\NoSuchPropertyException If a property does not exist.
|
||||
* @throws Exception\NoSuchPropertyException If a property does not exist
|
||||
* @throws Exception\PropertyAccessDeniedException If a property cannot be accessed due to
|
||||
* access restrictions (private or protected).
|
||||
* access restrictions (private or protected)
|
||||
* @throws Exception\UnexpectedTypeException If a value within the path is neither object
|
||||
* nor array.
|
||||
* nor array
|
||||
*/
|
||||
public function setValue(&$objectOrArray, $propertyPath, $value);
|
||||
|
||||
|
@ -73,7 +73,7 @@ interface PropertyAccessorInterface
|
|||
* If none of them are found, an exception is thrown.
|
||||
*
|
||||
* @param object|array $objectOrArray The object or array to traverse
|
||||
* @param string|PropertyPathInterface $propertyPath The property path to modify.
|
||||
* @param string|PropertyPathInterface $propertyPath The property path to read
|
||||
*
|
||||
* @return mixed The value at the end of the property path
|
||||
*
|
||||
|
|
|
@ -62,10 +62,10 @@ class PropertyPath implements \IteratorAggregate, PropertyPathInterface
|
|||
/**
|
||||
* Constructs a property path from a string.
|
||||
*
|
||||
* @param PropertyPath|string $propertyPath The property path as string or instance.
|
||||
* @param PropertyPath|string $propertyPath The property path as string or instance
|
||||
*
|
||||
* @throws UnexpectedTypeException If the given path is not a string.
|
||||
* @throws InvalidPropertyPathException If the syntax of the property path is not valid.
|
||||
* @throws UnexpectedTypeException If the given path is not a string
|
||||
* @throws InvalidPropertyPathException If the syntax of the property path is not valid
|
||||
*/
|
||||
public function __construct($propertyPath)
|
||||
{
|
||||
|
|
|
@ -44,9 +44,9 @@ class PropertyPathBuilder
|
|||
/**
|
||||
* Appends a (sub-) path to the current path.
|
||||
*
|
||||
* @param PropertyPathInterface $path The path to append.
|
||||
* @param PropertyPathInterface $path The path to append
|
||||
* @param integer $offset The offset where the appended piece
|
||||
* starts in $path.
|
||||
* starts in $path
|
||||
* @param integer $length The length of the appended piece.
|
||||
* If 0, the full path is appended.
|
||||
*/
|
||||
|
@ -67,7 +67,7 @@ class PropertyPathBuilder
|
|||
/**
|
||||
* Appends an index element to the current path.
|
||||
*
|
||||
* @param string $name The name of the appended index.
|
||||
* @param string $name The name of the appended index
|
||||
*/
|
||||
public function appendIndex($name)
|
||||
{
|
||||
|
@ -78,7 +78,7 @@ class PropertyPathBuilder
|
|||
/**
|
||||
* Appends a property element to the current path.
|
||||
*
|
||||
* @param string $name The name of the appended property.
|
||||
* @param string $name The name of the appended property
|
||||
*/
|
||||
public function appendProperty($name)
|
||||
{
|
||||
|
@ -89,8 +89,8 @@ class PropertyPathBuilder
|
|||
/**
|
||||
* Removes elements from the current path.
|
||||
*
|
||||
* @param integer $offset The offset at which to remove.
|
||||
* @param integer $length The length of the removed piece.
|
||||
* @param integer $offset The offset at which to remove
|
||||
* @param integer $length The length of the removed piece
|
||||
*
|
||||
* @throws OutOfBoundsException if offset is invalid
|
||||
*/
|
||||
|
@ -106,15 +106,15 @@ class PropertyPathBuilder
|
|||
/**
|
||||
* Replaces a sub-path by a different (sub-) path.
|
||||
*
|
||||
* @param integer $offset The offset at which to replace.
|
||||
* @param integer $length The length of the piece to replace.
|
||||
* @param PropertyPathInterface $path The path to insert.
|
||||
* @param integer $offset The offset at which to replace
|
||||
* @param integer $length The length of the piece to replace
|
||||
* @param PropertyPathInterface $path The path to insert
|
||||
* @param integer $pathOffset The offset where the inserted piece
|
||||
* starts in $path.
|
||||
* starts in $path
|
||||
* @param integer $pathLength The length of the inserted piece.
|
||||
* If 0, the full path is inserted.
|
||||
*
|
||||
* @throws OutOfBoundsException If the offset is invalid.
|
||||
* @throws OutOfBoundsException If the offset is invalid
|
||||
*/
|
||||
public function replace($offset, $length, PropertyPathInterface $path, $pathOffset = 0, $pathLength = 0)
|
||||
{
|
||||
|
@ -137,10 +137,10 @@ class PropertyPathBuilder
|
|||
/**
|
||||
* Replaces a property element by an index element.
|
||||
*
|
||||
* @param integer $offset The offset at which to replace.
|
||||
* @param integer $offset The offset at which to replace
|
||||
* @param string $name The new name of the element. Optional.
|
||||
*
|
||||
* @throws OutOfBoundsException If the offset is invalid.
|
||||
* @throws OutOfBoundsException If the offset is invalid
|
||||
*/
|
||||
public function replaceByIndex($offset, $name = null)
|
||||
{
|
||||
|
@ -158,10 +158,10 @@ class PropertyPathBuilder
|
|||
/**
|
||||
* Replaces an index element by a property element.
|
||||
*
|
||||
* @param integer $offset The offset at which to replace.
|
||||
* @param integer $offset The offset at which to replace
|
||||
* @param string $name The new name of the element. Optional.
|
||||
*
|
||||
* @throws OutOfBoundsException If the offset is invalid.
|
||||
* @throws OutOfBoundsException If the offset is invalid
|
||||
*/
|
||||
public function replaceByProperty($offset, $name = null)
|
||||
{
|
||||
|
@ -179,7 +179,7 @@ class PropertyPathBuilder
|
|||
/**
|
||||
* Returns the length of the current path.
|
||||
*
|
||||
* @return integer The path length.
|
||||
* @return integer The path length
|
||||
*/
|
||||
public function getLength()
|
||||
{
|
||||
|
@ -189,7 +189,7 @@ class PropertyPathBuilder
|
|||
/**
|
||||
* Returns the current property path.
|
||||
*
|
||||
* @return PropertyPathInterface The constructed property path.
|
||||
* @return PropertyPathInterface The constructed property path
|
||||
*/
|
||||
public function getPropertyPath()
|
||||
{
|
||||
|
@ -201,7 +201,7 @@ class PropertyPathBuilder
|
|||
/**
|
||||
* Returns the current property path as string.
|
||||
*
|
||||
* @return string The property path as string.
|
||||
* @return string The property path as string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
|
@ -225,9 +225,9 @@ class PropertyPathBuilder
|
|||
* removed at $offset and another chunk of length $insertionLength
|
||||
* can be inserted.
|
||||
*
|
||||
* @param integer $offset The offset where the removed chunk starts.
|
||||
* @param integer $cutLength The length of the removed chunk.
|
||||
* @param integer $insertionLength The length of the inserted chunk.
|
||||
* @param integer $offset The offset where the removed chunk starts
|
||||
* @param integer $cutLength The length of the removed chunk
|
||||
* @param integer $insertionLength The length of the inserted chunk
|
||||
*/
|
||||
private function resize($offset, $cutLength, $insertionLength)
|
||||
{
|
||||
|
|
|
@ -21,14 +21,14 @@ interface PropertyPathInterface extends \Traversable
|
|||
/**
|
||||
* Returns the string representation of the property path
|
||||
*
|
||||
* @return string The path as string.
|
||||
* @return string The path as string
|
||||
*/
|
||||
public function __toString();
|
||||
|
||||
/**
|
||||
* Returns the length of the property path, i.e. the number of elements.
|
||||
*
|
||||
* @return integer The path length.
|
||||
* @return integer The path length
|
||||
*/
|
||||
public function getLength();
|
||||
|
||||
|
@ -40,7 +40,7 @@ interface PropertyPathInterface extends \Traversable
|
|||
*
|
||||
* If this property path only contains one item, null is returned.
|
||||
*
|
||||
* @return PropertyPath The parent path or null.
|
||||
* @return PropertyPath The parent path or null
|
||||
*/
|
||||
public function getParent();
|
||||
|
||||
|
@ -58,7 +58,7 @@ interface PropertyPathInterface extends \Traversable
|
|||
*
|
||||
* @return string A property or index name
|
||||
*
|
||||
* @throws Exception\OutOfBoundsException If the offset is invalid.
|
||||
* @throws Exception\OutOfBoundsException If the offset is invalid
|
||||
*/
|
||||
public function getElement($index);
|
||||
|
||||
|
@ -69,7 +69,7 @@ interface PropertyPathInterface extends \Traversable
|
|||
*
|
||||
* @return Boolean Whether the element at this index is a property
|
||||
*
|
||||
* @throws Exception\OutOfBoundsException If the offset is invalid.
|
||||
* @throws Exception\OutOfBoundsException If the offset is invalid
|
||||
*/
|
||||
public function isProperty($index);
|
||||
|
||||
|
@ -80,7 +80,7 @@ interface PropertyPathInterface extends \Traversable
|
|||
*
|
||||
* @return Boolean Whether the element at this index is an array index
|
||||
*
|
||||
* @throws Exception\OutOfBoundsException If the offset is invalid.
|
||||
* @throws Exception\OutOfBoundsException If the offset is invalid
|
||||
*/
|
||||
public function isIndex($index);
|
||||
}
|
||||
|
|
|
@ -261,7 +261,7 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt
|
|||
}
|
||||
|
||||
// add a query string if needed
|
||||
$extra = array_diff_key($parameters, $variables);
|
||||
$extra = array_diff_key($parameters, $variables, $defaults);
|
||||
if ($extra && $query = http_build_query($extra, '', '&')) {
|
||||
$url .= '?'.$query;
|
||||
}
|
||||
|
|
|
@ -297,8 +297,8 @@ class UrlGeneratorTest extends \PHPUnit_Framework_TestCase
|
|||
{
|
||||
$routes = $this->getRoutes('test', new Route('/test', array('default' => 'value')));
|
||||
|
||||
$this->assertSame('/app.php/test?default=foo', $this->getGenerator($routes)->generate('test', array('default' => 'foo')));
|
||||
$this->assertSame('/app.php/test?default=value', $this->getGenerator($routes)->generate('test', array('default' => 'value')));
|
||||
$this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test', array('default' => 'foo')));
|
||||
$this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test', array('default' => 'value')));
|
||||
$this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test'));
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ use Symfony\Component\Security\Core\Exception\CookieTheftException;
|
|||
use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Component\Security\Core\Util\SecureRandomInterface;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
/**
|
||||
* Concrete implementation of the RememberMeServicesInterface which needs
|
||||
|
@ -98,7 +99,7 @@ class PersistentTokenBasedRememberMeServices extends AbstractRememberMeServices
|
|||
}
|
||||
|
||||
$series = $persistentToken->getSeries();
|
||||
$tokenValue = $this->secureRandom->nextBytes(64);
|
||||
$tokenValue = base64_encode($this->secureRandom->nextBytes(64));
|
||||
$this->tokenProvider->updateToken($series, $tokenValue, new \DateTime());
|
||||
$request->attributes->set(self::COOKIE_ATTR_NAME,
|
||||
new Cookie(
|
||||
|
@ -120,8 +121,8 @@ class PersistentTokenBasedRememberMeServices extends AbstractRememberMeServices
|
|||
*/
|
||||
protected function onLoginSuccess(Request $request, Response $response, TokenInterface $token)
|
||||
{
|
||||
$series = $this->secureRandom->nextBytes(64);
|
||||
$tokenValue = $this->secureRandom->nextBytes(64);
|
||||
$series = base64_encode($this->secureRandom->nextBytes(64));
|
||||
$tokenValue = base64_encode($this->secureRandom->nextBytes(64));
|
||||
|
||||
$this->tokenProvider->createNewToken(
|
||||
new PersistentToken(
|
||||
|
|
|
@ -11,7 +11,7 @@ Resources
|
|||
|
||||
Documentation:
|
||||
|
||||
http://symfony.com/doc/2.0/book/security.html
|
||||
http://symfony.com/doc/2.2/book/security.html
|
||||
|
||||
Resources
|
||||
---------
|
||||
|
|
|
@ -26,7 +26,7 @@ https://github.com/fabpot/Silex/blob/master/src/Silex/Provider/TranslationServic
|
|||
|
||||
Documentation:
|
||||
|
||||
http://symfony.com/doc/2.0/book/translation.html
|
||||
http://symfony.com/doc/2.2/book/translation.html
|
||||
|
||||
You can run the unit tests with the following command:
|
||||
|
||||
|
|
|
@ -107,7 +107,7 @@ https://github.com/fabpot/Silex/blob/master/src/Silex/Provider/ValidatorServiceP
|
|||
|
||||
Documentation:
|
||||
|
||||
http://symfony.com/doc/2.0/book/validation.html
|
||||
http://symfony.com/doc/2.2/book/validation.html
|
||||
|
||||
JSR-303 Specification:
|
||||
|
||||
|
|
|
@ -4,23 +4,23 @@
|
|||
<body>
|
||||
<trans-unit id="1">
|
||||
<source>This value should be false.</source>
|
||||
<target>値はfalseでなければなりません.</target>
|
||||
<target>falseでなければなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="2">
|
||||
<source>This value should be true.</source>
|
||||
<target>値はtrueでなければなりません.</target>
|
||||
<target>trueでなければなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="3">
|
||||
<source>This value should be of type {{ type }}.</source>
|
||||
<target>値の型は{{ type }}でなければなりません.</target>
|
||||
<target>型は{{ type }}でなければなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="4">
|
||||
<source>This value should be blank.</source>
|
||||
<target>値は空でなければなりません.</target>
|
||||
<target>空でなければなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="5">
|
||||
<source>The value you selected is not a valid choice.</source>
|
||||
<target>選択された値は選択肢として有効な値ではありません.</target>
|
||||
<target>有効な選択肢ではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="6">
|
||||
<source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
|
||||
|
@ -32,47 +32,47 @@
|
|||
</trans-unit>
|
||||
<trans-unit id="8">
|
||||
<source>One or more of the given values is invalid.</source>
|
||||
<target>1つまたは複数の選択された値が正しくありません.</target>
|
||||
<target>無効な選択肢が含まれています。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="9">
|
||||
<source>The fields {{ fields }} were not expected.</source>
|
||||
<target>フィールド{{ fields }}は無効です.</target>
|
||||
<target>フィールド{{ fields }}は無効です。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="10">
|
||||
<source>The fields {{ fields }} are missing.</source>
|
||||
<target>フィールド{{ fields }}は必須です.</target>
|
||||
<target>フィールド{{ fields }}は必須です。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="11">
|
||||
<source>This value is not a valid date.</source>
|
||||
<target>値が有効な日付ではありません.</target>
|
||||
<target>有効な日付ではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="12">
|
||||
<source>This value is not a valid datetime.</source>
|
||||
<target>値が有効な日時ではありません.</target>
|
||||
<target>有効な日時ではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="13">
|
||||
<source>This value is not a valid email address.</source>
|
||||
<target>値が有効なメールアドレスではありません.</target>
|
||||
<target>有効なメールアドレスではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="14">
|
||||
<source>The file could not be found.</source>
|
||||
<target>ファイルが見つかりません.</target>
|
||||
<target>ファイルが見つかりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="15">
|
||||
<source>The file is not readable.</source>
|
||||
<target>ファイルを読み込めません.</target>
|
||||
<target>ファイルを読み込めません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="16">
|
||||
<source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
|
||||
<target>ファイルのサイズが大きすぎます({{ size }} {{ suffix }})。有効な最大サイズは{{ limit }} {{ suffix }}です.</target>
|
||||
<target>ファイルのサイズが大きすぎます({{ size }} {{ suffix }})。有効な最大サイズは{{ limit }} {{ suffix }}です。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="17">
|
||||
<source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
|
||||
<target>ファイルのMIMEタイプが無効です({{ type }})。有効なMIMEタイプは{{ types }}です.</target>
|
||||
<target>ファイルのMIMEタイプが無効です({{ type }})。有効なMIMEタイプは{{ types }}です。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="18">
|
||||
<source>This value should be {{ limit }} or less.</source>
|
||||
<target>値は{{ limit }}以下でなければなりません.</target>
|
||||
<target>{{ limit }}以下でなければなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="19">
|
||||
<source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
|
||||
|
@ -80,7 +80,7 @@
|
|||
</trans-unit>
|
||||
<trans-unit id="20">
|
||||
<source>This value should be {{ limit }} or more.</source>
|
||||
<target>値は{{ limit }}以上でなければなりません.</target>
|
||||
<target>{{ limit }}以上でなければなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="21">
|
||||
<source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
|
||||
|
@ -88,63 +88,131 @@
|
|||
</trans-unit>
|
||||
<trans-unit id="22">
|
||||
<source>This value should not be blank.</source>
|
||||
<target>値が空であってはなりません.</target>
|
||||
<target>空であってはなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="23">
|
||||
<source>This value should not be null.</source>
|
||||
<target>値がnullであってはなりません.</target>
|
||||
<target>nullであってはなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="24">
|
||||
<source>This value should be null.</source>
|
||||
<target>値はnullでなければなりません.</target>
|
||||
<target>nullでなければなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="25">
|
||||
<source>This value is not valid.</source>
|
||||
<target>値が無効です.</target>
|
||||
<target>有効な値ではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="26">
|
||||
<source>This value is not a valid time.</source>
|
||||
<target>値が有効な時刻ではありません.</target>
|
||||
<target>有効な時刻ではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="27">
|
||||
<source>This value is not a valid URL.</source>
|
||||
<target>値が有効なURLではありません.</target>
|
||||
<target>有効なURLではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="31">
|
||||
<source>The two values should be equal.</source>
|
||||
<target>2つの値が同じでなければなりません.</target>
|
||||
<target>2つの値が同じでなければなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="32">
|
||||
<source>This value is not a valid country.</source>
|
||||
<target>値は有効な国名ではありません.</target>
|
||||
<source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
|
||||
<target>ファイルのサイズが大きすぎます。有効な最大サイズは{{ limit }} {{ suffix }}です。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="33">
|
||||
<source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
|
||||
<target>ファイルのサイズが大きすぎます。有効な最大サイズは{{ limit }} {{ suffix }}です.</target>
|
||||
<source>The file is too large.</source>
|
||||
<target>ファイルのサイズが大きすぎます。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="34">
|
||||
<source>The file is too large.</source>
|
||||
<target>ファイルのサイズが大きすぎます.</target>
|
||||
<source>The file could not be uploaded.</source>
|
||||
<target>ファイルをアップロードできませんでした。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="35">
|
||||
<source>The file could not be uploaded.</source>
|
||||
<target>ファイルをアップロードできませんでした.</target>
|
||||
<source>This value should be a valid number.</source>
|
||||
<target>有効な数字ではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="36">
|
||||
<source>This file is not a valid image.</source>
|
||||
<target>ファイルが画像ではありません.</target>
|
||||
<target>ファイルが画像ではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="37">
|
||||
<source>This is not a valid IP address.</source>
|
||||
<target>値は有効なIPアドレスではありません.</target>
|
||||
<target>有効なIPアドレスではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="38">
|
||||
<source>This value is not a valid language.</source>
|
||||
<target>値は有効な言語名ではありません.</target>
|
||||
<target>有効な言語名ではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="39">
|
||||
<source>This value is not a valid locale.</source>
|
||||
<target>値は有効なロケールではありません.</target>
|
||||
<target>有効なロケールではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="40">
|
||||
<source>This value is not a valid country.</source>
|
||||
<target>有効な国名ではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="41">
|
||||
<source>This value is already used.</source>
|
||||
<target>既に使用されています。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="42">
|
||||
<source>The size of the image could not be detected.</source>
|
||||
<target>画像のサイズが検出できません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="43">
|
||||
<source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
|
||||
<target>画像の幅が大きすぎます({{ width }}ピクセル)。{{ max_width }}ピクセルまでにしてください。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="44">
|
||||
<source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
|
||||
<target>画像の幅が小さすぎます({{ width }}ピクセル)。{{ min_width }}ピクセル以上にしてください。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="45">
|
||||
<source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
|
||||
<target>画像の高さが大きすぎます({{ height }}ピクセル)。{{ max_height }}ピクセルまでにしてください。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="46">
|
||||
<source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
|
||||
<target>画像の高さが小さすぎます({{ height }}ピクセル)。{{ min_height }}ピクセル以上にしてください。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="47">
|
||||
<source>This value should be the user current password.</source>
|
||||
<target>ユーザーの現在のパスワードでなければなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="48">
|
||||
<source>This value should have exactly {{ limit }} characters.</source>
|
||||
<target>ちょうど{{ limit }}文字でなければなりません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="49">
|
||||
<source>The file was only partially uploaded.</source>
|
||||
<target>ファイルのアップロードは完全ではありません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="50">
|
||||
<source>No file was uploaded.</source>
|
||||
<target>ファイルがアップロードされていません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="51">
|
||||
<source>No temporary folder was configured in php.ini.</source>
|
||||
<target>php.iniで一時フォルダが設定されていません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="52">
|
||||
<source>Cannot write temporary file to disk.</source>
|
||||
<target>一時ファイルをディスクに書き込むことができません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="53">
|
||||
<source>A PHP extension caused the upload to fail.</source>
|
||||
<target>PHP拡張によってアップロードに失敗しました。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="54">
|
||||
<source>This collection should contain {{ limit }} elements or more.</source>
|
||||
<target>{{ limit }}個以上の要素を含んでなければいけません。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="55">
|
||||
<source>This collection should contain {{ limit }} elements or less.</source>
|
||||
<target>要素は{{ limit }}個までです。</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="56">
|
||||
<source>This collection should contain exactly {{ limit }} elements.</source>
|
||||
<target>要素はちょうど{{ limit }}個でなければなりません。</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
|
|
Reference in New Issue